BSD 3 development
[unix-history] / usr / src / cmd / refer / flagger.c
CommitLineData
42d6e430
BJ
1# include "stdio.h"
2char wds[100][40];
3int synwd[100];
4int mark[100];
5int justw 0;
6extern int comcount;
7int blank[100];
8int wdp, wdf;
9int bl;
10int sargc; char **sargv;
11FILE *inf;
12main(argc,argv)
13 char *argv[];
14{
15int i;
16while (--argc && **++argv== '-')
17 switch(argv[0][1])
18 {
19 case 'w': justw=1; break;
20 case 'c': comcount=atoi(argv[0]+2); break;
21 }
22wdp=wdf=0;
23if (argc>0)
24 {
25 argc--;
26 inf = fopen(argv[0], "r");
27 if (inf==NULL) exit(0);
28 argv++;
29 }
30else
31 inf=stdin;
32sargc=argc; sargv= argv;
33while ( gw (wds[wdp = next(wdp)], &bl))
34 {
35 blank[wdp] = bl;
36 mark[wdp]=0;
37 synwd[wdp] = common(upcase(wds[wdp]));
38 if (common(sstrip(upcase(wds[wdp]))))
39 synwd[wdp]=1;
40 if (allpunct(wds[wdp]))
41 synwd[wdp]=1;
42 if (strlen(wds[wdp])<3)
43 synwd[wdp]=1;
44 if (synwd[wdp]==1)
45 {
46 for(i=wdp; i!=wdf; i=prev(i))
47 {
48 if (synwd[i]>0)
49 continue;
50 mark[i]=1;
51 break;
52 }
53 }
54 }
55if (wdp<0) return(0);
56i=wdf -1;
57i = next(i);
58while (i != wdp)
59 i= next(i);
60}
61next(i)
62{
63int j;
64j = (i+1) % 100;
65if (j==wdf)
66 {
67 if (justw==0)
68 {
69 if (mark[j] ) putchar('*');
70 printf("%s",wds[j]);
71 if (blank[j]) putchar(' ');
72 }
73 else
74 if (mark[j]) printf("%s\n", wds[j]);
75 wdf = (wdf+1)%100;
76 }
77return(j);
78}
79prev(i)
80{
81i = (i-1)%100;
82return(i);
83}
84allpunct(s)
85 char *s;
86{
87int c;
88while (c = *s++)
89 if (isalpha(c))
90 return(0);
91return(1);
92}
93gw(s, b)
94 char *s;
95 int *b;
96{
97int c, type, nt;
98c = getc(inf);
99while (c==EOF)
100 {
101 fclose(inf);
102 inf=NULL;
103 if (sargc-->0)
104 {
105 inf = fopen ( *sargv++, "r");
106 }
107 if (inf==NULL) return(0);
108 c = getc(inf);
109 }
110*s++ = c;
111type = isalpha(c) || isdigit(c);
112while ( (c = getc(inf)) != EOF )
113 {
114 nt = isalpha(c) || isdigit(c);
115 if (nt==type)
116 *s++= c;
117 else
118 break;
119 }
120*s=0;
121if (c== ' ')
122 {
123 *b = 1;
124 return(1);
125 }
126while (c==EOF)
127 {
128 fclose(inf); inf=NULL;
129 if (sargc-- > 0)
130 {
131 inf= fopen( *sargv++, "r");
132 }
133 if (inf==NULL) return(0);
134 c = getc(inf);
135 }
136ungetc(c, inf);
137*b=0;
138return(1);
139}
140trimnl(s)
141 char *s;
142{
143while (*s) s++;
144if (*--s=='\n') *s=0;
145}
146upcase(s)
147 char *s;
148{
149static char buf[100];
150strcpy (buf, s);
151for(s=buf; *s; s++)
152 if (isupper(*s))
153 *s = *s-'A'+'a';
154return(buf);
155}
156sstrip(s)
157 char *s;
158{
159char *p ; p=s;
160while (*s) s++;
161if (*--s=='s') *s=0;
162return(p);
163}