home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 15 / CD_ASCQ_15_070894.iso / vrac / nl_crcr.zip / NL-CRC.C < prev    next >
C/C++ Source or Header  |  1994-05-29  |  9KB  |  225 lines

  1. #define TITLE   "NL-CRC"                  /*  Program Name    */
  2. #define DATES   "1994"                    /*  Copyright Date  */
  3. #define VERSION "1.00"                    /*  Version Number  */
  4. /*
  5.  
  6.                                    NL-CRC
  7.                                 Version 1.00
  8.              Copyright (c) Bob Swift, 1994.  All Rights Reserved.
  9.                    Compiled with the Borland C++ compiler.
  10.  
  11.    This program is designed to read an input nodelist file and return
  12.    the correct CRC value which should be displayed in the first line.
  13.  
  14.    The format for using this program is as follows:
  15.  
  16.  
  17.           NL-CRC [drive:][path]<srcfile>
  18.  
  19.    where <srcfile>    is the name of the nodelist file to be read
  20.  
  21.  
  22.    The program will display a VERY brief set of instructions if it is called
  23.    without any arguments or if it encounters an error.  The following is a
  24.    list of the error codes returned by the program:
  25.  
  26.                   0 - No errors.  CRC value is correct.
  27.                   1 - No errors.  CRC value is incorrect.
  28.                   2 - Bad or missing command line argument.
  29.                   3 - Unable to open the input file.
  30.                   4 - Error reading the input file.
  31.  
  32.    When an error is encountered, the program will exit immediately and will
  33.    attempt to properly close all files.
  34.  
  35.    Although I have chosen to retain all rights to this program, you are free
  36.    to use it under the following conditions:
  37.  
  38.             - You realize that there is NO Warrantee of any sort.
  39.               It was tested pretty thoroughly here before release
  40.               but who knows what bugs may be lurking within.
  41.  
  42.             - You will not modify the code and release a new version
  43.               of the program.  I welcome suggestions for improvement
  44.               (especially when accompanied by code) but I make no
  45.               guarantee of future releases.
  46.  
  47.             - If you find the program useful, I ask that you do
  48.               something to brighten somebody else's day.  Just
  49.               exactly what, I will leave up to you.
  50.  
  51.  
  52.    You may freely distribute this program provided that you distribute only
  53.    the complete archive which includes the NL-CRC.EXE, NL-CRC.C and
  54.    NL-CRC.DOC.  In addition, You MUST NOT charge for the program nor can
  55.    you charge a copy fee over $4.00 (including the price of the diskette).
  56.  
  57.  
  58.                                                    Bob Swift (1:342/5)
  59.  
  60.  
  61. */
  62.  
  63.  
  64. /*****************************************************************************/
  65.  
  66. #include <stdio.h>
  67.  
  68. #define MAXBUF 4096
  69.  
  70. /*  CRC routine taken from Bob Stout's SNIPPETS collection  */
  71.     /* the CRC polynomial. This is used by XMODEM (almost CCITT).
  72.      * If you change P, you must change crctab[]'s initial value to what is
  73.      * printed by initcrctab()
  74.      */
  75. #define   P    0x1021
  76.  
  77.     /* number of bits in CRC: don't change it. */
  78. #define W 16
  79.  
  80.     /* this the number of bits per char: don't change it. */
  81. #define B 8
  82.  
  83. static unsigned short crctab[1<<B] = { /* as calculated by initcrctab() */
  84.     0x0000,  0x1021,  0x2042,  0x3063,  0x4084,  0x50a5,  0x60c6,  0x70e7,
  85.     0x8108,  0x9129,  0xa14a,  0xb16b,  0xc18c,  0xd1ad,  0xe1ce,  0xf1ef,
  86.     0x1231,  0x0210,  0x3273,  0x2252,  0x52b5,  0x4294,  0x72f7,  0x62d6,
  87.     0x9339,  0x8318,  0xb37b,  0xa35a,  0xd3bd,  0xc39c,  0xf3ff,  0xe3de,
  88.     0x2462,  0x3443,  0x0420,  0x1401,  0x64e6,  0x74c7,  0x44a4,  0x5485,
  89.     0xa56a,  0xb54b,  0x8528,  0x9509,  0xe5ee,  0xf5cf,  0xc5ac,  0xd58d,
  90.     0x3653,  0x2672,  0x1611,  0x0630,  0x76d7,  0x66f6,  0x5695,  0x46b4,
  91.     0xb75b,  0xa77a,  0x9719,  0x8738,  0xf7df,  0xe7fe,  0xd79d,  0xc7bc,
  92.     0x48c4,  0x58e5,  0x6886,  0x78a7,  0x0840,  0x1861,  0x2802,  0x3823,
  93.     0xc9cc,  0xd9ed,  0xe98e,  0xf9af,  0x8948,  0x9969,  0xa90a,  0xb92b,
  94.     0x5af5,  0x4ad4,  0x7ab7,  0x6a96,  0x1a71,  0x0a50,  0x3a33,  0x2a12,
  95.     0xdbfd,  0xcbdc,  0xfbbf,  0xeb9e,  0x9b79,  0x8b58,  0xbb3b,  0xab1a,
  96.     0x6ca6,  0x7c87,  0x4ce4,  0x5cc5,  0x2c22,  0x3c03,  0x0c60,  0x1c41,
  97.     0xedae,  0xfd8f,  0xcdec,  0xddcd,  0xad2a,  0xbd0b,  0x8d68,  0x9d49,
  98.     0x7e97,  0x6eb6,  0x5ed5,  0x4ef4,  0x3e13,  0x2e32,  0x1e51,  0x0e70,
  99.     0xff9f,  0xefbe,  0xdfdd,  0xcffc,  0xbf1b,  0xaf3a,  0x9f59,  0x8f78,
  100.     0x9188,  0x81a9,  0xb1ca,  0xa1eb,  0xd10c,  0xc12d,  0xf14e,  0xe16f,
  101.     0x1080,  0x00a1,  0x30c2,  0x20e3,  0x5004,  0x4025,  0x7046,  0x6067,
  102.     0x83b9,  0x9398,  0xa3fb,  0xb3da,  0xc33d,  0xd31c,  0xe37f,  0xf35e,
  103.     0x02b1,  0x1290,  0x22f3,  0x32d2,  0x4235,  0x5214,  0x6277,  0x7256,
  104.     0xb5ea,  0xa5cb,  0x95a8,  0x8589,  0xf56e,  0xe54f,  0xd52c,  0xc50d,
  105.     0x34e2,  0x24c3,  0x14a0,  0x0481,  0x7466,  0x6447,  0x5424,  0x4405,
  106.     0xa7db,  0xb7fa,  0x8799,  0x97b8,  0xe75f,  0xf77e,  0xc71d,  0xd73c,
  107.     0x26d3,  0x36f2,  0x0691,  0x16b0,  0x6657,  0x7676,  0x4615,  0x5634,
  108.     0xd94c,  0xc96d,  0xf90e,  0xe92f,  0x99c8,  0x89e9,  0xb98a,  0xa9ab,
  109.     0x5844,  0x4865,  0x7806,  0x6827,  0x18c0,  0x08e1,  0x3882,  0x28a3,
  110.     0xcb7d,  0xdb5c,  0xeb3f,  0xfb1e,  0x8bf9,  0x9bd8,  0xabbb,  0xbb9a,
  111.     0x4a75,  0x5a54,  0x6a37,  0x7a16,  0x0af1,  0x1ad0,  0x2ab3,  0x3a92,
  112.     0xfd2e,  0xed0f,  0xdd6c,  0xcd4d,  0xbdaa,  0xad8b,  0x9de8,  0x8dc9,
  113.     0x7c26,  0x6c07,  0x5c64,  0x4c45,  0x3ca2,  0x2c83,  0x1ce0,  0x0cc1,
  114.     0xef1f,  0xff3e,  0xcf5d,  0xdf7c,  0xaf9b,  0xbfba,  0x8fd9,  0x9ff8,
  115.     0x6e17,  0x7e36,  0x4e55,  0x5e74,  0x2e93,  0x3eb2,  0x0ed1,  0x1ef0
  116.     };
  117.  
  118. unsigned short updcrc(unsigned short icrc,unsigned char *icp,unsigned int icnt);
  119. void showprog(int out);
  120. void helpscrn(int ernum);
  121.  
  122. /*****************************************************************************/
  123.  
  124. void main(int argc, char *argv[])
  125. {
  126. char version[] = {VERSION};  /* Current Version Number */
  127. char title[] = {TITLE};
  128. char dates[] = {DATES};
  129. FILE *infile1;
  130. char buf[MAXBUF];
  131. unsigned short crc,filecrc;
  132. int i,j;
  133.  
  134. printf("\n\n%s Version %s\n",title,version);
  135. printf("Copyright (c) Bob Swift, %s.  All Rights Reserved.\n",dates);
  136.  
  137. if (argc != 2) helpscrn(2);
  138. if ((infile1=fopen(argv[1],"rb")) == NULL) helpscrn(3);
  139.  
  140. i = 0;
  141. j = 0;
  142.  
  143. if (fgets(buf,MAXBUF,infile1) == NULL) helpscrn(4);
  144. filecrc = atoi(buf+strlen(buf)-7);
  145. printf("\n%s\n",buf+3);
  146. printf("CRC read from file header: %05u\n",filecrc);
  147. printf("CRC calculated from file : -----");
  148.  
  149. crc = 0;
  150. while( (i = (int) fread(buf, 1, MAXBUF, infile1)) > 0 )
  151.   {
  152.   showprog(j++);
  153.   crc = updcrc( crc, buf, i );
  154.   }
  155.  
  156. fclose(infile1);
  157. printf("\b\b\b\b\b%05u\n\n",crc);
  158. printf("The file header CRC value is ");
  159. if (crc != filecrc) printf("in");
  160. printf("correct.\n\n");
  161.  
  162. printf("Thank-you for using %s.\n\n",title);
  163. if (crc != filecrc) exit(1);
  164. exit(0);
  165. }
  166.  
  167.  
  168. /*****************************************************************************/
  169.  
  170. unsigned short updcrc(unsigned short icrc,
  171.                       unsigned char *icp,
  172.                       unsigned int icnt )
  173. {
  174.       register unsigned short crc = icrc;
  175.       register unsigned char *cp = icp;
  176.       register unsigned int cnt = icnt;
  177.  
  178.       while ((cnt--) && (*cp != 26))
  179.             crc = (crc<<B) ^ crctab[(crc>>(W-B)) ^ *cp++];
  180.  
  181.       return(crc);
  182. }
  183.  
  184.  
  185. /*****************************************************************************/
  186.  
  187. /*  Display changing symbol so user doesn't get worried  */
  188. void showprog(int out)
  189. {
  190. char dispchar[5][6] = {"*----","-*---","--*--","---*-","----*"};
  191.  
  192. printf("\b\b\b\b\b%s",dispchar[out%5]);
  193. }
  194.  
  195.  
  196. /*****************************************************************************/
  197.  
  198. void helpscrn(int ernum)
  199. /*  Here are the error messages and VERY brief instructions  */
  200. {
  201. cprintf("\n");
  202. switch (ernum) {
  203.  
  204. case  2 : printf("     **  Bad or missing command line argument  **\n\n");
  205.           break;
  206.  
  207. case  3 : printf("     **  Unable to open the input file  **\n\n");
  208.           break;
  209.  
  210. case  4 : printf("     **  Error reading the input file  **\n\n");
  211.           break;
  212.     }
  213.  
  214.  
  215. printf("This program is designed to read an input nodelist file and return\n");
  216. printf("the correct CRC value which should be displayed in the first line.\n");
  217. printf("\nThe format for using this program is as follows:\n\n");
  218. printf("     NL-CRC [drive:][path]<srcfile>\n\n");
  219. printf("where <srcfile>    is the name of the nodelist file to be read\n");
  220. exit(ernum);
  221. }
  222.  
  223.  
  224. /*****************************************************************************/
  225.