Bill Jolitz @ Berkeley received this version from Lorindia Cherry
[unix-history] / usr / src / usr.bin / diction / style3 / outp.c
CommitLineData
2958d0fe 1#ifndef lint
280efb10 2static char sccsid[] = "@(#)outp.c 4.2 (Berkeley) 82/11/06";
2958d0fe
RH
3#endif not lint
4
280efb10
RH
5#include <stdio.h>
6#include <ctype.h>
2958d0fe
RH
7#include "style.h"
8#include "names.h"
9#include "conp.h"
10char *names[] = {
11 "noun", "verb", "interjection", "adjective", "adverb", "conjunction", "possessive",
280efb10 12 "pronoun", "article", "preposition", "auxiliary", "tobe", "", "subordinate conjunction", "expletive"
2958d0fe 13};
280efb10 14extern int barebones;
2958d0fe
RH
15outp(){
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;
280efb10 22 int nom;
2958d0fe
RH
23 int infinf, ovflg;
24 int lvowel,nlet;
25 int imper;
26 float rd;
280efb10
RH
27 extern FILE *deb;
28 extern int nosave;
2958d0fe 29
280efb10
RH
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 }
2958d0fe
RH
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
280efb10 56 imper = lexp = lpas = index = lverbc = nom = 0;
2958d0fe
RH
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;
280efb10
RH
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 }
2958d0fe
RH
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 }
280efb10 112 if(bflg && sentp->ic == ED){lpas++; ++passive;}
2958d0fe
RH
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++;
280efb10
RH
125 if(sentp->ic == NOM){
126 nom++;
127 if(nosave && (deb != NULL)) /* SAVE NOM */
128 fprintf(deb,"%s\n",sentp->sp);
129 }
2958d0fe
RH
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 }
2958d0fe
RH
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){
280efb10
RH
260 printf(". %s\n",sentp->sp);
261 if(sentno < MAXPAR && nn > 0)
262 leng[sentno++] = nn;
2958d0fe 263 }
280efb10 264 if(nn == 0)return;
2958d0fe
RH
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;
280efb10
RH
276 if(pstyle ||
277 (rstyle&& rd>=rthresh)||(lstyle&&nn >= lthresh)||(pastyle&&lpas)||(estyle&&lexp)
278 || (nstyle && (nom > 1 || (nom && lpas)))|| (Nstyle && nom)){
2958d0fe
RH
279 if(!part){
280 for(st=sent, kk=0;st->cc != END;st++){
280efb10
RH
281 if(st->ic == NOM)
282 printf("*%s* ",st->sp);
283 else printf("%s ",st->sp);
2958d0fe
RH
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}