There are no available options for this view.

Parent Directory Parent Directory | Revision <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Log">Log</a> Revision <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Log">Log</a>

Revision 1.35 - (show annotations) (download) (as text)
Wed Sep 28 05:50:47 2011 UTC (6 years, 3 months ago) by dvrsn
Branch: MAIN
CVS Tags: aolserver_v45_r2_rc0, HEAD
Branch point for: aolserver_v45_r2
Changes since 1.34: +32 -1 lines
File MIME type: text/x-chdr
added NsTclGetNative function to get decoded versions of strings.  Use that
function to get filenames with ns_retutrnfile and ns_respond
1 /*
2 * The contents of this file are subject to the AOLserver Public License
3 * Version 1.1 (the "License"); you may not use this file except in
4 * compliance with the License. You may obtain a copy of the License at
5 * http://aolserver.com/.
6 *
7 * Software distributed under the License is distributed on an "AS IS"
8 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
9 * the License for the specific language governing rights and limitations
10 * under the License.
11 *
12 * The Original Code is AOLserver Code and related documentation
13 * distributed by AOL.
14 *
15 * The Initial Developer of the Original Code is America Online,
16 * Inc. Portions created by AOL are Copyright (C) 1999 America Online,
17 * Inc. All Rights Reserved.
18 *
19 * Alternatively, the contents of this file may be used under the terms
20 * of the GNU General Public License (the "GPL"), in which case the
21 * provisions of GPL are applicable instead of those above. If you wish
22 * to allow use of your version of this file only under the terms of the
23 * GPL and not to allow others to use your version of this file under the
24 * License, indicate your decision by deleting the provisions above and
25 * replace them with the notice and other provisions required by the GPL.
26 * If you do not delete the provisions above, a recipient may use your
27 * version of this file under either the License or the GPL.
28 */
29
30
31 /*
32 * tclmisc.c --
33 *
34 * Implements a lot of Tcl API commands.
35 */
36
37 static const char *RCSID = "@(#) $Header: /cvsroot-fuse/aolserver/aolserver/nsd/tclmisc.c,v 1.35 2011/09/28 05:50:47 dvrsn Exp $, compiled: " __DATE__ " " __TIME__;
38
39 #include "nsd.h"
40
41 /*
42 * Local functions defined in this file
43 */
44
45 static int <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_WordEndsInSemi">WordEndsInSemi</a>(char *ip);
46
47
48 /*
49 *----------------------------------------------------------------------
50 *
51 * <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclStripHtmlCmd">NsTclStripHtmlCmd</a> --
52 *
53 * Implements ns_striphtml.
54 *
55 * Results:
56 * Tcl result.
57 *
58 * Side effects:
59 * See docs.
60 *
61 *----------------------------------------------------------------------
62 */
63
64 int
65 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclStripHtmlCmd">NsTclStripHtmlCmd</a>(ClientData dummy, Tcl_Interp *interp, int argc, char **argv)
66 {
67 int intag; /* flag to see if are we inside a tag */
68 int intspec; /* flag to see if we are inside a special char */
69 char *inString; /* copy of input string */
70 char *inPtr; /* moving pointer to input string */
71 char *outPtr; /* moving pointer to output string */
72
73 if (argc != 2) {
74 Tcl_AppendResult(interp, "wrong # of args: should be \"",
75 argv[0], " page\"", NULL);
76 return TCL_ERROR;
77 }
78
79 /*
80 * Make a copy of the input and point the moving and output ptrs to it.
81 */
82 inString = ns_strdup(argv[1]);
83 inPtr = inString;
84 outPtr = inString;
85 intag = 0;
86 intspec = 0;
87
88 while (*inPtr != '\0') {
89
90 if (*inPtr == '<') {
91 intag = 1;
92
93 } else if (intag && (*inPtr == '>')) {
94 /* inside a tag that closes */
95 intag = 0;
96
97 } else if (intspec && (*inPtr == ';')) {
98 /* inside a special character that closes */
99 intspec = 0;
100
101 } else if (!intag && !intspec) {
102 /* regular text */
103
104 if (*inPtr == '&') {
105 /* starting a new special character */
106 intspec=<a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_WordEndsInSemi">WordEndsInSemi</a>(inPtr);
107 }
108
109 if (!intspec) {
110 /* incr pointer only if we're not in something htmlish */
111 *outPtr++ = *inPtr;
112 }
113 }
114 ++inPtr;
115 }
116
117 /* null-terminator */
118 *outPtr = '\0';
119
120 Tcl_SetResult(interp, inString, TCL_VOLATILE);
121
122 ns_free(inString);
123
124 return TCL_OK;
125 }
126
127
128 /*
129 *----------------------------------------------------------------------
130 *
131 * <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclCryptObjCmd">NsTclCryptObjCmd</a> --
132 *
133 * Implements ns_crypt as ObjCommand.
134 *
135 * Results:
136 * Tcl result.
137 *
138 * Side effects:
139 * See docs.
140 *
141 *----------------------------------------------------------------------
142 */
143
144 int
145 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclCryptObjCmd">NsTclCryptObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
146 {
147 char buf[NS_ENCRYPT_BUFSIZE];
148
149 if (objc != 3) {
150 Tcl_WrongNumArgs(interp, 1, objv, "key salt");
151 return TCL_ERROR;
152 }
153 Tcl_SetResult(interp, <a href="/cvs/aolserver/aolserver/nsd/crypt.c#A_Ns_Encrypt">Ns_Encrypt</a>(Tcl_GetString(objv[1]), Tcl_GetString(objv[2]), buf), TCL_VOLATILE);
154
155 return TCL_OK;
156 }
157
158
159 /*
160 *----------------------------------------------------------------------
161 *
162 * <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclHrefsCmd">NsTclHrefsCmd</a> --
163 *
164 * Implements ns_hrefs.
165 *
166 * Results:
167 * Tcl result.
168 *
169 * Side effects:
170 * See docs.
171 *
172 *----------------------------------------------------------------------
173 */
174
175 int
176 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclHrefsCmd">NsTclHrefsCmd</a>(ClientData dummy, Tcl_Interp *interp, int argc, char **argv)
177 {
178 char *p, *s, *e, *he, save;
179
180 if (argc != 2) {
181 Tcl_AppendResult(interp, "wrong # args: should be \"",
182 argv[0], " html\"", (char *) NULL);
183 return TCL_ERROR;
184 }
185
186 p = argv[1];
187 while ((s = strchr(p, '<')) && (e = strchr(s, '>'))) {
188 ++s;
189 *e = '\0';
190 while (*s && isspace(UCHAR(*s))) {
191 ++s;
192 }
193 if ((*s == 'a' || *s == 'A') && isspace(UCHAR(s[1]))) {
194 ++s;
195 while (*s) {
196 if (!strncasecmp(s, "href", 4)) {
197 s += 4;
198 while (*s && isspace(UCHAR(*s))) {
199 ++s;
200 }
201 if (*s == '=') {
202 ++s;
203 while (*s && isspace(UCHAR(*s))) {
204 ++s;
205 }
206 he = NULL;
207 if (*s == '\'' || *s == '"') {
208 he = strchr(s+1, *s);
209 ++s;
210 }
211 if (he == NULL) {
212 he = s;
213 while (!isspace(UCHAR(*he))) {
214 ++he;
215 }
216 }
217 save = *he;
218 *he = '\0';
219 Tcl_AppendElement(interp, s);
220 *he = save;
221 break;
222 }
223 }
224 if (*s == '\'' || *s == '\"') {
225 while (*s && (*s != '\'' || *s != '\"')) {
226 ++s;
227 }
228 continue;
229 }
230 ++s;
231 }
232 }
233 *e++ = '>';
234 p = e;
235 }
236
237 return TCL_OK;
238 }
239
240
241 /*
242 *----------------------------------------------------------------------
243 *
244 * <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclLocalTimeObjCmd">NsTclLocalTimeObjCmd</a>, <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclGmTimeObjCmd">NsTclGmTimeObjCmd</a> --
245 *
246 * Implements the ns_gmtime and ns_localtime commands.
247 *
248 * Results:
249 * Tcl result.
250 *
251 * Side effects:
252 * See docs.
253 *
254 *----------------------------------------------------------------------
255 */
256
257 static int
258 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_TmObjCmd">TmObjCmd</a>(ClientData isgmt, Tcl_Interp *interp, int objc, Tcl_Obj **objv)
259 {
260 time_t now;
261 struct tm *ptm;
262 Tcl_Obj *objPtr[9];
263
264 if (objc != 1) {
265 Tcl_WrongNumArgs(interp, 1, objv, "");
266 return TCL_ERROR;
267 }
268 now = time(NULL);
269 if (isgmt) {
270 ptm = ns_gmtime(&now);
271 } else {
272 ptm = ns_localtime(&now);
273 }
274 objPtr[0] = Tcl_NewIntObj(ptm->tm_sec);
275 objPtr[1] = Tcl_NewIntObj(ptm->tm_min);
276 objPtr[2] = Tcl_NewIntObj(ptm->tm_hour);
277 objPtr[3] = Tcl_NewIntObj(ptm->tm_mday);
278 objPtr[4] = Tcl_NewIntObj(ptm->tm_mon);
279 objPtr[5] = Tcl_NewIntObj(ptm->tm_year);
280 objPtr[6] = Tcl_NewIntObj(ptm->tm_wday);
281 objPtr[7] = Tcl_NewIntObj(ptm->tm_yday);
282 objPtr[8] = Tcl_NewIntObj(ptm->tm_isdst);
283 Tcl_SetListObj(Tcl_GetObjResult(interp), 9, objPtr);
284 return TCL_OK;
285 }
286
287 int
288 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclGmTimeObjCmd">NsTclGmTimeObjCmd</a>(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv)
289 {
290 return <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_TmObjCmd">TmObjCmd</a>((ClientData) 1, interp, objc, objv);
291 }
292
293 int
294 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclLocalTimeObjCmd">NsTclLocalTimeObjCmd</a>(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv)
295 {
296 return <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_TmObjCmd">TmObjCmd</a>(NULL, interp, objc, objv);
297 }
298
299
300 /*
301 *----------------------------------------------------------------------
302 *
303 * <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclSleepObjCmd">NsTclSleepObjCmd</a> --
304 *
305 * Tcl result.
306 *
307 * Results:
308 * See docs.
309 *
310 * Side effects:
311 * See docs.
312 *
313 *----------------------------------------------------------------------
314 */
315
316 int
317 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclSleepObjCmd">NsTclSleepObjCmd</a>(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv)
318 {
319 Ns_Time time;
320 int ms;
321
322 if (objc != 2) {
323 Tcl_WrongNumArgs(interp, 1, objv, "timespec");
324 return TCL_ERROR;
325 }
326 if (<a href="/cvs/aolserver/aolserver/nsd/tclobj.c#A_Ns_TclGetTimeFromObj">Ns_TclGetTimeFromObj</a>(interp, objv[1], &time) != TCL_OK) {
327 return TCL_ERROR;
328 }
329 Ns_AdjTime(&time);
330 if (time.sec < 0 || (time.sec == 0 && time.usec < 0)) {
331 Tcl_AppendResult(interp, "invalid timespec: ",
332 Tcl_GetString(objv[1]), NULL);
333 return TCL_ERROR;
334 }
335 ms = time.sec * 1000 + time.usec / 1000;
336 Tcl_Sleep(ms);
337 return TCL_OK;
338 }
339
340
341 /*
342 *----------------------------------------------------------------------
343 *
344 * <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclHTUUEncodeObjCmd">NsTclHTUUEncodeObjCmd</a> --
345 *
346 * Implements ns_uuencode as obj command.
347 *
348 * Results:
349 * Tcl result.
350 *
351 * Side effects:
352 * See docs.
353 *
354 *----------------------------------------------------------------------
355 */
356
357 int
358 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclHTUUEncodeObjCmd">NsTclHTUUEncodeObjCmd</a>(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv)
359 {
360 char bufcoded[1 + (4 * 48) / 2];
361 char *string;
362 int nbytes;
363
364 if (objc != 2) {
365 Tcl_WrongNumArgs(interp, 1, objv, "string");
366 return TCL_ERROR;
367 }
368 string = Tcl_GetStringFromObj(objv[1], &nbytes);
369 if (nbytes > 48) {
370 Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "invalid string \"",
371 string, "\": must be less than 48 characters", NULL);
372 return TCL_ERROR;
373 }
374 <a href="/cvs/aolserver/aolserver/nsd/uuencode.c#A_Ns_HtuuEncode">Ns_HtuuEncode</a>((unsigned char *) string, (size_t)nbytes, bufcoded);
375 Tcl_SetResult(interp, bufcoded, TCL_VOLATILE);
376 return TCL_OK;
377 }
378
379
380 /*
381 *----------------------------------------------------------------------
382 *
383 * HTUUDecodeObjcmd --
384 *
385 * Implements ns_uudecode as obj command.
386 *
387 * Results:
388 * Tcl result.
389 *
390 * Side effects:
391 * See docs.
392 *
393 *----------------------------------------------------------------------
394 */
395
396 int
397 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclHTUUDecodeObjCmd">NsTclHTUUDecodeObjCmd</a>(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv)
398 {
399 int n;
400 char *string, *decoded;
401
402 if (objc != 2) {
403 Tcl_WrongNumArgs(interp, 1, objv, "string");
404 return TCL_ERROR;
405 }
406 string = Tcl_GetStringFromObj(objv[1], &n);
407 n += 3;
408 decoded = ns_malloc((size_t)n);
409 n = <a href="/cvs/aolserver/aolserver/nsd/uuencode.c#A_Ns_HtuuDecode">Ns_HtuuDecode</a>(string, (unsigned char *) decoded, n);
410 decoded[n] = '\0';
411 Tcl_SetResult(interp, decoded, (Tcl_FreeProc *) ns_free);
412 return TCL_OK;
413 }
414
415
416 /*
417 *----------------------------------------------------------------------
418 *
419 * <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclTimeObjCmd">NsTclTimeObjCmd</a> --
420 *
421 * Implements ns_time.
422 *
423 * Results:
424 * Tcl result.
425 *
426 * Side effects:
427 * See docs.
428 *
429 *----------------------------------------------------------------------
430 */
431
432 int
433 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclTimeObjCmd">NsTclTimeObjCmd</a>(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv)
434 {
435 Ns_Time result, t1, t2;
436 static CONST char *opts[] = {
437 "adjust", "diff", "get", "incr", "make", "seconds",
438 "microseconds", NULL
439 };
440 enum {
441 TAdjustIdx, TDiffIdx, TGetIdx, TIncrIdx, TMakeIdx,
442 TSecondsIdx, TMicroSecondsIdx
443 } _nsmayalias opt;
444
445 if (objc < 2) {
446 Tcl_SetLongObj(Tcl_GetObjResult(interp), time(NULL));
447 } else {
448 if (Tcl_GetIndexFromObj(interp, objv[1], opts, "option", 0,
449 (int *) &opt) != TCL_OK) {
450 return TCL_ERROR;
451 }
452 switch (opt) {
453 case TGetIdx:
454 Ns_GetTime(&result);
455 break;
456
457 case TMakeIdx:
458 if (objc != 3 && objc != 4) {
459 Tcl_WrongNumArgs(interp, 2, objv, "sec ?usec?");
460 return TCL_ERROR;
461 }
462 if (Tcl_GetLongFromObj(interp, objv[2], &result.sec) != TCL_OK) {
463 return TCL_ERROR;
464 }
465 if (objc == 3) {
466 result.usec = 0;
467 } else if (Tcl_GetLongFromObj(interp, objv[3], &result.usec) != TCL_OK) {
468 return TCL_ERROR;
469 }
470 break;
471
472 case TIncrIdx:
473 if (objc != 4 && objc != 5) {
474 Tcl_WrongNumArgs(interp, 2, objv, "time sec ?usec?");
475 return TCL_ERROR;
476 }
477 if (<a href="/cvs/aolserver/aolserver/nsd/tclobj.c#A_Ns_TclGetTimeFromObj">Ns_TclGetTimeFromObj</a>(interp, objv[2], &result) != TCL_OK ||
478 Tcl_GetLongFromObj(interp, objv[3], &t2.sec) != TCL_OK) {
479 return TCL_ERROR;
480 }
481 if (objc == 4) {
482 t2.usec = 0;
483 } else if (Tcl_GetLongFromObj(interp, objv[4], &t2.usec) != TCL_OK) {
484 return TCL_ERROR;
485 }
486 Ns_IncrTime(&result, t2.sec, t2.usec);
487 break;
488
489 case TDiffIdx:
490 if (objc != 4) {
491 Tcl_WrongNumArgs(interp, 2, objv, "time1 time2");
492 return TCL_ERROR;
493 }
494 if (<a href="/cvs/aolserver/aolserver/nsd/tclobj.c#A_Ns_TclGetTimeFromObj">Ns_TclGetTimeFromObj</a>(interp, objv[2], &t1) != TCL_OK ||
495 <a href="/cvs/aolserver/aolserver/nsd/tclobj.c#A_Ns_TclGetTimeFromObj">Ns_TclGetTimeFromObj</a>(interp, objv[3], &t2) != TCL_OK) {
496 return TCL_ERROR;
497 }
498 Ns_DiffTime(&t1, &t2, &result);
499 break;
500
501 case TAdjustIdx:
502 if (objc != 3) {
503 Tcl_WrongNumArgs(interp, 2, objv, "time");
504 return TCL_ERROR;
505 }
506 if (<a href="/cvs/aolserver/aolserver/nsd/tclobj.c#A_Ns_TclGetTimeFromObj">Ns_TclGetTimeFromObj</a>(interp, objv[2], &result) != TCL_OK) {
507 return TCL_ERROR;
508 }
509 Ns_AdjTime(&result);
510 break;
511
512 case TSecondsIdx:
513 case TMicroSecondsIdx:
514 if (objc != 3) {
515 Tcl_WrongNumArgs(interp, 2, objv, "time");
516 return TCL_ERROR;
517 }
518 if (<a href="/cvs/aolserver/aolserver/nsd/tclobj.c#A_Ns_TclGetTimeFromObj">Ns_TclGetTimeFromObj</a>(interp, objv[2], &result) != TCL_OK) {
519 return TCL_ERROR;
520 }
521 Tcl_SetLongObj(Tcl_GetObjResult(interp),
522 opt == TSecondsIdx ? result.sec : result.usec);
523 return TCL_OK;
524 break;
525 }
526 <a href="/cvs/aolserver/aolserver/nsd/tclobj.c#A_Ns_TclSetTimeObj">Ns_TclSetTimeObj</a>(Tcl_GetObjResult(interp), &result);
527 }
528 return TCL_OK;
529 }
530
531
532 /*
533 *----------------------------------------------------------------------
534 *
535 * <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclStrftimeObjCmd">NsTclStrftimeObjCmd</a> --
536 *
537 * Implements ns_fmttime.
538 *
539 * Results:
540 * Tcl result.
541 *
542 * Side effects:
543 * See docs.
544 *
545 *----------------------------------------------------------------------
546 */
547
548 int
549 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclStrftimeObjCmd">NsTclStrftimeObjCmd</a>(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv)
550 {
551 char *fmt, buf[200];
552 time_t time;
553
554 if (objc != 2 && objc != 3) {
555 Tcl_WrongNumArgs(interp, 1, objv, "time ?fmt?");
556 return TCL_ERROR;
557 }
558 if (Tcl_GetLongFromObj(interp, objv[1], &time) != TCL_OK) {
559 return TCL_ERROR;
560 }
561 if (objc > 2) {
562 fmt = Tcl_GetString(objv[2]);
563 } else {
564 fmt = "%c";
565 }
566 if (strftime(buf, sizeof(buf), fmt, ns_localtime(&time)) == 0) {
567 Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "invalid time: ",
568 Tcl_GetString(objv[1]), NULL);
569 return TCL_ERROR;
570 }
571 Tcl_SetResult(interp, buf, TCL_VOLATILE);
572 return TCL_OK;
573 }
574
575
576 /*
577 *----------------------------------------------------------------------
578 *
579 * <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclCrashCmd">NsTclCrashCmd</a> --
580 *
581 * Crash the server to test exception handling.
582 *
583 * Results:
584 * None.
585 *
586 * Side effects:
587 * Server will segfault.
588 *
589 *----------------------------------------------------------------------
590 */
591
592 int
593 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_NsTclCrashCmd">NsTclCrashCmd</a>(ClientData dummy, Tcl_Interp *interp, int argc, char **argv)
594 {
595 char *death;
596
597 death = NULL;
598 *death = 1;
599
600 return TCL_ERROR;
601 }
602
603
604 /*
605 *----------------------------------------------------------------------
606 *
607 * NsTclGetNative --
608 *
609 * Gets a string from a Tcl_Obj in the system encoding, suitable
610 * for passing to system calls
611 *
612 * Results:
613 * native string
614 *
615 * Side effects:
616 * Memory is allocated. Caller should free result
617 *
618 *----------------------------------------------------------------------
619 */
620
621 char *
622 NsTclGetNative(Tcl_Obj *objPtr)
623 {
624 Tcl_DString ds;
625 char *encoded, *native;
626 int len;
627 encoded=Tcl_GetStringFromObj(objPtr, &len);
628 native=ns_strdup(Tcl_UtfToExternalDString(NULL,encoded,len,&ds));
629 Tcl_DStringFree(&ds);
630 return native;
631 }
632
633
634
635 /*
636 *----------------------------------------------------------------------
637 *
638 * <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_WordEndsInSemi">WordEndsInSemi</a> --
639 *
640 * Does this word end in a semicolon or a space?
641 *
642 * Results:
643 * 1 if semi, 0 if space.
644 *
645 * Side effects:
646 * Undefined behavior if string does not end in null
647 *
648 *----------------------------------------------------------------------
649 */
650
651 static int
652 <a href="/cvs/aolserver/aolserver/nsd/tclmisc.c#A_WordEndsInSemi">WordEndsInSemi</a>(char *ip)
653 {
654 if (ip == NULL) {
655 return 0;
656 }
657 /* advance past the first '&' so we can check for a second
658 (i.e. to handle "ben&jerry&nbsp;")
659 */
660 if (*ip == '&') {
661 ip++;
662 }
663 while((*ip != '\0') && (*ip != ' ') && (*ip != ';') && (*ip != '&')) {
664 ip++;
665 }
666 if (*ip == ';') {
667 return 1;
668 } else {
669 return 0;
670 }
671 }