xref: /plan9/acme/bin/source/spout.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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