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;
outp()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