|
|
1.1 ! root 1: /* ! 2: * roff.src - v 1.123 of 12/5/80 ! 3: * ! 4: * This is the first file of the nroff/troff program (n1.c). ! 5: * ! 6: */ ! 7: ! 8: ! 9: ! 10: ! 11: #ifdef NROFF ! 12: char ntversion[] = "@(#)nroff: 1.123"; ! 13: #else ! 14: char ntversion[] = "@(#)troff: 1.123"; ! 15: #endif ! 16: ! 17: #ifndef unix ! 18: char ntNunix[] = "@(#) non-unix"; ! 19: #define INCORE ! 20: #define SMALL ! 21: #define tso ! 22: #endif ! 23: ! 24: #ifdef SMALL ! 25: char ntSMALL[] = "@(#) SMALL"; ! 26: #define NDIAGS ! 27: #define NOCOMPACT ! 28: #endif ! 29: ! 30: #ifdef INCORE ! 31: char ntINC[] = "@(#) incore"; ! 32: #define NOCOMPACT ! 33: #endif ! 34: ! 35: #ifdef NDIAGS ! 36: char ntDIAGS[] = "@(#) NDIAGS"; ! 37: #endif ! 38: ! 39: #ifdef NOCOMPACT ! 40: char ntNOCOMPACT[] = "@(#) NOCOMPACT"; ! 41: #endif ! 42: ! 43: ! 44: ! 45: int version = 1123; /* nroff/troff version tag */ ! 46: ! 47: #ifdef unix ! 48: #include <sys/types.h> ! 49: #include <sys/stat.h> ! 50: #endif ! 51: #include "tdef.hd" ! 52: #include "strs.hd" ! 53: #ifndef INCORE ! 54: #include "uns.hd" ! 55: #endif ! 56: #ifdef NROFF ! 57: #include "tw.hd" ! 58: extern struct ttable t; ! 59: #endif ! 60: #ifdef unix ! 61: #include <setjmp.h> ! 62: jmp_buf sjbuf; ! 63: #include <sgtty.h> ! 64: #endif ! 65: /* ! 66: troff1.c ! 67: ! 68: consume options, initialization, main loop, ! 69: input routines, escape function calling ! 70: */ ! 71: ! 72: extern struct s *frame, *stk, *nxf; ! 73: extern struct s *ejl; ! 74: extern struct tmpfaddr ip; ! 75: #ifndef INCORE ! 76: extern struct envblock eblock; /* environment block */ ! 77: #else ! 78: extern struct envblock eblock[NEV]; /* incore environments */ ! 79: extern char *malloc(); ! 80: extern int *argsp; ! 81: extern int maclev; ! 82: #endif ! 83: extern struct d d[NDI], *dip; ! 84: extern struct datablock dblock; /* compactable data area */ ! 85: ! 86: ! 87: #ifndef SMALL ! 88: extern int fork(), pipe(), dup2(); ! 89: extern int **argpp; /* pointers to request arguments */ ! 90: #endif ! 91: ! 92: #ifdef ebcdic ! 93: extern char atoe[], etoa[]; /* ascii to ebcdic and vice versa */ ! 94: extern char *fname(); ! 95: #endif ! 96: #ifdef tso ! 97: char hibuf[NSO][IBUFSZ]; /* input buffers during .so */ ! 98: int heibuf[NSO]; /* end pointers for hibuf */ ! 99: int hibufp[NSO]; /* current pos pointers for hibuf */ ! 100: #endif ! 101: extern int ev; ! 102: extern int bdtab[]; ! 103: extern getfont(); ! 104: extern char *mktemp(); ! 105: extern char *ttyname(); ! 106: #ifndef INCORE ! 107: extern char *setbrk(); ! 108: #endif ! 109: extern char *ttyname(); ! 110: extern catch(), fpecatch(), kcatch(); ! 111: extern int cd; ! 112: extern int vflag; ! 113: extern int dfact; ! 114: extern int tch[]; ! 115: extern int *cstk[], cstkl; ! 116: extern int ch_CMASK; ! 117: extern long atoi0(); ! 118: extern int ndone; ! 119: extern int stdi; ! 120: extern int waitf; ! 121: extern int nofeed; ! 122: extern int quiet; ! 123: extern filedes ptid; ! 124: extern int ascii; ! 125: extern int npn; ! 126: extern int xflg; ! 127: extern int stop; ! 128: extern char ibuf[IBUFSZ]; ! 129: extern char xbuf[IBUFSZ]; ! 130: extern char *ibufp; ! 131: extern char *xbufp; ! 132: extern char *eibuf; ! 133: extern char *xeibuf; ! 134: extern int cbuf[NC]; ! 135: extern int nx; ! 136: extern int mflg; ! 137: extern int ch; ! 138: extern int pto; ! 139: extern int pfrom; ! 140: extern int cps; ! 141: extern int suffid; ! 142: extern char suftab[]; ! 143: extern int ibf; ! 144: extern filedes ttyod; ! 145: #ifdef unix ! 146: extern struct sgttyb ttys; ! 147: #endif ! 148: extern int iflg; ! 149: extern int init; ! 150: extern int rargc; ! 151: extern char **argp; ! 152: extern int lgf; ! 153: extern int copyf; ! 154: extern int eschar; ! 155: extern int cwidth; ! 156: extern int nlflg; ! 157: extern int donef; ! 158: extern int nflush; ! 159: extern int nfo; ! 160: extern filedes ifile; ! 161: extern int fc; ! 162: extern int padc; ! 163: extern int raw; ! 164: extern struct { ! 165: char buf[NS]; ! 166: } nextf[NSN]; ! 167: char cfname[NSO][NS] = "<standard input"; /* file name stack */ ! 168: extern char newf[]; ! 169: extern int nfi; ! 170: #ifdef NROFF ! 171: extern char termtab[]; ! 172: extern int tti; ! 173: #endif ! 174: extern filedes ifl[NSO]; ! 175: extern int ifi; ! 176: extern int flss; ! 177: extern char ptname[]; ! 178: extern int print; ! 179: extern int nonumb; ! 180: extern int pnlist[]; ! 181: extern int *pnp; ! 182: extern int trap; ! 183: extern int tflg; ! 184: extern int ejf; ! 185: extern int gflag; ! 186: extern int oline[]; ! 187: extern int *olinep; ! 188: extern int dpn; ! 189: extern int noscale; ! 190: extern char *unlkp; ! 191: extern int level; ! 192: extern int ttysave; ! 193: extern int dotT; ! 194: extern int tabch, ldrch; ! 195: extern no_out; ! 196: #ifndef NROFF ! 197: extern char codetab[]; ! 198: extern int lg; ! 199: extern char fontfile[]; ! 200: extern int ffi; /* index into fontfile string (see t6.c) */ ! 201: #else ! 202: extern int eqflg; ! 203: extern int hflg; ! 204: #endif ! 205: int nnextf = 0; /* index into nextf */ ! 206: struct tmpfaddr ipl[NSO]; ! 207: long offl[NSO]; ! 208: long ioff; ! 209: char *ttyp; ! 210: int ms[] = {31,28,31,30,31,30,31,31,30,31,30,31}; ! 211: ! 212: #ifndef SMALL ! 213: int unixp; /* pointer into unix call buffer */ ! 214: int unixpt=0; /* top of unix buffer */ ! 215: int unixch=0; /* channel for unix reads */ ! 216: #endif ! 217: ! 218: #ifndef NROFF ! 219: int acctf; ! 220: #endif ! 221: int did_mesg = 0; ! 222: ! 223: /* definitions for compacted macros */ ! 224: ! 225: #ifndef NOCOMPACT ! 226: ! 227: extern char cmpctf[], cmpctuf[]; ! 228: ! 229: int cmpcti; /* pointer into cmpctt string */ ! 230: int compact; /* compact flag */ ! 231: char cname[10] = "x."; /* string name for compacted output */ ! 232: int cnamei = 2; /* pointer to end of cname string */ ! 233: ! 234: #endif ! 235: main(argc, argv, envp) ! 236: int argc; ! 237: char **argv, **envp; ! 238: { ! 239: register char *p, *q; ! 240: register i; ! 241: #ifndef NOCOMPACT ! 242: int sargc; /* hold argc, argv for -c */ ! 243: char **sargv; ! 244: int tversion; ! 245: ! 246: sargc = argc; ! 247: sargv = argv; ! 248: #endif ! 249: ! 250: #ifdef ebcdic ! 251: cargs(argc, argv); /* convert args to ascii */ ! 252: #endif ! 253: setsignals(); ! 254: init1(argv[0][0]); ! 255: ! 256: #ifdef NROFF ! 257: for (tti = -1; termtab[++tti]; ) ; /* find end of string */ ! 258: termtab[tti] = '3'; ! 259: termtab[tti+1] = '7'; /* tab37 is default terminal table */ ! 260: #ifdef tso ! 261: termtab[tti+2] = '.'; /* fudge name (to tabnn.t) */ ! 262: termtab[tti+3] = 't'; ! 263: #endif ! 264: #else ! 265: for (ffi = -1; fontfile[++ffi]; ) ; /* find end of string */ ! 266: #endif ! 267: ! 268: #ifndef NOCOMPACT ! 269: for (cmpcti = -1; cmpctf[++cmpcti]; ) ; /* end of comp. macr. names */ ! 270: #endif ! 271: ! 272: for (nfi = -1; nextf[0].buf[++nfi]; ) ; /* find end of string */ ! 273: ! 274: while(--argc > 0 && (++argv)[0][0]=='-') ! 275: switch(argv[0][1]){ ! 276: ! 277: case 0: ! 278: goto start; ! 279: case 'i': ! 280: stdi++; ! 281: continue; ! 282: case 'q': ! 283: quiet++; ! 284: #ifdef unix ! 285: if(gtty(0, &ttys) >= 0) ! 286: ttysave = ttys.sg_flags; ! 287: #endif ! 288: continue; ! 289: case 'n': ! 290: npn = cnum(&argv[0][2]); ! 291: continue; ! 292: case 'p': ! 293: xflg = 0; ! 294: cps = cnum(&argv[0][2]); ! 295: continue; ! 296: case 's': ! 297: if(!(stop = cnum(&argv[0][2])))stop++; ! 298: continue; ! 299: case 'r': ! 300: vlist[findr(argv[0][2])] = cnum(&argv[0][3]); ! 301: continue; ! 302: case 'c': /* read compacted macros */ ! 303: #ifndef NOCOMPACT ! 304: if (mflg) goto regmac; /* use -m if not first package */ ! 305: else mflg++; ! 306: p = &cmpctf[cmpcti]; ! 307: q = &argv[0][2]; ! 308: while (*p++ = *q++) ; /* make compacted file name */ ! 309: ! 310: if ((i = open(cmpctf,0)) < 0) ! 311: goto regless; /* data area */ ! 312: if ((read(i,&tversion,sizeof(version)) != sizeof(version)) || ! 313: (tversion != version )) ! 314: goto regless; /* wrong version of macros */ ! 315: if ((read(i,&dblock,sizeof(struct datablock))) < ! 316: sizeof(struct datablock)) { ! 317: prstr("error reading data area\n"); ! 318: exit(1); } ! 319: ! 320: cmpctf[cmpcti-2] = 't'; /* now tmp file */ ! 321: if ((i = open(cmpctf,0)) < 0) { ! 322: prstr("can't find compacted tmp file\n"); ! 323: exit(1); } ! 324: Mcp(i, ibf); /* copy tmp file */ ! 325: close(i); ! 326: ! 327: p = nextf[nnextf++].buf; /* save name of uncomp. area */ ! 328: q = cmpctuf; ! 329: while (*p++ = *q++) ; ! 330: p--; /* point to uncompacted segment */ ! 331: q = &argv[0][2]; /* package name */ ! 332: while (*p++ = *q++) ; /* stow it */ ! 333: ! 334: for (sargc-=argc; ((--sargc>0)&&((++sargv)[0][0])); ) ! 335: if (sargv[0][1] == 'r') /* re-eval nr settings */ ! 336: vlist[findr(sargv[0][2])] = cnum(&sargv[0][3]); ! 337: ! 338: continue; ! 339: ! 340: case 'k': ! 341: p = &cname[cnamei]; /* save name to compact into */ ! 342: q = &argv[0][2]; ! 343: while (*p++ = *q++) ; ! 344: compact++; ! 345: continue; ! 346: ! 347: regless: mflg--; /* fall into -m */ ! 348: #endif ! 349: case 'm': ! 350: regmac: ! 351: if (mflg++ >= NSN) ertoomp(); ! 352: p = &nextf[nnextf++].buf[nfi]; ! 353: q = &argv[0][2]; ! 354: while((*p++ = *q++) != 0); ! 355: continue; ! 356: case 'o': ! 357: getpn(&argv[0][2]); ! 358: continue; ! 359: #ifdef NROFF ! 360: case 'h': ! 361: hflg++; ! 362: continue; ! 363: case 'z': ! 364: no_out++; ! 365: continue; ! 366: case 'e': ! 367: eqflg++; ! 368: continue; ! 369: case 'T': ! 370: p = &termtab[tti]; ! 371: q = &argv[0][2]; ! 372: if(!((*q) & 0177))continue; ! 373: while((*p++ = *q++) != 0); ! 374: #ifdef tso ! 375: *p++ = '.'; /* fudge name on tso */ ! 376: *p++ = 't'; ! 377: #endif ! 378: dotT++; ! 379: continue; ! 380: case 'u': ! 381: bdtab[2] = cnum(&argv[0][2]); /* set emboldening */ ! 382: if ((bdtab[2]<0) || (bdtab[2]>50)) bdtab[2]=0; ! 383: continue; ! 384: #endif ! 385: #ifndef NROFF ! 386: case 'z': ! 387: no_out++; ! 388: case 'a': ! 389: ascii = 1; ! 390: nofeed++; ! 391: case 't': ! 392: #ifndef tso ! 393: ptid = 1; ! 394: #endif ! 395: continue; ! 396: case 'w': ! 397: waitf = 1; ! 398: continue; ! 399: case 'f': ! 400: nofeed++; ! 401: continue; ! 402: case 'x': ! 403: xflg = 0; ! 404: continue; ! 405: case 'b': ! 406: #ifdef unix ! 407: if(open(ptname,1) < 0)prstr("Busy.\n"); ! 408: else ! 409: #endif ! 410: prstr("Available.\n"); ! 411: done3(0); ! 412: case 'g': ! 413: stop = gflag = 1; ! 414: #ifdef unix ! 415: ptid = 1; ! 416: #endif ! 417: dpn = 0; ! 418: continue; ! 419: case 'T': ! 420: ffi -= 2; /* overwrite 'ft' */ ! 421: for (p = &argv[0][2]; (fontfile[ffi] = *p++); ffi++); ! 422: fontfile[ffi++] = '/'; /* build new path */ ! 423: fontfile[ffi++] = 'f'; ! 424: fontfile[ffi++] = 't'; ! 425: #ifdef tso ! 426: fontfile[ffi+1] = '.'; /* fudge name on tso */ ! 427: fontfile[ffi+2] = 'f'; ! 428: #endif ! 429: fontfile[ffi] = 'R'; getfont(0,1); /* get default fonts */ ! 430: fontfile[ffi] = 'I'; getfont(1,1); ! 431: fontfile[ffi] = 'B'; getfont(2,1); ! 432: fontfile[ffi] = 'S'; getfont(3,1); ! 433: continue; ! 434: #endif ! 435: default: ! 436: prstr("Unknown option: "); ! 437: aprstr(argv[0]); ! 438: prstr("\n"); ! 439: ferrex(); ! 440: } ! 441: start: ! 442: argp = argv; ! 443: rargc = argc; ! 444: nnextf = 0; ! 445: init2(); ! 446: #ifdef unix ! 447: setjmp(sjbuf); ! 448: #endif ! 449: #ifdef tso ! 450: setexit(); ! 451: #endif ! 452: loop: ! 453: copyf = lgf = nb = nflush = nlflg = 0; ! 454: if(ip.b && (rbf0(&ip)==0) && ejf ! 455: #ifndef INCORE ! 456: && (frame->pframe <= ejl) ! 457: #else ! 458: && ((maclev-1) <= (int)ejl) ! 459: #endif ! 460: ) { ! 461: nflush++; ! 462: trap = 0; ! 463: eject((struct s *)0); ! 464: goto loop; ! 465: } ! 466: i = getch(); ! 467: if(pendt)goto lablt; ! 468: if(ch_CMASK == XPAR){ ! 469: copyf++; ! 470: tflg++; ! 471: for(;ch_CMASK != '\n';)pchar(getch()); ! 472: tflg = 0; ! 473: copyf--; ! 474: goto loop; ! 475: } ! 476: if((ch_CMASK == cc) || (ch_CMASK == c2)){ ! 477: if(ch_CMASK == c2)nb++; ! 478: copyf++; ! 479: do i = getch(); ! 480: while ((ch_CMASK == ' ') || (ch_CMASK == '\t')); ! 481: ch = i; ! 482: copyf--; ! 483: control(getrq(),1); ! 484: flushi(); ! 485: goto loop; ! 486: } ! 487: lablt: ! 488: ch = i; ! 489: text(); ! 490: goto loop; ! 491: } ! 492: setsignals() ! 493: { ! 494: #ifdef unix ! 495: signal(SIGHUP,catch); ! 496: if (signal(SIGINT,SIG_IGN) == SIG_IGN){ ! 497: signal(SIGHUP,SIG_IGN); ! 498: signal(SIGINT,SIG_IGN); ! 499: signal(SIGQUIT,SIG_IGN); } ! 500: else signal(SIGINT,catch); ! 501: signal(SIGFPE,fpecatch); ! 502: signal(SIGPIPE,catch); ! 503: signal(SIGTERM,kcatch); ! 504: #endif ! 505: } ! 506: catch(){ ! 507: /* ! 508: prstr("Interrupt\n"); ! 509: */ ! 510: done3(01); ! 511: } ! 512: fpecatch(){ ! 513: prstrfl("Floating Exception.\n"); ! 514: #ifdef unix ! 515: signal(SIGFPE,fpecatch); ! 516: #endif ! 517: } ! 518: kcatch(){ ! 519: #ifdef unix ! 520: signal(SIGTERM,SIG_IGN); ! 521: #endif ! 522: done3(01); ! 523: } ! 524: #ifndef NROFF ! 525: #ifndef SMALL ! 526: acctg() { ! 527: static char *acct_file = "/usr/adm/tracct"; ! 528: acctf = open(acct_file,1); ! 529: setuid(getuid()); ! 530: } ! 531: #endif ! 532: #endif ! 533: init1(a) ! 534: char a; ! 535: { ! 536: register char *p; ! 537: register i; ! 538: ! 539: #ifndef NROFF ! 540: #ifndef SMALL ! 541: acctg();/*open troff actg file while mode 4755*/ ! 542: #endif ! 543: #endif ! 544: #ifndef INCORE ! 545: if((suffid=open(suftab,0)) < 0) errcos(); ! 546: read(suffid, sufind.chr, sizeof(sufind)); ! 547: ! 548: p = mktemp("/tmp/taXXXXX"); ! 549: if(a == 'a')p = &p[5]; ! 550: if((close(creat(p, 0600))) < 0){ ! 551: prstr("Cannot create temp file.\n"); ! 552: exit(-1); ! 553: } ! 554: ibf = open(p, 2); ! 555: #endif ! 556: for(i=256; --i;)trtab[i]=i; ! 557: trtab[UNPAD] = ' '; ! 558: mchbits(); ! 559: #ifndef INCORE ! 560: if(a != 'a')unlkp = p; ! 561: #endif ! 562: } ! 563: init2() ! 564: { ! 565: register i,j; ! 566: ! 567: #ifdef unix ! 568: ttyod = 2; ! 569: if(((ttyp=ttyname(j=0)) != (char *)0) || ! 570: ((ttyp=ttyname(j=1)) != (char *)0) || ! 571: ((ttyp=ttyname(j=2)) != (char *)0) ! 572: );else ! 573: #endif ! 574: ttyp = "notty"; ! 575: #ifdef tso ! 576: ttyod = stdout; ! 577: #endif ! 578: iflg = j; ! 579: if(ascii)mesg(0); ! 580: ! 581: #ifdef unix ! 582: if (!ptid && !waitf ! 583: #ifndef NOCOMPACT ! 584: && !compact ! 585: #endif ! 586: ) { ! 587: if((ptid = open(ptname,1)) < 0){ ! 588: prstr("Typesetter busy.\n"); ! 589: done3(-2); ! 590: } ! 591: } ! 592: #endif ! 593: #ifdef tso ! 594: if ((ptid = fopen("OUTPUT", "w,BINARY")) == (FILE *)-1) { ! 595: prstr("can't create OUTPUT"); ! 596: exit(1); } ! 597: #endif ! 598: ptinit(); ! 599: for(i=NEV; i--;) ! 600: #ifndef INCORE ! 601: write(ibf, (char *)&eblock, sizeof(struct envblock)); ! 602: #else ! 603: if (i) ! 604: { char *p, *q; ! 605: for (p=(char *)&eblock[i],q=(char *)&eblock[0],j=0; (j<sizeof(struct envblock)); j++) ! 606: *p++ = *q++; } ! 607: #endif ! 608: olinep = oline; ! 609: ibufp = eibuf = ibuf; ! 610: v_hp = init = 0; ! 611: ioff = 0; ! 612: v_nl = -1; ! 613: cvtime(); ! 614: #ifndef INCORE ! 615: frame = stk = (struct s *)setbrk(DELTA); ! 616: #else ! 617: frame = stk = (struct s *)malloc(sizeof(struct s)); ! 618: /* incore version */ ! 619: #endif ! 620: dip = &d[0]; ! 621: #ifndef INCORE ! 622: nxf = frame + 1; ! 623: #else ! 624: nxf = (struct s *)malloc(sizeof(struct s)); ! 625: #endif ! 626: nx = mflg; ! 627: } ! 628: cvtime(){ ! 629: ! 630: long tt; ! 631: register i; ! 632: ! 633: time(&tt); ! 634: tt -= 3600*ZONE; /*5hrs for EST*/ ! 635: v_dy = (tt/86400L) + 1; ! 636: v_dw = (v_dy + 3)%7 + 1; ! 637: for(v_yr=70;; v_yr++){ ! 638: if((v_yr)%4)ms[1]=28;else ms[1]=29; ! 639: for(i=0;i<12;){ ! 640: if(v_dy<=ms[i]){ ! 641: v_mo = i+1; ! 642: return; ! 643: } ! 644: v_dy -= ms[i++]; ! 645: } ! 646: } ! 647: } ! 648: cnum(a) ! 649: char *a; ! 650: { ! 651: register i; ! 652: ! 653: ibufp = a; ! 654: for (eibuf = a; *eibuf++; ) ; ! 655: i = atoi(); ! 656: ch = 0; ! 657: return(i); ! 658: } ! 659: mesg(f) ! 660: int f; ! 661: { ! 662: #ifdef unix ! 663: static int mode; ! 664: struct stat statb; ! 665: ! 666: if(!f){ ! 667: stat(ttyp,&statb); ! 668: mode = statb.st_mode; ! 669: chmod(ttyp,mode & ~0122); ! 670: did_mesg = 1; ! 671: }else{ ! 672: if (did_mesg) chmod(ttyp,mode); ! 673: } ! 674: #endif ! 675: } ! 676: prstrfl(s) ! 677: char *s; ! 678: { ! 679: flusho(); ! 680: prstr(s); ! 681: } ! 682: prstr(s) ! 683: char *s; ! 684: { ! 685: register i; ! 686: register char *j; ! 687: ! 688: #ifdef unix ! 689: j = s; ! 690: for(i=0;*s;i++)s++; ! 691: write(ttyod,j,i); ! 692: #endif ! 693: #ifdef ebcdic ! 694: while (i = *s++) { ! 695: if (putc(i, ttyod) == EOF) ! 696: exit(1); ! 697: if (etoa[i] == '\n') ! 698: fflush(ttyod); } ! 699: #endif ! 700: } ! 701: #ifdef ebcdic ! 702: aprstrfl(s) ! 703: char *s; ! 704: { ! 705: flusho(); ! 706: aprstr(s); ! 707: } ! 708: aprstr(s) ! 709: char *s; ! 710: { register i; ! 711: register char *j; ! 712: ! 713: while (i = *s++) { ! 714: if (putc(atoe[i], ttyod) == EOF) ! 715: exit(1); ! 716: if (i == '\n') ! 717: fflush(ttyod); } ! 718: } ! 719: #endif ! 720: control(a,b) ! 721: int a,b; ! 722: { ! 723: register i,j; ! 724: ! 725: i = a; ! 726: if((i == 0) || ((j = frmname(i)) == -1))return(0); ! 727: if (nametab[j].ename & MMASK) { ! 728: nxf->nargs = 0; ! 729: if(b)collect(); ! 730: flushi(); ! 731: return(pushi((filep)nametab[j].vv.val)); } ! 732: else { ! 733: if(!b)return(0); ! 734: return ((*nametab[j].vv.f)(0)); } ! 735: } ! 736: ! 737: getrq(){ ! 738: register i,j; ! 739: ! 740: if(((i=getach()) == 0) || ! 741: ((j=getach()) == 0))goto rtn; ! 742: i = PAIR(i,j); ! 743: rtn: ! 744: return(i); ! 745: } ! 746: getch(){ ! 747: register int i, j, k; ! 748: ! 749: level++; ! 750: g0: ! 751: if(ch){ ! 752: if (((ch_CMASK = (i = ch) & CMASK)) == '\n')nlflg++; ! 753: ch = 0; ! 754: level--; ! 755: return(i); ! 756: } ! 757: ! 758: if(nlflg){ ! 759: level--; ! 760: return(ch_CMASK = '\n'); ! 761: } ! 762: ! 763: if((k = (i = getch0()) & CMASK) != ESC){ ! 764: if(i & MOT)goto g2; ! 765: if(k == FLSS){ ! 766: copyf++; raw++; ! 767: i = getch0(); ! 768: /* sign extend */ ! 769: if (i & 0100000) i |= (int)~0177777; ! 770: if(!fi)flss = i; ! 771: copyf--; raw--; ! 772: goto g0; ! 773: } ! 774: if(!copyf){ ! 775: #ifndef NROFF ! 776: if((k == 'f') && lg && !lgf){ ! 777: i = getlg(i); ! 778: goto g2; ! 779: } ! 780: #endif ! 781: if((k == fc) || (k == tabch) || (k == ldrch)){ ! 782: if((i=setfield(k)) == 0)goto g0; else goto g2; ! 783: } ! 784: if(k == 010){ ! 785: i = makem(-width(' ' | chbits)); ! 786: goto g2; ! 787: } ! 788: } ! 789: goto g2; ! 790: } ! 791: k = (j = getch0()) & CMASK; ! 792: if(j & MOT){ ! 793: i = j; ! 794: goto g2; ! 795: } ! 796: switch(k){ ! 797: ! 798: case '\n': /*concealed newline*/ ! 799: goto g0; ! 800: case 'n': /*number register*/ ! 801: setn(); ! 802: goto g0; ! 803: case '*': /*string indicator*/ ! 804: setstr(); ! 805: goto g0; ! 806: case '$': /*argument indicator*/ ! 807: getch(); ! 808: if (((i = ch_CMASK - '0') > 0) && (i <= 9) && (i <= frame->nargs)) ! 809: #ifndef INCORE ! 810: setap(*((int **)frame + i-1 + (sizeof(struct s)/sizeof(int **)))); ! 811: #else ! 812: setap((int *)*(argsp + i - 1)); ! 813: #endif ! 814: goto g0; ! 815: case '{': /*LEFT*/ ! 816: i = LEFT; ! 817: goto gx; ! 818: case '}': /*RIGHT*/ ! 819: i = RIGHT; ! 820: goto gx; ! 821: case '"': /*comment*/ ! 822: while(((i=getch0()) & CMASK ) != '\n'); ! 823: goto g2; ! 824: case ESC: /*double backslash*/ ! 825: i = eschar; ! 826: goto gx; ! 827: case 'e': /*printable version of current eschar*/ ! 828: i = PRESC; ! 829: goto gx; ! 830: case ' ': /*unpaddable space*/ ! 831: i = UNPAD; ! 832: goto gx; ! 833: case '|': /*narrow space*/ ! 834: i = NARSP; ! 835: goto gx; ! 836: case '^': /*half of narrow space*/ ! 837: i = HNSP; ! 838: goto gx; ! 839: case '\'': /*\(aa*/ ! 840: i = 0222; ! 841: goto gx; ! 842: case '`': /*\(ga*/ ! 843: i = 0223; ! 844: goto gx; ! 845: case '_': /*\(ul*/ ! 846: i = 0224; ! 847: goto gx; ! 848: case '-': /*current font minus*/ ! 849: i = 0210; ! 850: goto gx; ! 851: case '&': /*filler*/ ! 852: i = FILLER; ! 853: goto gx; ! 854: case 'c': /*to be continued*/ ! 855: i = CONT; ! 856: goto gx; ! 857: case ':': /* lem's character */ ! 858: i = COLON; ! 859: goto gx; ! 860: case '!': /*transparent indicator*/ ! 861: i = XPAR; ! 862: goto gx; ! 863: case 't': /*tab*/ ! 864: i = '\t'; ! 865: goto g2; ! 866: case 'a': /*leader (SOH)*/ ! 867: i = LEADER; ! 868: goto g2; ! 869: case '%': /*ohc*/ ! 870: i = OHC; ! 871: goto g2; ! 872: case 'g': /* return format of a number reg */ ! 873: setaf(); ! 874: goto g0; ! 875: case '.': /*.*/ ! 876: i = '.'; ! 877: gx: ! 878: i = (j & ~CMASK) | i; ! 879: goto g2; ! 880: } ! 881: if(!copyf) ! 882: switch(k){ ! 883: ! 884: case 'p': /*spread*/ ! 885: spread++; ! 886: goto g0; ! 887: case '(': /*special char name*/ ! 888: if((i=setch()) == 0)goto g0; ! 889: break; ! 890: case 's': /*size indicator*/ ! 891: setps(); ! 892: goto g0; ! 893: case 'f': /*font indicator*/ ! 894: setfont(0); ! 895: goto g0; ! 896: case 'w': /*width function*/ ! 897: setwd(); ! 898: goto g0; ! 899: case 'v': /*vert mot*/ ! 900: dfact = lss; ! 901: vflag++; ! 902: if (i = mot()) break; ! 903: goto g0; ! 904: case 'h': /*horiz mot*/ ! 905: #ifdef NROFF ! 906: dfact = EM; ! 907: #endif ! 908: #ifndef NROFF ! 909: dfact = 6 * (pts & 077); ! 910: #endif ! 911: if (i = mot()) break; ! 912: goto g0; ! 913: case 'z': /*zero with char*/ ! 914: if (!((i = getch()) & MOT)) i |= ZBIT; ! 915: break; ! 916: case 'l': /*hor line*/ ! 917: setline(); ! 918: goto g0; ! 919: case 'L': /*vert line*/ ! 920: setvline(); ! 921: goto g0; ! 922: case 'b': /*bracket*/ ! 923: setbra(); ! 924: goto g0; ! 925: case 'o': /*overstrike*/ ! 926: setov(); ! 927: goto g0; ! 928: case 'k': /*mark hor place*/ ! 929: if((i=findr(getsn())) == -1)goto g0; ! 930: vlist[i] = v_hp; ! 931: goto g0; ! 932: case 'j': /*mark output hor place*/ ! 933: if(!(i=getach()))goto g0; ! 934: i = (i<<BYTE) | JREG; ! 935: break; ! 936: case '0': /*number space*/ ! 937: i = makem(width('0' | chbits)); ! 938: break; ! 939: case 'x': /*extra line space*/ ! 940: if(i = xlss())break; ! 941: goto g0; ! 942: case 'u': /*half em up*/ ! 943: case 'r': /*full em up*/ ! 944: case 'd': /*half em down*/ ! 945: i = sethl(k); ! 946: break; ! 947: default: ! 948: i = j; ! 949: } ! 950: else{ ! 951: setch0(j); ! 952: i = eschar; ! 953: } ! 954: g2: ! 955: if((ch_CMASK = (i & CMASK)) == '\n'){ ! 956: nlflg++; ! 957: v_hp = 0; ! 958: if (!ip.b) cd++; ! 959: } ! 960: if(!--level){ ! 961: j = width(i); ! 962: v_hp += j; ! 963: cwidth = j; ! 964: } ! 965: return(i); ! 966: } ! 967: char ifilt[32] = {0,001,002,003,0,005,006,007,010, ! 968: 011,012,0,0,0,016,017,0, ! 969: 0,0,0,0,0,0,0,0, ! 970: 0,0,033}; ! 971: getch0(){ ! 972: register int i, j; ! 973: ! 974: again: ! 975: if (cstkl) { /* characters in stack? */ ! 976: while ((i = *cstk[cstkl]++) == 0) { ! 977: cstk[cstkl--] = 0; /* that string is depleted */ ! 978: while (cstkl && !cstk[cstkl]) ! 979: cstkl--; /* find next in stack */ ! 980: if (!cstkl) break; } /* out if stack empty */ ! 981: if (cstkl >= RP) return (i); ! 982: else if (i) goto g5; } ! 983: ipagain: ! 984: if (ip.b) /* input from tty or tmp file */ ! 985: i = ! 986: #ifndef SMALL ! 987: (ip.b == (filep)-2) ? rdunix() : /* read from unix */ ! 988: #endif ! 989: (ip.b == (filep)-1) ? rdtty() : /* read from tty */ ! 990: rbf(); /* read from tmp */ ! 991: else { ! 992: if(donef || ndone)done(0); ! 993: if(nx || (ibufp >= eibuf)){ ! 994: if(nfo)goto g1; ! 995: g0: ! 996: if (nextfile(0)) { ! 997: if (ip.b) goto ipagain; ! 998: if (ibufp < eibuf) goto g2; } ! 999: g1: ! 1000: nx = 0; ! 1001: #ifdef unix ! 1002: if((j=read(ifile,ibuf,IBUFSZ)) <= 0)goto g0; ! 1003: #endif ! 1004: #ifdef tso ! 1005: if ((j=fread(ibuf,1,IBUFSZ,ifile))<=0) goto g0; ! 1006: #endif ! 1007: ibufp = ibuf; ! 1008: eibuf = ibuf + j; } ! 1009: g2: ! 1010: #ifndef ebcdic ! 1011: i = *ibufp++ & 0177; ! 1012: #else ! 1013: i = etoa[*ibufp++] & 0177; ! 1014: #endif ! 1015: ioff++; ! 1016: if(i >= 040)goto g4; else i = ifilt[i]; } ! 1017: g5: ! 1018: if(raw)return(i); ! 1019: if((i & CMASK) == IMP)goto again; ! 1020: if((i == 0) && !init)goto again; ! 1021: g4: ! 1022: if((copyf == 0) && ((i & ~BMASK) == 0) && ((i & CMASK) < 0370)) ! 1023: #ifndef NROFF ! 1024: if(spbits && (i>31) && ((codetab[i-32] & 0200))) i |= spbits; ! 1025: else ! 1026: #endif ! 1027: i |= chbits; ! 1028: if((i & CMASK) == eschar)i = (i & ~CMASK) | ESC; ! 1029: return(i); ! 1030: } ! 1031: nextfile(nxtog) ! 1032: int nxtog; ! 1033: { ! 1034: register char *p; ! 1035: register int i; ! 1036: ! 1037: n0: ! 1038: #ifdef unix ! 1039: if(ifile)close(ifile); ! 1040: #endif ! 1041: #ifdef tso ! 1042: if (ifile) fclose(ifile); ! 1043: #endif ! 1044: if(nnextf < mflg){ ! 1045: p = nextf[nnextf++].buf; ! 1046: goto n1; } ! 1047: else ! 1048: if (mflg == nnextf) nnextf++; ! 1049: if(ifi > 0){ ! 1050: if(popf())goto n0; /*popf error*/ ! 1051: return(1); /*popf ok*/ ! 1052: } ! 1053: if(rargc-- <= 0) { ! 1054: if((nfo -= mflg) && !stdi)done(0); ! 1055: nfo++; ! 1056: cd = stdi = mflg = 0; ! 1057: for (i=0,p="<standard input>"; cfname[ifi][i] = p[i]; i++) ; ! 1058: ifile = (filedes)0; ! 1059: ioff = 0; ! 1060: return(0); } ! 1061: p = (argp++)[0]; ! 1062: n1: ! 1063: if((p[0] == '-') && (p[1] == 0)){ ! 1064: for (i=0,p="<standard input>"; cfname[ifi][i] = p[i]; i++) ; ! 1065: ifile = (filedes)0; ! 1066: }else ! 1067: #ifdef unix ! 1068: if((ifile=open(p,0)) >= 0) ! 1069: #endif ! 1070: #ifdef tso ! 1071: if ((ifile=fopen(fname(p),"r")) != NULL) ! 1072: #endif ! 1073: for (i=0; cfname[ifi][i] = p[i]; i++) ; ! 1074: else { ! 1075: if ((nnextf <= mflg) && !nxtog) { ! 1076: prstr("Non-existent macro file ("); ! 1077: aprstr(&nextf[nnextf-1].buf[nfi]); ! 1078: prstr(")"); } ! 1079: else { ! 1080: prstr("cannot open file "); ! 1081: aprstr(p); } ! 1082: prstr("\n"); ! 1083: nfo -= mflg; ! 1084: nx = nnextf; ! 1085: done(02); ! 1086: } ! 1087: nfo++; ! 1088: cd = 0; ! 1089: ioff = 0; ! 1090: return(0); ! 1091: } ! 1092: popf(){ ! 1093: register i; ! 1094: register char *p, *q; ! 1095: ! 1096: ioff = offl[--ifi]; ! 1097: cptmpfaddr(ip,ipl[ifi]); ! 1098: if((ifile = ifl[ifi]) == (filedes)0){ ! 1099: p = xbuf; ! 1100: q = ibuf; ! 1101: ibufp = xbufp; ! 1102: eibuf = xeibuf; ! 1103: while(q < eibuf)*q++ = *p++; ! 1104: return(0); ! 1105: } ! 1106: #ifdef unix ! 1107: if((lseek(ifile,(long)(ioff & ~(IBUFSZ-1)),0) < (long)0) || ! 1108: ((i = read(ifile,ibuf,IBUFSZ)) < 0))return(1); ! 1109: eibuf = ibuf + i; ! 1110: ibufp = ibuf; ! 1111: if(ttyname(ifile) == (char *)0) ! 1112: ibufp = ibuf + (int)(ioff & (IBUFSZ-1)); ! 1113: #endif ! 1114: #ifdef tso ! 1115: eibuf = heibuf[ifi]; /* restore buffers and pointers */ ! 1116: ibufp = hibufp[ifi]; ! 1117: if (ibufp >= eibuf) return (1); ! 1118: for (p=ibuf,q=hibuf[ifi]; p<=eibuf; ) ! 1119: *p++ = *q++; ! 1120: #endif ! 1121: return(0); ! 1122: } ! 1123: flushi(){ ! 1124: if(nflush)return; ! 1125: ch = 0; ! 1126: if (cstkl == CH0) { ! 1127: if (tch[0] == '\n') nlflg++; ! 1128: do cstkl--; ! 1129: while (cstkl && !cstk[cstkl]); } ! 1130: copyf++; ! 1131: while(!nlflg){ ! 1132: if(donef && (frame == stk))break; ! 1133: getch(); ! 1134: } ! 1135: copyf--; ! 1136: v_hp = 0; ! 1137: } ! 1138: getach(){ ! 1139: register i; ! 1140: ! 1141: lgf++; ! 1142: if(((i = getch()) & (MOT | 0200)) || ! 1143: (ch_CMASK == ' ') || ! 1144: (ch_CMASK == '\n')) { ! 1145: ch = i; ! 1146: i = 0; ! 1147: } ! 1148: lgf--; ! 1149: return(i & 0177); ! 1150: } ! 1151: getname(){ ! 1152: register int i, k; ! 1153: ! 1154: lgf++; ! 1155: for(k=0; k < (NS-1); k++){ ! 1156: i = getch(); ! 1157: if ((ch_CMASK <= ' ') || (ch_CMASK > 0176)) break; ! 1158: newf[k] = ch_CMASK; ! 1159: } ! 1160: newf[k] = 0; ! 1161: ch = i; ! 1162: lgf--; ! 1163: return(newf[0]); ! 1164: } ! 1165: casenx(){ ! 1166: register int i; ! 1167: ! 1168: lgf++; ! 1169: skip(); ! 1170: getname(); ! 1171: nx++; ! 1172: nnextf--; ! 1173: for (i=0; (nextf[nnextf].buf[i] = newf[i]); i++) ; ! 1174: i = mflg; ! 1175: if (mflg <= nnextf) mflg = nnextf + 1; ! 1176: nextfile(1); ! 1177: mflg = i; ! 1178: nlflg++; ! 1179: cstkl = pendt = ip.b = 0; ! 1180: cstk[CH0] = cstk[AP] = (int *)0; ! 1181: frame = stk; ! 1182: #ifndef INCORE ! 1183: nxf = frame + 1; ! 1184: #else ! 1185: nxf = (struct s *)malloc(sizeof(struct s)); ! 1186: #endif ! 1187: } ! 1188: caseso() ! 1189: { ! 1190: register filedes i; ! 1191: register char *p, *q; ! 1192: ! 1193: lgf++; ! 1194: newf[0] = 0; ! 1195: if(skip() || !getname() ! 1196: #ifdef unix ! 1197: || ((i=open(newf,0)) <0) ! 1198: #endif ! 1199: #ifdef tso ! 1200: || ((i=fopen(fname(newf),"r")) == NULL) ! 1201: #endif ! 1202: || (ifi >= NSO)) { ! 1203: prstr("can't open file "); ! 1204: aprstr(newf); ! 1205: prstr("\n"); ! 1206: done(02); ! 1207: } ! 1208: for (p=cfname[ifi+1],q=newf; *p = *q; p++,q++) ; ! 1209: flushi(); ! 1210: #ifdef tso ! 1211: for (p=ibuf,q=hibuf[ifi]; p<eibuf; ) ! 1212: *q++ = *p++; ! 1213: heibuf[ifi] = eibuf; /* save buffer and pointers */ ! 1214: hibufp[ifi] = ibufp; ! 1215: #endif ! 1216: ifl[ifi] = ifile; ! 1217: ifile = i; ! 1218: offl[ifi] = ioff; ! 1219: ioff = 0; ! 1220: cptmpfaddr(ipl[ifi],ip); ! 1221: ip.b = 0; ! 1222: nx++; ! 1223: nflush++; ! 1224: if(!ifl[ifi++]){ ! 1225: p = ibuf; ! 1226: q = xbuf; ! 1227: xbufp = ibufp; ! 1228: xeibuf = eibuf; ! 1229: while(p < eibuf)*q++ = *p++; ! 1230: } ! 1231: } ! 1232: getpn(a) ! 1233: char *a; ! 1234: { ! 1235: register i, neg; ! 1236: long atoi1(); ! 1237: ! 1238: if((*a & 0177) == 0)return; ! 1239: neg = 0; ! 1240: ibufp = a; ! 1241: for (eibuf = a; *eibuf++; ) ; ! 1242: noscale++; ! 1243: while((i = getch() & CMASK) != 0)switch(i){ ! 1244: case '+': ! 1245: case ',': ! 1246: continue; ! 1247: case '-': ! 1248: neg = MOT; ! 1249: goto d2; ! 1250: default: ! 1251: ch = i; ! 1252: d2: ! 1253: i = atoi1(); ! 1254: if(nonumb)goto fini; ! 1255: else{ ! 1256: *pnp++ = i | neg; ! 1257: neg = 0; ! 1258: if(pnp >= &pnlist[NPN-2]){ ! 1259: prstr("Too many page numbers\n"); ! 1260: done3(-3); ! 1261: } ! 1262: } ! 1263: } ! 1264: fini: ! 1265: if(neg)*pnp++ = -2; ! 1266: *pnp = -1; ! 1267: ch = noscale = print = 0; ! 1268: pnp = pnlist; ! 1269: if(*pnp != -1)chkpn(); ! 1270: } ! 1271: ! 1272: /* compacted macros support routines. */ ! 1273: ! 1274: ! 1275: #ifndef NOCOMPACT ! 1276: ! 1277: Mcp(oldp, newp) /* copy file on oldp to file on newp */ ! 1278: int oldp, newp; ! 1279: { int n; ! 1280: char BUF[BSIZE]; /* copy buffer */ ! 1281: ! 1282: while ((n = read(oldp, BUF, BSIZE)) > 0) ! 1283: ! 1284: if (write(newp, BUF, n) != n) { ! 1285: ! 1286: prstr("tmp file write error\n"); ! 1287: exit(1); } ! 1288: } ! 1289: ! 1290: #endif ! 1291: ! 1292: caseco() /* perform .co request */ ! 1293: { ! 1294: #ifndef NOCOMPACT ! 1295: int i; ! 1296: ! 1297: if (!compact) return(0); ! 1298: cname[0] = 'd'; /* data file first */ ! 1299: if ((i = creat(cname, 0666)) < 0) { ! 1300: prstr("can't create data file\n"); ! 1301: exit(1); } ! 1302: ! 1303: write(i, &version, sizeof(version)); /* write current version tag */ ! 1304: write(i, &dblock, sizeof(struct datablock)); /* write data area */ ! 1305: close(i); /* done with data area */ ! 1306: ! 1307: cname[0] = 't'; /* now the tmp file */ ! 1308: lseek(ibf, (long)(ev*sizeof(struct envblock)), 0); /* write curr env */ ! 1309: write(ibf, (char *)&eblock, sizeof(struct envblock)); ! 1310: lseek(ibf, (long)0, 0); /* rewind */ ! 1311: if ((i = creat(cname, 0666)) < 0) { ! 1312: prstr("can't create tmp file\n"); ! 1313: exit(1); } ! 1314: Mcp(ibf, i); /* copy tmp file */ ! 1315: unlink(unlkp); /* remove old tmp file */ ! 1316: ! 1317: prstr("Compaction completed\n"); ! 1318: exit(1); ! 1319: #endif ! 1320: } ! 1321: ! 1322: /* error message routines */ ! 1323: ! 1324: ertoomp() {prstr("Too many macro packages.\n"); exit(-1); } ! 1325: ! 1326: #ifndef INCORE ! 1327: errcos() {prstr("Cannot open suftab.\n"); exit(-1); } ! 1328: #endif ! 1329: ! 1330: ferrex() { ! 1331: #ifdef unix ! 1332: #ifndef INCORE ! 1333: unlink(unlkp); ! 1334: #endif ! 1335: #endif ! 1336: exit(1); } ! 1337: caseunix() /* read output of command sent to unix */ ! 1338: { ! 1339: #ifndef SMALL ! 1340: int fildes[2]; /* file pointers for pipe */ ! 1341: register int i, j; ! 1342: char argbuf[15*ARGLEN]; /* hold arguments sent to unix */ ! 1343: char *argp[20]; /* pointers to arguments */ ! 1344: register int *p; ! 1345: ! 1346: nxf->nargs = 0; ! 1347: collect(); /* get request arguments */ ! 1348: flushi(); /* flush input */ ! 1349: pipe(fildes); /* open pipe */ ! 1350: ! 1351: if (fork() == 0) { /* child only code */ ! 1352: ! 1353: close(1); /* close standard output */ ! 1354: if (dup2(fildes[1], 1) != 1) { ! 1355: prstr("can't setup command env\n"); ! 1356: exit(1); } ! 1357: close(fildes[1]); /* close old pipe channel */ ! 1358: ! 1359: j = 0; ! 1360: argpp -= nxf->nargs; /* point to args */ ! 1361: ! 1362: for (i=0; i < nxf->nargs; i++) { ! 1363: argp[i] = &argbuf[j]; /* point to next string */ ! 1364: for (p = *argpp++; argbuf[j++] = (char)*p++; ) ; } ! 1365: ! 1366: argp[nxf->nargs] = 0; /* null after last pointer */ ! 1367: close(0); /* close standard input */ ! 1368: execvp(argp[0], argp); /* call unix program */ ! 1369: prstr("Can't execute "); ! 1370: prstr(argp[0]); ! 1371: prstr("\n"); ! 1372: exit(1); } ! 1373: ! 1374: else { /* parent only code */ ! 1375: ! 1376: close(fildes[1]); /* close write side */ ! 1377: unixch = fildes[0]; /* channel for unix reads */ ! 1378: pushi((filep)-2); } /* mark unix read */ ! 1379: } ! 1380: ! 1381: rdunix() ! 1382: { ! 1383: static char unixb[BSIZE]; /* unix read buffer */ ! 1384: ! 1385: if (unixp >= unixpt) { /* read a buffer */ ! 1386: ! 1387: if ((unixpt = read(unixch,unixb,BSIZE)) <= 0) { ! 1388: close(unixch); ! 1389: popi(); /* end of file - terminate unix read */ ! 1390: unixch = 0; ! 1391: return getch0(); } ! 1392: ! 1393: else unixp = 0; } ! 1394: ! 1395: return unixb[unixp++]; ! 1396: #endif ! 1397: } ! 1398: ! 1399: #ifdef ebcdic ! 1400: ! 1401: char *fname(s) ! 1402: char *s; ! 1403: { static char fnamebuf[NS]; ! 1404: register char *p; ! 1405: ! 1406: for (p = fnamebuf; *s; s++) ! 1407: if (*s == '/') ! 1408: p = fnamebuf; ! 1409: else ! 1410: *p++ = atoe[*s]; ! 1411: *p++ = 0; ! 1412: return (fnamebuf); ! 1413: } ! 1414: ! 1415: cargs(rgc, rgv) ! 1416: int rgc; ! 1417: char **rgv; ! 1418: { char *trgv; ! 1419: ! 1420: for ( ; (rgc-- > 0); rgv++) ! 1421: ! 1422: for (trgv = *rgv; (*trgv); trgv++) ! 1423: ! 1424: *trgv = etoa[*trgv]; ! 1425: } ! 1426: ! 1427: #endif ! 1428: ! 1429: #ifdef tso ! 1430: abs(i) ! 1431: int i; ! 1432: { ! 1433: if (i >= 0) return i; ! 1434: else return -i; ! 1435: } ! 1436: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.