PWB1/sys/source/s2/rgrep.c
#
#define LBSIZE 256
char ibuf[512];
int lnum[2];
char linebuf[LBSIZE+1];
int bflag;
int nflag;
int cflag;
int vflag;
int nfile;
int blkno;
int tln[2];
char *regp;
main(argc, argv)
char **argv;
{
extern fout;
fout = dup(1);
flush();
while (--argc > 0 && (++argv)[0][0]=='-')
switch (argv[0][1]) {
case 'v':
vflag++;
continue;
case 'b':
bflag++;
continue;
case 'c':
cflag++;
continue;
case 'n':
nflag++;
continue;
default:
printf2("Unknown flag\n");
continue;
}
if (argc<=0)
exit(2);
if ((regp = regcmp(*argv,0))==0)
printf2("RE Error\n");
nfile = --argc;
if (argc<=0)
execute(0);
else while (--argc >= 0) {
argv++;
execute(*argv);
}
flush();
exit(0);
}
execute(file)
{
register char *p1, *p2;
register c;
int f;
char *ebp, *cbp;
if (file) {
if ((f = open(file, 0)) < 0) {
printf2("Can't open %s\n", file);
}
} else
f = 0;
ebp = ibuf;
cbp = ibuf;
lnum[0] = 0;
lnum[1] = 0;
tln[0] = 0;
tln[1] = 0;
blkno = -1;
for (;;) {
if ((++lnum[1])==0)
lnum[1]++;
if((lnum[1]&0377) == 0)
flush();
p1 = linebuf;
p2 = cbp;
for (;;) {
if (p2 >= ebp) {
if ((c = read(f, ibuf, 512)) <= 0) {
close(f);
if (cflag) {
if (nfile > 1)
printf("%s:", file);
p1 = locv(tln[0],tln[1]);
printf("%s\n", p1);
}
return;
}
blkno++;
p2 = ibuf;
ebp = ibuf+c;
}
if ((c = *p2++) == '\n')
break;
if(c)
if (p1 < &linebuf[LBSIZE-1])
*p1++ = c;
}
*p1++ = 0;
cbp = p2;
p1 = linebuf;
if (regex(regp,p1))
goto found;
nfound:
if (vflag)
succeed(file);
continue;
found:
if (vflag==0)
succeed(file);
}
}
printf2(s, a)
{
extern fout;
flush();
fout = 2;
printf(s, a);
flush();
exit(2);
}
succeed(f)
{
if (cflag) {
if (++tln[1]==0)
tln[0]++;
return;
}
if (nfile > 1)
printf("%s:", f);
if (bflag)
printf("%l:", blkno);
if (nflag)
printf("%s:", locv(lnum[0], lnum[1]));
printf("%s\n", linebuf);
}