11175Sbill /* 21175Sbill * egrep -- print lines containing (or not containing) a regular expression 31175Sbill * 41175Sbill * status returns: 51175Sbill * 0 - ok, and some matches 61175Sbill * 1 - ok, but no matches 71175Sbill * 2 - some error 81175Sbill */ 91175Sbill %token CHAR DOT CCL NCCL OR CAT STAR PLUS QUEST 101175Sbill %left OR 111175Sbill %left CHAR DOT CCL NCCL '(' 121175Sbill %left CAT 131175Sbill %left STAR PLUS QUEST 141175Sbill 151175Sbill %{ 16*48265Sbostic /*- 17*48265Sbostic * Copyright (c) 1991 The Regents of the University of California. 18*48265Sbostic * All rights reserved. 19*48265Sbostic * 20*48265Sbostic * %sccs.include.proprietary.c% 21*48265Sbostic */ 22*48265Sbostic 23*48265Sbostic #ifndef lint 24*48265Sbostic char copyright[] = 25*48265Sbostic "@(#) Copyright (c) 1991 The Regents of the University of California.\n\ 26*48265Sbostic All rights reserved.\n"; 27*48265Sbostic #endif /* not lint */ 28*48265Sbostic 29*48265Sbostic #ifndef lint 30*48265Sbostic static char sccsid[] = "@(#)old.egrep.y 4.7 (Berkeley) 04/17/91"; 31*48265Sbostic #endif /* not lint */ 32*48265Sbostic 331175Sbill #include <stdio.h> 3421255Smckusick #include <sys/types.h> 3521255Smckusick #include <sys/stat.h> 3632331Sbostic #include <ctype.h> 371175Sbill 3821255Smckusick #define BLKSIZE 8192 391175Sbill #define MAXLIN 350 401175Sbill #define MAXPOS 4000 411175Sbill #define NCHARS 128 421175Sbill #define NSTATES 128 431175Sbill #define FINAL -1 441175Sbill char gotofn[NSTATES][NCHARS]; 4532331Sbostic char cmap[256]; 461175Sbill int state[NSTATES]; 471175Sbill char out[NSTATES]; 481175Sbill int line = 1; 491175Sbill int name[MAXLIN]; 501175Sbill int left[MAXLIN]; 511175Sbill int right[MAXLIN]; 521175Sbill int parent[MAXLIN]; 531175Sbill int foll[MAXLIN]; 541175Sbill int positions[MAXPOS]; 551175Sbill char chars[MAXLIN]; 561175Sbill int nxtpos; 571175Sbill int nxtchar = 0; 581175Sbill int tmpstat[MAXLIN]; 591175Sbill int initstat[MAXLIN]; 601175Sbill int xstate; 611175Sbill int count; 621175Sbill int icount; 631175Sbill char *input; 649117Srrh FILE *exprfile; 651175Sbill 661175Sbill long lnum; 671175Sbill int bflag; 681175Sbill int cflag; 691175Sbill int fflag; 7032331Sbostic int iflag; 711175Sbill int lflag; 721175Sbill int nflag; 731175Sbill int hflag = 1; 7432365Sbostic int oflag; 751175Sbill int sflag; 761175Sbill int vflag; 7711561Sedward int retcode = 0; 781175Sbill int nfile; 791175Sbill int blkno; 801175Sbill long tln; 811175Sbill int nsucc; 821175Sbill 831175Sbill int f; 849117Srrh char *fname; 851175Sbill %} 861175Sbill 871175Sbill %% 881175Sbill s: t 891175Sbill ={ unary(FINAL, $1); 901175Sbill line--; 911175Sbill } 921175Sbill ; 931175Sbill t: b r 941175Sbill ={ $$ = node(CAT, $1, $2); } 951175Sbill | OR b r OR 961175Sbill ={ $$ = node(CAT, $2, $3); } 971175Sbill | OR b r 981175Sbill ={ $$ = node(CAT, $2, $3); } 991175Sbill | b r OR 1001175Sbill ={ $$ = node(CAT, $1, $2); } 1011175Sbill ; 1021175Sbill b: 1031175Sbill ={ $$ = enter(DOT); 1041175Sbill $$ = unary(STAR, $$); } 1051175Sbill ; 1061175Sbill r: CHAR 1071175Sbill ={ $$ = enter($1); } 1081175Sbill | DOT 1091175Sbill ={ $$ = enter(DOT); } 1101175Sbill | CCL 1111175Sbill ={ $$ = cclenter(CCL); } 1121175Sbill | NCCL 1131175Sbill ={ $$ = cclenter(NCCL); } 1141175Sbill ; 1151175Sbill 1161175Sbill r: r OR r 1171175Sbill ={ $$ = node(OR, $1, $3); } 1181175Sbill | r r %prec CAT 1191175Sbill ={ $$ = node(CAT, $1, $2); } 1201175Sbill | r STAR 1211175Sbill ={ $$ = unary(STAR, $1); } 1221175Sbill | r PLUS 1231175Sbill ={ $$ = unary(PLUS, $1); } 1241175Sbill | r QUEST 1251175Sbill ={ $$ = unary(QUEST, $1); } 1261175Sbill | '(' r ')' 1271175Sbill ={ $$ = $2; } 1281175Sbill | error 1291175Sbill ; 1301175Sbill 1311175Sbill %% 1321175Sbill yyerror(s) { 1331175Sbill fprintf(stderr, "egrep: %s\n", s); 1341175Sbill exit(2); 1351175Sbill } 1361175Sbill 1371175Sbill yylex() { 1381175Sbill extern int yylval; 1391175Sbill int cclcnt, x; 1401175Sbill register char c, d; 1411175Sbill switch(c = nextch()) { 1421175Sbill case '$': 1431175Sbill case '^': c = '\n'; 1441175Sbill goto defchar; 1451175Sbill case '|': return (OR); 1461175Sbill case '*': return (STAR); 1471175Sbill case '+': return (PLUS); 1481175Sbill case '?': return (QUEST); 1491175Sbill case '(': return (c); 1501175Sbill case ')': return (c); 1511175Sbill case '.': return (DOT); 1521175Sbill case '\0': return (0); 1531175Sbill case '\n': return (OR); 1541175Sbill case '[': 1551175Sbill x = CCL; 1561175Sbill cclcnt = 0; 1571175Sbill count = nxtchar++; 1581175Sbill if ((c = nextch()) == '^') { 1591175Sbill x = NCCL; 1601175Sbill c = nextch(); 1611175Sbill } 1621175Sbill do { 1631175Sbill if (c == '\0') synerror(); 1641175Sbill if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) { 1651175Sbill if ((d = nextch()) != 0) { 1661175Sbill c = chars[nxtchar-1]; 1671175Sbill while (c < d) { 1681175Sbill if (nxtchar >= MAXLIN) overflo(); 1691175Sbill chars[nxtchar++] = ++c; 1701175Sbill cclcnt++; 1711175Sbill } 1721175Sbill continue; 1731175Sbill } 1741175Sbill } 1751175Sbill if (nxtchar >= MAXLIN) overflo(); 1761175Sbill chars[nxtchar++] = c; 1771175Sbill cclcnt++; 1781175Sbill } while ((c = nextch()) != ']'); 1791175Sbill chars[count] = cclcnt; 1801175Sbill return (x); 1811175Sbill case '\\': 1821175Sbill if ((c = nextch()) == '\0') synerror(); 1831175Sbill defchar: 1841175Sbill default: yylval = c; return (CHAR); 1851175Sbill } 1861175Sbill } 1871175Sbill nextch() { 18832331Sbostic register int c; 1891175Sbill if (fflag) { 1909117Srrh if ((c = getc(exprfile)) == EOF) { 1919117Srrh fclose(exprfile); 1929117Srrh return(0); 1939117Srrh } 1941175Sbill } 1951175Sbill else c = *input++; 1961175Sbill return(c); 1971175Sbill } 1981175Sbill 1991175Sbill synerror() { 2001175Sbill fprintf(stderr, "egrep: syntax error\n"); 2011175Sbill exit(2); 2021175Sbill } 2031175Sbill 2041175Sbill enter(x) int x; { 2051175Sbill if(line >= MAXLIN) overflo(); 2061175Sbill name[line] = x; 2071175Sbill left[line] = 0; 2081175Sbill right[line] = 0; 2091175Sbill return(line++); 2101175Sbill } 2111175Sbill 2121175Sbill cclenter(x) int x; { 2131175Sbill register linno; 2141175Sbill linno = enter(x); 2151175Sbill right[linno] = count; 2161175Sbill return (linno); 2171175Sbill } 2181175Sbill 2191175Sbill node(x, l, r) { 2201175Sbill if(line >= MAXLIN) overflo(); 2211175Sbill name[line] = x; 2221175Sbill left[line] = l; 2231175Sbill right[line] = r; 2241175Sbill parent[l] = line; 2251175Sbill parent[r] = line; 2261175Sbill return(line++); 2271175Sbill } 2281175Sbill 2291175Sbill unary(x, d) { 2301175Sbill if(line >= MAXLIN) overflo(); 2311175Sbill name[line] = x; 2321175Sbill left[line] = d; 2331175Sbill right[line] = 0; 2341175Sbill parent[d] = line; 2351175Sbill return(line++); 2361175Sbill } 2371175Sbill overflo() { 2381175Sbill fprintf(stderr, "egrep: regular expression too long\n"); 2391175Sbill exit(2); 2401175Sbill } 2411175Sbill 2421175Sbill cfoll(v) { 2431175Sbill register i; 2441175Sbill if (left[v] == 0) { 2451175Sbill count = 0; 2461175Sbill for (i=1; i<=line; i++) tmpstat[i] = 0; 2471175Sbill follow(v); 2481175Sbill add(foll, v); 2491175Sbill } 2501175Sbill else if (right[v] == 0) cfoll(left[v]); 2511175Sbill else { 2521175Sbill cfoll(left[v]); 2531175Sbill cfoll(right[v]); 2541175Sbill } 2551175Sbill } 2561175Sbill cgotofn() { 2571175Sbill register c, i, k; 2581175Sbill int n, s; 2591175Sbill char symbol[NCHARS]; 2601175Sbill int j, nc, pc, pos; 2611175Sbill int curpos, num; 2621175Sbill int number, newpos; 2631175Sbill count = 0; 2641175Sbill for (n=3; n<=line; n++) tmpstat[n] = 0; 2651175Sbill if (cstate(line-1)==0) { 2661175Sbill tmpstat[line] = 1; 2671175Sbill count++; 2681175Sbill out[0] = 1; 2691175Sbill } 2701175Sbill for (n=3; n<=line; n++) initstat[n] = tmpstat[n]; 2711175Sbill count--; /*leave out position 1 */ 2721175Sbill icount = count; 2731175Sbill tmpstat[1] = 0; 2741175Sbill add(state, 0); 2751175Sbill n = 0; 2761175Sbill for (s=0; s<=n; s++) { 2771175Sbill if (out[s] == 1) continue; 2781175Sbill for (i=0; i<NCHARS; i++) symbol[i] = 0; 2791175Sbill num = positions[state[s]]; 2801175Sbill count = icount; 2811175Sbill for (i=3; i<=line; i++) tmpstat[i] = initstat[i]; 2821175Sbill pos = state[s] + 1; 2831175Sbill for (i=0; i<num; i++) { 2841175Sbill curpos = positions[pos]; 2851175Sbill if ((c = name[curpos]) >= 0) { 2861175Sbill if (c < NCHARS) symbol[c] = 1; 2871175Sbill else if (c == DOT) { 2881175Sbill for (k=0; k<NCHARS; k++) 2891175Sbill if (k!='\n') symbol[k] = 1; 2901175Sbill } 2911175Sbill else if (c == CCL) { 2921175Sbill nc = chars[right[curpos]]; 2931175Sbill pc = right[curpos] + 1; 2941175Sbill for (k=0; k<nc; k++) symbol[chars[pc++]] = 1; 2951175Sbill } 2961175Sbill else if (c == NCCL) { 2971175Sbill nc = chars[right[curpos]]; 2981175Sbill for (j = 0; j < NCHARS; j++) { 2991175Sbill pc = right[curpos] + 1; 3001175Sbill for (k = 0; k < nc; k++) 3011175Sbill if (j==chars[pc++]) goto cont; 3021175Sbill if (j!='\n') symbol[j] = 1; 3031175Sbill cont:; 3041175Sbill } 3051175Sbill } 3061175Sbill else printf("something's funny\n"); 3071175Sbill } 3081175Sbill pos++; 3091175Sbill } 3101175Sbill for (c=0; c<NCHARS; c++) { 3111175Sbill if (symbol[c] == 1) { /* nextstate(s,c) */ 3121175Sbill count = icount; 3131175Sbill for (i=3; i <= line; i++) tmpstat[i] = initstat[i]; 3141175Sbill pos = state[s] + 1; 3151175Sbill for (i=0; i<num; i++) { 3161175Sbill curpos = positions[pos]; 3171175Sbill if ((k = name[curpos]) >= 0) 3181175Sbill if ( 3191175Sbill (k == c) 3201175Sbill | (k == DOT) 3211175Sbill | (k == CCL && member(c, right[curpos], 1)) 3221175Sbill | (k == NCCL && member(c, right[curpos], 0)) 3231175Sbill ) { 3241175Sbill number = positions[foll[curpos]]; 3251175Sbill newpos = foll[curpos] + 1; 3261175Sbill for (k=0; k<number; k++) { 3271175Sbill if (tmpstat[positions[newpos]] != 1) { 3281175Sbill tmpstat[positions[newpos]] = 1; 3291175Sbill count++; 3301175Sbill } 3311175Sbill newpos++; 3321175Sbill } 3331175Sbill } 3341175Sbill pos++; 3351175Sbill } /* end nextstate */ 3361175Sbill if (notin(n)) { 3371175Sbill if (n >= NSTATES) overflo(); 3381175Sbill add(state, ++n); 3391175Sbill if (tmpstat[line] == 1) out[n] = 1; 3401175Sbill gotofn[s][c] = n; 3411175Sbill } 3421175Sbill else { 3431175Sbill gotofn[s][c] = xstate; 3441175Sbill } 3451175Sbill } 3461175Sbill } 3471175Sbill } 3481175Sbill } 3491175Sbill 3501175Sbill cstate(v) { 3511175Sbill register b; 3521175Sbill if (left[v] == 0) { 3531175Sbill if (tmpstat[v] != 1) { 3541175Sbill tmpstat[v] = 1; 3551175Sbill count++; 3561175Sbill } 3571175Sbill return(1); 3581175Sbill } 3591175Sbill else if (right[v] == 0) { 3601175Sbill if (cstate(left[v]) == 0) return (0); 3611175Sbill else if (name[v] == PLUS) return (1); 3621175Sbill else return (0); 3631175Sbill } 3641175Sbill else if (name[v] == CAT) { 3651175Sbill if (cstate(left[v]) == 0 && cstate(right[v]) == 0) return (0); 3661175Sbill else return (1); 3671175Sbill } 3681175Sbill else { /* name[v] == OR */ 3691175Sbill b = cstate(right[v]); 3701175Sbill if (cstate(left[v]) == 0 || b == 0) return (0); 3711175Sbill else return (1); 3721175Sbill } 3731175Sbill } 3741175Sbill 3751175Sbill 3761175Sbill member(symb, set, torf) { 3771175Sbill register i, num, pos; 3781175Sbill num = chars[set]; 3791175Sbill pos = set + 1; 3801175Sbill for (i=0; i<num; i++) 3811175Sbill if (symb == chars[pos++]) return (torf); 3821175Sbill return (!torf); 3831175Sbill } 3841175Sbill 3851175Sbill notin(n) { 3861175Sbill register i, j, pos; 3871175Sbill for (i=0; i<=n; i++) { 3881175Sbill if (positions[state[i]] == count) { 3891175Sbill pos = state[i] + 1; 3901175Sbill for (j=0; j < count; j++) 3911175Sbill if (tmpstat[positions[pos++]] != 1) goto nxt; 3921175Sbill xstate = i; 3931175Sbill return (0); 3941175Sbill } 3951175Sbill nxt: ; 3961175Sbill } 3971175Sbill return (1); 3981175Sbill } 3991175Sbill 4001175Sbill add(array, n) int *array; { 4011175Sbill register i; 4021175Sbill if (nxtpos + count > MAXPOS) overflo(); 4031175Sbill array[n] = nxtpos; 4041175Sbill positions[nxtpos++] = count; 4051175Sbill for (i=3; i <= line; i++) { 4061175Sbill if (tmpstat[i] == 1) { 4071175Sbill positions[nxtpos++] = i; 4081175Sbill } 4091175Sbill } 4101175Sbill } 4111175Sbill 4121175Sbill follow(v) int v; { 4131175Sbill int p; 4141175Sbill if (v == line) return; 4151175Sbill p = parent[v]; 4161175Sbill switch(name[p]) { 4171175Sbill case STAR: 4181175Sbill case PLUS: cstate(v); 4191175Sbill follow(p); 4201175Sbill return; 4211175Sbill 4221175Sbill case OR: 4231175Sbill case QUEST: follow(p); 4241175Sbill return; 4251175Sbill 4261175Sbill case CAT: if (v == left[p]) { 4271175Sbill if (cstate(right[p]) == 0) { 4281175Sbill follow(p); 4291175Sbill return; 4301175Sbill } 4311175Sbill } 4321175Sbill else follow(p); 4331175Sbill return; 4341175Sbill case FINAL: if (tmpstat[line] != 1) { 4351175Sbill tmpstat[line] = 1; 4361175Sbill count++; 4371175Sbill } 4381175Sbill return; 4391175Sbill } 4401175Sbill } 4411175Sbill 4421175Sbill 4431175Sbill main(argc, argv) 4441175Sbill char **argv; 4451175Sbill { 44632331Sbostic register int i; 44732331Sbostic 4481175Sbill while (--argc > 0 && (++argv)[0][0]=='-') 4491175Sbill switch (argv[0][1]) { 4501175Sbill 4511175Sbill case 's': 4521175Sbill sflag++; 4531175Sbill continue; 4541175Sbill 4551175Sbill case 'h': 4561175Sbill hflag = 0; 4571175Sbill continue; 4581175Sbill 45932365Sbostic case 'o': 46032365Sbostic oflag++; 46132365Sbostic continue; 46232365Sbostic 4631175Sbill case 'b': 4641175Sbill bflag++; 4651175Sbill continue; 4661175Sbill 4671175Sbill case 'c': 4681175Sbill cflag++; 4691175Sbill continue; 4701175Sbill 4711175Sbill case 'e': 4721175Sbill argc--; 4731175Sbill argv++; 4741175Sbill goto out; 4751175Sbill 4761175Sbill case 'f': 4771175Sbill fflag++; 4781175Sbill continue; 4791175Sbill 48032331Sbostic case 'i': 48132331Sbostic iflag++; 48232331Sbostic for ( i = 'A'; i <= 'Z'; i++ ) 48332331Sbostic cmap[i] = (char) tolower ( i ); 48432331Sbostic continue; 48532331Sbostic 4861175Sbill case 'l': 4871175Sbill lflag++; 4881175Sbill continue; 4891175Sbill 4901175Sbill case 'n': 4911175Sbill nflag++; 4921175Sbill continue; 4931175Sbill 4941175Sbill case 'v': 4951175Sbill vflag++; 4961175Sbill continue; 4971175Sbill 4981175Sbill default: 4991175Sbill fprintf(stderr, "egrep: unknown flag\n"); 5001175Sbill continue; 5011175Sbill } 5021175Sbill out: 5031175Sbill if (argc<=0) 5041175Sbill exit(2); 50532331Sbostic 50632331Sbostic for (i = 0; i < 256; ++i) 50732331Sbostic cmap[i] = (char)i; 50832331Sbostic 5091175Sbill if (fflag) { 5109117Srrh fname = *argv; 5119117Srrh exprfile = fopen(fname, "r"); 5129117Srrh if (exprfile == (FILE *)NULL) { 5131175Sbill fprintf(stderr, "egrep: can't open %s\n", fname); 5141175Sbill exit(2); 5151175Sbill } 5161175Sbill } 5171175Sbill else input = *argv; 51832331Sbostic if ( iflag ) { 51932331Sbostic register char *s; 52032331Sbostic for ( s = input; *s != '\0'; s++ ) 52132331Sbostic if ( isupper ( (int)(*s) ) ) 52232331Sbostic *s = (char) tolower ( (int)(*s) ); 52332331Sbostic } 5241175Sbill argc--; 5251175Sbill argv++; 5261175Sbill 5271175Sbill yyparse(); 5281175Sbill 5291175Sbill cfoll(line-1); 5301175Sbill cgotofn(); 5311175Sbill nfile = argc; 5321175Sbill if (argc<=0) { 5331175Sbill if (lflag) exit(1); 5341175Sbill execute(0); 5351175Sbill } 5361175Sbill else while (--argc >= 0) { 5371175Sbill execute(*argv); 5381175Sbill argv++; 5391175Sbill } 54011561Sedward exit(retcode != 0 ? retcode : nsucc == 0); 5411175Sbill } 5421175Sbill 5431175Sbill execute(file) 5441175Sbill char *file; 5451175Sbill { 5461175Sbill register char *p; 5471175Sbill register cstat; 5481175Sbill register ccount; 54932331Sbostic register char *cmapr = cmap; 55021255Smckusick static char *buf; 55121255Smckusick static int blksize; 55221255Smckusick struct stat stb; 5531175Sbill char *nlp; 5541175Sbill int istat; 5551175Sbill if (file) { 5561175Sbill if ((f = open(file, 0)) < 0) { 5571175Sbill fprintf(stderr, "egrep: can't open %s\n", file); 55811561Sedward retcode = 2; 55911561Sedward return; 5601175Sbill } 5611175Sbill } 5621175Sbill else f = 0; 56321255Smckusick if (buf == NULL) { 56421255Smckusick if (fstat(f, &stb) > 0 && stb.st_blksize > 0) 56521255Smckusick blksize = stb.st_blksize; 56621255Smckusick else 56721255Smckusick blksize = BLKSIZE; 56821255Smckusick buf = (char *)malloc(2*blksize); 56921255Smckusick if (buf == NULL) { 57021255Smckusick fprintf(stderr, "egrep: no memory for %s\n", file); 57121255Smckusick retcode = 2; 57221255Smckusick return; 57321255Smckusick } 57421255Smckusick } 5751175Sbill ccount = 0; 5761175Sbill lnum = 1; 5771175Sbill tln = 0; 5781175Sbill blkno = 0; 5791175Sbill p = buf; 5801175Sbill nlp = p; 58121255Smckusick if ((ccount = read(f,p,blksize))<=0) goto done; 5821175Sbill istat = cstat = gotofn[0]['\n']; 5831175Sbill if (out[cstat]) goto found; 5841175Sbill for (;;) { 58532331Sbostic cstat = gotofn[cstat][(unsigned char)cmapr[*(unsigned char *)p]]; 5861175Sbill if (out[cstat]) { 5871175Sbill found: for(;;) { 5881175Sbill if (*p++ == '\n') { 5891175Sbill if (vflag == 0) { 5901175Sbill succeed: nsucc = 1; 5911175Sbill if (cflag) tln++; 5921175Sbill else if (sflag) 5931175Sbill ; /* ugh */ 5941175Sbill else if (lflag) { 5951175Sbill printf("%s\n", file); 5961175Sbill close(f); 5971175Sbill return; 5981175Sbill } 5991175Sbill else { 60032365Sbostic if (nfile > 1 && hflag || oflag) printf("%s:", file); 6011175Sbill if (bflag) printf("%d:", blkno); 6021175Sbill if (nflag) printf("%ld:", lnum); 6031175Sbill if (p <= nlp) { 60421255Smckusick while (nlp < &buf[2*blksize]) putchar(*nlp++); 6051175Sbill nlp = buf; 6061175Sbill } 6071175Sbill while (nlp < p) putchar(*nlp++); 6081175Sbill } 6091175Sbill } 6101175Sbill lnum++; 6111175Sbill nlp = p; 6121175Sbill if ((out[(cstat=istat)]) == 0) goto brk2; 6131175Sbill } 6141175Sbill cfound: 6151175Sbill if (--ccount <= 0) { 61621255Smckusick if (p <= &buf[blksize]) { 61721255Smckusick if ((ccount = read(f, p, blksize)) <= 0) goto done; 6181175Sbill } 61921255Smckusick else if (p == &buf[2*blksize]) { 6201175Sbill p = buf; 62121255Smckusick if ((ccount = read(f, p, blksize)) <= 0) goto done; 6221175Sbill } 6231175Sbill else { 62421255Smckusick if ((ccount = read(f, p, &buf[2*blksize]-p)) <= 0) goto done; 6251175Sbill } 62621255Smckusick blkno += ccount / 512; 6271175Sbill } 6281175Sbill } 6291175Sbill } 6301175Sbill if (*p++ == '\n') { 6311175Sbill if (vflag) goto succeed; 6321175Sbill else { 6331175Sbill lnum++; 6341175Sbill nlp = p; 6351175Sbill if (out[(cstat=istat)]) goto cfound; 6361175Sbill } 6371175Sbill } 6381175Sbill brk2: 6391175Sbill if (--ccount <= 0) { 64021255Smckusick if (p <= &buf[blksize]) { 64121255Smckusick if ((ccount = read(f, p, blksize)) <= 0) break; 6421175Sbill } 64321255Smckusick else if (p == &buf[2*blksize]) { 6441175Sbill p = buf; 64521255Smckusick if ((ccount = read(f, p, blksize)) <= 0) break; 6461175Sbill } 6471175Sbill else { 64821255Smckusick if ((ccount = read(f, p, &buf[2*blksize] - p)) <= 0) break; 6491175Sbill } 65021255Smckusick blkno += ccount / 512; 6511175Sbill } 6521175Sbill } 6531175Sbill done: close(f); 6541175Sbill if (cflag) { 6551175Sbill if (nfile > 1) 6561175Sbill printf("%s:", file); 6571175Sbill printf("%ld\n", tln); 6581175Sbill } 6591175Sbill } 660