1*18578Sralph /* sed1.c 4.1 85/04/05 */ 2*18578Sralph 3*18578Sralph #include <stdio.h> 4*18578Sralph #include "sed.h" 5*18578Sralph 6*18578Sralph char *trans[040] = { 7*18578Sralph "\\01", 8*18578Sralph "\\02", 9*18578Sralph "\\03", 10*18578Sralph "\\04", 11*18578Sralph "\\05", 12*18578Sralph "\\06", 13*18578Sralph "\\07", 14*18578Sralph "<-", 15*18578Sralph ">-", 16*18578Sralph "\n", 17*18578Sralph "\\13", 18*18578Sralph "\\14", 19*18578Sralph "\\15", 20*18578Sralph "\\16", 21*18578Sralph "\\17", 22*18578Sralph "\\20", 23*18578Sralph "\\21", 24*18578Sralph "\\22", 25*18578Sralph "\\23", 26*18578Sralph "\\24", 27*18578Sralph "\\25", 28*18578Sralph "\\26", 29*18578Sralph "\\27", 30*18578Sralph "\\30", 31*18578Sralph "\\31", 32*18578Sralph "\\32", 33*18578Sralph "\\33", 34*18578Sralph "\\34", 35*18578Sralph "\\35", 36*18578Sralph "\\36", 37*18578Sralph "\\37" 38*18578Sralph }; 39*18578Sralph char rub[] = {"\177"}; 40*18578Sralph 41*18578Sralph execute(file) 42*18578Sralph char *file; 43*18578Sralph { 44*18578Sralph register char *p1, *p2; 45*18578Sralph register union reptr *ipc; 46*18578Sralph int c; 47*18578Sralph char *execp; 48*18578Sralph 49*18578Sralph if (file) { 50*18578Sralph if ((f = open(file, 0)) < 0) { 51*18578Sralph fprintf(stderr, "Can't open %s\n", file); 52*18578Sralph } 53*18578Sralph } else 54*18578Sralph f = 0; 55*18578Sralph 56*18578Sralph ebp = ibuf; 57*18578Sralph cbp = ibuf; 58*18578Sralph 59*18578Sralph if(pending) { 60*18578Sralph ipc = pending; 61*18578Sralph pending = 0; 62*18578Sralph goto yes; 63*18578Sralph } 64*18578Sralph 65*18578Sralph for(;;) { 66*18578Sralph if((execp = gline(linebuf)) == badp) { 67*18578Sralph close(f); 68*18578Sralph return; 69*18578Sralph } 70*18578Sralph spend = execp; 71*18578Sralph 72*18578Sralph for(ipc = ptrspace; ipc->command; ) { 73*18578Sralph 74*18578Sralph p1 = ipc->ad1; 75*18578Sralph p2 = ipc->ad2; 76*18578Sralph 77*18578Sralph if(p1) { 78*18578Sralph 79*18578Sralph if(ipc->inar) { 80*18578Sralph if(*p2 == CEND) { 81*18578Sralph p1 = 0; 82*18578Sralph } else if(*p2 == CLNUM) { 83*18578Sralph c = p2[1]; 84*18578Sralph if(lnum > tlno[c]) { 85*18578Sralph ipc->inar = 0; 86*18578Sralph if(ipc->negfl) 87*18578Sralph goto yes; 88*18578Sralph ipc++; 89*18578Sralph continue; 90*18578Sralph } 91*18578Sralph if(lnum == tlno[c]) { 92*18578Sralph ipc->inar = 0; 93*18578Sralph } 94*18578Sralph } else if(match(p2, 0)) { 95*18578Sralph ipc->inar = 0; 96*18578Sralph } 97*18578Sralph } else if(*p1 == CEND) { 98*18578Sralph if(!dolflag) { 99*18578Sralph if(ipc->negfl) 100*18578Sralph goto yes; 101*18578Sralph ipc++; 102*18578Sralph continue; 103*18578Sralph } 104*18578Sralph 105*18578Sralph } else if(*p1 == CLNUM) { 106*18578Sralph c = p1[1]; 107*18578Sralph if(lnum != tlno[c]) { 108*18578Sralph if(ipc->negfl) 109*18578Sralph goto yes; 110*18578Sralph ipc++; 111*18578Sralph continue; 112*18578Sralph } 113*18578Sralph if(p2) 114*18578Sralph ipc->inar = 1; 115*18578Sralph } else if(match(p1, 0)) { 116*18578Sralph if(p2) 117*18578Sralph ipc->inar = 1; 118*18578Sralph } else { 119*18578Sralph if(ipc->negfl) 120*18578Sralph goto yes; 121*18578Sralph ipc++; 122*18578Sralph continue; 123*18578Sralph } 124*18578Sralph } 125*18578Sralph 126*18578Sralph if(ipc->negfl) { 127*18578Sralph ipc++; 128*18578Sralph continue; 129*18578Sralph } 130*18578Sralph yes: 131*18578Sralph command(ipc); 132*18578Sralph 133*18578Sralph if(delflag) 134*18578Sralph break; 135*18578Sralph 136*18578Sralph if(jflag) { 137*18578Sralph jflag = 0; 138*18578Sralph if((ipc = ipc->lb1) == 0) { 139*18578Sralph ipc = ptrspace; 140*18578Sralph break; 141*18578Sralph } 142*18578Sralph } else 143*18578Sralph ipc++; 144*18578Sralph 145*18578Sralph } 146*18578Sralph if(!nflag && !delflag) { 147*18578Sralph for(p1 = linebuf; p1 < spend; p1++) 148*18578Sralph putc(*p1, stdout); 149*18578Sralph putc('\n', stdout); 150*18578Sralph } 151*18578Sralph 152*18578Sralph if(aptr > abuf) { 153*18578Sralph arout(); 154*18578Sralph } 155*18578Sralph 156*18578Sralph delflag = 0; 157*18578Sralph 158*18578Sralph } 159*18578Sralph } 160*18578Sralph match(expbuf, gf) 161*18578Sralph char *expbuf; 162*18578Sralph { 163*18578Sralph register char *p1, *p2, c; 164*18578Sralph 165*18578Sralph if(gf) { 166*18578Sralph if(*expbuf) return(0); 167*18578Sralph p1 = linebuf; 168*18578Sralph p2 = genbuf; 169*18578Sralph while(*p1++ = *p2++); 170*18578Sralph locs = p1 = loc2; 171*18578Sralph } else { 172*18578Sralph p1 = linebuf; 173*18578Sralph locs = 0; 174*18578Sralph } 175*18578Sralph 176*18578Sralph p2 = expbuf; 177*18578Sralph if(*p2++) { 178*18578Sralph loc1 = p1; 179*18578Sralph if(*p2 == CCHR && p2[1] != *p1) 180*18578Sralph return(0); 181*18578Sralph return(advance(p1, p2)); 182*18578Sralph } 183*18578Sralph 184*18578Sralph /* fast check for first character */ 185*18578Sralph 186*18578Sralph if(*p2 == CCHR) { 187*18578Sralph c = p2[1]; 188*18578Sralph do { 189*18578Sralph if(*p1 != c) 190*18578Sralph continue; 191*18578Sralph if(advance(p1, p2)) { 192*18578Sralph loc1 = p1; 193*18578Sralph return(1); 194*18578Sralph } 195*18578Sralph } while(*p1++); 196*18578Sralph return(0); 197*18578Sralph } 198*18578Sralph 199*18578Sralph do { 200*18578Sralph if(advance(p1, p2)) { 201*18578Sralph loc1 = p1; 202*18578Sralph return(1); 203*18578Sralph } 204*18578Sralph } while(*p1++); 205*18578Sralph return(0); 206*18578Sralph } 207*18578Sralph advance(alp, aep) 208*18578Sralph char *alp, *aep; 209*18578Sralph { 210*18578Sralph register char *lp, *ep, *curlp; 211*18578Sralph char c; 212*18578Sralph char *bbeg; 213*18578Sralph int ct; 214*18578Sralph 215*18578Sralph /*fprintf(stderr, "*lp = %c, %o\n*ep = %c, %o\n", *lp, *lp, *ep, *ep); /*DEBUG*/ 216*18578Sralph 217*18578Sralph lp = alp; 218*18578Sralph ep = aep; 219*18578Sralph for (;;) switch (*ep++) { 220*18578Sralph 221*18578Sralph case CCHR: 222*18578Sralph if (*ep++ == *lp++) 223*18578Sralph continue; 224*18578Sralph return(0); 225*18578Sralph 226*18578Sralph case CDOT: 227*18578Sralph if (*lp++) 228*18578Sralph continue; 229*18578Sralph return(0); 230*18578Sralph 231*18578Sralph case CNL: 232*18578Sralph case CDOL: 233*18578Sralph if (*lp == 0) 234*18578Sralph continue; 235*18578Sralph return(0); 236*18578Sralph 237*18578Sralph case CEOF: 238*18578Sralph loc2 = lp; 239*18578Sralph return(1); 240*18578Sralph 241*18578Sralph case CCL: 242*18578Sralph c = *lp++ & 0177; 243*18578Sralph if(ep[c>>3] & bittab[c & 07]) { 244*18578Sralph ep += 16; 245*18578Sralph continue; 246*18578Sralph } 247*18578Sralph return(0); 248*18578Sralph 249*18578Sralph case CBRA: 250*18578Sralph braslist[*ep++] = lp; 251*18578Sralph continue; 252*18578Sralph 253*18578Sralph case CKET: 254*18578Sralph braelist[*ep++] = lp; 255*18578Sralph continue; 256*18578Sralph 257*18578Sralph case CBACK: 258*18578Sralph bbeg = braslist[*ep]; 259*18578Sralph ct = braelist[*ep++] - bbeg; 260*18578Sralph 261*18578Sralph if(ecmp(bbeg, lp, ct)) { 262*18578Sralph lp += ct; 263*18578Sralph continue; 264*18578Sralph } 265*18578Sralph return(0); 266*18578Sralph 267*18578Sralph case CBACK|STAR: 268*18578Sralph bbeg = braslist[*ep]; 269*18578Sralph ct = braelist[*ep++] - bbeg; 270*18578Sralph curlp = lp; 271*18578Sralph while(ecmp(bbeg, lp, ct)) 272*18578Sralph lp += ct; 273*18578Sralph 274*18578Sralph while(lp >= curlp) { 275*18578Sralph if(advance(lp, ep)) return(1); 276*18578Sralph lp -= ct; 277*18578Sralph } 278*18578Sralph return(0); 279*18578Sralph 280*18578Sralph 281*18578Sralph case CDOT|STAR: 282*18578Sralph curlp = lp; 283*18578Sralph while (*lp++); 284*18578Sralph goto star; 285*18578Sralph 286*18578Sralph case CCHR|STAR: 287*18578Sralph curlp = lp; 288*18578Sralph while (*lp++ == *ep); 289*18578Sralph ep++; 290*18578Sralph goto star; 291*18578Sralph 292*18578Sralph case CCL|STAR: 293*18578Sralph curlp = lp; 294*18578Sralph do { 295*18578Sralph c = *lp++ & 0177; 296*18578Sralph } while(ep[c>>3] & bittab[c & 07]); 297*18578Sralph ep += 16; 298*18578Sralph goto star; 299*18578Sralph 300*18578Sralph star: 301*18578Sralph if(--lp == curlp) { 302*18578Sralph continue; 303*18578Sralph } 304*18578Sralph 305*18578Sralph if(*ep == CCHR) { 306*18578Sralph c = ep[1]; 307*18578Sralph do { 308*18578Sralph if(*lp != c) 309*18578Sralph continue; 310*18578Sralph if(advance(lp, ep)) 311*18578Sralph return(1); 312*18578Sralph } while(lp-- > curlp); 313*18578Sralph return(0); 314*18578Sralph } 315*18578Sralph 316*18578Sralph if(*ep == CBACK) { 317*18578Sralph c = *(braslist[ep[1]]); 318*18578Sralph do { 319*18578Sralph if(*lp != c) 320*18578Sralph continue; 321*18578Sralph if(advance(lp, ep)) 322*18578Sralph return(1); 323*18578Sralph } while(lp-- > curlp); 324*18578Sralph return(0); 325*18578Sralph } 326*18578Sralph 327*18578Sralph do { 328*18578Sralph if(lp == locs) break; 329*18578Sralph if (advance(lp, ep)) 330*18578Sralph return(1); 331*18578Sralph } while (lp-- > curlp); 332*18578Sralph return(0); 333*18578Sralph 334*18578Sralph default: 335*18578Sralph fprintf(stderr, "RE botch, %o\n", *--ep); 336*18578Sralph } 337*18578Sralph } 338*18578Sralph substitute(ipc) 339*18578Sralph union reptr *ipc; 340*18578Sralph { 341*18578Sralph if(match(ipc->re1, 0) == 0) return(0); 342*18578Sralph 343*18578Sralph sflag = 1; 344*18578Sralph dosub(ipc->rhs); 345*18578Sralph 346*18578Sralph if(ipc->gfl) { 347*18578Sralph while(*loc2) { 348*18578Sralph if(match(ipc->re1, 1) == 0) break; 349*18578Sralph dosub(ipc->rhs); 350*18578Sralph } 351*18578Sralph } 352*18578Sralph return(1); 353*18578Sralph } 354*18578Sralph 355*18578Sralph dosub(rhsbuf) 356*18578Sralph char *rhsbuf; 357*18578Sralph { 358*18578Sralph register char *lp, *sp, *rp; 359*18578Sralph int c; 360*18578Sralph 361*18578Sralph lp = linebuf; 362*18578Sralph sp = genbuf; 363*18578Sralph rp = rhsbuf; 364*18578Sralph while (lp < loc1) 365*18578Sralph *sp++ = *lp++; 366*18578Sralph while(c = *rp++) { 367*18578Sralph if (c == '&') { 368*18578Sralph sp = place(sp, loc1, loc2); 369*18578Sralph continue; 370*18578Sralph } else if (c&0200 && (c &= 0177) >= '1' && c < NBRA+'1') { 371*18578Sralph sp = place(sp, braslist[c-'1'], braelist[c-'1']); 372*18578Sralph continue; 373*18578Sralph } 374*18578Sralph *sp++ = c&0177; 375*18578Sralph if (sp >= &genbuf[LBSIZE]) 376*18578Sralph fprintf(stderr, "output line too long.\n"); 377*18578Sralph } 378*18578Sralph lp = loc2; 379*18578Sralph loc2 = sp - genbuf + linebuf; 380*18578Sralph while (*sp++ = *lp++) 381*18578Sralph if (sp >= &genbuf[LBSIZE]) { 382*18578Sralph fprintf(stderr, "Output line too long.\n"); 383*18578Sralph } 384*18578Sralph lp = linebuf; 385*18578Sralph sp = genbuf; 386*18578Sralph while (*lp++ = *sp++); 387*18578Sralph spend = lp-1; 388*18578Sralph } 389*18578Sralph char *place(asp, al1, al2) 390*18578Sralph char *asp, *al1, *al2; 391*18578Sralph { 392*18578Sralph register char *sp, *l1, *l2; 393*18578Sralph 394*18578Sralph sp = asp; 395*18578Sralph l1 = al1; 396*18578Sralph l2 = al2; 397*18578Sralph while (l1 < l2) { 398*18578Sralph *sp++ = *l1++; 399*18578Sralph if (sp >= &genbuf[LBSIZE]) 400*18578Sralph fprintf(stderr, "Output line too long.\n"); 401*18578Sralph } 402*18578Sralph return(sp); 403*18578Sralph } 404*18578Sralph 405*18578Sralph command(ipc) 406*18578Sralph union reptr *ipc; 407*18578Sralph { 408*18578Sralph register int i; 409*18578Sralph register char *p1, *p2, *p3; 410*18578Sralph char *execp; 411*18578Sralph 412*18578Sralph 413*18578Sralph switch(ipc->command) { 414*18578Sralph 415*18578Sralph case ACOM: 416*18578Sralph *aptr++ = ipc; 417*18578Sralph if(aptr >= &abuf[ABUFSIZE]) { 418*18578Sralph fprintf(stderr, "Too many appends after line %ld\n", 419*18578Sralph lnum); 420*18578Sralph } 421*18578Sralph *aptr = 0; 422*18578Sralph break; 423*18578Sralph 424*18578Sralph case CCOM: 425*18578Sralph delflag = 1; 426*18578Sralph if(!ipc->inar || dolflag) { 427*18578Sralph for(p1 = ipc->re1; *p1; ) 428*18578Sralph putc(*p1++, stdout); 429*18578Sralph putc('\n', stdout); 430*18578Sralph } 431*18578Sralph break; 432*18578Sralph case DCOM: 433*18578Sralph delflag++; 434*18578Sralph break; 435*18578Sralph case CDCOM: 436*18578Sralph p1 = p2 = linebuf; 437*18578Sralph 438*18578Sralph while(*p1 != '\n') { 439*18578Sralph if(*p1++ == 0) { 440*18578Sralph delflag++; 441*18578Sralph return; 442*18578Sralph } 443*18578Sralph } 444*18578Sralph 445*18578Sralph p1++; 446*18578Sralph while(*p2++ = *p1++); 447*18578Sralph spend = p2-1; 448*18578Sralph jflag++; 449*18578Sralph break; 450*18578Sralph 451*18578Sralph case EQCOM: 452*18578Sralph fprintf(stdout, "%ld\n", lnum); 453*18578Sralph break; 454*18578Sralph 455*18578Sralph case GCOM: 456*18578Sralph p1 = linebuf; 457*18578Sralph p2 = holdsp; 458*18578Sralph while(*p1++ = *p2++); 459*18578Sralph spend = p1-1; 460*18578Sralph break; 461*18578Sralph 462*18578Sralph case CGCOM: 463*18578Sralph *spend++ = '\n'; 464*18578Sralph p1 = spend; 465*18578Sralph p2 = holdsp; 466*18578Sralph while(*p1++ = *p2++) 467*18578Sralph if(p1 >= lbend) 468*18578Sralph break; 469*18578Sralph spend = p1-1; 470*18578Sralph break; 471*18578Sralph 472*18578Sralph case HCOM: 473*18578Sralph p1 = holdsp; 474*18578Sralph p2 = linebuf; 475*18578Sralph while(*p1++ = *p2++); 476*18578Sralph hspend = p1-1; 477*18578Sralph break; 478*18578Sralph 479*18578Sralph case CHCOM: 480*18578Sralph *hspend++ = '\n'; 481*18578Sralph p1 = hspend; 482*18578Sralph p2 = linebuf; 483*18578Sralph while(*p1++ = *p2++) 484*18578Sralph if(p1 >= hend) 485*18578Sralph break; 486*18578Sralph hspend = p1-1; 487*18578Sralph break; 488*18578Sralph 489*18578Sralph case ICOM: 490*18578Sralph for(p1 = ipc->re1; *p1; ) 491*18578Sralph putc(*p1++, stdout); 492*18578Sralph putc('\n', stdout); 493*18578Sralph break; 494*18578Sralph 495*18578Sralph case BCOM: 496*18578Sralph jflag = 1; 497*18578Sralph break; 498*18578Sralph 499*18578Sralph case LCOM: 500*18578Sralph p1 = linebuf; 501*18578Sralph p2 = genbuf; 502*18578Sralph genbuf[72] = 0; 503*18578Sralph while(*p1) 504*18578Sralph if(*p1 >= 040) { 505*18578Sralph if(*p1 == 0177) { 506*18578Sralph p3 = rub; 507*18578Sralph while(*p2++ = *p3++) 508*18578Sralph if(p2 >= lcomend) { 509*18578Sralph *p2 = '\\'; 510*18578Sralph fprintf(stdout, "%s\n", genbuf); 511*18578Sralph p2 = genbuf; 512*18578Sralph } 513*18578Sralph p2--; 514*18578Sralph p1++; 515*18578Sralph continue; 516*18578Sralph } 517*18578Sralph *p2++ = *p1++; 518*18578Sralph if(p2 >= lcomend) { 519*18578Sralph *p2 = '\\'; 520*18578Sralph fprintf(stdout, "%s\n", genbuf); 521*18578Sralph p2 = genbuf; 522*18578Sralph } 523*18578Sralph } else { 524*18578Sralph p3 = trans[*p1-1]; 525*18578Sralph while(*p2++ = *p3++) 526*18578Sralph if(p2 >= lcomend) { 527*18578Sralph *p2 = '\\'; 528*18578Sralph fprintf(stdout, "%s\n", genbuf); 529*18578Sralph p2 = genbuf; 530*18578Sralph } 531*18578Sralph p2--; 532*18578Sralph p1++; 533*18578Sralph } 534*18578Sralph *p2 = 0; 535*18578Sralph fprintf(stdout, "%s\n", genbuf); 536*18578Sralph break; 537*18578Sralph 538*18578Sralph case NCOM: 539*18578Sralph if(!nflag) { 540*18578Sralph for(p1 = linebuf; p1 < spend; p1++) 541*18578Sralph putc(*p1, stdout); 542*18578Sralph putc('\n', stdout); 543*18578Sralph } 544*18578Sralph 545*18578Sralph if(aptr > abuf) 546*18578Sralph arout(); 547*18578Sralph if((execp = gline(linebuf)) == badp) { 548*18578Sralph pending = ipc; 549*18578Sralph delflag = 1; 550*18578Sralph break; 551*18578Sralph } 552*18578Sralph spend = execp; 553*18578Sralph 554*18578Sralph break; 555*18578Sralph case CNCOM: 556*18578Sralph if(aptr > abuf) 557*18578Sralph arout(); 558*18578Sralph *spend++ = '\n'; 559*18578Sralph if((execp = gline(spend)) == badp) { 560*18578Sralph pending = ipc; 561*18578Sralph delflag = 1; 562*18578Sralph break; 563*18578Sralph } 564*18578Sralph spend = execp; 565*18578Sralph break; 566*18578Sralph 567*18578Sralph case PCOM: 568*18578Sralph for(p1 = linebuf; p1 < spend; p1++) 569*18578Sralph putc(*p1, stdout); 570*18578Sralph putc('\n', stdout); 571*18578Sralph break; 572*18578Sralph case CPCOM: 573*18578Sralph cpcom: 574*18578Sralph for(p1 = linebuf; *p1 != '\n' && *p1 != '\0'; ) 575*18578Sralph putc(*p1++, stdout); 576*18578Sralph putc('\n', stdout); 577*18578Sralph break; 578*18578Sralph 579*18578Sralph case QCOM: 580*18578Sralph if(!nflag) { 581*18578Sralph for(p1 = linebuf; p1 < spend; p1++) 582*18578Sralph putc(*p1, stdout); 583*18578Sralph putc('\n', stdout); 584*18578Sralph } 585*18578Sralph if(aptr > abuf) arout(); 586*18578Sralph fclose(stdout); 587*18578Sralph exit(0); 588*18578Sralph case RCOM: 589*18578Sralph 590*18578Sralph *aptr++ = ipc; 591*18578Sralph if(aptr >= &abuf[ABUFSIZE]) 592*18578Sralph fprintf(stderr, "Too many reads after line%ld\n", 593*18578Sralph lnum); 594*18578Sralph 595*18578Sralph *aptr = 0; 596*18578Sralph 597*18578Sralph break; 598*18578Sralph 599*18578Sralph case SCOM: 600*18578Sralph i = substitute(ipc); 601*18578Sralph if(ipc->pfl && i) 602*18578Sralph if(ipc->pfl == 1) { 603*18578Sralph for(p1 = linebuf; p1 < spend; p1++) 604*18578Sralph putc(*p1, stdout); 605*18578Sralph putc('\n', stdout); 606*18578Sralph } 607*18578Sralph else 608*18578Sralph goto cpcom; 609*18578Sralph if(i && ipc->fcode) 610*18578Sralph goto wcom; 611*18578Sralph break; 612*18578Sralph 613*18578Sralph case TCOM: 614*18578Sralph if(sflag == 0) break; 615*18578Sralph sflag = 0; 616*18578Sralph jflag = 1; 617*18578Sralph break; 618*18578Sralph 619*18578Sralph wcom: 620*18578Sralph case WCOM: 621*18578Sralph fprintf(ipc->fcode, "%s\n", linebuf); 622*18578Sralph break; 623*18578Sralph case XCOM: 624*18578Sralph p1 = linebuf; 625*18578Sralph p2 = genbuf; 626*18578Sralph while(*p2++ = *p1++); 627*18578Sralph p1 = holdsp; 628*18578Sralph p2 = linebuf; 629*18578Sralph while(*p2++ = *p1++); 630*18578Sralph spend = p2 - 1; 631*18578Sralph p1 = genbuf; 632*18578Sralph p2 = holdsp; 633*18578Sralph while(*p2++ = *p1++); 634*18578Sralph hspend = p2 - 1; 635*18578Sralph break; 636*18578Sralph 637*18578Sralph case YCOM: 638*18578Sralph p1 = linebuf; 639*18578Sralph p2 = ipc->re1; 640*18578Sralph while(*p1 = p2[*p1]) p1++; 641*18578Sralph break; 642*18578Sralph } 643*18578Sralph 644*18578Sralph } 645*18578Sralph 646*18578Sralph char * 647*18578Sralph gline(addr) 648*18578Sralph char *addr; 649*18578Sralph { 650*18578Sralph register char *p1, *p2; 651*18578Sralph register c; 652*18578Sralph p1 = addr; 653*18578Sralph p2 = cbp; 654*18578Sralph for (;;) { 655*18578Sralph if (p2 >= ebp) { 656*18578Sralph if ((c = read(f, ibuf, BUFSIZ)) <= 0) { 657*18578Sralph return(badp); 658*18578Sralph } 659*18578Sralph p2 = ibuf; 660*18578Sralph ebp = ibuf+c; 661*18578Sralph } 662*18578Sralph if ((c = *p2++) == '\n') { 663*18578Sralph if(p2 >= ebp) { 664*18578Sralph if((c = read(f, ibuf, BUFSIZ)) <= 0) { 665*18578Sralph close(f); 666*18578Sralph if(eargc == 0) 667*18578Sralph dolflag = 1; 668*18578Sralph } 669*18578Sralph 670*18578Sralph p2 = ibuf; 671*18578Sralph ebp = ibuf + c; 672*18578Sralph } 673*18578Sralph break; 674*18578Sralph } 675*18578Sralph if(c) 676*18578Sralph if(p1 < lbend) 677*18578Sralph *p1++ = c; 678*18578Sralph } 679*18578Sralph lnum++; 680*18578Sralph *p1 = 0; 681*18578Sralph cbp = p2; 682*18578Sralph 683*18578Sralph return(p1); 684*18578Sralph } 685*18578Sralph ecmp(a, b, count) 686*18578Sralph char *a, *b; 687*18578Sralph { 688*18578Sralph while(count--) 689*18578Sralph if(*a++ != *b++) return(0); 690*18578Sralph return(1); 691*18578Sralph } 692*18578Sralph 693*18578Sralph arout() 694*18578Sralph { 695*18578Sralph register char *p1; 696*18578Sralph FILE *fi; 697*18578Sralph char c; 698*18578Sralph int t; 699*18578Sralph 700*18578Sralph aptr = abuf - 1; 701*18578Sralph while(*++aptr) { 702*18578Sralph if((*aptr)->command == ACOM) { 703*18578Sralph for(p1 = (*aptr)->re1; *p1; ) 704*18578Sralph putc(*p1++, stdout); 705*18578Sralph putc('\n', stdout); 706*18578Sralph } else { 707*18578Sralph if((fi = fopen((*aptr)->re1, "r")) == NULL) 708*18578Sralph continue; 709*18578Sralph while((t = getc(fi)) != EOF) { 710*18578Sralph c = t; 711*18578Sralph putc(c, stdout); 712*18578Sralph } 713*18578Sralph fclose(fi); 714*18578Sralph } 715*18578Sralph } 716*18578Sralph aptr = abuf; 717*18578Sralph *aptr = 0; 718*18578Sralph } 719*18578Sralph 720