1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 0 stevel * Common Development and Distribution License, Version 1.0 only 6 0 stevel * (the "License"). You may not use this file except in compliance 7 0 stevel * with the License. 8 0 stevel * 9 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 0 stevel * or http://www.opensolaris.org/os/licensing. 11 0 stevel * See the License for the specific language governing permissions 12 0 stevel * and limitations under the License. 13 0 stevel * 14 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 15 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 0 stevel * If applicable, add the following below this CDDL HEADER, with the 17 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 18 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 19 0 stevel * 20 0 stevel * CDDL HEADER END 21 0 stevel */ 22 640 basabi /* 23 640 basabi * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 640 basabi * Use is subject to license terms. 25 640 basabi */ 26 640 basabi 27 0 stevel /* Copyright (c) 1984 AT&T */ 28 0 stevel /* All Rights Reserved */ 29 0 stevel 30 0 stevel 31 640 basabi #pragma ident "%Z%%M% %I% %E% SMI" 32 0 stevel 33 0 stevel #include <stdio.h> 34 0 stevel #include <sys/types.h> 35 0 stevel #include <sys/stat.h> 36 0 stevel #include <fcntl.h> 37 0 stevel #include "sed.h" 38 0 stevel #include <regexp.h> 39 0 stevel 40 0 stevel union reptr *abuf[ABUFSIZE+1]; 41 0 stevel union reptr **aptr; 42 0 stevel char ibuf[BUFSIZ]; 43 0 stevel char *cbp; 44 0 stevel char *ebp; 45 0 stevel char genbuf[LBSIZE+1]; 46 0 stevel char *lcomend; 47 0 stevel int dolflag; 48 0 stevel int sflag; 49 0 stevel int jflag; 50 0 stevel int delflag; 51 0 stevel long long lnum; 52 0 stevel char holdsp[LBSIZE+1]; 53 0 stevel char *spend; 54 0 stevel char *hspend; 55 0 stevel int nflag; 56 0 stevel long long tlno[NLINES]; 57 0 stevel int f; 58 0 stevel char *ifname; 59 0 stevel int numpass; 60 0 stevel union reptr *pending; 61 0 stevel char *trans[040] = { 62 0 stevel "\\01", 63 0 stevel "\\02", 64 0 stevel "\\03", 65 0 stevel "\\04", 66 0 stevel "\\05", 67 0 stevel "\\06", 68 0 stevel "\\07", 69 0 stevel "-<", 70 0 stevel "->", 71 0 stevel "\n", 72 0 stevel "\\13", 73 0 stevel "\\14", 74 0 stevel "\\15", 75 0 stevel "\\16", 76 0 stevel "\\17", 77 0 stevel "\\20", 78 0 stevel "\\21", 79 0 stevel "\\22", 80 0 stevel "\\23", 81 0 stevel "\\24", 82 0 stevel "\\25", 83 0 stevel "\\26", 84 0 stevel "\\27", 85 0 stevel "\\30", 86 0 stevel "\\31", 87 0 stevel "\\32", 88 0 stevel "\\33", 89 0 stevel "\\34", 90 0 stevel "\\35", 91 0 stevel "\\36", 92 0 stevel "\\37" 93 0 stevel }; 94 0 stevel char rub[] = {"\\177"}; 95 0 stevel 96 0 stevel extern char TMMES[]; 97 0 stevel 98 640 basabi static int match(char *expbuf, int gf); 99 640 basabi static int substitute(union reptr *ipc); 100 640 basabi static void dosub(char *rhsbuf, int n); 101 640 basabi static void command(union reptr *ipc); 102 640 basabi static void arout(void); 103 640 basabi 104 640 basabi void 105 640 basabi execute(char *file) 106 0 stevel { 107 640 basabi char *p1, *p2; 108 640 basabi union reptr *ipc; 109 0 stevel int c; 110 0 stevel char *execp; 111 0 stevel 112 0 stevel if (file) { 113 0 stevel if ((f = open(file, 0)) < 0) { 114 0 stevel (void) fprintf(stderr, "sed: "); 115 0 stevel perror(file); 116 0 stevel } 117 0 stevel ifname = file; 118 0 stevel } else { 119 0 stevel f = 0; 120 0 stevel ifname = "standard input"; 121 0 stevel } 122 0 stevel 123 0 stevel ebp = ibuf; 124 0 stevel cbp = ibuf; 125 0 stevel 126 0 stevel if(pending) { 127 0 stevel ipc = pending; 128 0 stevel pending = 0; 129 0 stevel goto yes; 130 0 stevel } 131 0 stevel 132 0 stevel for(;;) { 133 0 stevel if((execp = gline(linebuf)) == 0) { 134 0 stevel (void) close(f); 135 0 stevel return; 136 0 stevel } 137 0 stevel spend = execp; 138 0 stevel 139 0 stevel for(ipc = ptrspace; ipc->r1.command; ) { 140 0 stevel 141 0 stevel p1 = ipc->r1.ad1; 142 0 stevel p2 = ipc->r1.ad2; 143 0 stevel 144 0 stevel if(p1) { 145 0 stevel 146 0 stevel if(ipc->r1.inar) { 147 0 stevel if(*p2 == CEND) { 148 0 stevel p1 = 0; 149 0 stevel } else if(*p2 == CLNUM) { 150 0 stevel c = (unsigned char)p2[1]; 151 0 stevel if(lnum > tlno[c]) { 152 0 stevel ipc->r1.inar = 0; 153 0 stevel if(ipc->r1.negfl) 154 0 stevel goto yes; 155 0 stevel ipc++; 156 0 stevel continue; 157 0 stevel } 158 0 stevel if(lnum == tlno[c]) { 159 0 stevel ipc->r1.inar = 0; 160 0 stevel } 161 0 stevel } else if(match(p2, 0)) { 162 0 stevel ipc->r1.inar = 0; 163 0 stevel } 164 0 stevel } else if(*p1 == CEND) { 165 0 stevel if(!dolflag) { 166 0 stevel if(ipc->r1.negfl) 167 0 stevel goto yes; 168 0 stevel ipc++; 169 0 stevel continue; 170 0 stevel } 171 0 stevel 172 0 stevel } else if(*p1 == CLNUM) { 173 0 stevel c = (unsigned char)p1[1]; 174 0 stevel if(lnum != tlno[c]) { 175 0 stevel if(ipc->r1.negfl) 176 0 stevel goto yes; 177 0 stevel ipc++; 178 0 stevel continue; 179 0 stevel } 180 0 stevel if(p2) 181 0 stevel ipc->r1.inar = 1; 182 0 stevel } else if(match(p1, 0)) { 183 0 stevel if(p2) 184 0 stevel ipc->r1.inar = 1; 185 0 stevel } else { 186 0 stevel if(ipc->r1.negfl) 187 0 stevel goto yes; 188 0 stevel ipc++; 189 0 stevel continue; 190 0 stevel } 191 0 stevel } 192 0 stevel 193 0 stevel if(ipc->r1.negfl) { 194 0 stevel ipc++; 195 0 stevel continue; 196 0 stevel } 197 0 stevel yes: 198 0 stevel command(ipc); 199 0 stevel 200 0 stevel if(delflag) 201 0 stevel break; 202 0 stevel 203 0 stevel if(jflag) { 204 0 stevel jflag = 0; 205 0 stevel if((ipc = ipc->r2.lb1) == 0) { 206 0 stevel ipc = ptrspace; 207 0 stevel break; 208 0 stevel } 209 0 stevel } else 210 0 stevel ipc++; 211 0 stevel 212 0 stevel } 213 0 stevel if(!nflag && !delflag) { 214 0 stevel for(p1 = linebuf; p1 < spend; p1++) 215 0 stevel (void) putc(*p1, stdout); 216 0 stevel (void) putc('\n', stdout); 217 0 stevel } 218 0 stevel 219 0 stevel if(aptr > abuf) { 220 0 stevel arout(); 221 0 stevel } 222 0 stevel 223 0 stevel delflag = 0; 224 0 stevel 225 0 stevel } 226 0 stevel } 227 640 basabi 228 640 basabi static int 229 640 basabi match(char *expbuf, int gf) 230 0 stevel { 231 640 basabi char *p1; 232 0 stevel 233 0 stevel if(gf) { 234 0 stevel if(*expbuf) return(0); 235 0 stevel locs = p1 = loc2; 236 0 stevel } else { 237 0 stevel p1 = linebuf; 238 0 stevel locs = 0; 239 0 stevel } 240 0 stevel 241 0 stevel circf = *expbuf++; 242 0 stevel return(step(p1, expbuf)); 243 0 stevel } 244 0 stevel 245 640 basabi static int 246 640 basabi substitute(union reptr *ipc) 247 0 stevel { 248 0 stevel if(match(ipc->r1.re1, 0) == 0) return(0); 249 0 stevel 250 0 stevel numpass = 0; 251 0 stevel sflag = 0; /* Flags if any substitution was made */ 252 0 stevel dosub(ipc->r1.rhs, ipc->r1.gfl); 253 0 stevel 254 0 stevel if(ipc->r1.gfl) { 255 0 stevel while(*loc2) { 256 0 stevel if(match(ipc->r1.re1, 1) == 0) break; 257 0 stevel dosub(ipc->r1.rhs, ipc->r1.gfl); 258 0 stevel } 259 0 stevel } 260 0 stevel return(sflag); 261 0 stevel } 262 0 stevel 263 640 basabi static void 264 640 basabi dosub(char *rhsbuf, int n) 265 0 stevel { 266 640 basabi char *lp, *sp, *rp; 267 0 stevel int c; 268 0 stevel 269 0 stevel if(n > 0 && n < 999) 270 0 stevel {numpass++; 271 0 stevel if(n != numpass) return; 272 0 stevel } 273 0 stevel sflag = 1; 274 0 stevel lp = linebuf; 275 0 stevel sp = genbuf; 276 0 stevel rp = rhsbuf; 277 0 stevel while (lp < loc1) 278 0 stevel *sp++ = *lp++; 279 0 stevel while(c = *rp++) { 280 0 stevel if (c == '&') 281 0 stevel sp = place(sp, loc1, loc2); 282 0 stevel else if (c == '\\') { 283 0 stevel c = *rp++; 284 0 stevel if (c >= '1' && c < NBRA+'1') 285 0 stevel sp = place(sp, braslist[c-'1'], braelist[c-'1']); 286 0 stevel else 287 0 stevel *sp++ = c; 288 0 stevel } else 289 0 stevel *sp++ = c; 290 0 stevel if (sp == &genbuf[LBSIZE+1]) { 291 0 stevel (void) fprintf(stderr, "Output line too long.\n"); 292 0 stevel *--sp = '\0'; 293 0 stevel goto out; 294 0 stevel } 295 0 stevel } 296 0 stevel lp = loc2; 297 0 stevel loc2 = sp - genbuf + linebuf; 298 0 stevel while(*sp++ = *lp++) 299 0 stevel if (sp == &genbuf[LBSIZE+1]) { 300 0 stevel (void) fprintf(stderr, "Output line too long.\n"); 301 0 stevel *--sp = '\0'; 302 0 stevel break; 303 0 stevel } 304 0 stevel out: 305 0 stevel lp = linebuf; 306 0 stevel sp = genbuf; 307 0 stevel while (*lp++ = *sp++); 308 0 stevel spend = lp-1; 309 0 stevel } 310 0 stevel 311 0 stevel char *place(asp, al1, al2) 312 0 stevel char *asp, *al1, *al2; 313 0 stevel { 314 640 basabi char *sp, *l1, *l2; 315 0 stevel 316 0 stevel sp = asp; 317 0 stevel l1 = al1; 318 0 stevel l2 = al2; 319 0 stevel while (l1 < l2) { 320 0 stevel *sp++ = *l1++; 321 0 stevel if (sp == &genbuf[LBSIZE+1]) 322 0 stevel break; 323 0 stevel } 324 0 stevel return(sp); 325 0 stevel } 326 0 stevel 327 640 basabi static void 328 640 basabi command(union reptr *ipc) 329 0 stevel { 330 640 basabi int i; 331 640 basabi char *p1, *p2, *p3; 332 0 stevel char *execp; 333 0 stevel 334 0 stevel 335 0 stevel switch(ipc->r1.command) { 336 0 stevel 337 0 stevel case ACOM: 338 0 stevel if(aptr >= &abuf[ABUFSIZE]) { 339 0 stevel (void) fprintf(stderr, "Too many appends or reads after line %lld\n", 340 0 stevel lnum); 341 0 stevel } else { 342 0 stevel *aptr++ = ipc; 343 0 stevel *aptr = 0; 344 0 stevel } 345 0 stevel break; 346 0 stevel 347 0 stevel case CCOM: 348 0 stevel delflag = 1; 349 0 stevel if(!ipc->r1.inar || dolflag) { 350 0 stevel for(p1 = ipc->r1.re1; *p1; ) 351 0 stevel (void) putc(*p1++, stdout); 352 0 stevel (void) putc('\n', stdout); 353 0 stevel } 354 0 stevel break; 355 0 stevel case DCOM: 356 0 stevel delflag++; 357 0 stevel break; 358 0 stevel case CDCOM: 359 0 stevel p1 = p2 = linebuf; 360 0 stevel 361 0 stevel while(*p1 != '\n') { 362 0 stevel if(*p1++ == 0) { 363 0 stevel delflag++; 364 0 stevel return; 365 0 stevel } 366 0 stevel } 367 0 stevel 368 0 stevel p1++; 369 0 stevel while(*p2++ = *p1++); 370 0 stevel spend = p2-1; 371 0 stevel jflag++; 372 0 stevel break; 373 0 stevel 374 0 stevel case EQCOM: 375 0 stevel (void) fprintf(stdout, "%lld\n", lnum); 376 0 stevel break; 377 0 stevel 378 0 stevel case GCOM: 379 0 stevel p1 = linebuf; 380 0 stevel p2 = holdsp; 381 0 stevel while(*p1++ = *p2++); 382 0 stevel spend = p1-1; 383 0 stevel break; 384 0 stevel 385 0 stevel case CGCOM: 386 0 stevel *spend++ = '\n'; 387 0 stevel p1 = spend; 388 0 stevel p2 = holdsp; 389 0 stevel do { 390 0 stevel if (p1 == &linebuf[LBSIZE+1]) { 391 0 stevel (void) fprintf(stderr, "Output line too long.\n"); 392 0 stevel *--p1 = '\0'; 393 0 stevel } 394 0 stevel } while(*p1++ = *p2++); 395 0 stevel spend = p1-1; 396 0 stevel break; 397 0 stevel 398 0 stevel case HCOM: 399 0 stevel p1 = holdsp; 400 0 stevel p2 = linebuf; 401 0 stevel while(*p1++ = *p2++); 402 0 stevel hspend = p1-1; 403 0 stevel break; 404 0 stevel 405 0 stevel case CHCOM: 406 0 stevel *hspend++ = '\n'; 407 0 stevel p1 = hspend; 408 0 stevel p2 = linebuf; 409 0 stevel do { 410 0 stevel if (p1 == &holdsp[LBSIZE+1]) { 411 0 stevel (void) fprintf(stderr, "Hold space overflowed.\n"); 412 0 stevel *--p1 = '\0'; 413 0 stevel } 414 0 stevel } while(*p1++ = *p2++); 415 0 stevel hspend = p1-1; 416 0 stevel break; 417 0 stevel 418 0 stevel case ICOM: 419 0 stevel for(p1 = ipc->r1.re1; *p1; ) 420 0 stevel (void) putc(*p1++, stdout); 421 0 stevel (void) putc('\n', stdout); 422 0 stevel break; 423 0 stevel 424 0 stevel case BCOM: 425 0 stevel jflag = 1; 426 0 stevel break; 427 0 stevel 428 0 stevel 429 0 stevel case LCOM: 430 0 stevel p1 = linebuf; 431 0 stevel p2 = genbuf; 432 0 stevel genbuf[72] = 0; 433 0 stevel while(*p1) 434 0 stevel if((unsigned char)*p1 >= 040) { 435 0 stevel if(*p1 == 0177) { 436 0 stevel p3 = rub; 437 0 stevel while(*p2++ = *p3++) 438 0 stevel if(p2 >= lcomend) { 439 0 stevel *p2 = '\\'; 440 0 stevel (void) fprintf(stdout, "%s\n", genbuf); 441 0 stevel p2 = genbuf; 442 0 stevel } 443 0 stevel p2--; 444 0 stevel p1++; 445 0 stevel continue; 446 0 stevel } 447 0 stevel if(!isprint(*p1 & 0377)) { 448 0 stevel *p2++ = '\\'; 449 0 stevel if(p2 >= lcomend) { 450 0 stevel *p2 = '\\'; 451 0 stevel (void) fprintf(stdout, "%s\n", genbuf); 452 0 stevel p2 = genbuf; 453 0 stevel } 454 0 stevel *p2++ = (*p1 >> 6) + '0'; 455 0 stevel if(p2 >= lcomend) { 456 0 stevel *p2 = '\\'; 457 0 stevel (void) fprintf(stdout, "%s\n", genbuf); 458 0 stevel p2 = genbuf; 459 0 stevel } 460 0 stevel *p2++ = ((*p1 >> 3) & 07) + '0'; 461 0 stevel if(p2 >= lcomend) { 462 0 stevel *p2 = '\\'; 463 0 stevel (void) fprintf(stdout, "%s\n", genbuf); 464 0 stevel p2 = genbuf; 465 0 stevel } 466 0 stevel *p2++ = (*p1++ & 07) + '0'; 467 0 stevel if(p2 >= lcomend) { 468 0 stevel *p2 = '\\'; 469 0 stevel (void) fprintf(stdout, "%s\n", genbuf); 470 0 stevel p2 = genbuf; 471 0 stevel } 472 0 stevel } else { 473 0 stevel *p2++ = *p1++; 474 0 stevel if(p2 >= lcomend) { 475 0 stevel *p2 = '\\'; 476 0 stevel (void) fprintf(stdout, "%s\n", genbuf); 477 0 stevel p2 = genbuf; 478 0 stevel } 479 0 stevel } 480 0 stevel } else { 481 0 stevel p3 = trans[(unsigned char)*p1-1]; 482 0 stevel while(*p2++ = *p3++) 483 0 stevel if(p2 >= lcomend) { 484 0 stevel *p2 = '\\'; 485 0 stevel (void) fprintf(stdout, "%s\n", genbuf); 486 0 stevel p2 = genbuf; 487 0 stevel } 488 0 stevel p2--; 489 0 stevel p1++; 490 0 stevel } 491 0 stevel *p2 = 0; 492 0 stevel (void) fprintf(stdout, "%s\n", genbuf); 493 0 stevel break; 494 0 stevel 495 0 stevel case NCOM: 496 0 stevel if(!nflag) { 497 0 stevel for(p1 = linebuf; p1 < spend; p1++) 498 0 stevel (void) putc(*p1, stdout); 499 0 stevel (void) putc('\n', stdout); 500 0 stevel } 501 0 stevel 502 0 stevel if(aptr > abuf) 503 0 stevel arout(); 504 0 stevel if((execp = gline(linebuf)) == 0) { 505 0 stevel pending = ipc; 506 0 stevel delflag = 1; 507 0 stevel break; 508 0 stevel } 509 0 stevel spend = execp; 510 0 stevel 511 0 stevel break; 512 0 stevel case CNCOM: 513 0 stevel if(aptr > abuf) 514 0 stevel arout(); 515 0 stevel *spend++ = '\n'; 516 0 stevel if((execp = gline(spend)) == 0) { 517 0 stevel pending = ipc; 518 0 stevel delflag = 1; 519 0 stevel break; 520 0 stevel } 521 0 stevel spend = execp; 522 0 stevel break; 523 0 stevel 524 0 stevel case PCOM: 525 0 stevel for(p1 = linebuf; p1 < spend; p1++) 526 0 stevel (void) putc(*p1, stdout); 527 0 stevel (void) putc('\n', stdout); 528 0 stevel break; 529 0 stevel case CPCOM: 530 0 stevel cpcom: 531 0 stevel for(p1 = linebuf; *p1 != '\n' && *p1 != '\0'; ) 532 0 stevel (void) putc(*p1++, stdout); 533 0 stevel (void) putc('\n', stdout); 534 0 stevel break; 535 0 stevel 536 0 stevel case QCOM: 537 0 stevel if(!nflag) { 538 0 stevel for(p1 = linebuf; p1 < spend; p1++) 539 0 stevel (void) putc(*p1, stdout); 540 0 stevel (void) putc('\n', stdout); 541 0 stevel } 542 0 stevel if(aptr > abuf) arout(); 543 0 stevel (void) fclose(stdout); 544 0 stevel exit(0); 545 0 stevel case RCOM: 546 0 stevel if(aptr >= &abuf[ABUFSIZE]) { 547 0 stevel (void) fprintf(stderr, "Too many appends or reads after line %lld\n", 548 0 stevel lnum); 549 0 stevel } else { 550 0 stevel *aptr++ = ipc; 551 0 stevel *aptr = 0; 552 0 stevel } 553 0 stevel break; 554 0 stevel 555 0 stevel case SCOM: 556 0 stevel i = substitute(ipc); 557 0 stevel if(ipc->r1.pfl && nflag && i) 558 0 stevel if(ipc->r1.pfl == 1) { 559 0 stevel for(p1 = linebuf; p1 < spend; p1++) 560 0 stevel (void) putc(*p1, stdout); 561 0 stevel (void) putc('\n', stdout); 562 0 stevel } 563 0 stevel else 564 0 stevel goto cpcom; 565 0 stevel if(i && ipc->r1.fcode) 566 0 stevel goto wcom; 567 0 stevel break; 568 0 stevel 569 0 stevel case TCOM: 570 0 stevel if(sflag == 0) break; 571 0 stevel sflag = 0; 572 0 stevel jflag = 1; 573 0 stevel break; 574 0 stevel 575 0 stevel wcom: 576 0 stevel case WCOM: 577 0 stevel (void) fprintf(ipc->r1.fcode, "%s\n", linebuf); 578 0 stevel (void) fflush(ipc->r1.fcode); 579 0 stevel break; 580 0 stevel case XCOM: 581 0 stevel p1 = linebuf; 582 0 stevel p2 = genbuf; 583 0 stevel while(*p2++ = *p1++); 584 0 stevel p1 = holdsp; 585 0 stevel p2 = linebuf; 586 0 stevel while(*p2++ = *p1++); 587 0 stevel spend = p2 - 1; 588 0 stevel p1 = genbuf; 589 0 stevel p2 = holdsp; 590 0 stevel while(*p2++ = *p1++); 591 0 stevel hspend = p2 - 1; 592 0 stevel break; 593 0 stevel 594 0 stevel case YCOM: 595 0 stevel p1 = linebuf; 596 0 stevel p2 = ipc->r1.re1; 597 0 stevel while(*p1 = p2[(unsigned char)*p1]) p1++; 598 0 stevel break; 599 0 stevel } 600 0 stevel 601 0 stevel } 602 0 stevel 603 0 stevel char *gline(addr) 604 0 stevel char *addr; 605 0 stevel { 606 640 basabi char *p1, *p2; 607 640 basabi int c; 608 0 stevel sflag = 0; 609 0 stevel p1 = addr; 610 0 stevel p2 = cbp; 611 0 stevel for (;;) { 612 0 stevel if (p2 >= ebp) { 613 0 stevel if(f < 0 || (c = read(f, ibuf, BUFSIZ)) == 0) { 614 0 stevel return(0); 615 0 stevel } 616 0 stevel if(c < 0) { 617 0 stevel (void) fprintf(stderr, "sed: error reading "); 618 0 stevel perror(ifname); 619 0 stevel exit(2); 620 0 stevel } 621 0 stevel p2 = ibuf; 622 0 stevel ebp = ibuf+c; 623 0 stevel } 624 0 stevel if ((c = *p2++) == '\n') { 625 0 stevel if(p2 >= ebp) { 626 0 stevel if(f < 0 || (c = read(f, ibuf, BUFSIZ)) == 0) { 627 0 stevel if(f >= 0) { 628 0 stevel (void) close(f); 629 0 stevel f = -1; 630 0 stevel } 631 0 stevel if(eargc == 0) 632 0 stevel dolflag = 1; 633 0 stevel } 634 0 stevel if(c < 0) { 635 0 stevel (void) fprintf(stderr, "sed: error reading "); 636 0 stevel perror(ifname); 637 0 stevel exit(2); 638 0 stevel } 639 0 stevel 640 0 stevel p2 = ibuf; 641 0 stevel ebp = ibuf + c; 642 0 stevel } 643 0 stevel break; 644 0 stevel } 645 0 stevel if(c) 646 0 stevel if(p1 < &linebuf[LBSIZE]) 647 0 stevel *p1++ = c; 648 0 stevel } 649 0 stevel lnum++; 650 0 stevel *p1 = 0; 651 0 stevel cbp = p2; 652 0 stevel 653 0 stevel return(p1); 654 0 stevel } 655 0 stevel 656 0 stevel char *comple(x1, ep, x3, x4) 657 0 stevel char *x1, *x3; 658 0 stevel char x4; 659 640 basabi char *ep; 660 0 stevel { 661 640 basabi char *p; 662 0 stevel 663 0 stevel p = compile(x1, ep + 1, x3, x4); 664 0 stevel if(p == ep + 1) 665 0 stevel return(ep); 666 0 stevel *ep = circf; 667 0 stevel return(p); 668 0 stevel } 669 0 stevel 670 640 basabi int 671 640 basabi regerr(int err) 672 0 stevel { 673 0 stevel switch(err) { 674 0 stevel 675 0 stevel case 11: 676 0 stevel comperr("Range endpoint too large: %s"); 677 0 stevel break; 678 0 stevel 679 0 stevel case 16: 680 0 stevel comperr("Bad number: %s"); 681 0 stevel break; 682 0 stevel 683 0 stevel case 25: 684 0 stevel comperr("``\\digit'' out of range: %s"); 685 0 stevel break; 686 0 stevel 687 0 stevel case 36: 688 0 stevel comperr("Illegal or missing delimiter: %s"); 689 0 stevel break; 690 0 stevel 691 0 stevel case 41: 692 0 stevel comperr("No remembered search string: %s"); 693 0 stevel break; 694 0 stevel 695 0 stevel case 42: 696 0 stevel comperr("\\( \\) imbalance: %s"); 697 0 stevel break; 698 0 stevel 699 0 stevel case 43: 700 0 stevel comperr("Too many \\(: %s"); 701 0 stevel break; 702 0 stevel 703 0 stevel case 44: 704 0 stevel comperr("More than 2 numbers given in \\{ \\}: %s"); 705 0 stevel break; 706 0 stevel 707 0 stevel case 45: 708 0 stevel comperr("} expected after \\: %s"); 709 0 stevel break; 710 0 stevel 711 0 stevel case 46: 712 0 stevel comperr("First number exceeds second in \\{ \\}: %s"); 713 0 stevel break; 714 0 stevel 715 0 stevel case 49: 716 0 stevel comperr("[ ] imbalance: %s"); 717 0 stevel break; 718 0 stevel 719 0 stevel case 50: 720 0 stevel comperr(TMMES); 721 0 stevel break; 722 0 stevel 723 0 stevel default: 724 0 stevel (void) fprintf(stderr, "Unknown regexp error code %d: %s\n", 725 0 stevel err, linebuf); 726 0 stevel exit(2); 727 0 stevel break; 728 0 stevel } 729 640 basabi return (0); 730 0 stevel } 731 0 stevel 732 640 basabi static void 733 640 basabi arout(void) 734 0 stevel { 735 640 basabi char *p1; 736 0 stevel FILE *fi; 737 0 stevel char c; 738 0 stevel int t; 739 0 stevel 740 0 stevel aptr = abuf - 1; 741 0 stevel while(*++aptr) { 742 0 stevel if((*aptr)->r1.command == ACOM) { 743 0 stevel for(p1 = (*aptr)->r1.re1; *p1; ) 744 0 stevel (void) putc(*p1++, stdout); 745 0 stevel (void) putc('\n', stdout); 746 0 stevel } else { 747 0 stevel if((fi = fopen((*aptr)->r1.re1, "r")) == NULL) 748 0 stevel continue; 749 0 stevel while((t = getc(fi)) != EOF) { 750 0 stevel c = t; 751 0 stevel (void) putc(c, stdout); 752 0 stevel } 753 0 stevel (void) fclose(fi); 754 0 stevel } 755 0 stevel } 756 0 stevel aptr = abuf; 757 0 stevel *aptr = 0; 758 0 stevel } 759