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