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