// ------------------------------- //
// -------- Start of File -------- //
// ------------------------------- //
// ----------------------------------------------------------- //
// C++ Source Code File Name: testprog.cpp
// Compiler Used: MSVC, BCC32, GCC, HPUX aCC, SOLARIS CC
// Produced By: glNET Software
// File Creation Date: 08/17/1998
// Date Last Modified: 05/25/2001
// Copyright (c) 2001 glNET Software
// ----------------------------------------------------------- //
// ------------- Program description and details ------------- //
// ----------------------------------------------------------- //
/*
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
The CRC32 functions (Cyclic Redundancy Check) are used to
calculate a sophisticated checksum based on the algebra of
polynomials. The Cyclic Redundancy Check, is a way to detect
bit errors that occur during data storage or transmission.
The CRC-32 algorithm operates on a block of data as a single
large numerical value. The algorithm divides this large value
by the CRC-32 polynomial or generator polynomial, leaving the
remainder 32-bit, which is the checksum.
*/
// ----------------------------------------------------------- //
#include "gxcrc32.h"
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <stdlib.h>
char in_file[255]; // Input file
void HelpMessage(const char *program_name)
{
cout << endl;
cout << "CRC-32 program." << endl;
cerr << "Displays 32-bit CRC for a specified file or string." << endl;
cout << "Usage: " << program_name << " [switches] infile" << endl;
cout << "Switches: -? = Display this help message." << endl;
cout << " -sData = Display 32-bit CRC for a specifed string."
<< endl;
cout << " -t = Write a CRC-32 table to the standard output."
<< endl;
cout << endl;
exit(0);
}
void ProcessArgs(int argc, char *argv[])
// Process the program's argument list
{
char *sbuf;
int i;
for(i = 1; i < argc; i++ ) {
if(*argv[i] == '-') {
char sw = *(argv[i] +1);
switch(sw) {
case '?' :
HelpMessage(argv[0]);
break;
case 's': {
sbuf = &argv[i][2];
unsigned long crc;
crc = calcCRC32(sbuf, strlen(sbuf));
cout << sbuf << endl;
cout << "CRC-32 = ";
cout.setf(ios::uppercase);
cout << "0x" << setfill('0') << setw(8) << hex << crc << endl;
cout.unsetf(ios::uppercase);
exit(0);
break;
}
case 't':
makeCRC32(cout);
exit(0);
break;
default:
cerr << endl;
cerr << "Unknown switch " << argv[i] << endl;
cerr << "Exiting..." << endl;
cerr << endl;
exit(0);
break;
}
}
else {
strcpy(in_file, argv[i]);
}
}
}
int main(int argc,char *argv[])
{
// If no argument is given print usage message to the screen
if(argc < 2) {
HelpMessage(argv[0]);
return 0;
}
// Process the programs command line arguments
ProcessArgs(argc, argv);
if(in_file[0] == 0 ) {
cout << endl;
cout << "You must specify a valid input file name." << endl;
cout << endl;
return 0;
}
#if defined (__UNIX__)
// In UNIX there is only one file type
fstream infile(in_file, ios::in | ios::nocreate);
#elif defined (__DOS__) || defined (__WIN32__)
// In MS-DOS/Windows there are two file types, text and binary
#ifdef __BCC32__
// The BCC 32 ios class does not have an enumeration for "nocreate"
fstream infile(in_file, ios::in | ios::binary);
#else
fstream infile(in_file, ios::in | ios::binary | ios::nocreate);
#endif // __BCC32__
#else
#error You must define a file system: __DOS__ __WIN32__ or __UNIX__
#endif
if(!infile) {
cerr << endl;
cerr << "Cannot open file: " << in_file << endl;
cerr << "Exiting..." << endl;
cerr << endl;
return 1;
}
unsigned long crc = calcCRC32(infile);
cout << in_file << endl;
cout << "CRC-32 = ";
cout.setf(ios::uppercase);
cout << "0x" << setfill('0') << setw(8) << hex << crc << endl;
cout.unsetf(ios::uppercase);
infile.close();
return 0;
}
// ----------------------------------------------------------- //
// ------------------------------- //
// --------- End of File --------- //
// ------------------------------- //