diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-04-14 17:27:24 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-04-14 17:27:24 +0000 |
commit | a150899221a5badff9740703b754f901b4f52762 (patch) | |
tree | 3d6911874b0ee763e40490d04f56fc09d89ccfa6 /acme/bin/source/spout.c | |
parent | 71cfa9c637386ebe00fc6d1bf6215db6657559f4 (diff) | |
download | plan9front-a150899221a5badff9740703b754f901b4f52762.tar.xz |
fill /acme
Diffstat (limited to 'acme/bin/source/spout.c')
-rw-r--r-- | acme/bin/source/spout.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/acme/bin/source/spout.c b/acme/bin/source/spout.c new file mode 100644 index 000000000..02429785a --- /dev/null +++ b/acme/bin/source/spout.c @@ -0,0 +1,123 @@ +#include <u.h> +#include <libc.h> +#include <ctype.h> +#include <bio.h> + +void spout(int, char*); + +Biobuf bout; + +void +main(int argc, char *argv[]) +{ + int i, fd; + + Binit(&bout, 1, OWRITE); + if(argc == 1) + spout(0, ""); + else + for(i=1; i<argc; i++){ + fd = open(argv[i], OREAD); + if(fd < 0){ + fprint(2, "spell: can't open %s: %r\n", argv[i]); + continue; + } + spout(fd, argv[i]); + close(fd); + } + exits(nil); +} + +Biobuf b; + +void +spout(int fd, char *name) +{ + char *s, *t, *w; + Rune r; + int inword, wordchar; + int n, wn, wid, c, m; + char buf[1024]; + + Binit(&b, fd, OREAD); + n = 0; + wn = 0; + while((s = Brdline(&b, '\n')) != nil){ + if(s[0] == '.') + for(c=0; c<3 && *s>' '; 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); +} |