|
|
1.1 ! root 1: [ MH-patches - Tue Jul 18 00:47:38 1989 - WP patches to MH - /mtr ] ! 2: ! 3: ! 4: Here are patches to MH 6.5 to allow send/whom to expand names into addresses. ! 5: ! 6: The user specifies a name by bracketing a WhitePages query between ! 7: '<<' and '>>' using fred's whois syntax, e.g., ! 8: ! 9: To: << rose -org nyser >> ! 10: ! 11: At the "What now?" prompt, the user can say "whom" to have the ! 12: names expanded into addresses. Alternately, the "send" option can ! 13: be used as well. For each query appearing between '<<' and '>>', ! 14: fred will be asked to perform a white pages resolution. All ! 15: matches are printed and the user is asked to select one. If one is ! 16: not selected, the user remains with fred, to make more queries, ! 17: until eventually one is selected (or the user exits fred to abort ! 18: the expansion process). ! 19: ! 20: Note that expansion can occur only if whom/send is invoked ! 21: interactively. If you use push, then the expansion will fail ! 22: because fred will be unable to query you to select/confirm the ! 23: right entry to use for the substitution. ! 24: ! 25: To enable these patches, add "options WP" to your MH config file, ! 26: run mhconfig, apply the patches, and then do "make" from the ! 27: top-level. Note that this code has only been tested with ! 28: ! 29: #undef BERK ! 30: ! 31: in effect. I believe that it should work okay, but since I don't ! 32: run with BERK defined, I have no way of knowing. ! 33: ! 34: /mtr ! 35: diff -c sbr/*addrsbr.c ! 36: diff -c uip/_post.c uip/post.c ! 37: diff -c uip/*whom.c ! 38: diff -c uip/*whatnowsbr.c ! 39: diff -c zotnet/mf/*mf.c ! 40: *** sbr/:addrsbr.c Mon Oct 30 17:22:49 1989 ! 41: --- sbr/addrsbr.c Sat Nov 4 22:18:39 1989 ! 42: *************** ! 43: *** 103,108 **** ! 44: --- 103,117 ---- ! 45: ! 46: char *getusr (); ! 47: ! 48: + ! 49: + #ifdef WP ! 50: + int do_wp = 0; ! 51: + ! 52: + #ifdef BERK ! 53: + char *wp_expand (); ! 54: + #endif ! 55: + #endif ! 56: + ! 57: /* */ ! 58: ! 59: char *getname (addrs) ! 60: *************** ! 61: *** 171,176 **** ! 62: --- 180,214 ---- ! 63: while ( (c = *addrs++) == ',' || isspace(c)) ! 64: ; ! 65: ! 66: + #ifdef WP ! 67: + if (do_wp && c == '<' && *addrs == '<') { ! 68: + register char *cp, ! 69: + *dp, ! 70: + *ep; ! 71: + ! 72: + if (cp = index (++addrs, '>')) { ! 73: + *++cp = NULL; ! 74: + if (dp = wp_expand (addrs, NULLCP)) { ! 75: + *(addrs - 1) = NULL; ! 76: + ep = concat (saved_addr, dp, cp, NULLCP); ! 77: + addrs = ep + strlen (saved_addr); ! 78: + while ((c = *addrs++) == ',' || isspace (c)) ! 79: + continue; ! 80: + free (saved_addr); ! 81: + saved_addr = ep; ! 82: + free (dp); ! 83: + } ! 84: + else { ! 85: + err = "unable to expand WhitePages query"; ! 86: + (void) strcpy (adrtext, addrs); ! 87: + addrs = cp; ! 88: + goto out; ! 89: + } ! 90: + ! 91: + } ! 92: + } ! 93: + #endif ! 94: + ! 95: *nxtout = *adrcopy = '\0'; ! 96: while (state != EOA) { ! 97: *adrcopy++ = c; ! 98: *************** ! 99: *** 267,280 **** ! 100: * addr points to where we should start scanning next time. ! 101: */ ! 102: *(nxtout-1) = *(adrcopy-1) = '\0'; ! 103: if (*adr && !err) { ! 104: adr_ptr = addrs-1; ! 105: - return adrtext; ! 106: } else { ! 107: free (saved_addr); ! 108: adr_ptr = NULL; ! 109: - return NULL; ! 110: } ! 111: #else not BERK ! 112: register struct adrx *ap; ! 113: ! 114: --- 305,320 ---- ! 115: * addr points to where we should start scanning next time. ! 116: */ ! 117: *(nxtout-1) = *(adrcopy-1) = '\0'; ! 118: + #ifdef WP ! 119: + out: ; ! 120: + #endif ! 121: if (*adr && !err) { ! 122: adr_ptr = addrs-1; ! 123: } else { ! 124: free (saved_addr); ! 125: adr_ptr = NULL; ! 126: } ! 127: + return adrtext; ! 128: #else not BERK ! 129: register struct adrx *ap; ! 130: ! 131: *************** ! 132: *** 825,827 **** ! 133: --- 865,1013 ---- ! 134: ! 135: return 0; ! 136: } ! 137: + ! 138: + /* */ ! 139: + ! 140: + #ifdef WP ! 141: + #include <signal.h> ! 142: + ! 143: + ! 144: + static char *fredproc = NULL; ! 145: + ! 146: + ! 147: + char *wp_expand (query, error) ! 148: + char *query, ! 149: + *error; ! 150: + { ! 151: + register int cc, ! 152: + i, ! 153: + vecp; ! 154: + int (*istat) (), (*qstat) (), (*pstat) (); ! 155: + register char *bp, ! 156: + *cp; ! 157: + char *ep, ! 158: + buffer[BUFSIZ], ! 159: + fds[10], ! 160: + *vec[10]; ! 161: + static int child_id = NOTOK, ! 162: + pdi[2], ! 163: + pdo[2]; ! 164: + ! 165: + if (error) ! 166: + (void) strcpy (error, "unable to expand WhitePages query: "); ! 167: + ! 168: + if (child_id == NOTOK || kill (child_id, 0) == NOTOK) { ! 169: + if (!isatty (fileno (stdout))) { ! 170: + if (error) ! 171: + (void) strcat (error, "not a tty"); ! 172: + return NULLCP; ! 173: + } ! 174: + ! 175: + if (fredproc == NULL && (fredproc = m_find ("fredproc")) == NULL) ! 176: + fredproc = "fred"; ! 177: + ! 178: + if (pipe (pdi) == NOTOK) { ! 179: + if (error) ! 180: + (void) strcat (error, "unable to pipe"); ! 181: + ! 182: + return NULLCP; ! 183: + } ! 184: + ! 185: + if (pipe (pdo) == NOTOK) { ! 186: + if (error) ! 187: + (void) strcat (error, "unable to pipe"); ! 188: + ! 189: + losing: ; ! 190: + (void) close (pdi[0]); ! 191: + (void) close (pdi[1]); ! 192: + return NULLCP; ! 193: + } ! 194: + ! 195: + for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++) ! 196: + sleep (5); ! 197: + ! 198: + switch (child_id) { ! 199: + case NOTOK: ! 200: + if (error) ! 201: + (void) strcat (error, "unable to fork"); ! 202: + ! 203: + (void) close (pdo[0]); ! 204: + (void) close (pdo[1]); ! 205: + goto losing; ! 206: + ! 207: + case OK: ! 208: + (void) close (pdi[0]); ! 209: + (void) close (pdo[1]); ! 210: + (void) sprintf (fds, "%d %d", pdo[0], pdi[1]); ! 211: + vecp = 0; ! 212: + vec[vecp++] = r1bindex (fredproc, '/'); ! 213: + vec[vecp++] = "-q"; ! 214: + vec[vecp++] = fds; ! 215: + vec[vecp] = NULL; ! 216: + execvp (fredproc, vec); ! 217: + _exit (-1); /* NOTREACHED */ ! 218: + ! 219: + default: ! 220: + (void) close (pdi[1]); ! 221: + (void) close (pdo[0]); ! 222: + break; ! 223: + } ! 224: + } ! 225: + ! 226: + istat = signal (SIGINT, SIG_IGN); ! 227: + qstat = signal (SIGQUIT, SIG_IGN); ! 228: + ! 229: + pstat = signal (SIGPIPE, SIG_IGN); ! 230: + ! 231: + (void) sprintf (buffer, "%s\n", query); ! 232: + cc = write (pdo[1], buffer, i = strlen (buffer)); ! 233: + ! 234: + (void) signal (SIGPIPE, pstat); ! 235: + ! 236: + if (cc != i) { ! 237: + if (error) ! 238: + (void) strcat (error, "write to pipe failed"); ! 239: + ! 240: + lost_child: ; ! 241: + (void) kill (child_id, SIGTERM); ! 242: + (void) close (pdi[0]); ! 243: + (void) close (pdo[1]); ! 244: + ! 245: + child_id = NOTOK; ! 246: + return NULLCP; ! 247: + } ! 248: + ! 249: + for (ep = (bp = buffer) + sizeof buffer - 1; ! 250: + (i = read (pdi[0], bp, ep - bp)) > 0; ) { ! 251: + for (cp = bp + i; bp < cp; bp++) ! 252: + if (*bp == '\n') ! 253: + break; ! 254: + if (bp < cp) ! 255: + break; ! 256: + } ! 257: + ! 258: + (void) signal (SIGINT, istat); ! 259: + (void) signal (SIGQUIT, qstat); ! 260: + ! 261: + if (i == NOTOK) { ! 262: + if (error) ! 263: + (void) strcat (error, "read from pipe failed"); ! 264: + goto lost_child; ! 265: + } ! 266: + if (i == 0) { ! 267: + if (error) ! 268: + (void) sprintf (error + strlen (error), "%s exited prematurely", ! 269: + fredproc); ! 270: + goto lost_child; ! 271: + } ! 272: + *bp = NULL; ! 273: + ! 274: + if (error) ! 275: + if (bp != buffer) ! 276: + error[0] = NULL; ! 277: + else ! 278: + (void) strcpy (error, "unable to expand WhitePages query"); ! 279: + ! 280: + return (*buffer ? getcpy (buffer) : NULLCP); ! 281: + } ! 282: + #endif ! 283: *** uip/_post.c Mon Oct 30 17:22:54 1989 ! 284: --- uip/post.c Tue Aug 8 20:28:58 1989 ! 285: *************** ! 286: *** 91,97 **** ! 287: #define NWATCSW 17 ! 288: "nowatch", 0, ! 289: ! 290: ! #define WHOMSW 18 /* interface from whom */ ! 291: "whom", -4, ! 292: ! 293: #define WIDTHSW 19 ! 294: --- 91,97 ---- ! 295: #define NWATCSW 17 ! 296: "nowatch", 0, ! 297: ! 298: ! #define WHOMSW 18 /* interface from whom */ ! 299: "whom", -4, ! 300: ! 301: #define WIDTHSW 19 ! 302: *************** ! 303: *** 122,127 **** ! 304: --- 122,130 ---- ! 305: #define SNOOPSW 29 ! 306: "snoop", -5, ! 307: ! 308: + #define FILLSW 30 ! 309: + "fill-in file", -7, ! 310: + ! 311: NULL, NULL ! 312: }; ! 313: ! 314: *************** ! 315: *** 284,289 **** ! 316: --- 287,298 ---- ! 317: static int encryptsw = 0; /* encrypt it */ ! 318: ! 319: ! 320: + #ifdef WP ! 321: + extern int do_wp; /* fill-in white pages queries */ ! 322: + #endif ! 323: + static char *fill_in = NULLCP; ! 324: + ! 325: + ! 326: long lseek (), time (); ! 327: ! 328: /* MAIN */ ! 329: *************** ! 330: *** 486,491 **** ! 331: --- 495,507 ---- ! 332: snoop++; ! 333: continue; ! 334: #endif SENDMTS ! 335: + ! 336: + case FILLSW: ! 337: + #ifdef WP ! 338: + if (!(fill_in = *argp++) || *fill_in == '-') ! 339: + adios (NULLCP, "missing argument to %s", argp[-2]); ! 340: + #endif ! 341: + continue; ! 342: } ! 343: if (msg) ! 344: adios (NULLCP, "only one message at a time!"); ! 345: *************** ! 346: *** 494,499 **** ! 347: --- 510,518 ---- ! 348: } ! 349: ! 350: (void) alias (AliasFile); ! 351: + #ifdef WP ! 352: + do_wp++; ! 353: + #endif ! 354: ! 355: /* */ ! 356: ! 357: *************** ! 358: *** 534,540 **** ! 359: else ! 360: #endif MHMTS ! 361: if (whomsw) { ! 362: ! if ((out = fopen ("/dev/null", "w")) == NULL) ! 363: adios ("/dev/null", "unable to open"); ! 364: } ! 365: else { ! 366: --- 553,559 ---- ! 367: else ! 368: #endif MHMTS ! 369: if (whomsw) { ! 370: ! if ((out = fopen (fill_in ? fill_in : "/dev/null", "w")) == NULL) ! 371: adios ("/dev/null", "unable to open"); ! 372: } ! 373: else { ! 374: *************** ! 375: *** 575,581 **** ! 376: case BODY: ! 377: case BODYEOF: ! 378: finish_headers (out); ! 379: ! if (whomsw) ! 380: break; ! 381: fprintf (out, "\n%s", buf); ! 382: while (state == BODY) { ! 383: --- 594,600 ---- ! 384: case BODY: ! 385: case BODYEOF: ! 386: finish_headers (out); ! 387: ! if (whomsw && !fill_in) ! 388: break; ! 389: fprintf (out, "\n%s", buf); ! 390: while (state == BODY) { ! 391: *************** ! 392: *** 699,709 **** ! 393: } ! 394: ! 395: hdr = &hdrtab[i]; ! 396: ! if (hdr -> flags & HIGN) ! 397: return; ! 398: if (hdr -> flags & HBAD) { ! 399: ! advise (NULLCP, "illegal header line -- %s:", name); ! 400: ! badmsg++; ! 401: return; ! 402: } ! 403: msgflags |= (hdr -> set & ~(MVIS | MINV)); ! 404: --- 718,735 ---- ! 405: } ! 406: ! 407: hdr = &hdrtab[i]; ! 408: ! if (hdr -> flags & HIGN) { ! 409: ! if (fill_in) ! 410: ! fprintf (out, "%s: %s", name, str); ! 411: return; ! 412: + } ! 413: if (hdr -> flags & HBAD) { ! 414: ! if (fill_in) ! 415: ! fprintf (out, "%s: %s", name, str); ! 416: ! else { ! 417: ! advise (NULLCP, "illegal header line -- %s:", name); ! 418: ! badmsg++; ! 419: ! } ! 420: return; ! 421: } ! 422: msgflags |= (hdr -> set & ~(MVIS | MINV)); ! 423: *************** ! 424: *** 711,716 **** ! 425: --- 737,747 ---- ! 426: if (hdr -> flags & HSUB) ! 427: subject = subject ? add (str, add ("\t", subject)) : getcpy (str); ! 428: if (hdr -> flags & HFCC) { ! 429: + if (fill_in) { ! 430: + fprintf (out, "%s: %s", name, str); ! 431: + return; ! 432: + } ! 433: + ! 434: if (cp = rindex (str, '\n')) ! 435: *cp = NULL; ! 436: for (cp = pp = str; cp = index (pp, ','); pp = cp) { ! 437: *************** ! 438: *** 759,765 **** ! 439: ! 440: nameoutput = linepos = 0; ! 441: (void) sprintf (namep, "%s%s", ! 442: ! (hdr -> flags & HMNG) ? "Original-" : "", name); ! 443: ! 444: for (grp = 0, mp = tmpaddrs.m_next; mp; mp = np) ! 445: if (mp -> m_nohost) { /* also used to test (hdr -> flags & HTRY) */ ! 446: --- 790,797 ---- ! 447: ! 448: nameoutput = linepos = 0; ! 449: (void) sprintf (namep, "%s%s", ! 450: ! !fill_in && (hdr -> flags & HMNG) ? "Original-" : "", ! 451: ! name); ! 452: ! 453: for (grp = 0, mp = tmpaddrs.m_next; mp; mp = np) ! 454: if (mp -> m_nohost) { /* also used to test (hdr -> flags & HTRY) */ ! 455: *************** ! 456: *** 810,817 **** ! 457: advise (NULLCP, "%s: field does not allow groups", name); ! 458: badmsg++; ! 459: } ! 460: ! if (linepos) ! 461: (void) putc ('\n', out); ! 462: } ! 463: ! 464: /* */ ! 465: --- 842,852 ---- ! 466: advise (NULLCP, "%s: field does not allow groups", name); ! 467: badmsg++; ! 468: } ! 469: ! if (linepos) { ! 470: ! if (fill_in && grp > 0) ! 471: ! (void) putc (';', out); ! 472: (void) putc ('\n', out); ! 473: + } ! 474: } ! 475: ! 476: /* */ ! 477: *************** ! 478: *** 942,948 **** ! 479: ! 480: if (mp -> m_mbox == NULL || ((flags & HTRY) && !insert (mp))) ! 481: return 0; ! 482: ! if ((flags & HBCC) || mp -> m_ingrp) ! 483: return 1; ! 484: ! 485: if (!nameoutput) { ! 486: --- 977,983 ---- ! 487: ! 488: if (mp -> m_mbox == NULL || ((flags & HTRY) && !insert (mp))) ! 489: return 0; ! 490: ! if (!fill_in && ((flags & HBCC) || mp -> m_ingrp)) ! 491: return 1; ! 492: ! 493: if (!nameoutput) { ! 494: *************** ! 495: *** 953,959 **** ! 496: if (*aka && mp -> m_type != UUCPHOST && !mp -> m_pers) ! 497: mp -> m_pers = getcpy (aka); ! 498: if (format) { ! 499: ! if (mp -> m_gname) ! 500: (void) sprintf (cp = buffer, "%s;", mp -> m_gname); ! 501: else ! 502: cp = adrformat (mp); ! 503: --- 988,994 ---- ! 504: if (*aka && mp -> m_type != UUCPHOST && !mp -> m_pers) ! 505: mp -> m_pers = getcpy (aka); ! 506: if (format) { ! 507: ! if (mp -> m_gname && !fill_in) ! 508: (void) sprintf (cp = buffer, "%s;", mp -> m_gname); ! 509: else ! 510: cp = adrformat (mp); ! 511: *************** ! 512: *** 987,1004 **** ! 513: int len; ! 514: char *cp; ! 515: ! 516: ! if (flags & HBCC) ! 517: return; ! 518: ! 519: if (!nameoutput) { ! 520: fprintf (out, "%s: ", name); ! 521: linepos += (nameoutput = strlen (name) + 2); ! 522: } ! 523: ! 524: ! cp = concat (group, ";", NULLCP); ! 525: len = strlen (cp); ! 526: ! 527: ! if (linepos != nameoutput) ! 528: if (len + linepos + 2 > outputlinelen) { ! 529: fprintf (out, ",\n%*s", nameoutput, ""); ! 530: linepos = nameoutput; ! 531: --- 1022,1041 ---- ! 532: int len; ! 533: char *cp; ! 534: ! 535: ! if (!fill_in && (flags & HBCC)) ! 536: return; ! 537: ! 538: if (!nameoutput) { ! 539: fprintf (out, "%s: ", name); ! 540: linepos += (nameoutput = strlen (name) + 2); ! 541: + if (fill_in) ! 542: + linepos -= strlen (group); ! 543: } ! 544: ! 545: ! cp = fill_in ? group : concat (group, ";", NULLCP); ! 546: len = strlen (cp); ! 547: ! 548: ! if (linepos > nameoutput) ! 549: if (len + linepos + 2 > outputlinelen) { ! 550: fprintf (out, ",\n%*s", nameoutput, ""); ! 551: linepos = nameoutput; ! 552: *** uip/_whom.c Mon Oct 30 17:22:52 1989 ! 553: --- uip/whom.c Mon Jul 17 09:22:31 1989 ! 554: *************** ! 555: *** 35,40 **** ! 556: --- 35,43 ---- ! 557: #define SNOOPSW 10 ! 558: "snoop", -5, ! 559: ! 560: + #define FILLSW 11 ! 561: + "fill-in file", -7, ! 562: + ! 563: NULL, NULL ! 564: }; ! 565: ! 566: *************** ! 567: *** 125,130 **** ! 568: --- 128,134 ---- ! 569: case ALIASW: ! 570: case CLIESW: ! 571: case SERVSW: ! 572: + case FILLSW: ! 573: vec[vecp++] = --cp; ! 574: if (!(cp = *argp++) || *cp == '-') ! 575: adios (NULLCP, "missing argument to %s", argp[-2]); ! 576: *** uip/_whatnowsbr.c Mon Oct 30 17:22:57 1989 ! 577: --- uip/whatnowsbr.c Mon Jul 17 12:04:19 1989 ! 578: *************** ! 579: *** 758,764 **** ! 580: --- 758,773 ---- ! 581: int pid; ! 582: register int vecp; ! 583: char *vec[MAXARGS]; ! 584: + #ifdef WP ! 585: + char *cp, ! 586: + draft[BUFSIZ], ! 587: + backup[BUFSIZ]; ! 588: + #endif ! 589: ! 590: + #ifdef WP ! 591: + (void) strcpy (draft, m_scratch (file, invo_name)); ! 592: + #endif ! 593: + ! 594: m_update (); ! 595: (void) fflush (stdout); ! 596: ! 597: *************** ! 598: *** 774,779 **** ! 599: --- 783,792 ---- ! 600: if (arg) ! 601: while (*arg) ! 602: vec[vecp++] = *arg++; ! 603: + #ifdef WP ! 604: + vec[vecp++] = "-fill-in"; ! 605: + vec[vecp++] = draft; ! 606: + #endif ! 607: vec[vecp] = NULL; ! 608: ! 609: execvp (whomproc, vec); ! 610: *************** ! 611: *** 782,787 **** ! 612: --- 795,822 ---- ! 613: _exit (-1); /* NOTREACHED */ ! 614: ! 615: default: ! 616: + #ifndef WP ! 617: return (pidwait (pid, NOTOK) & 0377 ? 1 : 0); ! 618: + #else ! 619: + if (pidwait (pid, NOTOK)) { ! 620: + (void) unlink (draft); ! 621: + return 1; ! 622: + } ! 623: + break; ! 624: + #endif ! 625: } ! 626: + ! 627: + #ifdef WP ! 628: + if (rename (file, cp = m_backup (file)) == NOTOK) { ! 629: + advise (cp, "unable to rename %s to", file); ! 630: + (void) unlink (draft); ! 631: + return 1; ! 632: + } ! 633: + if (rename (draft, file) == NOTOK) { ! 634: + advise (file, "unable to rename %s to ", draft); ! 635: + return 1; ! 636: + } ! 637: + ! 638: + return 0; ! 639: + #endif ! 640: } ! 641: *** zotnet/mf/_mf.c Mon Oct 30 17:22:59 1989 ! 642: --- zotnet/mf/mf.c Mon Oct 30 20:32:38 1989 ! 643: *************** ! 644: *** 298,303 **** ! 645: --- 298,306 ---- ! 646: ! 647: #define QUOTE '\\' ! 648: ! 649: + #ifdef WP ! 650: + #define LX_WP (-1) ! 651: + #endif ! 652: #define LX_END 0 ! 653: #define LX_ERR 1 ! 654: #define LX_ATOM 2 ! 655: *************** ! 656: *** 351,361 **** ! 657: --- 354,375 ---- ! 658: ! 659: static struct adrx adrxs2; ! 660: ! 661: + ! 662: + #ifdef WP ! 663: + char *concat (); ! 664: + ! 665: + extern int do_wp; ! 666: + char *wp_expand (); ! 667: + #endif ! 668: + ! 669: /* */ ! 670: ! 671: struct adrx *getadrx (addrs) ! 672: register char *addrs; ! 673: { ! 674: + #ifdef WP ! 675: + int save_lex; ! 676: + #endif ! 677: register char *bp; ! 678: register struct adrx *adrxp = &adrxs2; ! 679: ! 680: *************** ! 681: *** 385,390 **** ! 682: --- 399,427 ---- ! 683: return NULL; ! 684: } ! 685: ! 686: + #ifdef WP ! 687: + bp = cp, save_lex = last_lex; ! 688: + if (my_lex (adr) == LX_WP) { ! 689: + register char *ep, ! 690: + *fp; ! 691: + ! 692: + if (fp = wp_expand (adr, err)) { ! 693: + *bp = NULL; ! 694: + ep = concat (dp, fp, cp, (char *) NULL); ! 695: + cp = ep + strlen (dp), last_lex = save_lex; ! 696: + free (dp); ! 697: + dp = ep; ! 698: + free (fp); ! 699: + } ! 700: + else { ! 701: + ap = bp, save_lex = last_lex; ! 702: + goto out; ! 703: + } ! 704: + } ! 705: + else ! 706: + cp = bp, last_lex = save_lex; ! 707: + #endif ! 708: + ! 709: switch (parse_address ()) { ! 710: case DONE: ! 711: free (dp); ! 712: *************** ! 713: *** 409,414 **** ! 714: --- 446,454 ---- ! 715: break; ! 716: } ! 717: ! 718: + #ifdef WP ! 719: + out: ; ! 720: + #endif ! 721: if (err[0]) ! 722: for (;;) { ! 723: switch (last_lex) { ! 724: *************** ! 725: *** 798,803 **** ! 726: --- 838,858 ---- ! 727: cp = NULL; ! 728: return (last_lex = LX_END); ! 729: } ! 730: + ! 731: + #ifdef WP ! 732: + if (do_wp && c == '<' && *cp == '<') ! 733: + for (cp++;;) ! 734: + switch (c = *cp++) { ! 735: + case '>': ! 736: + *bp = NULL; ! 737: + cp++; ! 738: + return (last_lex = LX_WP); ! 739: + ! 740: + default: ! 741: + *bp++ = c; ! 742: + continue; ! 743: + } ! 744: + #endif ! 745: ! 746: if (c == '(') ! 747: for (*bp++ = c, i = 0;;)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.