|
|
1.1 root 1: /* NOTICE-NOT TO BE DISCLOSED OUTSIDE BELL SYS EXCEPT UNDER WRITTEN AGRMT */
2: /* Writer's Workbench version 2.3, April 7, 1981 */
3: #define NVAR 14
4: #define MAXLENG 79.0
5: #define READAB 0
6: #define NONF 1
7: #define PASS 8
8: #define NOM 9
9: #define AVW 10
10: #define EXPL 11
11: #define S_CPX 12
12: #include <stdio.h>
13:
14: char *disclm ="BECAUSE YOUR TEXT IS SHORT \(< 2000 WORDS & < 100 SENTENCES\),\n\
15: THE FOLLOWING ANALYSIS MAY BE MISLEADING.\n\n";
16:
17: char *note0 =
18: "NOTE: Your document is being compared against standards\n\
19: derived from 30 TMs, classified as good by Department Heads\n\
20: in the Research Area.\n";
21: char *note2 =
22: "NOTE: Your text is being compared against standards derived\n\
23: from 34 instructional texts produced by Department 45272.\n\n";
24: char *note1 =
25: "NOTE: Your text is being compared to standards for Craft\n\
26: derived from the research of E. Coke.\n\n";
27: char *note3 =
28: "NOTE: Your text is being compared to standards given in file\n\"%s.\"\n";
29:
30: char *kincaid = "\nREADABILITY\n\
31: \n The Kincaid readability formula predicts that your text\n\
32: can be read by someone with %2.0f or more years of schooling,\n";
33:
34: char *more_str =
35: "\n More Information on Sentence Structure\n\
36: \n Since passives, nominalizations, as well as expletives\n\
37: all require some form of the verb \"to be,\" an easy way to\n\
38: identify difficult paragraphs is to look for the overuse of\n\
39: forms of \"be.\" The `findbe' program makes this easy; it for-\n\
40: mats a text and underlines and capitalizes all forms of \"to\n\
41: be.\" To use it type:\n\n\
42: findbe filename\n\n\
43: You can also use the `style' program to print your sentences\n\
44: containing both a passive verb and a nominalization. Type:\n\n\
45: style -n filename\n";
46:
47: char *read0 =
48: " Good TMs\n\
49: average close to 13th grade level, even though the audience\n\
50: has more education than that.\n";
51: char *read2 =
52: " Good train-\n\
53: ing materials average close to the 10th grade level, even\n\
54: though the audience has more education than that.\n";
55: char *read3 =
56: " Your good\n\
57: materials average close to grade %4.1f.\n";
58: char *read1 =
59: " Since Coke\n\
60: found that 62%% of Bell System craft have difficulty reading\n\
61: documents with readability scores above 12.0, the majority\n\
62: of the craft will probably not be able to read this.\n";
63:
64: char *begmsg =
65: "\n Writing teachers also stress that no more than 75\n\
66: percent of the sentences in a text should begin with the\n\
67: subject of the sentence; these start with the subject\n\
68: %2.0f%% of the time. Try starting more of your sentences with\n\
69: prepositions, adverbs, or conjunctions. This change will\n\
70: have the added benefit of adding variety of sentence length\n\
71: and type.\n";
72:
73: char *pasnom ="\n Passives and Nominalizations\n\
74: \n You have appropriately limited your use of passives and\n\
75: nominalizations \(nouns made from verbs, e.g. \"description\"\).\n";
76:
77: char *badpas =
78: "\n This text contains a %s higher percentage of passive verbs\n\
79: (%4.1f%%) than is common in good documents of this type (%2.0f%%).\n";
80:
81: char *badnom ="\n This text has a higher percentage of nominalizations\n\
82: (%4.1f%%) than is common in good documents of this type (%2.0f%%).\n";
83:
84: char *badexp ="\n Expletives\n\
85: \n This text contains a higher percentage of expletives\n\
86: (%4.1f%%) than is common in good documents of this type (%2.0f%%).\n";
87:
88: FILE *fp;
89: main(argc,argv)
90: int argc;
91: char *argv[];
92: {
93: char *rather="rather";
94: char *very="very";
95: char *too="too";
96: char *much="much";
97: char *null="";
98: char *qual;
99: char *note;
100: char *readmsg;
101: FILE *fpath;
102: int h,h0,fflag,sflag,ret;
103: char save[81], buf[100];
104: int i,aud,npara,p,j;
105: int numabst;
106: float kindex, avw,snonf, simple,complex, compound, compdx;
107: float ppron,padj, var[NVAR],array[NVAR][4],sc[NVAR];
108: float passive,explet;
109: int nomin,x;
110: int numsent, maxsent, qcount, icount,ml,lsum,mg,gsum;
111: long numwds,numnonf;
112: int maxindex,minindex,minsent;
113: float aindex,cindex,fgrad,findex,avl,fnumnonf,centlsum,centgsum;
114: int nsimple,ncomplex,ncompound,ncompdx,ntobe;
115: int npassive,pron,pos,adj,art,beg,begadv,begprep,begverb,begscon;
116: int begconj, begexp,noun;
117: float ptobe,paux,pinfin,padv,pconjc,pprepc,pnoun,pnomin,tot;
118: float pbegprep,pbegadv,pbegverb,pbegscon,pbegconj,pbegexp;
119: int tobe,aux,infin,prepc,conjc,adv;
120: char path[80];
121: fflag=0;
122: sflag=0;
123: aud=0;
124: note = note0;
125: readmsg = read0;
126: strcpy(path,LIB");
127: if(argc >= 2){
128: i=0;
129: if(*(argv[1]+i) =='f') {
130: fflag=1;
131: i++;
132: }
133: if(*(argv[1]+i) =='s') {
134: sflag=1;
135: i++;
136: }
137: switch (*(argv[1]+i)){
138: case 'm':
139: aud=0;
140: note = note0;
141: readmsg = read0;
142: break;
143: case 't':
144: aud=2;
145: note = note2;
146: readmsg = read2;
147: strds(LIB/train.st","training");
148: break;
149: case 'c':
150: aud=1;
151: note = note1;
152: readmsg = read1;
153: strds(LIB/crft.st","Craft");
154: break;
155: case 'x':
156: aud=3;
157: note = note3;
158: readmsg = read3;
159: if((fp=fopen(argv[2],"r"))==NULL){
160: fprintf(stderr,"Prose can't find your standards file \"%s,\" try specifying a more complete pathname.\n",argv[2]);
161: exit(1);
162: }
163: break;
164: }
165: }
166:
167: if(aud==0)
168: strds(LIB/tm.st","TM");
169: findbeg:
170: if(fgets(save,81,stdin)==NULL){
171: fprintf(stderr,"The file named after the -f flag doesn't seem\
172: to contain a style table.\nOr else style cannot produce a table for your\
173: file.\n Try running style alone on your file.\n");
174: exit(1);
175: }
176: ret=sscanf(save,"%*s%f%*s%f%*s%f%*s%f (%f)",
177: &kindex,&aindex,&cindex,&fgrad,&findex);
178: if(ret !=5 ) goto findbeg;
179: fgets(buf,100,stdin);
180: scanf("%*s%*s%d%*s%*s%ld",&numsent,&numwds);
181: scanf("%*s%*s%*s%f%*s%*s%*s%f",&avw,&avl);
182: scanf("%*s%*s%d%*s%*s%d",&qcount,&icount);
183: scanf("%*s%*s%*s%d%f%%%*s%*s%f",&numnonf,&fnumnonf,&snonf);
184: scanf("%*s%*s (<%d) %f%% (%d) %*s%*s (>%d) %f%% (%d)",
185: &ml,¢lsum,&lsum,&mg,¢gsum,&gsum);
186: scanf("%*s%*s%d%*s%*s%*s%d;%*s%*s%d%*s%*s%*s%d\n",
187: &maxsent,&maxindex,&minsent,&minindex);
188: fgets(buf,100,stdin);
189: scanf("%*s%f%% (%d) %*s %f%% (%d)",&simple,&nsimple,&complex,&ncomplex);
190: scanf("%*s%f%% (%d) %*s%f%% (%d)\n",
191: &compound,&ncompound,&compdx,&ncompdx);
192: fgets(buf,100,stdin);
193: fgets(buf,100,stdin);
194: scanf("%*s%f%% (%d) %*s %f%% (%d)%*s%f%% (%d)",
195: &ptobe,&tobe,&paux,&aux,&pinfin,&infin);
196: scanf("%*s%*s %% %*s%*s%*s%f%% (%d)\n",&passive,&npassive);
197: fgets(buf,100,stdin);
198: scanf("%*s %f%% (%d)%*s%f%% (%d)%*s%f%% (%d)",
199: &pprepc,&prepc,&pconjc,&conjc,&padv,&adv);
200: scanf("%*s%f%% (%d)%*s %f%% (%d)%*s%f%% (%d)",
201: &pnoun,&noun, &padj,&adj,&ppron,&pron);
202: scanf("%*s%f %% (%d)\n",&pnomin,&nomin);
203: fgets(buf,100,stdin);
204: scanf("%*s%*s%*s (%d)%*s (%d)%*s (%d)%*s (%d)%*s (%d)%*s%f%%",
205: &noun,&pron,&pos,&adj,&art,&tot);
206: scanf("%*s%f%% (%d)%*s%f%% (%d) ",&pbegprep,&begprep,&pbegadv,&begadv);
207: scanf("%*s%f%% (%d) ",&pbegverb,&begverb);
208: scanf("%*s%f%% (%d)%*s%f%% (%d)",&pbegscon,&begscon,&pbegconj,&begconj);
209: scanf("%*s%f%% (%d)",&pbegexp,&begexp);
210:
211: /*variables used by the prose program*/
212: var[READAB]=kindex;
213: var[NONF]=snonf;
214: var[2]=centlsum;
215: var[3]=centgsum;
216: var[4]=simple;
217: var[5]=complex;
218: var[6]=compound;
219: var[7]=compdx;
220: var[PASS]=passive;
221: var[NOM]=pnomin;
222: var[AVW]=avw;
223: var[EXPL]=pbegexp;
224: var[S_CPX]=simple-complex;
225: var[13]=compound+compdx;
226:
227: /*read criterion values for variables from appropriate file*/
228: ret=0;
229: for(i=0;i <NVAR; i++)
230: for(j=0;j<4; j++){
231: ret+=fscanf(fp,"%f",&array[i][j]);
232: }
233:
234: /* make sure values were read correctly*/
235: if(ret!=(NVAR*4)){
236: fprintf(stderr,"The standards file is not formatted\
237: properly.\nIt should have %d lines, each with 4 floating point numbers.\n",
238: NVAR);
239: exit(1);
240: }
241:
242: /* Compare criterion values against STYLE produced scores*/
243:
244: for(i=0; i< NVAR; i++){
245: sc[i]=0;
246: for(j=0; j < 4;j++){
247: if(var[i] > array[i][j]) sc[i]=j+1;
248: }
249: }
250:
251: /* Read percent of abstract words */
252:
253:
254: if(numwds < 2000 && numsent <100)
255: printf(disclm);
256: if(sflag) goto shortans ;
257: printf(note,argv[2]);
258: /*READABILITY*/
259: printf(kincaid,kindex);
260: if(sc[READAB]==0){
261: printf("which is a low score for this type of document.");
262: if (aud==0)
263: printf(" If this is\nan instructional text\
264: (in paragraph form), run prose -t for\na more appropriate review.\n");
265: else if(aud==2)putchar('\n');
266: }
267: else if(sc[READAB] < 3)
268: printf("which is a good score for documents like this.\n");
269: else { /* ==3 or 4*/
270: if(sc[READAB] == 3)qual=rather;
271: else qual=very;
272: printf("which is %s high for this type of document.",qual);
273: if(aud != 1)printf(readmsg,(array[READAB][1]+array[READAB][2])/2.0);
274: if(sc[NONF] > 2)
275: prtfile(LIB/rd2.t");
276: if(aud == 1)printf(readmsg);
277:
278: }
279:
280:
281: printf("\nVARIATION\n");
282: if(sc[S_CPX]==4 || sc[S_CPX]==0 || tot >MAXLENG)
283: prtfile(LIB/var.t");
284: if(sc[S_CPX]==0||sc[S_CPX]==4)
285: printf("\n In this text %2.0f%% of the sentences are\
286: simple, %2.0f%% are\ncomplex, giving a difference of %3.0f. This\
287: difference should\nrange from %2.0f to %2.0f for good documents of this\
288: type.\n",simple,complex, simple-complex,array[S_CPX][1],array[S_CPX][2]);
289: if(sc[S_CPX]==4){
290: if(sc[AVW] < 2)
291: prtfile(LIB/type.t");
292: else
293: prtfile(LIB/type2.t");
294: }
295: else if(sc[S_CPX]==0){
296: if(sc[READAB] < 3)
297: prtfile(LIB/var4.t");
298: else
299: prtfile(LIB/var6.t");
300: }
301: else printf("\n You have an appropriate distribution of sentence\
302: types.\n");
303: if(maxsent >= 50){
304: if(sc[S_CPX]==0 || sc[S_CPX]==4)
305: printf("\n Additionally, the longest sentence is\
306: %d words long.\n",maxsent);
307: else printf("\n The longest sentence,\
308: however, is %d words long.\n",maxsent);
309: prtfile(LIB/var5.t");
310: }
311: if(sc[AVW] > 2){
312: if(sc[S_CPX]==4 || sc[S_CPX]==0)
313: printf("\n Such changes would also help to\
314: reduce the average\n");
315: else printf("\n You should, however, consider\
316: shortening your average\n");
317: printf("sentence length. Your average is %2.0f words,\
318: which is ",var[AVW]);
319: if(sc[AVW]==3)printf("high.\n");
320: if(sc[AVW]==4) printf(" very\nhigh. ");
321: printf("A good average would be %2.0f to %2.0f words.\n",
322: array[AVW][1],array[AVW][2]);
323: }
324: if(tot >MAXLENG){
325: printf(begmsg,tot);
326: }
327: printf("\nSENTENCE STRUCTURE\n");
328: if(sc[PASS]<=2 && sc[NOM] <=2) {
329: printf(pasnom);
330: }
331: else {
332: printf("\n Passives\n");
333: if(sc[PASS] > 2){
334: if(sc[PASS] == 3)qual=null;
335: else qual=much;
336: printf(badpas,qual,var[PASS],(array[PASS][1]+array[PASS][2])/2.0);
337: prtfile(LIB/pass.t");
338: }
339: else printf("\n You have limited your passives appropriately.\n");
340: printf("\n Nominalizations\n");
341: if(sc[NOM] > 2){
342: printf(badnom,var[NOM],(array[NOM][1]+array[NOM][2])/2.0);
343: prtfile(LIB/nom.t");
344: }
345: else printf("\n You have appropriately limited your\
346: nominalizations\n\(nouns made from verbs, e.g., \"description\"\).\n");
347: }
348: if(sc[EXPL]==4){
349: printf(badexp,var[EXPL],(array[EXPL][1]+array[EXPL][2])/2.0);
350: prtfile(LIB/exp.t");
351: }
352: if(sc[PASS]>2 && sc[NOM]>2){
353: printf(more_str);
354: }
355: if(!fflag){
356: if(aud==0)
357: prtfile(LIB/popttm.t");
358: else if(aud==2)
359: prtfile(LIB/poptt.t");
360: }
361: prtfile(LIB/fur.t");
362: exit(0);
363: shortans :
364: if(aud==0) printf("Compared to TMs.\n\n");
365: else if(aud==1) printf("Evaluated for Craft.\n\n");
366: else if(aud==2) printf("Compared to training material.\n\n");
367: else if(aud==3)printf("Compared to file \"%s\"\n",argv[2]);
368: printf("Reading grade level--%2.0f: ",kindex);
369: if(sc[READAB]==1 || sc[READAB]==2) printf("Good\n");
370: else if(sc[READAB]==0) printf("Low\n");
371: else if(sc[READAB]==3) printf("High\n");
372: else if(sc[READAB]==4)printf("Very high\n");
373:
374:
375: printf("Variation--");
376: if(sc[S_CPX] == 4)
377: printf("Too many short, simple sentences--subordinate.\n");
378: else if(sc[S_CPX]==0) printf("Too many complex sentences.\n");
379: else printf("Good sentence type distribution.\n");
380: if(sc[AVW] > 2){
381: if(sc[AVW]==3)
382: qual = too;
383: else qual = very;
384: printf(" Sentences are %s long--avg\
385: length=%2.1f words\n",qual,var[AVW]);
386: printf(" --Good length\
387: = %2.1f to %2.1f\n",array[AVW][1],array[AVW][2]);
388: }
389: if( maxsent >50)
390: printf("Longest sentence is %d words---perhaps it is a list\n"
391: ,maxsent);
392: if(tot >MAXLENG)
393: printf(" %2.0f%%= Too many sentences begin with\
394: the subject.\n",tot);
395:
396: printf("Passives--%2.0f%%: ",passive);
397: if(sc[PASS]<=2)printf("Good\n");
398: else if(sc[PASS] ==3)printf("High\n");
399: else if(sc[PASS]==4)printf("Very high\n");
400:
401: printf("Nominalizations--%2.0f%%: ",pnomin);
402: if(sc[NOM]<=2)printf("Good\n");
403: else if(sc[NOM]==3)printf("High\n");
404: else if(sc[NOM]==4)printf("Very high\n");
405:
406: if(sc[EXPL]==4)printf("Expletive--%2.0f%%: Very high\n",pbegexp);
407: if (!fflag) printf("Don't forget the styl.tmp file.\n");
408: putchar('\n');
409: }
410: prtfile(s)
411: char *s;
412: {
413: FILE *ff;
414: char ch[512];
415: int num;
416: if((ff=fopen(s,"r"))==NULL){
417: fprintf(stderr,"Prose can't find the file %s\n",s);
418: exit(1);
419: }
420: while((num=fread(ch,sizeof(ch[0]),512,ff)))
421: fwrite(ch,sizeof(ch[0]),num,stdout);
422: fclose(ff);
423: }
424: strds(s1,s2)
425: char *s1, *s2;
426: {
427: if((fp=fopen(s1,"r"))==NULL){
428: fprintf(stderr,"Prose can't find the %s standards file %s\n",
429: s2,s1);
430: exit(1);
431: }
432: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.