|
|
1.1 ! root 1: /* ! 2: * diction -- print all sentences containing one of default phrases ! 3: * ! 4: * status returns: ! 5: * 0 - ok, and some matches ! 6: * 1 - ok, but no matches ! 7: * 2 - some error ! 8: */ ! 9: ! 10: #include <stdio.h> ! 11: #include <ctype.h> ! 12: ! 13: #define MAXSIZ 6500 ! 14: #define QSIZE 1000 ! 15: #define DICT "" ! 16: int linemsg; ! 17: long olcount; ! 18: long lcount; ! 19: struct words { ! 20: char inp; ! 21: char out; ! 22: struct words *nst; ! 23: struct words *link; ! 24: struct words *fail; ! 25: } w[MAXSIZ], *smax, *q; ! 26: ! 27: char table[128] = { ! 28: 0, 0, 0, 0, 0, 0, 0, 0, ! 29: 0, 0, ' ', 0, 0, 0, 0, 0, ! 30: 0, 0, 0, 0, 0, 0, 0, 0, ! 31: 0, 0, 0, 0, 0, 0, 0, 0, ! 32: ' ', '.', ' ', ' ', '$', '%', '&', '\'', ! 33: '(', ')', '*', '+', ' ', '-', '.', '/', ! 34: '0', '1', '2', '3', '4', '5', '6', '7', ! 35: '8', '9', ':', ' ', ' ', '=', ' ', '?', ! 36: ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', ! 37: 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', ! 38: 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', ! 39: 'x', 'y', 'z', ' ', '\\', ' ', '^', '_', ! 40: ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', ! 41: 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', ! 42: 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', ! 43: 'x', 'y', 'z', '{', ' ', '}', ' ', ' ' ! 44: }; ! 45: int caps = 0; ! 46: int lineno = 1; ! 47: int fflag= 0; ! 48: int nflag = 0; /*use default file*/ ! 49: char *filename; ! 50: int mflg = 0; /*don't catch output*/ ! 51: int nfile; ! 52: int nsucc; ! 53: long nsent = 0; ! 54: long nhits = 0; ! 55: char *nlp; ! 56: char *begp, *endp; ! 57: int beg, last; ! 58: char *myst; ! 59: int myct = 0; ! 60: int oct = 0; ! 61: FILE *wordf; ! 62: FILE *mine; ! 63: FILE *fl; ! 64: char *listn; ! 65: int list = 0; ! 66: char *argptr; ! 67: long tl = 0; ! 68: long th = 0; ! 69: ! 70: main(argc, argv) ! 71: char *argv[]; ! 72: { ! 73: int sv; ! 74: char cc; ! 75: while (--argc > 0 && (++argv)[0][0]=='-') ! 76: switch (argv[0][1]) { ! 77: ! 78: case 'f': ! 79: fflag++; ! 80: filename = (++argv)[0]; ! 81: argc--; ! 82: continue; ! 83: ! 84: case 'n': ! 85: nflag = 0; ! 86: continue; ! 87: case 'd': ! 88: mflg=0; ! 89: continue; ! 90: case 'c': ! 91: caps++; ! 92: continue; ! 93: case 'l': ! 94: lineno++; ! 95: continue; ! 96: case 'A': /* for acro */ ! 97: for(cc='A';cc<='Z';cc++) ! 98: table[cc] = cc; ! 99: continue; ! 100: case 'o': /*to put hits to file*/ ! 101: listn = (++argv)[0]; ! 102: argc--; ! 103: list++; ! 104: if((fl=fopen(listn,"w"))== NULL){ ! 105: fprintf(stderr,"diction: can't open file %s\n", ! 106: listn); ! 107: exit(2); ! 108: } ! 109: continue; ! 110: default: ! 111: fprintf(stderr, "diction: unknown flag\n"); ! 112: continue; ! 113: } ! 114: out: ! 115: if(nflag){ ! 116: wordf = fopen(DICT,"r"); ! 117: if(wordf == NULL){ ! 118: fprintf(stderr,"diction: can't open default dictionary\n"); ! 119: exit(2); ! 120: } ! 121: } ! 122: else { ! 123: wordf = fopen(filename,"r"); ! 124: if(wordf == NULL){ ! 125: fprintf(stderr,"diction: can't open %s\n",filename); ! 126: exit(2); ! 127: } ! 128: } ! 129: ! 130: #ifdef CATCH ! 131: if(fopen(CATCH,"r") != NULL){ ! 132: if((mine=fopen(CATCH,"a"))==NULL)mflg=0; ! 133: else mflg = 1; ! 134: } ! 135: #else ! 136: mflg = 0; ! 137: #endif ! 138: #ifdef MACS ! 139: if(caps){ ! 140: printf(".so "); ! 141: printf(MACS); ! 142: printf("\n"); ! 143: } ! 144: #endif ! 145: cgotofn(); ! 146: cfail(); ! 147: nfile = argc; ! 148: if (argc<=0) { ! 149: execute((char *)NULL); ! 150: } ! 151: else while (--argc >= 0) { ! 152: execute(*argv); ! 153: if(lineno){ ! 154: printf("file %s: number of lines %ld number of phrases found %ld\n", ! 155: *argv, lcount-1, nhits); ! 156: tl += lcount-1; ! 157: th += nhits; ! 158: sv = lcount-1; ! 159: lcount = nhits = 0; ! 160: } ! 161: argv++; ! 162: } ! 163: fprintf(stderr,"lcount %ld\n",tl); ! 164: if(mflg)fprintf(mine,"number of sentences %ld %ld number of hits %ld %ld\n",nsent,tl,nhits,th); ! 165: if(!caps&& !lineno)printf("number of sentences %ld number of phrases found %ld\n",nsent,nhits); ! 166: else if(tl != sv) ! 167: if(!caps)printf("totals: number of lines %ld number of phrases found %ld\n",tl,th); ! 168: exit(nsucc == 0); ! 169: } ! 170: ! 171: execute(file) ! 172: char *file; ! 173: { ! 174: register char *p; ! 175: register struct words *c; ! 176: register ccount; ! 177: int count1; ! 178: char *beg1; ! 179: struct words *savc; ! 180: char *savp, *seen; ! 181: int savct; ! 182: int scr; ! 183: char buf[1024]; ! 184: int f; ! 185: int hit; ! 186: last = 0; ! 187: if (file) { ! 188: if ((f = open(file, 0)) < 0) { ! 189: fprintf(stderr, "diction: can't open %s\n", file); ! 190: exit(2); ! 191: } ! 192: } ! 193: else f = 0; ! 194: lcount = olcount = 1; ! 195: linemsg = 1; ! 196: ccount = 0; ! 197: count1 = -1; ! 198: p = buf; ! 199: nlp = p; ! 200: c = w; ! 201: oct = hit = 0; ! 202: savc = (struct words *) 0; ! 203: savp = (char *) 0; ! 204: for (;;) { ! 205: if(--ccount <= 0) { ! 206: if (p == &buf[1024]) p = buf; ! 207: if (p > &buf[512]) { ! 208: if ((ccount = read(f, p, &buf[1024] - p)) <= 0) break; ! 209: } ! 210: else if ((ccount = read(f, p, 512)) <= 0) break; ! 211: if(caps && (count1 > 0)) ! 212: fwrite(beg1,sizeof(*beg1),count1,stdout); ! 213: count1 = ccount; ! 214: beg1 = p; ! 215: } ! 216: if(p == &buf[1024])p=buf; ! 217: nstate: ! 218: if (c->inp == table[*p]) { ! 219: c = c->nst; ! 220: } ! 221: else if (c->link != 0) { ! 222: c = c->link; ! 223: goto nstate; ! 224: } ! 225: else { ! 226: if(savp != 0){ ! 227: c=savc; ! 228: p=savp; ! 229: if(ccount > savct)ccount += savct; ! 230: else ccount = savct; ! 231: savc = (struct words *) 0; ! 232: savp = (char *) 0; ! 233: goto hadone; ! 234: } ! 235: c = c->fail; ! 236: if (c==0) { ! 237: c = w; ! 238: istate: ! 239: if (c->inp == table[*p]) { ! 240: c = c->nst; ! 241: } ! 242: else if (c->link != 0) { ! 243: c = c->link; ! 244: goto istate; ! 245: } ! 246: } ! 247: else goto nstate; ! 248: } ! 249: if(c->out){ ! 250: if((c->inp == table[*(p+1)]) && (c->nst != 0)){ ! 251: savp=p; ! 252: savc=c; ! 253: savct=ccount; ! 254: goto cont; ! 255: } ! 256: else if(c->link != 0){ ! 257: savc=c; ! 258: while((savc=savc->link)!= 0){ ! 259: if(savc->inp == table[*(p+1)]){ ! 260: savp=p; ! 261: savc=c; ! 262: savct=ccount; ! 263: goto cont; ! 264: } ! 265: } ! 266: } ! 267: hadone: ! 268: savc = (struct words *) 0; ! 269: savp = (char *) 0; ! 270: if(c->out == (char)(0377)){ ! 271: c=w; ! 272: goto nstate; ! 273: } ! 274: begp = p - (c->out); ! 275: if(begp < &buf[0])begp = &buf[1024] - (&buf[0]-begp); ! 276: endp=p; ! 277: if(mflg){ ! 278: if(begp-20 < &buf[0]){ ! 279: myst = &buf[1024]-20; ! 280: if(nlp < &buf[512])myst=nlp; ! 281: } ! 282: else myst = begp-20; ! 283: if(myst < nlp)myst = nlp; ! 284: beg = 0; ! 285: } ! 286: hit = 1; ! 287: nhits++; ! 288: if(*p == '\n'){lcount++; ! 289: seen = p; ! 290: } ! 291: if (table[*p++] == '.') { ! 292: linemsg = 1; ! 293: if (--ccount <= 0) { ! 294: if (p == &buf[1024]) p = buf; ! 295: if (p > &buf[512]) { ! 296: if ((ccount = read(f, p, &buf[1024] - p)) <= 0) break; ! 297: } ! 298: else if ((ccount = read(f, p, 512)) <= 0) break; ! 299: if(caps && (count1 > 0)) ! 300: fwrite(beg1,sizeof(*beg1),count1,stdout); ! 301: count1=ccount; ! 302: beg1=p; ! 303: } ! 304: } ! 305: succeed: nsucc = 1; ! 306: { ! 307: if (p <= nlp) { ! 308: outc(&buf[1024],file); ! 309: nlp = buf; ! 310: } ! 311: outc(p,file); ! 312: } ! 313: if(mflg)last=1; ! 314: nomatch: ! 315: nlp = p; ! 316: c = w; ! 317: begp = endp = 0; ! 318: continue; ! 319: } ! 320: cont: ! 321: if(*p == '\n' && p != seen){lcount++; ! 322: seen = p; ! 323: } ! 324: if (table[*p++] == '.'){ ! 325: if(hit){ ! 326: if(p <= nlp){ ! 327: outc(&buf[1024],file); ! 328: nlp = buf; ! 329: } ! 330: outc(p,file); ! 331: if(!caps)printf("\n\n"); ! 332: if(mflg && last){putc('\n',mine);myct = 0;} ! 333: } ! 334: linemsg = 1; ! 335: if(*p == '\n')olcount = lcount+1; ! 336: else ! 337: olcount=lcount; ! 338: last = 0; ! 339: hit = 0; ! 340: oct = 0; ! 341: nlp = p; ! 342: c = w; ! 343: begp = endp = 0; ! 344: nsent++; ! 345: } ! 346: } ! 347: if(caps && (count1 > 0)) ! 348: fwrite(beg1,sizeof(*beg1),count1,stdout); ! 349: close(f); ! 350: } ! 351: ! 352: getargc() ! 353: { ! 354: register c; ! 355: if (wordf){ ! 356: if((c=getc(wordf))==EOF){ ! 357: fclose(wordf); ! 358: if(nflag && fflag){ ! 359: nflag=0; ! 360: wordf=fopen(filename,"r"); ! 361: if(wordf == NULL){ ! 362: fprintf(stderr,"diction can't open %s\n",filename); ! 363: exit(2); ! 364: } ! 365: return(getc(wordf)); ! 366: } ! 367: else return(EOF); ! 368: } ! 369: else return(c); ! 370: } ! 371: if ((c = *argptr++) == '\0') ! 372: return(EOF); ! 373: return(c); ! 374: } ! 375: ! 376: cgotofn() { ! 377: register c; ! 378: register struct words *s; ! 379: register ct; ! 380: int neg; ! 381: ! 382: s = smax = w; ! 383: neg = ct = 0; ! 384: nword: for(;;) { ! 385: c = getargc(); ! 386: if(c == '~'){ ! 387: neg++; ! 388: c = getargc(); ! 389: } ! 390: if (c==EOF) ! 391: return; ! 392: if (c == '\n') { ! 393: if(neg)s->out = 0377; ! 394: else s->out = ct-1; ! 395: neg = ct = 0; ! 396: s = w; ! 397: } else { ! 398: loop: if (s->inp == c) { ! 399: s = s->nst; ! 400: ct++; ! 401: continue; ! 402: } ! 403: if (s->inp == 0) goto enter; ! 404: if (s->link == 0) { ! 405: if (smax >= &w[MAXSIZ - 1]) overflo("w1"); ! 406: s->link = ++smax; ! 407: s = smax; ! 408: goto enter; ! 409: } ! 410: s = s->link; ! 411: goto loop; ! 412: } ! 413: } ! 414: ! 415: enter: ! 416: do { ! 417: s->inp = c; ! 418: ct++; ! 419: if (smax >= &w[MAXSIZ - 1]) overflo("w2"); ! 420: s->nst = ++smax; ! 421: s = smax; ! 422: } while ((c = getargc()) != '\n' && c!=EOF); ! 423: if(neg)smax->out = 0377; ! 424: else smax->out = ct-1; ! 425: neg = ct = 0; ! 426: s = w; ! 427: if (c != EOF) ! 428: goto nword; ! 429: } ! 430: ! 431: overflo(s) ! 432: char *s; ! 433: { ! 434: fprintf(stderr, "wordlist too large %s\n",s); ! 435: exit(2); ! 436: } ! 437: cfail() { ! 438: struct words *queue[QSIZE]; ! 439: struct words **front, **rear; ! 440: struct words *state; ! 441: int bstart; ! 442: register char c; ! 443: register struct words *s; ! 444: s = w; ! 445: front = rear = queue; ! 446: init: if ((s->inp) != 0) { ! 447: *rear++ = s->nst; ! 448: if (rear >= &queue[QSIZE - 1]) overflo("queue1"); ! 449: } ! 450: if ((s = s->link) != 0) { ! 451: goto init; ! 452: } ! 453: ! 454: while (rear!=front) { ! 455: s = *front; ! 456: if (front == &queue[QSIZE-1]) ! 457: front = queue; ! 458: else front++; ! 459: cloop: if ((c = s->inp) != 0) { ! 460: bstart=0; ! 461: *rear = (q = s->nst); ! 462: if (front < rear) ! 463: if (rear >= &queue[QSIZE-1]) ! 464: if (front == queue) overflo("queue2"); ! 465: else rear = queue; ! 466: else rear++; ! 467: else ! 468: if (++rear == front) overflo("queue3"); ! 469: state = s->fail; ! 470: floop: if (state == 0){ state = w;bstart=1;} ! 471: if (state->inp == c) { ! 472: qloop: q->fail = state->nst; ! 473: if ((state->nst)->out != 0 && q->out == 0) q->out = (state->nst)->out; ! 474: if((q=q->link) != 0)goto qloop; ! 475: } ! 476: else if((state->link) != 0){ ! 477: state = state->link; ! 478: goto floop; ! 479: } ! 480: else if((state = state->fail) != 0) ! 481: goto floop; ! 482: else if(bstart==0){state=0; goto floop;} ! 483: } ! 484: if ((s = s->link) != 0) ! 485: goto cloop; ! 486: } ! 487: /* for(s=w;s<=smax;s++) ! 488: printf("s %d ch %c out %d nst %d link %d fail %d\n",s, ! 489: s->inp,s->out,s->nst,s->link,s->fail); ! 490: */ ! 491: } ! 492: outc(addr,file) ! 493: char *addr; ! 494: char *file; ! 495: { ! 496: static inside = 0; ! 497: ! 498: if(!caps && lineno && linemsg){ ! 499: if(list)fprintf(fl,"%ld ",olcount); ! 500: printf("beginning line %ld",olcount); ! 501: if(file != (char *)NULL)printf(" %s\n",file); ! 502: else printf("\n"); ! 503: linemsg = 0; ! 504: } ! 505: while(nlp < addr){ ! 506: if(!caps && oct > 60 && table[*nlp] == ' ' && nlp != begp && nlp != endp){ ! 507: oct=0; ! 508: putchar('\n'); ! 509: } ! 510: if(nlp == begp){ ! 511: if(caps)inside++; ! 512: else { ! 513: if(list)inside++; ! 514: if( oct >45){putchar('\n'); ! 515: oct=0; ! 516: } ! 517: if( oct==0 || table[*nlp] != ' '){ ! 518: printf("*["); ! 519: oct+=2; ! 520: } ! 521: else {printf(" *[");; ! 522: oct+=3; ! 523: } ! 524: } ! 525: if(mflg)putc('[',mine); ! 526: } ! 527: if(inside && caps){ ! 528: if(islower(*nlp))*nlp = toupper(*nlp); ! 529: } ! 530: else { ! 531: if(inside && list)putc(table[*nlp],fl); ! 532: if(!caps && *nlp == '\n')*nlp = ' '; ! 533: if(*nlp == ' ' && oct==0); ! 534: else if(!caps) {putchar(*nlp); oct++;} ! 535: } ! 536: if(nlp == endp){ ! 537: if(caps) ! 538: inside= 0; ! 539: else { ! 540: if(list && inside){ ! 541: inside = 0; ! 542: putc('\n',fl); ! 543: } ! 544: if(*(nlp) != ' '){printf("]*"); ! 545: oct+=2; ! 546: } ! 547: else {printf("]* "); ! 548: oct+=3; ! 549: } ! 550: if(oct >60){putchar('\n'); ! 551: oct=0; ! 552: } ! 553: } ! 554: if(mflg)putc(']',mine); ! 555: beg = 0; ! 556: } ! 557: if(mflg){ ! 558: if(nlp == myst)beg = 1; ! 559: if(beg || last){ ! 560: putc(*nlp,mine); ! 561: if(myct++ >= 72 || last == 20){ ! 562: putc('\n',mine); ! 563: if(last == 20)last=myct=0; ! 564: else myct=0; ! 565: } ! 566: if(last)last++; ! 567: } ! 568: } ! 569: nlp++; ! 570: } ! 571: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.