xref: /original-bsd/usr.bin/diction/style3/outp.c (revision c3e32dec)
1 /*-
2  * %sccs.include.proprietary.c%
3  */
4 
5 #ifndef lint
6 static char sccsid[] = "@(#)outp.c	8.1 (Berkeley) 06/06/93";
7 #endif /* not lint */
8 
9 #include <stdio.h>
10 #include <ctype.h>
11 #include "style.h"
12 #include "names.h"
13 #include "conp.h"
14 char *names[] = {
15 	"noun", "verb", "interjection", "adjective", "adverb", "conjunction", "possessive",
16 	"pronoun", "article", "preposition", "auxiliary", "tobe", "", "subordinate conjunction",  "expletive"
17 };
18 extern int barebones;
19 outp(){
20 	struct ss *st;
21 	char *ssp;
22 	char *spart, ff;
23 	int index, lverbc;
24 	int nn, sc, f, kk,comp, begsc;
25 	int conjf, verbf,lpas,bflg,lexp,olvb;
26 	int nom;
27 	int infinf, ovflg;
28 	int lvowel,nlet;
29 	int imper;
30 	float rd;
31 	extern FILE *deb;
32 	extern int nosave;
33 
34 	if(barebones){
35 		for(sentp=sent;sentp->cc != END;sentp++)
36 			printf("%s %c %c\n",sentp->sp,sentp->ic,sentp->cc);
37 		printf("%s %c %c\n",sentp->sp,sentp->ic,sentp->cc);
38 		return;
39 	}
40 	if(topic){
41 		for(sentp=sent;sentp->cc != END;sentp++){
42 			if(sentp->cc==ADJ && (sentp+1)->cc==NOUN){
43 				printf("%s ",sentp->sp);
44 				sentp++;
45 				printf("%s\n",sentp->sp);
46 			}
47 			else if(sentp->cc==NOUN)printf("%s\n",sentp->sp);
48 		}
49 		return;
50 	}
51 	if(style){
52 	nn = kk = 0;
53 	for(sentp=sent;sentp->cc != END;sentp++){
54 		if(sentp->cc != ',' && sentp->cc != '"')nn++;
55 		if(sentp->cc == VERB || sentp->cc == BE || sentp->cc == AUX)kk++;
56 	}
57 	if(nn < 4 && kk == 0)return;
58 	}
59 
60 	imper = lexp = lpas = index = lverbc = nom = 0;
61 	conjf = verbf = kk = nn = sc = comp = begsc = 0;
62 	bflg = olvb = infinf = ovflg = 0;
63 	nlet = 0;
64 	f = 1;
65 	sentp=sent;
66 	while(sentp->cc != END){
67 /*	printf("%c:",sentp->ic);	*/
68 		if(sentp->cc == ';')comp++;
69 		else {
70 			if((sentp->cc != ',') && (sentp->cc != '"')){
71 				if(*sentp->sp != 'x'){
72 					nn++;
73 					nlet += sentp->leng;
74 				}
75 				kk++;
76 			}
77 		}
78 		switch(sentp->cc){
79 		case NOUN:
80 			spart ="noun";
81 			if(f)index=0;
82 			if((sentp->ic==NOM)||(sentp->ic==PNOUN  && islower(*(sentp->sp)))){
83 				sentp->ic = NOM;
84 				nom++;
85 				if(nosave && (deb != NULL))	/* SAVE NOM */
86 					fprintf(deb,"%s\n",sentp->sp);
87 			}
88 			if(*sentp->sp != 'x'){
89 				noun++;
90 				numnonf++;
91 				letnonf += sentp->leng;
92 			}
93 			bflg = infinf = ovflg = 0;
94 			break;
95 		case VERB:
96 			spart = "verb";
97 			if(f)index=1;
98 			if(sentp->ic==TO){
99 				infin++;
100 				infinf=1;
101 				lverbc++;
102 			}
103 			else {
104 				if(f)imper=1;
105 				if(ovflg == 0 && infinf == 0){
106 					ovflg = 1;
107 					lverbc++;
108 					olvb++;
109 				}
110 				numnonf++;
111 				letnonf += sentp->leng;
112 				if(infinf == 0){
113 					if(verbf == 0)verbf++;
114 					else if(conjf)comp++;
115 				}
116 				if(bflg && sentp->ic == ED){lpas++; ++passive;}
117 			}
118 			break;
119 		case INTER:
120 			spart = "interj";
121 			if(f)index=2;
122 			bflg = infinf = ovflg = 0;
123 			break;
124 		case ADJ:
125 			spart = "adj";
126 			if(f)index=3;
127 			adj++;
128 			numnonf++;
129 			if(sentp->ic == NOM){
130 				nom++;
131 				if(nosave && (deb != NULL))	/* SAVE NOM */
132 					fprintf(deb,"%s\n",sentp->sp);
133 			}
134 			letnonf += sentp->leng;
135 			bflg = infinf = ovflg = 0;
136 			break;
137 		case ADV:
138 			spart = "adv";
139 			if(f)index=4;
140 			adv++;
141 			numnonf++;
142 			letnonf += sentp->leng;
143 			break;
144 		case CONJ:
145 			spart = "conj";
146 			conjc++;
147 			if(f)index=5;
148 			if(infinf && (sentp+1)->cc == VERB);
149 			else {
150 				if(verbf)conjf++;
151 				bflg = infinf = ovflg = 0;
152 			}
153 			break;
154 		case POS:
155 			spart = "pos";
156 			if(f)index=6;
157 			bflg = infinf = ovflg = 0;
158 			break;
159 		case PRONS:
160 		case PRONP:
161 			spart = "pron";
162 			pron++;
163 			if(f){
164 				index=7;
165 				if((sentp+1)->cc == BE){
166 				if(sentp->leng == 5 && *(sentp->sp) == 't' && *((sentp->sp)+3)=='r'){index=14;lexp=1;}
167 				else if(sentp->leng ==2&& *(sentp->sp) == 'i' ){index=14;lexp=1;}
168 				}
169 			}
170 			bflg = infinf = ovflg = 0;
171 			if(sentp->ic == THAT || sentp->ic == WHO)sc++;
172 			break;
173 		case ART:
174 			spart = "art";
175 			if(f)index=8;
176 			bflg = infinf = ovflg = 0;
177 			break;
178 		case PREP:
179 			spart = "prep";
180 			if(f)index=9;
181 			prepc++;
182 			bflg = infinf = ovflg = 0;
183 			break;
184 		case AUXX:
185 			spart = "aux";
186 			if(ovflg == 0 && infinf == 0){
187 				ovflg = 1;
188 				lverbc++;
189 				olvb++;
190 				aux++;
191 			}
192 			if(f)index=10;
193 			break;
194 		case BE:
195 			if(ovflg == 0 && infinf == 0){
196 				ovflg = 1;
197 				lverbc++;
198 				olvb++;
199 			}
200 			spart = "be";
201 			if(f)index=11;
202 			tobe++;
203 			bflg = 1;
204 			if(verbf == 0)verbf++;
205 			else if(conjf)comp++;
206 			break;
207 		case SUBCONJ:
208 			spart = "subcj";
209 			if(f){
210 				index=13;
211 				begsc++;
212 			}
213 			sc++;
214 			if((sentp-1)->cc != CONJ)
215 				verbf = conjf = 0;
216 			bflg = infinf = ovflg = 0;
217 			break;
218 		default:
219 			if(sentp->cc == ','){
220 				if(begsc)conjf=verbf=0;
221 			}
222 			spart = sentp->sp;
223 		}
224 	if(part){
225 		printf("%s	%s\n",spart,sentp->sp);
226 	}
227 	if(style){
228 		ssp=sentp->sp;
229 		lvowel = 0;
230 		while(*ssp != '\0'){
231 			if(*ssp >= '0' && *ssp <= '9'){
232 				lvowel=0;
233 				break;
234 			}
235 			switch(*(ssp++)){
236 			case 'a':
237 			case 'e':
238 			case 'i':
239 			case 'o':
240 			case 'u':
241 			case 'y':
242 			case 'A':
243 			case 'E':
244 			case 'I':
245 			case 'O':
246 			case 'U':
247 			case 'Y':
248 				lvowel++;
249 				continue;
250 			}
251 		}
252 		if(lvowel != 0){
253 			vowel += lvowel;
254 			twds++;
255 		}
256 	}
257 		if(f){
258 			ff=sentp->cc;
259 			f=0;
260 		}
261 		sentp++;
262 	}
263 	if(part){
264 		printf(".	%s\n",sentp->sp);
265 		if(sentno < MAXPAR && nn > 0)
266 			leng[sentno++] = nn;
267 	}
268 	if(nn == 0)return;
269 	numsent++;
270 	numlet += nlet;
271 	tverbc += lverbc;
272 	verbc += olvb;
273 	if(*(sentp->sp) == '?'){
274 		if(sc > 0)sc -= 1;
275 		qcount++;
276 	}
277 	else if(*(sentp->sp) == '/')icount++;
278 	else if(imper)icount++;
279 	if(rstyle||pstyle)rd = 4.71*((float)(nlet)/(float)(nn))+.5*(float)(nn)-21.43;
280 	if(pstyle ||
281 	    (rstyle&& rd>=rthresh)||(lstyle&&nn >= lthresh)||(pastyle&&lpas)||(estyle&&lexp)
282 	    || (nstyle && (nom > 1 || (nom && lpas)))|| (Nstyle && nom)){
283 		if(!part){
284 			for(st=sent, kk=0;st->cc != END;st++){
285 				if(st->ic == NOM)
286 					printf("*%s* ",st->sp);
287 				else printf("%s ",st->sp);
288 				if(kk++ >= 15){
289 					kk=0;
290 					printf("\n");
291 				}
292 			}
293 		}
294 		kk=1;
295 	}
296 	else kk=0;
297 	if(pstyle || kk){
298 		if(!part)printf("%s\n",sentp->sp);
299 		printf(" sentence length: %d ",nn);
300 		if(sc == 0){
301 			if(comp == 0)printf("SIMPLE ");
302 			else printf("COMPOUND ");
303 		}
304 		else if(comp == 0)printf("COMPLEX ");
305 		else printf("COMPOUND-COMPLEX ");
306 		if(index==14)printf(":expletive:");
307 		if(lpas)printf(":passive:");
308 		if(rstyle||pstyle)printf(" readability %4.2f ",rd);
309 		printf(": begins with %s\n\n",names[index]);
310 	}
311 	if(index < 15)beg[index]++;
312 	if(nn > maxsent){
313 		maxsent=nn;
314 		maxindex=numsent;
315 	}
316 	if(nn < minsent ){
317 		minsent = nn;
318 		minindex=numsent;
319 	}
320 	numwds += nn;
321 	if(nn > 49)nn=49;
322 	sleng[nn]++;
323 	if(sc == 0){
324 		if(comp == 0)simple++;
325 		else compound++;
326 	}
327 	else if(comp == 0)complex++;
328 	else compdx++;
329 }
330