|
|
1.1 ! root 1: /********** ! 2: docgen.c ! 3: ! 4: (091984 version: from llc 080284; minor changes by vbt) ! 5: ! 6: modify *mmfile, *msfile, and *mcfile strings as needed to supply ! 7: full pathnames for mmdata, msdata, and mcsdata files; ! 8: ! 9: **********/ ! 10: #include <stdio.h> ! 11: #include <signal.h> ! 12: char *mmfile="/usr/lib/docgen/mmdata"; ! 13: char *msfile="/usr/lib/docgen/msdata"; ! 14: char *mcfile="/usr/lib/docgen/mcsdata"; ! 15: char *wr = "/usr/lib/docgen/wr"; ! 16: #define eatblanks(a) while((c=getc(a)) == ' '|| c == '\t') ! 17: #define MAX 100 ! 18: #define CMAX 7500 ! 19: #define LMAX 200 ! 20: #define QMAX 100 ! 21: #define NPATH 10 ! 22: #define NENT 200 ! 23: #define BUFS 512 ! 24: #define LABMAX 20 ! 25: #define STACK 10 ! 26: #define NEST 10 ! 27: ! 28: int inap; ! 29: int debug = 0; ! 30: int sdebug = 0; ! 31: int verbose = 0; ! 32: #define ARGS 1 ! 33: #define ONELINE 2 ! 34: #define MANY 4 ! 35: #define OUT 8 ! 36: #define PRINT 16 ! 37: #define SKIP 32 ! 38: #define BLOOP 128 ! 39: #define PATH 256 ! 40: #define QUEST 512 ! 41: #define STUFF 1024 ! 42: #define NAME 2048 ! 43: #define SUM 4096 ! 44: #define PAR 8192 ! 45: #define FLOOP 16384 ! 46: #define SEVERAL 32768 ! 47: #define QSTUFF 65536 ! 48: ! 49: struct q_a { ! 50: char *qtext; ! 51: char *text; ! 52: char *macro; ! 53: unsigned long type; ! 54: struct qa *argq; ! 55: } s[MAX]; ! 56: struct q_a *p = s; ! 57: ! 58: unsigned long gettype(); ! 59: int sig_in_ed(); ! 60: char buf[CMAX]; ! 61: char *ptr = buf; ! 62: char obuf[BUFS]; ! 63: char *optr = obuf; ! 64: FILE *outp; ! 65: char *ofile; ! 66: char line[LMAX]; ! 67: char sline[LMAX]; ! 68: char *first; ! 69: int lineno = 1; ! 70: ! 71: struct qa { ! 72: char *text; ! 73: struct qa *nexta; ! 74: } ques[QMAX]; ! 75: struct qa *qp = ques; ! 76: ! 77: struct pa { ! 78: char *name; ! 79: struct list *root; ! 80: } paths[NPATH]; ! 81: struct pa *pp = paths; ! 82: ! 83: struct list { ! 84: struct q_a *entry; ! 85: struct list *next; ! 86: struct list *loop; ! 87: char *quest; ! 88: struct list *floop; ! 89: } list[NENT]; ! 90: struct list *lp = list; ! 91: struct list *stack[STACK]; ! 92: struct list **st = stack; ! 93: ! 94: struct pa *findpath(); ! 95: struct lab { ! 96: struct list *path; ! 97: struct list *place; ! 98: } save[LABMAX], *sav=save; ! 99: struct lab *savp; ! 100: struct lab *savc[10]; ! 101: unsigned stype[10]; ! 102: int curly = 0; ! 103: char *onepath; ! 104: char *qfile; ! 105: char *namesf="tagfile"; ! 106: char nname[50]; ! 107: FILE *popen(), *edp; ! 108: ! 109: main(argc,argv) ! 110: int argc; ! 111: char *argv[]; ! 112: { ! 113: ! 114: qfile = mcfile; ! 115: while(argc > 1 && *argv[1] == '-'){ ! 116: switch(argv[1][1]){ ! 117: case 'f': ! 118: if(argc > 2)qfile=argv[2]; ! 119: argc--; ! 120: argv++; ! 121: break; ! 122: case 'm': ! 123: if(argv[1][2] == 's')qfile=msfile; ! 124: else if(argv[1][2] == 'c')qfile=mcfile; ! 125: else if(argv[1][2] == 'm')qfile=mmfile; ! 126: else { ! 127: fprintf("unknown macro package %s\n",argv); ! 128: exit(0); ! 129: } ! 130: break; ! 131: case 'w': ! 132: qfile = wr; ! 133: break; ! 134: case 'd': ! 135: sdebug=1; ! 136: break; ! 137: case 'p': ! 138: debug=1; ! 139: break; ! 140: case 'v': ! 141: verbose=1; ! 142: break; ! 143: default: ! 144: fprintf(stderr,"unknown flag %c\n",argv[1][1]); ! 145: exit(0); ! 146: } ! 147: argc--; argv++; ! 148: } ! 149: if(argc > 1)ofile=argv[1]; ! 150: init(qfile); ! 151: if(onepath != 0){ ! 152: pp=findpath(onepath); ! 153: lp=pp->root; ! 154: process(1); ! 155: } ! 156: else process(0); ! 157: done(); ! 158: } ! 159: init(file) ! 160: char *file; ! 161: { ! 162: FILE *inp; ! 163: int c; ! 164: int i; ! 165: int printall=0; ! 166: char command[50]; ! 167: FILE *dumb; ! 168: ! 169: if(ofile == 0){ ! 170: if(file == wr){ ! 171: printf("Tags going to file tagfile\n"); ! 172: ofile = namesf; ! 173: } ! 174: else if(file == mcfile){ ! 175: printf("Output going to file temp.cover\n"); ! 176: ofile = "temp.cover"; ! 177: } ! 178: else { ! 179: printf("Output going to file temp\n"); ! 180: ofile = "temp"; ! 181: } ! 182: } ! 183: if((inp=fopen(file,"r"))==NULL){ ! 184: fprintf(stderr,"can't open script file %s\n",file); ! 185: exit(0); ! 186: } ! 187: pp->name = onepath = ptr; ! 188: i=0; ! 189: while((c=getc(inp)) != '\n'){ ! 190: if(c == ','){ ! 191: *ptr++ = '\0'; ! 192: (++pp)->name = ptr; ! 193: i++; ! 194: if(pp > &paths[NPATH-1]) ! 195: error("more than 10 paths-NPATH"); ! 196: } ! 197: else if(c != ' ' && c != '\t') ! 198: *ptr++ = c; ! 199: } ! 200: *ptr++ = '\0'; ! 201: if(i > 0)onepath=0; ! 202: lineno++; ! 203: first = ptr; ! 204: if(getstr(inp)== 0) ! 205: if(onepath == 0) ! 206: error("text string expected"); ! 207: while(getentry(inp) != 0){ ! 208: if(p++ >= &s[MAX-1]) ! 209: error("number of instructions exceeded-MAX"); ! 210: } ! 211: if(debug)printf("\n"); ! 212: if((dumb = fopen(ofile,"r")) != NULL){ ! 213: if(file == wr){ ! 214: printf("File %s already exists; Tags will be appended\n",ofile); ! 215: printall++; ! 216: } ! 217: else { ! 218: printf("File %s already exists; Text will be appended\n",ofile); ! 219: } ! 220: fclose(dumb); ! 221: } ! 222: if((dumb = fopen(ofile,"a")) == NULL){ ! 223: fprintf(stderr,"can't open %s\n",ofile); ! 224: exit(1); ! 225: } ! 226: fclose(dumb); ! 227: sprintf(command,"ed - %s\n",ofile); ! 228: signal(SIGINT,sig_in_ed); ! 229: if((edp = popen(command,"w")) == NULL){ ! 230: printf("can't involk ed\n"); ! 231: exit(0); ! 232: } ! 233: setbuf(edp,NULL); ! 234: if(printall){ ! 235: printf("The following tags are already defined:\n"); ! 236: fputs("1,$p\n",edp); ! 237: fflush(edp); ! 238: sleep(8); ! 239: printf("\n"); ! 240: } ! 241: fputs("a\n",edp); ! 242: inap = 1; ! 243: } ! 244: ! 245: getentry(inp) ! 246: FILE *inp; ! 247: { ! 248: char *l; ! 249: int c; ! 250: int comment = 0; ! 251: ! 252: if(debug)printf("\n place %o ",p); ! 253: savp = sav; ! 254: l = line; ! 255: while((*l = c = getc(inp)) != ':'){ ! 256: if(c == EOF)return(0); ! 257: if(c == '*'){ ! 258: if(comment){ ! 259: comment=0; ! 260: continue; ! 261: } ! 262: else { ! 263: comment=1; ! 264: continue; ! 265: } ! 266: } ! 267: if(comment){ ! 268: if(c == '\n')lineno++; ! 269: continue; ! 270: } ! 271: if(c == '\\'){ ! 272: *l = getc(inp); ! 273: if(++l >= &line[LMAX-1]) ! 274: error("line length exceeded-LMAX"); ! 275: continue; ! 276: } ! 277: if(c == '}'){ ! 278: if(debug)printf("found }\n"); ! 279: l=ptr; ! 280: getstr(inp); ! 281: addloop(--curly,l); ! 282: eatline(inp); ! 283: sav = savc[curly]; ! 284: p->type = BLOOP; ! 285: return(1); ! 286: } ! 287: if(c == ','){ ! 288: *l = '\0'; ! 289: addentry(line,p); ! 290: l=line; ! 291: } ! 292: else if(c == '\n'){ ! 293: l=line; ! 294: lineno++; ! 295: } ! 296: else if(c != ' ' && c != '\t'){ ! 297: if(l++ >= &line[LMAX-1]) ! 298: error("line length exceeded-LMAX"); ! 299: } ! 300: } ! 301: *l = '\0'; ! 302: addentry(line,p); ! 303: p->macro = ptr; ! 304: while((*ptr = c = getc(inp))!= ':'){ ! 305: if(c == '\\'){ ! 306: *ptr = getc(inp); ! 307: if(++ptr >= &buf[CMAX-1]) ! 308: error("string buffer exceeded-CMAX"); ! 309: } ! 310: else if(c == ' ' && ptr == p->macro); ! 311: else if(c == '{' && ptr == p->macro){ ! 312: if(debug)printf("in { savp %o\n",savp); ! 313: (sav++)->path = 0; ! 314: stype[curly] = BLOOP; ! 315: savc[curly++] = savp; ! 316: if(curly >= NEST) ! 317: error("nesting depth exceeded-NEST"); ! 318: if((c = getc(inp)) == ' '|| c == '\t') ! 319: eatblanks(inp); ! 320: if(c == '\n'){ ! 321: lineno++; ! 322: if((c = getc(inp)) == ' '|| c == '\t') ! 323: eatblanks(inp); ! 324: } ! 325: if(c == '"'){ ! 326: p->type = FLOOP; ! 327: ungetc(c,inp); ! 328: l=ptr; ! 329: getstr(inp); ! 330: p->qtext = l; ! 331: stype[curly-1] = FLOOP; ! 332: } ! 333: else { ! 334: ungetc(c,inp); ! 335: p->type = BLOOP; ! 336: } ! 337: return(1); ! 338: } ! 339: else if(ptr++ >= &buf[CMAX-1]) ! 340: error("string buffer exceeded-CMAX"); ! 341: } ! 342: if(p->macro == ptr)p->macro=0; ! 343: else *ptr++ = '\0'; ! 344: p->type = gettype(inp); ! 345: if(p->type&QUEST){ ! 346: p->qtext = ptr; ! 347: if(getstr(inp) == 0) ! 348: error("text string expected"); ! 349: } ! 350: else p->qtext = 0; ! 351: p->text = ptr; ! 352: if(p->type&(ONELINE|SEVERAL|PRINT|MANY|PATH)) ! 353: if(getstr(inp)== 0) ! 354: error("text string expected"); ! 355: if(p->text == ptr)p->text = 0; ! 356: if(debug)printf(" macro %s type %d text %s ",p->macro,p->type,p->text); ! 357: if(sdebug)db(p); ! 358: if(p->type & (ARGS |SKIP)){ ! 359: p->argq = qp; ! 360: qp->text = ptr; ! 361: while(getstr(inp) != 0){ ! 362: qp->nexta = (qp+1); ! 363: if(debug||sdebug)printf("\n arg question= %s",qp->text); ! 364: if(debug)printf(" next %o",qp->nexta); ! 365: if(qp++ >= &ques[QMAX-1]) ! 366: error("number of questions exceeded-QMAX"); ! 367: qp->text = ptr; ! 368: } ! 369: (qp-1)->nexta = 0; ! 370: if(debug)printf("\n last %s next %o",(qp-1)->text,(qp-1)->nexta); ! 371: if(sdebug)printf("\n"); ! 372: } ! 373: sav = savp; ! 374: return(1); ! 375: } ! 376: getstr(inp) ! 377: FILE *inp; ! 378: { ! 379: int c; ! 380: while((c=getc(inp)) == ' ' || c == '\t' || c == '\n')if(c == '\n')lineno++; ! 381: if(c != '\"'){ ! 382: ungetc(c,inp); ! 383: return(0); ! 384: } ! 385: while((*ptr=c=getc(inp)) != '\"'){ ! 386: if(ptr++ >= &buf[CMAX]) ! 387: error("string buffer exceeded-CMAX"); ! 388: if(c == '\n')lineno++; ! 389: } ! 390: *ptr++ = '\0'; ! 391: return(1); ! 392: } ! 393: addentry(ch,p) ! 394: char *ch; ! 395: struct q_a *p; ! 396: { ! 397: struct list *ll; ! 398: if(debug || sdebug)printf("path= %s, ",ch); ! 399: ! 400: for(pp=paths;pp->name != 0 && pp < &paths[NPATH];pp++){ ! 401: if(match(ch,pp->name)){ ! 402: if(pp->root == 0){ ! 403: pp->root = lp; ! 404: } ! 405: else { ! 406: ll=pp->root; ! 407: while(ll->next != 0)ll=ll->next; ! 408: ll->next = lp; ! 409: } ! 410: if(debug)printf("entry %o path %o\n",lp,pp); ! 411: sav->path = (struct list *)pp; ! 412: sav->place = lp; ! 413: lp->entry = p; ! 414: if(lp++ >= &list[NENT-1]) ! 415: error("tree exceeded-NENT"); ! 416: if(sav++ >= &save[LABMAX-1]) ! 417: error("saved paths exceeded-LABMAX"); ! 418: return; ! 419: } ! 420: } ! 421: printf("no path to %s\n",ch); ! 422: exit(0); ! 423: } ! 424: ! 425: addloop(in,cp) ! 426: char *cp; ! 427: { ! 428: struct lab *sp; ! 429: struct list *ll; ! 430: ! 431: sp = savc[in]; ! 432: while((ll = sp->path) != 0){ ! 433: if(debug)printf("addloop sp %o path %o",sp,sp->path); ! 434: while(ll->next != 0){ ! 435: ll=ll->next; ! 436: } ! 437: if(debug)printf("ll %o place %o\n",ll,sp->place); ! 438: if(ll->loop != 0){ ! 439: ll->next = lp; ! 440: lp->loop = sp->place; ! 441: lp->quest = cp; ! 442: lp->entry = p; ! 443: if(lp++ >= &list[NENT-1]) ! 444: error("tree exceeded - NENT"); ! 445: } ! 446: else { ! 447: ll->loop = sp->place; ! 448: ll->quest = cp; ! 449: } ! 450: if(stype[in] == FLOOP){ ! 451: sp->place->floop = lp; ! 452: lp->entry = p; ! 453: if(lp++ >= &list[NENT-1]) ! 454: error("tree exceeded - NENT"); ! 455: } ! 456: sp++; ! 457: } ! 458: } ! 459: unsigned long ! 460: gettype(inp) ! 461: FILE *inp; ! 462: { ! 463: int c; ! 464: unsigned long i; ! 465: i=0; ! 466: another: ! 467: while((c=getc(inp)) == ' ' || c == '\t'); ! 468: switch(c){ ! 469: case 'A': ! 470: i |= ARGS; ! 471: break; ! 472: case 'M': ! 473: i |= MANY; ! 474: break; ! 475: case 'O': ! 476: if((c=getc(inp)) == 'U') ! 477: i |= OUT; ! 478: else if(c == 'N') ! 479: i|= ONELINE; ! 480: else error("unknown action"); ! 481: break; ! 482: case 'P': ! 483: if((c=getc(inp)) == 'R') ! 484: i |= PRINT; ! 485: else if(c == 'A'){ ! 486: if((c=getc(inp)) == 'T') ! 487: i |= PATH; ! 488: else if(c == 'R') ! 489: i |= PAR|MANY; ! 490: else error("unknown action"); ! 491: } ! 492: else error("unknown action"); ! 493: break; ! 494: case 'S': ! 495: if((c=getc(inp)) == 'T') ! 496: i |= STUFF|ARGS; ! 497: else if(c == 'K') ! 498: i |= SKIP; ! 499: else if(c == 'U') ! 500: i |= SUM|MANY; ! 501: else if(c == 'E') ! 502: i |= SEVERAL; ! 503: else error("unknown action"); ! 504: break; ! 505: case 'Q': ! 506: if((c=getc(inp)) == 'U') ! 507: i |= QUEST; ! 508: else if(c == 'S') ! 509: i |= QSTUFF|ARGS; ! 510: else error("unknown action"); ! 511: break; ! 512: case 'N': ! 513: i |= NAME|ONELINE; ! 514: break; ! 515: default: ! 516: error("unknown action"); ! 517: } ! 518: while((c=getc(inp))!= '\n') ! 519: if(c == '&')goto another; ! 520: lineno++; ! 521: if(i&OUT) ! 522: if(i & ~OUT){ ! 523: if(i & ~(OUT|QUEST)) ! 524: error("action error - OUT not alone"); ! 525: } ! 526: if(i & PRINT) ! 527: if(i & ~PRINT){ ! 528: if(i & ~(PRINT|QUEST)) ! 529: error("action error - PRINT not alone"); ! 530: } ! 531: if(i & PATH) ! 532: if(i & ~PATH)error("action error - PATH not alone"); ! 533: if((i&(MANY|ONELINE))==(MANY|ONELINE)) ! 534: error("contridictory actions - MANY & ONELINE"); ! 535: return(i); ! 536: } ! 537: ! 538: process(start) ! 539: int start; ! 540: { ! 541: if(start == 0){ ! 542: printf("%s\n",first); ! 543: getl(stdin,line); ! 544: pp=findpath(line); ! 545: lp = pp->root; ! 546: } ! 547: more: ! 548: while(lp){ ! 549: if(question(lp->entry)== 1) ! 550: continue; ! 551: if(lp->loop != 0){ ! 552: printf("%s\n",lp->quest); ! 553: getl(stdin,line); ! 554: if(line[0] == 'y'|| line[0] == 'Y') ! 555: lp=lp->loop; ! 556: else{ ! 557: if(lp->loop->entry->type & 1){ ! 558: lp->loop->entry->type &= 0177776; ! 559: } ! 560: if(line[0] == 'q')done(); ! 561: else lp=lp->next; ! 562: } ! 563: } ! 564: else ! 565: lp = lp->next; ! 566: } ! 567: if(*st != 0){ ! 568: lp = *st--; ! 569: if(lp->loop != 0){ ! 570: printf("%s\n",lp->quest); ! 571: getl(stdin,line); ! 572: if(line[0] == 'y' || line[0] == 'Y') ! 573: lp=lp->loop; ! 574: else{ ! 575: if(lp->loop->entry->type & 1) ! 576: lp->loop->entry->type &= 0177776; ! 577: if(line[0] == 'q')done(); ! 578: else lp=lp->next; ! 579: } ! 580: } ! 581: else lp=lp->next; ! 582: goto more; ! 583: } ! 584: } ! 585: ! 586: question(rp) ! 587: struct q_a *rp; ! 588: { ! 589: int blanks; ! 590: char *ch, *sv; ! 591: ! 592: rest: ! 593: if(debug)printf("in question %o\n",rp); ! 594: if(rp->type & BLOOP) ! 595: return(0); ! 596: if(rp->type & FLOOP){ ! 597: if(rp->type & 1)return(0); ! 598: printf("%s\n",rp->qtext); ! 599: getl(stdin,line); ! 600: if(line[0] == 'y' || line[0] == 'Y'){ ! 601: lp = lp->next; ! 602: rp->type |= 1; ! 603: } ! 604: else if(line[0] == 'q')done(); ! 605: else lp= lp->floop; ! 606: return(1); ! 607: } ! 608: if(rp->type & PATH){ ! 609: *(++st) = lp; ! 610: if(st >= &stack[STACK-1]) ! 611: error("stack depth exceeded-STACK"); ! 612: printf("%s\n",rp->text); ! 613: getl(stdin,line); ! 614: if(line[0] == '\0'){ ! 615: st--; ! 616: return(0); ! 617: } ! 618: pp=findpath(line); ! 619: lp = pp->root; ! 620: return(1); ! 621: } ! 622: if(rp->type&QUEST){ ! 623: printf("%s\n",rp->qtext); ! 624: getl(stdin,line); ! 625: if(line[0] != 'Y' && line[0] != 'y')return(0); ! 626: } ! 627: if(rp->text != 0) ! 628: if((rp->type&MANY) == 0)printf("%s\n",rp->text); ! 629: if(rp->type&(ONELINE|SEVERAL)) ! 630: getl(stdin,sline); ! 631: if(rp->type&NAME){ ! 632: return(newname(sline)); ! 633: } ! 634: if(rp->type&SUM){ ! 635: summary(); ! 636: } ! 637: if(rp->type&PAR){ ! 638: par(); ! 639: } ! 640: if(rp->type&(STUFF|QSTUFF)){ ! 641: sv = ch = rp->macro; ! 642: qp = rp->argq; ! 643: do{ ! 644: while(*ch != '$'){ ! 645: if(*ch == '\\')ch++; ! 646: if(*ch == '\0')break; ! 647: ch++; ! 648: } ! 649: if(*ch == '$'){ ! 650: *ch = '\0'; ! 651: out(sv); ! 652: *ch++ = '$'; ! 653: sv = ch; ! 654: } ! 655: printf("%s\n",qp->text); ! 656: getl(stdin,line); ! 657: if(rp->type&QSTUFF) ! 658: if(line[0] == '\0')break; ! 659: if(*(ch-1) == '$') ! 660: out(line); ! 661: qp = qp->nexta; ! 662: } while(qp != 0); ! 663: if(rp->type&STUFF) ! 664: out(sv); ! 665: else if(*sv == '"')out("\""); ! 666: out("\n"); ! 667: } ! 668: else if(rp->type&(ARGS | SKIP)){ ! 669: if((rp->type&SKIP) == 0 && rp->macro != 0) ! 670: out(rp->macro); ! 671: qp = rp->argq; ! 672: do{ ! 673: printf("%s\n",qp->text); ! 674: blanks = getl(stdin,line); ! 675: if(rp->type&SKIP){ ! 676: if(line[0] == '\0') ! 677: return(0); ! 678: else out(rp->macro); ! 679: } ! 680: out(" "); ! 681: if(line[0] == '\0')blanks++; ! 682: if(blanks)out("\""); ! 683: out(line); ! 684: if(blanks)out("\""); ! 685: qp=qp->nexta; ! 686: } while(qp != 0); ! 687: out("\n"); ! 688: } ! 689: else if((rp->type&(OUT|ONELINE|MANY))&& rp->macro != 0){ ! 690: out(rp->macro); ! 691: out("\n"); ! 692: } ! 693: if(rp->type&SEVERAL){ ! 694: out(rp->macro); ! 695: out(" "); ! 696: out(sline); ! 697: out("\n"); ! 698: } ! 699: if(rp->type&ONELINE){ ! 700: out(sline); ! 701: out("\n"); ! 702: } ! 703: if(rp->type&MANY){ ! 704: if(rp->type&(SUM)) ! 705: printf("%s named %s.sum\n",rp->text,nname); ! 706: else if(rp->type&PAR) ! 707: printf("%s named %s.par\n",rp->text,nname); ! 708: else printf("%s\n",rp->text); ! 709: printf(" end with : alone on a line (or read a file with :r filename)\n"); ! 710: getl(stdin,line); ! 711: if(line[0] == ':' && line[1] == 'r'){ ! 712: ch = &line[2]; ! 713: more: ! 714: readfiles(ch); ! 715: printf("Type other file names or return\n"); ! 716: getl(stdin,line); ! 717: if(line[0] == '\0')return(0); ! 718: ch = line; ! 719: goto more; ! 720: } ! 721: toed(); ! 722: } ! 723: return(0); ! 724: } ! 725: sig_in_ed(){ ! 726: inap = 0; ! 727: printf("type q to quit "); ! 728: getl(stdin,line); ! 729: if(line[0] == 'q')done(); ! 730: fputs("a\n",edp); ! 731: optr = obuf; ! 732: inap=1; ! 733: signal(SIGINT,sig_in_ed); ! 734: process(1); ! 735: done(); ! 736: } ! 737: ! 738: getl(inp,l) ! 739: char *l; ! 740: FILE *inp; ! 741: { ! 742: int c; ! 743: int blanks; ! 744: ! 745: blanks=0; ! 746: while((*l = c = getc(inp)) != '\n'){ ! 747: l++; ! 748: if(c == ' ' || c == '\t')blanks++; ! 749: } ! 750: *l++ = 0; ! 751: return(blanks); ! 752: } ! 753: ! 754: out(ch) ! 755: char *ch; ! 756: { ! 757: char c; ! 758: ! 759: while(*ch != '\0'){ ! 760: if(*ch == '\n'){ ! 761: *optr++ = *ch++; ! 762: *optr = '\0'; ! 763: fputs(obuf,edp); ! 764: optr=obuf; ! 765: if(verbose)printf("%s",obuf); ! 766: } ! 767: else *optr++ = *ch++; ! 768: if(optr >= &obuf[BUFS-1]){ ! 769: *optr = '\0'; ! 770: fputs(obuf,edp); ! 771: optr = obuf; ! 772: } ! 773: } ! 774: } ! 775: ofl() ! 776: { ! 777: if(optr != obuf){ ! 778: *optr='\0'; ! 779: fputs(obuf,edp); ! 780: optr=obuf; ! 781: } ! 782: if(inap) ! 783: fputs(".\nw\na\n",edp); ! 784: else { ! 785: fputs("w\na\n",edp); ! 786: inap=1; ! 787: } ! 788: } ! 789: done(){ ! 790: ofl(); ! 791: fputs(".\nq\n",edp); ! 792: exit(0); ! 793: } ! 794: ! 795: match(ch,hh) ! 796: char *ch, *hh; ! 797: { ! 798: while(*ch == *hh){ ! 799: if(*ch == '\0')return(1); ! 800: ch++; ! 801: hh++; ! 802: } ! 803: return(0); ! 804: } ! 805: ! 806: struct pa * ! 807: findpath(ch) ! 808: char *ch; ! 809: { ! 810: for(pp=paths;pp->name != 0;pp++){ ! 811: if(match(ch,pp->name)) ! 812: return(pp); ! 813: } ! 814: printf("can't find path for %s\n",ch); ! 815: exit(0); ! 816: } ! 817: eatline(inp) ! 818: FILE *inp; ! 819: { ! 820: while(getc(inp) != '\n'); ! 821: lineno++; ! 822: } ! 823: readfiles(ptr) ! 824: char *ptr; ! 825: { ! 826: FILE *io; ! 827: int nomore; ! 828: char *bp; ! 829: char fname[50]; ! 830: ! 831: ofl(); ! 832: fputs(".\n",edp); ! 833: nomore = 0; ! 834: while(1){ ! 835: while(*ptr == ' ')ptr++; ! 836: bp = ptr; ! 837: while(*ptr != ' ' && *ptr != '\0')ptr++; ! 838: if(*ptr == '\0')nomore++; ! 839: else *ptr++ = '\0'; ! 840: sprintf(fname,"$r %s\n",bp); ! 841: fputs(fname,edp); ! 842: if(nomore != 0)break; ! 843: } ! 844: fputs("a\n",edp); ! 845: } ! 846: error(sp) ! 847: char *sp; ! 848: { ! 849: fprintf(stderr,"%s at line %d file %s\n",sp,lineno,qfile); ! 850: exit(1); ! 851: } ! 852: db(dbp) ! 853: struct q_a *dbp; ! 854: { ! 855: printf(" macro= %s type=",dbp->macro); ! 856: if(dbp->type&ARGS)printf(" ARGS"); ! 857: if(dbp->type&SKIP)printf(" SKIP"); ! 858: if(dbp->type&OUT)printf(" OUT"); ! 859: if(dbp->type&PRINT)printf(" PRINT"); ! 860: if(dbp->type&ONELINE)printf(" ONELINE"); ! 861: if(dbp->type&SEVERAL)printf(" SEVERAL"); ! 862: if(dbp->type&MANY)printf(" MANY"); ! 863: if(dbp->type&PATH)printf(" PATH"); ! 864: if(dbp->text != 0)printf("\nmain text= %s\n",dbp->text); ! 865: else printf("\n"); ! 866: } ! 867: newname(s) ! 868: char *s; ! 869: { ! 870: int i; ! 871: char *name1, *name2; ! 872: int pid, rpid, retcode; ! 873: char *sp,spac[10]; ! 874: restart: ! 875: sp = spac; ! 876: *sp = '\0'; ! 877: if(*s == ' ' || *s == '\t') ! 878: while(*s== ' ' || *s == '\t')*sp++ = *s++; ! 879: *sp = '\0'; ! 880: for(i=0;*s != '\0';i++) ! 881: nname[i] = *s++; ! 882: if(nname[0] == ':'){ ! 883: switch(nname[1]){ ! 884: case 'p': ! 885: sprintf(line,".\nw\ne %s\n1,$p\na\n",ofile); ! 886: fputs(line,edp); ! 887: sleep(8); ! 888: return(1); ! 889: case 'r': ! 890: sprintf(line,".\nw\ne %s\na\n",&nname[3]); ! 891: printf("Type text to append to file %s\n",&nname[3]); ! 892: fputs(line,edp); ! 893: getl(stdin,line); ! 894: toed(); ! 895: return(1); ! 896: case 'j': ! 897: name1=0; ! 898: name2 = nname; ! 899: nextn: ! 900: for(; *name2 != ' ';name2++) ! 901: if(*name2 == '\0'){ ! 902: printf("error in command line: %s\nplease retype\n",nname); ! 903: getl(stdin,sline); ! 904: s=sline; ! 905: goto restart; ! 906: } ! 907: *name2++ = '\0'; ! 908: while(*name2 == ' ')name2++; ! 909: if(name1 == 0){ ! 910: name1 = name2; ! 911: goto nextn; ! 912: } ! 913: sprintf(line,".\nw\ne %s.sum\n$r %s.sum\nw\n",name1,name2); ! 914: fputs(line,edp); ! 915: sprintf(line,"e %s.par\n$r %s.par\nw\n",name1,name2); ! 916: fputs(line,edp); ! 917: sprintf(line,"e %s\n/%s/d\nw\na\n",ofile); ! 918: fputs(line,edp); ! 919: return(1); ! 920: default: ! 921: printf("unknown command %s\n",nname); ! 922: printf("please retype\n"); ! 923: goto restart; ! 924: } ! 925: } ! 926: if(nname[0] == '!'){ ! 927: if((pid = fork()) == 0){ ! 928: execl("/bin/sh","sh","-c",&nname[1],0); ! 929: exit(0); ! 930: } ! 931: while((rpid=wait(&retcode))!=pid&& rpid != -1); ! 932: printf("!\n"); ! 933: return(1); ! 934: } ! 935: if(i > 10){ ! 936: printf("tag too long - please type new tag "); ! 937: getl(stdin,sline); ! 938: s=sline; ! 939: goto restart; ! 940: } ! 941: nname[i] = '\0'; ! 942: sprintf(line, ".\nw\ne %s\na\n%s%s\n",ofile,spac,nname); ! 943: fputs(line,edp); ! 944: return(0); ! 945: } ! 946: summary(){ ! 947: FILE *ff; ! 948: sprintf(line,"%s.sum",nname); ! 949: if((ff = fopen(line,"a")) == NULL){ ! 950: printf("can't open %s\n",line); ! 951: } ! 952: sprintf(line,".\nw\ne %s.sum\na\n",nname); ! 953: fputs(line,edp); ! 954: fclose(ff); ! 955: } ! 956: par(){ ! 957: FILE *ff; ! 958: sprintf(line,"%s.par",nname); ! 959: if((ff=fopen(line,"a")) == NULL){ ! 960: printf("can't open %s\n",line); ! 961: exit(1); ! 962: } ! 963: sprintf(line,".\nw\ne %s.par\na\n",nname); ! 964: fputs(line,edp); ! 965: fclose(ff); ! 966: } ! 967: toed(){ ! 968: while(1){ ! 969: if(line[1] == '\0'){ ! 970: switch(line[0]){ ! 971: case 'i': ! 972: case 'a': ! 973: case 'c': ! 974: inap++; ! 975: break; ! 976: case '.': ! 977: inap = 0; ! 978: break; ! 979: case 'q': ! 980: if(inap != 0)break; ! 981: case ':': ! 982: if(inap == 0){fputs("a\n",edp); ! 983: inap++; ! 984: } ! 985: return(0); ! 986: } ! 987: } ! 988: fputs(line,edp); ! 989: fputs("\n",edp); ! 990: getl(stdin,line); ! 991: } ! 992: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.