1 #include <u.h>
2 #include <libc.h>
3 #include <ctype.h>
4 #include <bio.h>
5
6 void spout(int, char*);
7
8 Biobuf bout;
9
10 void
main(int argc,char * argv[])11 main(int argc, char *argv[])
12 {
13 int i, fd;
14
15 Binit(&bout, 1, OWRITE);
16 if(argc == 1)
17 spout(0, "");
18 else
19 for(i=1; i<argc; i++){
20 fd = open(argv[i], OREAD);
21 if(fd < 0){
22 fprint(2, "spell: can't open %s: %r\n", argv[i]);
23 continue;
24 }
25 spout(fd, argv[i]);
26 close(fd);
27 }
28 exits(nil);
29 }
30
31 Biobuf b;
32
33 void
spout(int fd,char * name)34 spout(int fd, char *name)
35 {
36 char *s, *t, *w;
37 Rune r;
38 int inword, wordchar;
39 int n, wn, wid, c, m;
40 char buf[1024];
41
42 Binit(&b, fd, OREAD);
43 n = 0;
44 wn = 0;
45 while((s = Brdline(&b, '\n')) != nil){
46 if(s[0] == '.')
47 for(c=0; c<3 && *s>' '; c++){
48 n++;
49 s++;
50 }
51 inword = 0;
52 w = s;
53 t = s;
54 do{
55 c = *(uchar*)t;
56 if(c < Runeself)
57 wid = 1;
58 else{
59 wid = chartorune(&r, t);
60 c = r;
61 }
62 wordchar = 0;
63 if(isalpha(c))
64 wordchar = 1;
65 if(inword && !wordchar){
66 if(c=='\'' && isalpha(t[1]))
67 goto Continue;
68 m = t-w;
69 if(m > 1){
70 memmove(buf, w, m);
71 buf[m] = 0;
72 Bprint(&bout, "%s:#%d,#%d:%s\n", name, wn, n, buf);
73 }
74 inword = 0;
75 }else if(!inword && wordchar){
76 wn = n;
77 w = t;
78 inword = 1;
79 }
80 if(c=='\\' && (isalpha(t[1]) || t[1]=='(')){
81 switch(t[1]){
82 case '(':
83 m = 4;
84 break;
85 case 'f':
86 if(t[2] == '(')
87 m = 5;
88 else
89 m = 3;
90 break;
91 case 's':
92 if(t[2] == '+' || t[2]=='-'){
93 if(t[3] == '(')
94 m = 6;
95 else
96 m = 4;
97 }else{
98 if(t[2] == '(')
99 m = 5;
100 else if(t[2]=='1' || t[2]=='2' || t[2]=='3')
101 m = 4;
102 else
103 m = 3;
104 }
105 break;
106 default:
107 m = 2;
108 }
109 while(m-- > 0){
110 if(*t == '\n')
111 break;
112 n++;
113 t++;
114 }
115 continue;
116 }
117 Continue:
118 n++;
119 t += wid;
120 }while(c != '\n');
121 }
122 Bterm(&b);
123 }
124