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