#include #include #include #include void spout(int, int, char*); Biobuf bout; void usage(void) { fprint(2, "usage: %s [-o offset | file...]\n", argv0); exits("usage"); } void main(int argc, char *argv[]) { int o, i, fd; o = 0; ARGBEGIN { case 'o': o = atoi(EARGF(usage())); break; default: usage(); } ARGEND if(o != 0 && argc > 0) usage(); Binit(&bout, 1, OWRITE); if(argc == 0) spout(0, o, ""); else for(i=0; i' '; c++){ n++; s++; } inword = 0; w = s; t = s; do{ c = *(uchar*)t; if(c < Runeself) wid = 1; else{ wid = chartorune(&r, t); c = r; } wordchar = 0; if(isalpha(c)) wordchar = 1; if(inword && !wordchar){ if(c=='\'' && isalpha(t[1])) goto Continue; m = t-w; if(m > 1){ memmove(buf, w, m); buf[m] = 0; Bprint(&bout, "%s:#%d,#%d:%s\n", name, wn, n, buf); } inword = 0; }else if(!inword && wordchar){ wn = n; w = t; inword = 1; } if(c=='\\' && (isalpha(t[1]) || t[1]=='(')){ switch(t[1]){ case '(': m = 4; break; case 'f': if(t[2] == '(') m = 5; else m = 3; break; case 's': if(t[2] == '+' || t[2]=='-'){ if(t[3] == '(') m = 6; else m = 4; }else{ if(t[2] == '(') m = 5; else if(t[2]=='1' || t[2]=='2' || t[2]=='3') m = 4; else m = 3; } break; default: m = 2; } while(m-- > 0){ if(*t == '\n') break; n++; t++; } continue; } Continue: n++; t += wid; }while(c != '\n'); } Bterm(&b); }