home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / crc.zip / crc.c next >
C/C++ Source or Header  |  1996-01-14  |  5KB  |  166 lines

  1. /* CRC 0.1, Public domain               */
  2. /* Radim Kolar 2:423/66.111@FidoNet.Org */
  3.  
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <io.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <time.h>
  10.  
  11. #if defined __EMX__
  12. #include <stdlib.h>
  13. #endif
  14.  
  15. unsigned long crc32tab[256];
  16. unsigned int  crc16tab[256];
  17. unsigned int  crc16tabnew[256];
  18.    
  19.  
  20. void crctabinit(void)
  21. {
  22.   int i,n;
  23.   unsigned long CRC32;
  24.   unsigned int  CRC16;
  25.     for (i=0;i<256;i++)
  26.         {
  27.         CRC32=i;
  28.         for (n=1;n<9;n++)
  29.             {
  30.             if (CRC32 & 1)
  31.                 CRC32 = (CRC32 >> 1) ^ /* XOR */ 0xedb88320;
  32.             else
  33.                 CRC32 = CRC32 >> 1;
  34.             }
  35.         crc32tab[i] = CRC32;
  36.         }
  37.  
  38.     for (i=0;i<256;i++)
  39.             {
  40.             CRC16=i;
  41.             for (n=1;n<9;n++)
  42.                 {
  43.                 if (CRC16 & 1)
  44.                     CRC16=(CRC16 >> 1) ^ 0xA001;
  45.                 else
  46.                     CRC16=CRC16 >> 1;
  47.                 }
  48.             crc16tab[i]=CRC16;
  49.             }
  50.  
  51.     for (i=0;i<256;i++)
  52.             {
  53.             CRC16=i;
  54.             for (n=1;n<9;n++)
  55.                 {
  56.                 if (CRC16 & 1)
  57.                     CRC16=(CRC16 >> 1) ^ 0x8408;
  58.                 else
  59.                     CRC16=CRC16 >> 1;
  60.                 }
  61.             crc16tabnew[i]=CRC16;
  62.             }
  63.         
  64.         
  65. }        
  66.  
  67. /* CCITT CRC-32 */
  68. unsigned long calc32crc(FILE *f)
  69. {
  70.  unsigned long CRC=0xffffffffL;
  71.  unsigned int C;
  72.  rewind(f);
  73.  while((C=fgetc(f))!=EOF)
  74.    CRC=crc32tab[(CRC ^ C) & 0xFF] ^ ((CRC>>8) & 0x00ffffffL);
  75.  return CRC ^ 0xffffffffL;
  76. }
  77.  
  78. unsigned int calc16crc(FILE *f,int mode)
  79. /* mode =0 CCITT CRC-16, AX.25 Europan    */
  80. /*       1 XModem/Zmodem/Arc/Hpack/LZH    */
  81.  
  82. {
  83.  unsigned int  CRC=0xffff;
  84.  unsigned int C;
  85.  if (mode==1) CRC=0; 
  86.  rewind(f);
  87.  while((C=fgetc(f))!=EOF)
  88.     if (mode==1) CRC=((CRC >> 8) & 0x00ff) ^ crc16tab[(CRC ^ C) & 0x00ff];
  89.        else
  90.     CRC=((CRC >> 8) & 0x00ff) ^ crc16tabnew[(CRC ^ C) & 0x00ff];
  91.  if (mode==1) return CRC;
  92.  return CRC ^ 0xffff;
  93. }
  94.  
  95.  
  96. int main(int argc,char *argv[])
  97. {
  98.   FILE *f; 
  99.   int i,mode=0,verb=0,fixed=0;
  100.   struct stat s;
  101.   char *tmp;
  102. #if defined __EMX__
  103.  _response(&argc,&argv);
  104.  _wildcard(&argc,&argv);
  105. #endif
  106.  if (argc==1) {
  107.                 printf("CRC 0.1, Cyclic Redundancy Check. Radim Kolar 2:423/66.111@FidoNet.Org.");
  108. #ifdef __EMX__                
  109.                 printf("\nCompiled "__DATE__" by GCC "__VERSION__".  Public domain.");
  110. #endif                
  111.                 printf("\n\nCRC [ -crctype ] [ -options ] <files...> <@listfile...>");
  112.                 printf("\nCRC Type: one of CRC32, CRC16, CCITT16, ALL.");
  113.                 printf("\nOptions: V - print filedate/size");
  114.                 printf("\n         F - fixed filename length (25 chars), size (7 chars)");
  115.                 return 0; /* no deal */
  116.               }  
  117.  crctabinit();
  118.  for (i=1;i<argc;i++)
  119.  {
  120.    if((argv[i][0]=='/')||(argv[i][0]=='-'))
  121.                       { if(!stricmp(argv[i]+1,"CRC32")) { mode=0;continue;}
  122.                         if(!stricmp(argv[i]+1,"CRC16")) { mode=1;continue;}
  123.                         if(!stricmp(argv[i]+1,"CCITT16")) { mode=2;continue;}
  124.                         if(!stricmp(argv[i]+1,"ALL")) { mode=3;continue;}
  125.                         if(!stricmp(argv[i]+1,"V")) { verb=1;continue;}
  126.                         if(!stricmp(argv[i]+1,"F")) { fixed=1;continue;}
  127.                         fprintf(stderr, "Unknown switch %s. RTFM !\n",argv[i]);
  128.                         continue;
  129.                       }  
  130.    f=fopen(argv[i],"rb");
  131.    if (f==NULL) {
  132.                   fprintf(stderr,"Error opening %s\n",argv[i]);
  133.                   continue;
  134.                 }
  135.  
  136.    if (verb==1) if (stat(argv[i],&s)) { fclose(f);
  137.                                         fprintf(stderr,"Error getting file info.\n");
  138.                                         continue;
  139.                                       }
  140.                                 
  141.    if ((fixed==1)&&(strlen(argv[i])>25)) argv[i][25]='\x0';             
  142.    if (fixed==1) printf("%-25s ",argv[i]);
  143.       else
  144.                  printf("%s ",argv[i]);             
  145.                  
  146.    if (verb==1)          
  147.                     {                    
  148.                     tmp=ctime(&s.st_mtime);
  149.                     tmp[24]='\0';
  150.                     if (fixed==1) printf("%-9ld %s ",s.st_size,tmp);
  151.                        else
  152.                                   printf("%ld %s ",s.st_size,tmp);
  153.                     };
  154.    switch(mode)
  155.    {             
  156.    case 0: printf("%08lX\n",calc32crc(f));break;
  157.    case 1: printf("%04X\n",calc16crc(f,1));break;
  158.    case 2: printf("%04X\n",calc16crc(f,0));break;
  159.    case 3: printf("%08lX %04X %04X\n",calc32crc(f),calc16crc(f,1),calc16crc(f,0));
  160.    }
  161.    fclose(f);               
  162.  }
  163.  return 0;
  164. }
  165.  
  166.