|
|
1.1 ! root 1: /* NOTICE-NOT TO BE DISCLOSED OUTSIDE BELL SYS EXCEPT UNDER WRITTEN AGRMT */ ! 2: /* Writer's Workbench version 2.0, January 1981 */ ! 3: #include <stdio.h> ! 4: #include <ctype.h> ! 5: #include <math.h> ! 6: #define MAXDOCS 75 ! 7: #define NVAR 10 ! 8: #define MINSENT 90 ! 9: #define MINWDS 1900 ! 10: #define FALSE 0 ! 11: #define TRUE 1 ! 12: #define MINN 20 ! 13: ! 14: char filen[MAXDOCS][15], extra[MAXDOCS], extra2[MAXDOCS]; ! 15: float kindex[MAXDOCS], avw[MAXDOCS],snonf[MAXDOCS], simple[MAXDOCS],complex[MAXDOCS], compound[MAXDOCS], compdx[MAXDOCS]; ! 16: float ppron[MAXDOCS],padj[MAXDOCS]; ! 17: float passive[MAXDOCS],explet[MAXDOCS]; ! 18: int nomin[MAXDOCS],x[MAXDOCS]; ! 19: int maxsent[MAXDOCS], numsent[MAXDOCS], numwds[MAXDOCS],qcount[MAXDOCS], icount[MAXDOCS],numnonf[MAXDOCS],ml[MAXDOCS],lsum[MAXDOCS],mg[MAXDOCS],gsum[MAXDOCS]; ! 20: int maxindex[MAXDOCS],minindex[MAXDOCS],minsent[MAXDOCS]; ! 21: float aindex[MAXDOCS],cindex[MAXDOCS],fgrad[MAXDOCS],findex[MAXDOCS],avl[MAXDOCS],fnumnonf[MAXDOCS],centlsum[MAXDOCS],centgsum[MAXDOCS]; ! 22: int nsimple[MAXDOCS],ncomplex[MAXDOCS],ncompound[MAXDOCS],ncompdx[MAXDOCS],ntobe[MAXDOCS]; ! 23: int npassive[MAXDOCS],pron[MAXDOCS],pos[MAXDOCS],adj[MAXDOCS],art[MAXDOCS],beg[MAXDOCS],begadv[MAXDOCS],begprep[MAXDOCS],begverb[MAXDOCS],begscon[MAXDOCS]; ! 24: int begconj[MAXDOCS], begexp[MAXDOCS],noun[MAXDOCS]; ! 25: float ptobe[MAXDOCS],paux[MAXDOCS],pinfin[MAXDOCS],padv[MAXDOCS],pconjc[MAXDOCS],pprepc[MAXDOCS],pnoun[MAXDOCS],pnomin[MAXDOCS],tot[MAXDOCS]; ! 26: float pbegprep[MAXDOCS],pbegadv[MAXDOCS],pbegverb[MAXDOCS],pbegscon[MAXDOCS],pbegconj[MAXDOCS],pbegexp[MAXDOCS]; ! 27: int tobe[MAXDOCS],aux[MAXDOCS],infin[MAXDOCS],prepc[MAXDOCS],conjc[MAXDOCS],adv[MAXDOCS]; ! 28: ! 29: FILE *fopen(), *stylout, *out, *scores, *tmp; ! 30: ! 31: ! 32: main(argc, argv) ! 33: int argc; ! 34: char *argv[]; ! 35: { ! 36: int n, i, j, x; ! 37: int aok,ok,once,lmesg; ! 38: int number, orignum; ! 39: float m[NVAR], sd[NVAR]; ! 40: float *score[NVAR], mm2[NVAR], mm1[NVAR], mp1[NVAR], mp2[NVAR]; ! 41: char *file[MAXDOCS]; ! 42: float mean(), sdev(); ! 43: float smpmcmp[MAXDOCS], cmpcmdx[MAXDOCS]; ! 44: int nvar; ! 45: char name[14], *pid; ! 46: ! 47: /* Begin */ ! 48: ! 49: number = *argv[1]; ! 50: number=number-'0'; ! 51: if(isdigit(*(argv[1]+1)))number=10*number+(*(argv[1]+1)-'0'); ! 52: orignum=number; ! 53: pid=argv[2]; ! 54: sprintf(name,"/tmp/%sstat.out",pid); ! 55: if((stylout=fopen(name,"r"))==NULL) { ! 56: fprintf(stderr, "Can't read %s.\n",name); ! 57: exit(2); ! 58: } ! 59: if((out=fopen("stand.out","w"))==NULL) { ! 60: printf("Can't write \"stand.out\".\n"); ! 61: exit(2); ! 62: } ! 63: if((scores=fopen("styl.scores","w"))==NULL) { ! 64: printf("Can't write \"styl.scores\".\n"); ! 65: exit(2); ! 66: } ! 67: ! 68: aok=FALSE; ! 69: once=FALSE; ! 70: lmesg=FALSE; ! 71: ! 72: /* Read style scores */ ! 73: ! 74: for(n=0; n<number; n++) { ! 75: fscanf(stylout,"%s %s %s\n", extra[n],extra2[n],filen[n]); ! 76: fscanf(stylout,"readability grades:\n"); ! 77: fscanf(stylout," (Kincaid) %f (auto) %f (Coleman-Liau) %f (Flesch) %f (%f)",&kindex[n],&aindex[n],&cindex[n],&fgrad[n],&findex[n]); ! 78: fscanf(stylout," sentence info:"); ! 79: fscanf(stylout," no. sent %d no. wds %ld",&numsent[n],&numwds[n]); ! 80: fscanf(stylout," av sent leng %f av word leng %f",&avw[n],&avl[n]); ! 81: fscanf(stylout," no. questions %d no. imperatives %d",&qcount[n],&icount[n]); ! 82: fscanf(stylout," no. content wds %d %f%% av leng %f",&numnonf[n],&fnumnonf[n],&snonf[n]); ! 83: fscanf(stylout," short sent (<%d)%f%% (%d) long sent (>%d) %f%% (%d)",&ml[n],¢lsum[n],&lsum[n],&mg[n],¢gsum[n],&gsum[n]); ! 84: fscanf(stylout," longest sent %d wds at sent %d; shortest sent %d wds at sent %d",&maxsent[n],&maxindex[n],&minsent[n],&minindex[n]); ! 85: fscanf(stylout," sentence types:"); ! 86: fscanf(stylout," simple %f%% (%d) complex %f%% (%d)",&simple[n],&nsimple[n],&complex[n],&ncomplex[n]); ! 87: fscanf(stylout," compound %f%% (%d) compound-complex %f%% (%d)",&compound[n],&ncompound[n],&compdx[n],&ncompdx[n]); ! 88: fscanf(stylout," word usage:"); ! 89: fscanf(stylout," verb types as %% of total verbs"); ! 90: fscanf(stylout," tobe %f%% (%d) aux %f%% (%d) inf %f%% (%d)",&ptobe[n],&tobe[n],&paux[n],&aux[n],&pinfin[n],&infin[n]); ! 91: fscanf(stylout," passives as %% of non-inf verbs %f%% (%d)",&passive[n],&npassive[n]); ! 92: fscanf(stylout," types as %% of total"); ! 93: fscanf(stylout," prep %f%% (%d) conj %f%% (%d) adv %f%% (%d)",&pprepc[n],&prepc[n],&pconjc[n],&conjc[n],&padv[n],&adv[n]); ! 94: fscanf(stylout," noun %f%% (%d) adj %f%% (%d) pron %f%% (%d)",&pnoun[n],&noun[n], &padj[n],&adj[n],&ppron[n],&pron[n]); ! 95: fscanf(stylout," nominalizations %f %% (%d)",&pnomin[n],&nomin[n]); ! 96: fscanf(stylout," sentence beginnings:"); ! 97: fscanf(stylout," subject opener: noun (%d) pron (%d) pos (%d) adj (%d) art (%d) tot %f%%",&noun[n],&pron[n],&pos[n],&adj[n],&art[n],&tot[n]); ! 98: fscanf(stylout," prep %f%% (%d) adv %f%% (%d) ",&pbegprep[n],&begprep[n],&pbegadv[n],&begadv[n]); ! 99: fscanf(stylout," verb %f%% (%d) ",&pbegverb[n],&begverb[n]); ! 100: fscanf(stylout," sub_conj %f%% (%d) conj %f%% (%d)",&pbegscon[n],&begscon[n],&pbegconj[n],&begconj[n]); ! 101: fscanf(stylout," expletives %f%% (%d)",&pbegexp[n],&begexp[n]); ! 102: } ! 103: fclose(stylout); ! 104: ! 105: ! 106: /* Set file to point at filen */ ! 107: for(n=0; n<number; n++) file[n]=filen[n]; ! 108: ! 109: /* Compute sentence variation and complexity scores */ ! 110: ! 111: for(n=0; n<number; n++) { ! 112: smpmcmp[n] = simple[n] - complex[n]; ! 113: cmpcmdx[n] = compound[n] + compdx[n]; ! 114: } ! 115: ! 116: /* Set score arrays */ ! 117: ! 118: score[0]=kindex; ! 119: score[1]=snonf; ! 120: score[2]=centlsum; ! 121: score[3]=centgsum; ! 122: score[4]=passive; ! 123: score[5]=pnomin; ! 124: score[6]=avw; ! 125: score[7]=pbegexp; ! 126: score[8]=smpmcmp; ! 127: score[9]=cmpcmdx; ! 128: nvar=NVAR; ! 129: ! 130: /* Check file lengths */ ! 131: n=0; ! 132: while(n < number) { ! 133: if(numsent[n] < MINSENT && numwds[n] < MINWDS) { ! 134: if(lmesg==FALSE) { ! 135: printf("Files must be at least 1900 words OR 90 sentences long,\nfor mkstand to compute reliable standards.\n"); ! 136: lmesg=TRUE; ! 137: } ! 138: printf("File %s is too short, its scores will be excluded.\n", file[n]); ! 139: for(i=n; i<number-1; i++) { ! 140: file[i]=file[i+1]; ! 141: kindex[i]=kindex[i+1]; ! 142: snonf[i]=snonf[i+1]; ! 143: centlsum[i]=centlsum[i+1]; ! 144: centgsum[i]=centgsum[i+1]; ! 145: passive[i]=passive[i+1]; ! 146: pnomin[i]=pnomin[i+1]; ! 147: avw[i]=avw[i+1]; ! 148: pbegexp[i]=pbegexp[i+1]; ! 149: smpmcmp[i]=smpmcmp[i+1]; ! 150: cmpcmdx[i]=cmpcmdx[i+1]; ! 151: numwds[i]=numwds[i+1]; ! 152: numsent[i]=numsent[i+1]; ! 153: } ! 154: number=number-1; ! 155: } ! 156: else n++; ! 157: } ! 158: ! 159: /* While aok = FALSE */ ! 160: ! 161: while(aok==FALSE) { ! 162: ok=TRUE; ! 163: ! 164: /* Check new number */ ! 165: ! 166: if(number<=1) { ! 167: if(number==0) printf("All the input files "); ! 168: if(number==1) printf("All the input files but one "); ! 169: printf("were too short\nfor mkstand to compute reliable standards.\n"); ! 170: printf("Rerun mkstand with files that are longer than 1900 words or 90 sentences.\n"); ! 171: exit(2); ! 172: } ! 173: if(number < MINN && orignum >= MINN) { ! 174: printf("Since some files had to be excluded,\nthere are no longer 20 files.\n"); ! 175: printf("Mkstand will compute the standards,\n"); ! 176: printf("but they would probably be more reliable.\n"); ! 177: printf("if you run mkstand again with additional files\n"); ! 178: printf("to replace those that were excluded.\n"); ! 179: } ! 180: ! 181: /* Compute standards */ ! 182: ! 183: for(i=0; i<nvar; i++) { ! 184: m[i]=mean(score[i],number); ! 185: ! 186: sd[i]=sdev(score[i],m[i],number); ! 187: ! 188: mm2[i] = m[i] - 2 * sd[i]; ! 189: mm1[i] = m[i] - sd[i]; ! 190: mp1[i] = m[i] + sd[i]; ! 191: mp2[i] = m[i] + 2 * sd[i]; ! 192: ! 193: } ! 194: ! 195: /* Check for outliers */ ! 196: ! 197: if(once==FALSE) { ! 198: n=0; ! 199: while(n < number) { ! 200: for(i=0; i<nvar; i++) { ! 201: if(score[i][n] < mm2[i] || score[i][n] > mp2[i]) { ! 202: ok=FALSE; ! 203: once=TRUE; ! 204: printf("File %s has a score more than 2 standard deviations from the mean,\nand will be excluded.\n", file[n]); ! 205: for(j=n; j<number-1; j++) { ! 206: file[j]=file[j+1]; ! 207: kindex[j]=kindex[j+1]; ! 208: snonf[j]=snonf[j+1]; ! 209: centlsum[j]=centlsum[j+1]; ! 210: centgsum[j]=centgsum[j+1]; ! 211: passive[j]=passive[j+1]; ! 212: pnomin[j]=pnomin[j+1]; ! 213: avw[j]=avw[j+1]; ! 214: pbegexp[j]=pbegexp[j+1]; ! 215: smpmcmp[j]=smpmcmp[j+1]; ! 216: cmpcmdx[j]=cmpcmdx[j+1]; ! 217: } ! 218: number=number-1; ! 219: i=nvar; ! 220: } ! 221: else if(i==nvar-1) n++; ! 222: } ! 223: } ! 224: if(ok != FALSE) aok=TRUE; ! 225: } ! 226: else aok=TRUE; ! 227: } ! 228: ! 229: /* Print scores for examination */ ! 230: ! 231: printf("The style scores used to compile the standards\n"); ! 232: printf("are in a file named styl.scores. Please examine\n"); ! 233: printf("this file for any scores that seem unusual or invalid.\n"); ! 234: printf("If you find any, rerun mkstand without the unusual\n"); ! 235: printf("document.\n"); ! 236: for(n=0;n<number; n++) { ! 237: fprintf(scores,"Document %s:\n", file[n]); ! 238: fprintf(scores,"\tKincaid readability %4.1f\n", kindex[n]); ! 239: fprintf(scores,"\tAve. length of non-function words %4.1f\n", snonf[n]); ! 240: fprintf(scores,"\t%% short sentences %4.1f\n", centlsum[n]); ! 241: fprintf(scores,"\t%% long sentences %4.1f\n", centgsum[n]); ! 242: fprintf(scores,"\t%% passives %4.1f\n", passive[n]); ! 243: fprintf(scores,"\t%% nominalizations %4.1f\n", pnomin[n]); ! 244: fprintf(scores,"\tAve. sentence length %4.1f\n", avw[n]); ! 245: fprintf(scores,"\t%% expletives as sentence beginners %4.1f\n", pbegexp[n]); ! 246: fprintf(scores,"\t%% simple sentences minus %% complex sentences %4.1f\n", smpmcmp[n]); ! 247: fprintf(scores,"\t%% compound sentences plus %% compound-complex sentences %4.1f\n", cmpcmdx[n]); ! 248: fprintf(scores,"\n"); ! 249: } ! 250: ! 251: /* Write standards to stand.out */ ! 252: ! 253: for(i=0; i<nvar; i++) { ! 254: fprintf(out,"%4.2f %4.2f %4.2f %4.2f\n", mm2[i], mm1[i], mp1[i], mp2[i]); ! 255: if(i==3) ! 256: fprintf(out,"0.0 0.0 0.0 0.0\n0.0 0.0 0.0 0.0\n0.0 0.0 0.0 0.0\n0.0 0.0 0.0 0.0\n"); ! 257: } ! 258: } ! 259: float sdev(score,m,n) ! 260: float score[], m; ! 261: int n; ! 262: { ! 263: float *sc, sumsq; ! 264: double sqrt(); ! 265: ! 266: sumsq=0.0; ! 267: for(sc = score; sc < score + n; sc++) sumsq += (*sc-m) * (*sc-m); ! 268: return(sqrt(sumsq/(n-1))); ! 269: } ! 270: float mean(score,n) ! 271: float score[]; ! 272: int n; ! 273: { ! 274: ! 275: float *sc, sum; ! 276: ! 277: sum=0.0; ! 278: for(sc = score; sc < score +n; sc++) sum += *sc; ! 279: return(sum/n); ! 280: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.