summaryrefslogtreecommitdiff
path: root/acme/bin/source/spout.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-04-14 17:27:24 +0000
committercinap_lenrek <cinap_lenrek@localhost>2011-04-14 17:27:24 +0000
commita150899221a5badff9740703b754f901b4f52762 (patch)
tree3d6911874b0ee763e40490d04f56fc09d89ccfa6 /acme/bin/source/spout.c
parent71cfa9c637386ebe00fc6d1bf6215db6657559f4 (diff)
downloadplan9front-a150899221a5badff9740703b754f901b4f52762.tar.xz
fill /acme
Diffstat (limited to 'acme/bin/source/spout.c')
-rw-r--r--acme/bin/source/spout.c123
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);
+}