|
|
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 = "\nRREEAADDAABBIILLIITTYY\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 _M_o_r_e__I_n_f_o_r_m_a_t_i_o_n__o_n__S_e_n_t_e_n_c_e__S_t_r_u_c_t_u_r_e\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 _f_i_n_d_b_e 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 _s_t_y_l_e 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 *pas_nom ="\n _P_a_s_s_i_v_e_s__a_n_d__N_o_m_i_n_a_l_i_z_a_t_i_o_n_s\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 _E_x_p_l_e_t_i_v_e_s\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: int h,h0,fflag,sflag,ret; ! 102: char save[81]; ! 103: int i,aud,npara,p,j; ! 104: int numabst; ! 105: float kindex, avw,snonf, simple,complex, compound, compdx; ! 106: float ppron,padj, var[NVAR],array[NVAR][4],sc[NVAR]; ! 107: float passive,explet; ! 108: int nomin,x; ! 109: int numsent, maxsent, qcount, icount,ml,lsum,mg,gsum; ! 110: long numwds,numnonf; ! 111: int maxindex,minindex,minsent; ! 112: float aindex,cindex,fgrad,findex,avl,fnumnonf,centlsum,centgsum; ! 113: int nsimple,ncomplex,ncompound,ncompdx,ntobe; ! 114: int npassive,pron,pos,adj,art,beg,begadv,begprep,begverb,begscon; ! 115: int begconj, begexp,noun; ! 116: float ptobe,paux,pinfin,padv,pconjc,pprepc,pnoun,pnomin,tot; ! 117: float pbegprep,pbegadv,pbegverb,pbegscon,pbegconj,pbegexp; ! 118: int tobe,aux,infin,prepc,conjc,adv; ! 119: char path[80]; ! 120: fflag=0; ! 121: sflag=0; ! 122: aud=0; ! 123: note = note0; ! 124: readmsg = read0; ! 125: strcpy(path,LIB"); ! 126: if(argc >= 2){ ! 127: i=0; ! 128: if(*(argv[1]+i) =='f') { ! 129: fflag=1; ! 130: i++; ! 131: } ! 132: if(*(argv[1]+i) =='s') { ! 133: sflag=1; ! 134: i++; ! 135: } ! 136: switch (*(argv[1]+i)){ ! 137: case 'm': ! 138: aud=0; ! 139: note = note0; ! 140: readmsg = read0; ! 141: break; ! 142: case 't': ! 143: aud=2; ! 144: note = note2; ! 145: readmsg = read2; ! 146: strds(LIB/train.st","training"); ! 147: break; ! 148: case 'c': ! 149: aud=1; ! 150: note = note1; ! 151: readmsg = read1; ! 152: strds(LIB/crft.st","Craft"); ! 153: break; ! 154: case 'x': ! 155: aud=3; ! 156: note = note3; ! 157: readmsg = read3; ! 158: if((fp=fopen(argv[2],"r"))==NULL){ ! 159: fprintf(stderr,"Prose can't find your standards file \"%s,\" try specifying a more complete pathname.\n",argv[2]); ! 160: exit(1); ! 161: } ! 162: break; ! 163: } ! 164: } ! 165: ! 166: if(aud==0) ! 167: strds(LIB/tm.st","TM"); ! 168: findbeg: ! 169: if(fgets(save,81,stdin)==NULL){ ! 170: fprintf(stderr,"The file named after the -f flag doesn't seem\ ! 171: to contain a style table.\nOr else style cannot produce a table for your\ ! 172: file.\n Try running style alone on your file.\n"); ! 173: exit(1); ! 174: } ! 175: ret=sscanf(save,"%*s%f%*s%f%*s%f%*s%f (%f)", ! 176: &kindex,&aindex,&cindex,&fgrad,&findex); ! 177: if(ret !=5 ) goto findbeg; ! 178: gets(path); ! 179: scanf("%*s%*s%d%*s%*s%ld",&numsent,&numwds); ! 180: scanf("%*s%*s%*s%f%*s%*s%*s%f",&avw,&avl); ! 181: scanf("%*s%*s%d%*s%*s%d",&qcount,&icount); ! 182: scanf("%*s%*s%*s%d%f%%%*s%*s%f",&numnonf,&fnumnonf,&snonf); ! 183: scanf("%*s%*s (<%d) %f%% (%d) %*s%*s (>%d) %f%% (%d)", ! 184: &ml,¢lsum,&lsum,&mg,¢gsum,&gsum); ! 185: scanf("%*s%*s%d%*s%*s%*s%d;%*s%*s%d%*s%*s%*s%d\n", ! 186: &maxsent,&maxindex,&minsent,&minindex); ! 187: gets(path); ! 188: scanf("%*s%f%% (%d) %*s %f%% (%d)",&simple,&nsimple,&complex,&ncomplex); ! 189: scanf("%*s%f%% (%d) %*s%f%% (%d)\n", ! 190: &compound,&ncompound,&compdx,&ncompdx); ! 191: gets(path); ! 192: gets(path); ! 193: scanf("%*s%f%% (%d) %*s %f%% (%d)%*s%f%% (%d)", ! 194: &ptobe,&tobe,&paux,&aux,&pinfin,&infin); ! 195: scanf("%*s%*s %% %*s%*s%*s%f%% (%d)\n",&passive,&npassive); ! 196: gets(path); ! 197: scanf("%*s %f%% (%d)%*s%f%% (%d)%*s%f%% (%d)", ! 198: &pprepc,&prepc,&pconjc,&conjc,&padv,&adv); ! 199: scanf("%*s%f%% (%d)%*s %f%% (%d)%*s%f%% (%d)", ! 200: &pnoun,&noun, &padj,&adj,&ppron,&pron); ! 201: scanf("%*s%f %% (%d)\n",&pnomin,&nomin); ! 202: gets(path); ! 203: scanf("%*s%*s%*s (%d)%*s (%d)%*s (%d)%*s (%d)%*s (%d)%*s%f%%", ! 204: &noun,&pron,&pos,&adj,&art,&tot); ! 205: scanf("%*s%f%% (%d)%*s%f%% (%d) ",&pbegprep,&begprep,&pbegadv,&begadv); ! 206: scanf("%*s%f%% (%d) ",&pbegverb,&begverb); ! 207: scanf("%*s%f%% (%d)%*s%f%% (%d)",&pbegscon,&begscon,&pbegconj,&begconj); ! 208: scanf("%*s%f%% (%d)",&pbegexp,&begexp); ! 209: ! 210: /*variables used by the prose program*/ ! 211: var[READAB]=kindex; ! 212: var[NONF]=snonf; ! 213: var[2]=centlsum; ! 214: var[3]=centgsum; ! 215: var[4]=simple; ! 216: var[5]=complex; ! 217: var[6]=compound; ! 218: var[7]=compdx; ! 219: var[PASS]=passive; ! 220: var[NOM]=pnomin; ! 221: var[AVW]=avw; ! 222: var[EXPL]=pbegexp; ! 223: var[S_CPX]=simple-complex; ! 224: var[13]=compound+compdx; ! 225: ! 226: /*read criterion values for variables from appropriate file*/ ! 227: ret=0; ! 228: for(i=0;i <NVAR; i++) ! 229: for(j=0;j<4; j++){ ! 230: ret+=fscanf(fp,"%f",&array[i][j]); ! 231: } ! 232: ! 233: /* make sure values were read correctly*/ ! 234: if(ret!=(NVAR*4)){ ! 235: fprintf(stderr,"The standards file is not formatted\ ! 236: properly.\nIt should have %d lines, each with 4 floating point numbers.\n", ! 237: NVAR); ! 238: exit(1); ! 239: } ! 240: ! 241: /* Compare criterion values against STYLE produced scores*/ ! 242: ! 243: for(i=0; i< NVAR; i++){ ! 244: sc[i]=0; ! 245: for(j=0; j < 4;j++){ ! 246: if(var[i] > array[i][j]) sc[i]=j+1; ! 247: } ! 248: } ! 249: ! 250: /* Read percent of abstract words */ ! 251: ! 252: ! 253: if(numwds < 2000 && numsent <100) ! 254: printf(disclm); ! 255: if(sflag) goto shortans ; ! 256: printf(note,argv[2]); ! 257: /*READABILITY*/ ! 258: printf(kincaid,kindex); ! 259: if(sc[READAB]==0){ ! 260: printf("which is a low score for this type of document."); ! 261: if (aud==0) ! 262: printf(" If this is\nan instructional text\ ! 263: (in paragraph form), run prose -t for\na more appropriate review.\n"); ! 264: else if(aud==2)putchar('\n'); ! 265: } ! 266: else if(sc[READAB] < 3) ! 267: printf("which is a good score for documents like this.\n"); ! 268: else { /* ==3 or 4*/ ! 269: if(sc[READAB] == 3)qual=rather; ! 270: else qual=very; ! 271: printf("which is %s high for this type of document.",qual); ! 272: if(aud != 1)printf(readmsg,(array[READAB][1]+array[READAB][2])/2.0); ! 273: if(sc[NONF] > 2) ! 274: prtfile(LIB/rd2.t"); ! 275: if(aud == 1)printf(readmsg); ! 276: ! 277: } ! 278: ! 279: ! 280: printf("\nVVAARRIIAATTIIOONN\n"); ! 281: if(sc[S_CPX]==4 || sc[S_CPX]==0 || tot >MAXLENG) ! 282: prtfile(LIB/var.t"); ! 283: if(sc[S_CPX]==0||sc[S_CPX]==4) ! 284: printf("\n In this text %2.0f%% of the sentences are\ ! 285: simple, %2.0f%% are\ncomplex, giving a difference of %3.0f. This\ ! 286: difference should\nrange from %2.0f to %2.0f for good documents of this\ ! 287: type.\n",simple,complex, simple-complex,array[S_CPX][1],array[S_CPX][2]); ! 288: if(sc[S_CPX]==4){ ! 289: if(sc[AVW] < 2) ! 290: prtfile(LIB/type.t"); ! 291: else ! 292: prtfile(LIB/type2.t"); ! 293: } ! 294: else if(sc[S_CPX]==0){ ! 295: if(sc[READAB] < 3) ! 296: prtfile(LIB/var4.t"); ! 297: else ! 298: prtfile(LIB/var6.t"); ! 299: } ! 300: else printf("\n You have an appropriate distribution of sentence\ ! 301: types.\n"); ! 302: if(maxsent >= 50){ ! 303: if(sc[S_CPX]==0 || sc[S_CPX]==4) ! 304: printf("\n Additionally, the longest sentence is\ ! 305: %d words long.\n",maxsent); ! 306: else printf("\n The longest sentence,\ ! 307: however, is %d words long.\n",maxsent); ! 308: prtfile(LIB/var5.t"); ! 309: } ! 310: if(sc[AVW] > 2){ ! 311: if(sc[S_CPX]==4 || sc[S_CPX]==0) ! 312: printf("\n Such changes would also help to\ ! 313: reduce the average\n"); ! 314: else printf("\n You should, however, consider\ ! 315: shortening your average\n"); ! 316: printf("sentence length. Your average is %2.0f words,\ ! 317: which is ",var[AVW]); ! 318: if(sc[AVW]==3)printf("high.\n"); ! 319: if(sc[AVW]==4) printf(" very\nhigh. "); ! 320: printf("A good average would be %2.0f to %2.0f words.\n", ! 321: array[AVW][1],array[AVW][2]); ! 322: } ! 323: if(tot >MAXLENG){ ! 324: printf(begmsg,tot); ! 325: } ! 326: printf("\nSSEENNTTEENNCCEE SSTTRRUUCCTTUURREE\n"); ! 327: if(sc[PASS]<=2 && sc[NOM] <=2) { ! 328: printf(pas_nom); ! 329: } ! 330: else { ! 331: printf("\n _P_a_s_s_i_v_e_s\n"); ! 332: if(sc[PASS] > 2){ ! 333: if(sc[PASS] == 3)qual=null; ! 334: else qual=much; ! 335: printf(badpas,qual,var[PASS],(array[PASS][1]+array[PASS][2])/2.0); ! 336: prtfile(LIB/pass.t"); ! 337: } ! 338: else printf("\n You have limited your passives appropriately.\n"); ! 339: printf("\n _N_o_m_i_n_a_l_i_z_a_t_i_o_n_s\n"); ! 340: if(sc[NOM] > 2){ ! 341: printf(badnom,var[NOM],(array[NOM][1]+array[NOM][2])/2.0); ! 342: prtfile(LIB/nom.t"); ! 343: } ! 344: else printf("\n You have appropriately limited your\ ! 345: nominalizations\n\(nouns made from verbs, e.g., \"description\"\).\n"); ! 346: } ! 347: if(sc[EXPL]==4){ ! 348: printf(badexp,var[EXPL],(array[EXPL][1]+array[EXPL][2])/2.0); ! 349: prtfile(LIB/exp.t"); ! 350: } ! 351: if(sc[PASS]>2 && sc[NOM]>2){ ! 352: printf(more_str); ! 353: } ! 354: if(!fflag){ ! 355: if(aud==0) ! 356: prtfile(LIB/popttm.t"); ! 357: else if(aud==2) ! 358: prtfile(LIB/poptt.t"); ! 359: } ! 360: prtfile(LIB/fur.t"); ! 361: exit(0); ! 362: shortans : ! 363: if(aud==0) printf("Compared to TMs.\n\n"); ! 364: else if(aud==1) printf("Evaluated for Craft.\n\n"); ! 365: else if(aud==2) printf("Compared to training material.\n\n"); ! 366: else if(aud==3)printf("Compared to file \"%s\"\n",argv[2]); ! 367: printf("Reading grade level--%2.0f: ",kindex); ! 368: if(sc[READAB]==1 || sc[READAB]==2) printf("Good\n"); ! 369: else if(sc[READAB]==0) printf("Low\n"); ! 370: else if(sc[READAB]==3) printf("High\n"); ! 371: else if(sc[READAB]==4)printf("Very high\n"); ! 372: ! 373: ! 374: printf("Variation--"); ! 375: if(sc[S_CPX] == 4) ! 376: printf("Too many short, simple sentences--subordinate.\n"); ! 377: else if(sc[S_CPX]==0) printf("Too many complex sentences.\n"); ! 378: else printf("Good sentence type distribution.\n"); ! 379: if(sc[AVW] > 2){ ! 380: if(sc[AVW]==3) ! 381: qual = too; ! 382: else qual = very; ! 383: printf(" Sentences are %s long--avg\ ! 384: length=%2.1f words\n",qual,var[AVW]); ! 385: printf(" --Good length\ ! 386: = %2.1f to %2.1f\n",array[AVW][1],array[AVW][2]); ! 387: } ! 388: if( maxsent >50) ! 389: printf("Longest sentence is %d words---perhaps it is a list\n" ! 390: ,maxsent); ! 391: if(tot >MAXLENG) ! 392: printf(" %2.0f%%= Too many sentences begin with\ ! 393: the subject.\n",tot); ! 394: ! 395: printf("Passives--%2.0f%%: ",passive); ! 396: if(sc[PASS]<=2)printf("Good\n"); ! 397: else if(sc[PASS] ==3)printf("High\n"); ! 398: else if(sc[PASS]==4)printf("Very high\n"); ! 399: ! 400: printf("Nominalizations--%2.0f%%: ",pnomin); ! 401: if(sc[NOM]<=2)printf("Good\n"); ! 402: else if(sc[NOM]==3)printf("High\n"); ! 403: else if(sc[NOM]==4)printf("Very high\n"); ! 404: ! 405: if(sc[EXPL]==4)printf("Expletive--%2.0f%%: Very high\n",pbegexp); ! 406: if (!fflag) printf("Don't forget the styl.tmp file.\n"); ! 407: putchar('\n'); ! 408: } ! 409: prtfile(s) ! 410: char *s; ! 411: { ! 412: FILE *ff; ! 413: char ch[512]; ! 414: int num; ! 415: if((ff=fopen(s,"r"))==NULL){ ! 416: fprintf(stderr,"Prose can't find the file %s\n",s); ! 417: exit(1); ! 418: } ! 419: while((num=fread(ch,sizeof(ch[0]),512,ff))) ! 420: fwrite(ch,sizeof(ch[0]),num,stdout); ! 421: fclose(ff); ! 422: } ! 423: strds(s1,s2) ! 424: char *s1, *s2; ! 425: { ! 426: if((fp=fopen(s1,"r"))==NULL){ ! 427: fprintf(stderr,"Prose can't find the %s standards file %s\n", ! 428: s2,s1); ! 429: exit(1); ! 430: } ! 431: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.