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 >
Wrap
C/C++ Source or Header
|
1994-05-29
|
9KB
|
225 lines
#define TITLE "NL-CRC" /* Program Name */
#define DATES "1994" /* Copyright Date */
#define VERSION "1.00" /* Version Number */
/*
NL-CRC
Version 1.00
Copyright (c) Bob Swift, 1994. All Rights Reserved.
Compiled with the Borland C++ compiler.
This program is designed to read an input nodelist file and return
the correct CRC value which should be displayed in the first line.
The format for using this program is as follows:
NL-CRC [drive:][path]<srcfile>
where <srcfile> is the name of the nodelist file to be read
The program will display a VERY brief set of instructions if it is called
without any arguments or if it encounters an error. The following is a
list of the error codes returned by the program:
0 - No errors. CRC value is correct.
1 - No errors. CRC value is incorrect.
2 - Bad or missing command line argument.
3 - Unable to open the input file.
4 - Error reading the input file.
When an error is encountered, the program will exit immediately and will
attempt to properly close all files.
Although I have chosen to retain all rights to this program, you are free
to use it under the following conditions:
- You realize that there is NO Warrantee of any sort.
It was tested pretty thoroughly here before release
but who knows what bugs may be lurking within.
- You will not modify the code and release a new version
of the program. I welcome suggestions for improvement
(especially when accompanied by code) but I make no
guarantee of future releases.
- If you find the program useful, I ask that you do
something to brighten somebody else's day. Just
exactly what, I will leave up to you.
You may freely distribute this program provided that you distribute only
the complete archive which includes the NL-CRC.EXE, NL-CRC.C and
NL-CRC.DOC. In addition, You MUST NOT charge for the program nor can
you charge a copy fee over $4.00 (including the price of the diskette).
Bob Swift (1:342/5)
*/
/*****************************************************************************/
#include <stdio.h>
#define MAXBUF 4096
/* CRC routine taken from Bob Stout's SNIPPETS collection */
/* the CRC polynomial. This is used by XMODEM (almost CCITT).
* If you change P, you must change crctab[]'s initial value to what is
* printed by initcrctab()
*/
#define P 0x1021
/* number of bits in CRC: don't change it. */
#define W 16
/* this the number of bits per char: don't change it. */
#define B 8
static unsigned short crctab[1<<B] = { /* as calculated by initcrctab() */
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};
unsigned short updcrc(unsigned short icrc,unsigned char *icp,unsigned int icnt);
void showprog(int out);
void helpscrn(int ernum);
/*****************************************************************************/
void main(int argc, char *argv[])
{
char version[] = {VERSION}; /* Current Version Number */
char title[] = {TITLE};
char dates[] = {DATES};
FILE *infile1;
char buf[MAXBUF];
unsigned short crc,filecrc;
int i,j;
printf("\n\n%s Version %s\n",title,version);
printf("Copyright (c) Bob Swift, %s. All Rights Reserved.\n",dates);
if (argc != 2) helpscrn(2);
if ((infile1=fopen(argv[1],"rb")) == NULL) helpscrn(3);
i = 0;
j = 0;
if (fgets(buf,MAXBUF,infile1) == NULL) helpscrn(4);
filecrc = atoi(buf+strlen(buf)-7);
printf("\n%s\n",buf+3);
printf("CRC read from file header: %05u\n",filecrc);
printf("CRC calculated from file : -----");
crc = 0;
while( (i = (int) fread(buf, 1, MAXBUF, infile1)) > 0 )
{
showprog(j++);
crc = updcrc( crc, buf, i );
}
fclose(infile1);
printf("\b\b\b\b\b%05u\n\n",crc);
printf("The file header CRC value is ");
if (crc != filecrc) printf("in");
printf("correct.\n\n");
printf("Thank-you for using %s.\n\n",title);
if (crc != filecrc) exit(1);
exit(0);
}
/*****************************************************************************/
unsigned short updcrc(unsigned short icrc,
unsigned char *icp,
unsigned int icnt )
{
register unsigned short crc = icrc;
register unsigned char *cp = icp;
register unsigned int cnt = icnt;
while ((cnt--) && (*cp != 26))
crc = (crc<<B) ^ crctab[(crc>>(W-B)) ^ *cp++];
return(crc);
}
/*****************************************************************************/
/* Display changing symbol so user doesn't get worried */
void showprog(int out)
{
char dispchar[5][6] = {"*----","-*---","--*--","---*-","----*"};
printf("\b\b\b\b\b%s",dispchar[out%5]);
}
/*****************************************************************************/
void helpscrn(int ernum)
/* Here are the error messages and VERY brief instructions */
{
cprintf("\n");
switch (ernum) {
case 2 : printf(" ** Bad or missing command line argument **\n\n");
break;
case 3 : printf(" ** Unable to open the input file **\n\n");
break;
case 4 : printf(" ** Error reading the input file **\n\n");
break;
}
printf("This program is designed to read an input nodelist file and return\n");
printf("the correct CRC value which should be displayed in the first line.\n");
printf("\nThe format for using this program is as follows:\n\n");
printf(" NL-CRC [drive:][path]<srcfile>\n\n");
printf("where <srcfile> is the name of the nodelist file to be read\n");
exit(ernum);
}
/*****************************************************************************/