home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 11092 < prev    next >
Text File  |  1994-08-04  |  10KB  |  358 lines

  1. Newsgroups: sci.crypt,alt.sources
  2. Path: wupost!golf!mont!ukma!jobone!newsxfer.itd.umich.edu!europa.eng.gtefsd.com!howland.reston.ans.net!agate!ames!enews.sgi.com!wdl1!mail!are107.lds.loral.com!hahn
  3. From: hahn@newshost.lds.loral.com  (Karl Hahn)
  4. Subject: Letter Usage Analysis Program (C-code)
  5. Message-ID: <940803075135@are107.lds.loral.com>
  6. Nntp-Software: PC/TCP NNTP
  7. Lines: 343       
  8. Sender: news@lds.loral.com
  9. Reply-To: hahn@lds.loral.com
  10. Organization: Loral Data Systems
  11. Date: Wed, 3 Aug 1994 12:51:35 GMT
  12. Xref: wupost sci.crypt:29915 alt.sources:11092
  13.  
  14. Somebody requested this yesterday on sci.crypt.  This code is ANSI-C,
  15. and will run on DOS or UNIX provided you have an ANSI-C compiler
  16. (sorry, old K&R compilers won't work).  Counts letter usage and percent,
  17. doubled letter usage and percent, leading letter usage and percent,
  18. trailing letter usage and percent, and two letter combinations (digraphs).
  19.  
  20. #    This is a shell archive.
  21. #    Remove everything above and including the cut line.
  22. #    Then run the rest of the file through sh.
  23. #----cut here-----cut here-----cut here-----cut here----#
  24. #!/bin/sh
  25. # shar:    Shell Archiver
  26. #    Run the following text with /bin/sh to create:
  27. #    letcount.c
  28. # This archive created: Wed Aug 03 07:47:40 1994
  29. sed 's/^X//' << \SHAR_EOF > letcount.c
  30. X#include <stdio.h>
  31. X#include <stdlib.h>
  32. X
  33. Xtypedef unsigned int  word;
  34. Xtypedef unsigned char byte;
  35. Xtypedef unsigned long lword;
  36. X
  37. X#define APOSTROPHE 27
  38. X#define BLANK      28
  39. X#define DASH       29
  40. X
  41. X#define ALPHASIZE  32
  42. X
  43. Xbyte sym2alpha[] = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ' -##";
  44. X
  45. X
  46. Xbyte alpha2sym( byte alpha )
  47. X{
  48. X   if ( alpha >  0x80 ) return 0;
  49. X
  50. X   if ( alpha >= 'a'  ) alpha -= ' ';
  51. X
  52. X   if ( alpha == '-'  ) return DASH;
  53. X
  54. X   if ( alpha == ' '  ) return BLANK;
  55. X   if ( alpha == '\n' ) return BLANK;
  56. X   if ( alpha == '\t' ) return BLANK;
  57. X   if ( alpha == '.'  ) return BLANK;
  58. X   if ( alpha == ','  ) return BLANK;
  59. X   if ( alpha == '!'  ) return BLANK;
  60. X   if ( alpha == '?'  ) return BLANK;
  61. X   if ( alpha == ';'  ) return BLANK;
  62. X   if ( alpha == ':'  ) return BLANK;
  63. X   if ( alpha == '"'  ) return BLANK;
  64. X   if ( alpha == '('  ) return BLANK;
  65. X   if ( alpha == ')'  ) return BLANK;
  66. X
  67. X   if ( alpha == '\'' ) return APOSTROPHE;
  68. X
  69. X   if ( alpha < 'A'   ) return 0;
  70. X
  71. X   if ( alpha > 'Z'   ) return 0;
  72. X
  73. X   return 1 + alpha - 'A';
  74. X}
  75. X
  76. X
  77. Xlword lettercount[ALPHASIZE];
  78. Xlword digraphcount[ALPHASIZE][ALPHASIZE];
  79. Xlword doublelet[ALPHASIZE];
  80. X
  81. X
  82. Xint main( int nargs, char *cargs[] )
  83. X{
  84. X   FILE *infile, *outfile;
  85. X   byte newblivit, oldblivit, spareblivit, anotherblivit;
  86. X   lword totalcount=0, initcount=0, endcount=0, doublecount=0, cmpcount, count;
  87. X
  88. X   if ( nargs < 2 )
  89. X   {
  90. X      printf( "letcount infile [outfile]\n"
  91. X              "\n"
  92. X              "   if no oufile given, output to screen\n" );
  93. X
  94. X      exit(0);
  95. X   }
  96. X
  97. X   infile = fopen( cargs[1], "r" );
  98. X   if ( infile == 0 )
  99. X   {
  100. X      printf( "%s not found\n", cargs[1] );
  101. X      exit(-1);
  102. X   }
  103. X
  104. X   if ( nargs < 3 )
  105. X   {
  106. X      outfile = stdout;
  107. X   }
  108. X   else
  109. X   {
  110. X      outfile = fopen( cargs[2], "r" );
  111. X      if ( outfile != 0 )
  112. X      {
  113. X         printf ( "%s already exists\n", cargs[2] );
  114. X         exit(-2);
  115. X      }
  116. X
  117. X      fclose( outfile );
  118. X
  119. X      outfile = fopen( cargs[2], "w" );
  120. X      if ( outfile == 0 )
  121. X      {
  122. X         printf( "couldn't open %s for output\n", cargs[2] );
  123. X      }
  124. X   }
  125. X
  126. X   for ( newblivit = 0; newblivit < ALPHASIZE; newblivit++ )
  127. X   {
  128. X      lettercount[newblivit] = 0;
  129. X      doublelet[newblivit] = 0;
  130. X
  131. X      for ( oldblivit = 0; oldblivit < ALPHASIZE; oldblivit++ )
  132. X      {
  133. X         digraphcount[newblivit][oldblivit] = 0;
  134. X      }
  135. X   }
  136. X
  137. X   newblivit = BLANK;
  138. X
  139. X   while ( 1 )
  140. X   {
  141. X      spareblivit = oldblivit;
  142. X
  143. X      oldblivit = newblivit;
  144. X
  145. X      newblivit = fgetc( infile );
  146. X
  147. X      if ( feof( infile ) ) break;
  148. X
  149. X      newblivit = alpha2sym( newblivit );
  150. X
  151. X      if ( newblivit != 0 )
  152. X      {
  153. X         if ( newblivit != BLANK ) totalcount++;
  154. X         lettercount[newblivit]++;
  155. X
  156. X         if ( (newblivit == oldblivit) && (newblivit != BLANK) )
  157. X         {
  158. X            doublecount++;
  159. X            doublelet[newblivit]++;
  160. X         }
  161. X
  162. X         if ( ( oldblivit == BLANK ) && ( newblivit != BLANK ) &&
  163. X              ( newblivit != 0 ) )
  164. X         {
  165. X            initcount++;
  166. X         }
  167. X
  168. X         if ( ( oldblivit != BLANK ) && ( newblivit == BLANK ) &&
  169. X              ( oldblivit != 0 ) )
  170. X         {
  171. X            endcount++;
  172. X         }
  173. X
  174. X         if ( oldblivit != 0 )
  175. X         {
  176. X            digraphcount[newblivit][oldblivit]++;
  177. X         }
  178. X      }
  179. X      else
  180. X      {
  181. X         oldblivit = spareblivit;
  182. X      }
  183. X   }
  184. X
  185. X   fprintf( outfile, "Total letter count = %7ld\n\n", totalcount );
  186. X
  187. X   fprintf( outfile, "Letter use frequencies:\n" );
  188. X
  189. X   for ( newblivit = 0; newblivit < ALPHASIZE-3; newblivit++ )
  190. X   {
  191. X      for ( oldblivit = 0, spareblivit = 0, cmpcount = 0;
  192. X            oldblivit < ALPHASIZE;
  193. X            oldblivit++ )
  194. X      {
  195. X         if ( lettercount[oldblivit] > cmpcount )
  196. X         {
  197. X            cmpcount = lettercount[oldblivit];
  198. X            spareblivit = oldblivit;
  199. X         }
  200. X
  201. X      }
  202. X
  203. X      lettercount[spareblivit] = 0;
  204. X
  205. X      if ( ( spareblivit != BLANK ) && (spareblivit <= DASH) &&
  206. X           ( spareblivit != 0 ) && (cmpcount != 0) )
  207. X      {
  208. X         fprintf( outfile, "%c:  %7ld   %3ld.%1ld\%\n",
  209. X                  sym2alpha[spareblivit],
  210. X                  cmpcount,
  211. X                  cmpcount*100 / totalcount,
  212. X                  (cmpcount*1000 / totalcount) % 10 );
  213. X      }
  214. X   }
  215. X
  216. X   fprintf( outfile, "\nTotal doubled letter count = %7ld\n\n", doublecount );
  217. X
  218. X   fprintf( outfile, "Doubled letter frequencies:\n" );
  219. X
  220. X   for ( newblivit = 0; newblivit < ALPHASIZE-3; newblivit++ )
  221. X   {
  222. X      for ( oldblivit = 0, spareblivit = 0, cmpcount = 0;
  223. X            oldblivit < ALPHASIZE;
  224. X            oldblivit++ )
  225. X      {
  226. X         if ( doublelet[oldblivit] > cmpcount )
  227. X         {
  228. X            cmpcount = doublelet[oldblivit];
  229. X            spareblivit = oldblivit;
  230. X         }
  231. X
  232. X      }
  233. X
  234. X      doublelet[spareblivit] = 0;
  235. X
  236. X      if ( ( spareblivit != BLANK ) && (spareblivit <= DASH) &&
  237. X           ( spareblivit != 0 ) && (cmpcount != 0) )
  238. X      {
  239. X         fprintf( outfile, "%c%c:  %7ld   %3ld.%1ld\%\n",
  240. X                  sym2alpha[spareblivit],
  241. X                  sym2alpha[spareblivit],
  242. X                  cmpcount,
  243. X                  cmpcount*100 / doublecount,
  244. X                  (cmpcount*1000 / doublecount) % 10 );
  245. X      }
  246. X   }
  247. X
  248. X   fprintf( outfile, "\nTotal initial letters = %7ld\n", initcount );
  249. X   fprintf( outfile, "Initial letter frequencies:\n" );
  250. X
  251. X   for ( newblivit = 0; newblivit < ALPHASIZE-3; newblivit++ )
  252. X   {
  253. X      for ( oldblivit = 0, spareblivit = 0, cmpcount = 0;
  254. X            oldblivit < ALPHASIZE;
  255. X            oldblivit++ )
  256. X      {
  257. X         if ( digraphcount[oldblivit][BLANK] > cmpcount )
  258. X         {
  259. X            cmpcount = digraphcount[oldblivit][BLANK];
  260. X            spareblivit = oldblivit;
  261. X         }
  262. X
  263. X      }
  264. X
  265. X      digraphcount[spareblivit][BLANK] = 0;
  266. X
  267. X      if ( ( spareblivit != BLANK ) && (spareblivit <= DASH) &&
  268. X           ( spareblivit != 0 ) )
  269. X      {
  270. X         fprintf( outfile, "%c:  %7ld   %3ld.%1ld\%\n",
  271. X                  sym2alpha[spareblivit],
  272. X                  cmpcount,
  273. X                  cmpcount*100 / initcount,
  274. X                  (cmpcount*1000 / initcount) % 10 );
  275. X      }
  276. X   }
  277. X
  278. X
  279. X
  280. X
  281. X   fprintf( outfile, "\nTotal ending letters = %7ld\n", endcount );
  282. X   fprintf( outfile, "Ending letter frequencies:\n" );
  283. X
  284. X   for ( newblivit = 0; newblivit < ALPHASIZE-3; newblivit++ )
  285. X   {
  286. X      for ( oldblivit = 0, spareblivit = 0, cmpcount = 0;
  287. X            oldblivit < ALPHASIZE;
  288. X            oldblivit++ )
  289. X      {
  290. X         if ( digraphcount[BLANK][oldblivit] > cmpcount )
  291. X         {
  292. X            cmpcount = digraphcount[BLANK][oldblivit];
  293. X            spareblivit = oldblivit;
  294. X         }
  295. X
  296. X      }
  297. X
  298. X      digraphcount[BLANK][spareblivit] = 0;
  299. X
  300. X      if ( ( spareblivit != BLANK ) && (spareblivit <= DASH) &&
  301. X           ( spareblivit != 0 ) && (cmpcount != 0) )
  302. X      {
  303. X         fprintf( outfile, "%c:  %7ld   %3ld.%1ld\%\n",
  304. X                  sym2alpha[spareblivit],
  305. X                  cmpcount,
  306. X                  cmpcount*100 / initcount,
  307. X                  (cmpcount*1000 / initcount) % 10 );
  308. X      }
  309. X   }
  310. X
  311. X   fprintf( outfile, "\nTop 250 digraphs:\n" );
  312. X
  313. X   for ( count = 0; count < 250; count++ )
  314. X   {
  315. X      for (newblivit = 0, spareblivit = 0, anotherblivit = 0, cmpcount = 0;
  316. X           newblivit < ALPHASIZE;
  317. X           newblivit++ )
  318. X      {
  319. X         for ( oldblivit = 0; oldblivit < ALPHASIZE; oldblivit++ )
  320. X         {
  321. X            if ( digraphcount[newblivit][oldblivit] > cmpcount )
  322. X            {
  323. X               cmpcount = digraphcount[newblivit][oldblivit];
  324. X               spareblivit = newblivit;
  325. X               anotherblivit = oldblivit;
  326. X            }
  327. X         }
  328. X      }
  329. X
  330. X      digraphcount[spareblivit][anotherblivit] = 0;
  331. X
  332. X      if ( cmpcount != 0 )
  333. X      {
  334. X         fprintf ( outfile, "%c%c:   %ld\n",
  335. X                   sym2alpha[anotherblivit],
  336. X                   sym2alpha[spareblivit],
  337. X                   cmpcount );
  338. X      }
  339. X   }
  340. X
  341. X}
  342. SHAR_EOF
  343. #    End of shell archive
  344. exit 0
  345.  
  346.  
  347.  
  348. --
  349. |         (V)              |  "Tiger gotta hunt.  Bird gotta fly.
  350. |   (^    (`>              |   Man gotta sit and wonder why, why, why.
  351. |  ((\\__/ )               |   Tiger gotta sleep.  Bird gotta land.
  352. |  (\\<   )   der Nethahn  |   Man gotta tell himself he understand."
  353. |    \<  )                 |  
  354. |     ( /                  |                Kurt Vonnegut Jr.
  355. |      |                   |  
  356. |      ^           hahn@lds.loral.com
  357.  
  358.