#include #include #include #include /* * A stand-alone work-alike to the RCS ident program, but matching * any $@: text $ pattern, not caring about 'RCS keywords'. */ int search(Reprog*, char*); int check(Reprog*, char[]); char *delim; void usage(void) { fprint(2, "usage: %s file [ files... ]\n", argv0); exits("usage"); } void main(int argc, char *argv[]) { int i; delim = "$"; char *pattern = "\\$([a-zA-Z0-9]+): ([^$]+) \\$"; // sprint(pattern, "%c[a-zA-Z0-9]+: [^%c]+ %c", delim, delim); Reprog *r; ARGBEGIN{ default: usage(); }ARGEND /* For now. */ if (argc == 0) usage(); r = regcomp(pattern); if (!argv) search(r, 0); else for (i=0; i< argc; i++) { search(r, argv[i]); } exits(0); } int search(Reprog *r, char *name) { int c, fd, collecting; char buf[512]; Biobuf b; if (name == 0) { name = "stdin"; fd = 0; } else fd = open(name, OREAD); if (fd < 0) { fprint(2, "%s: can't open %s: %r\n", argv0, name); exits("open"); } print("%s:\n", name); Binit(&b, fd, OREAD); collecting = 0; while((c = Bgetc(&b)) != Beof) { if(! (collecting < sizeof buf)) { memset(buf, 0, sizeof buf); collecting = 0; } if(collecting) { if(c == '$') { buf[collecting] = c; if(!check(r, buf)) Bungetc(&b); memset(buf, 0, sizeof buf); collecting = 0; } else { buf[collecting] = c; collecting++; } } else { if(c == '$') { buf[collecting] = c; collecting++; } } } Bterm(&b); return 0; } int check(Reprog *r, char buf[]) { int len; Resub match[3]; #ifdef PLAN9PORT match[0].s.sp = match[0].e.ep = 0; if(regexec(r, buf, match, 2)) { len = match[0].e.ep - match[0].s.sp; print(" %*s\n", len, match[0].s.sp); #else match[0].sp = match[0].ep = 0; if(regexec(r, buf, match, 2)) { len = match[0].ep - match[0].sp; print(" %*s\n", len, match[0].sp); #endif return 1; } return 0; }