home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / csbruce / crc32a.c < prev    next >
C/C++ Source or Header  |  1993-12-24  |  1KB  |  53 lines

  1. /* CRC32A.C BY cRAIG bRUCE, 26-fEB-93 */
  2.  
  3. #INCLUDE <STDIO.H>
  4.  
  5. #DEFINE crc32_gen0X04C11DB7  /* ccitt STANDARD */
  6. #DEFINE crc32_msb0X80000000
  7.  
  8. UNSIGNED LONG GETCRC();
  9.  
  10. /******************************************************************************/
  11. MAIN( ARGC, ARGV )
  12. INT ARGC;
  13. CHAR *ARGV[];
  14. {$7b}
  15. INT I;
  16. file *FP;
  17. UNSIGNED LONG CRC;
  18.  
  19. IF (ARGC < 2) {$7b}
  20. CRC = GETCRC( STDIN );
  21. PRINTF("CRC32A = %10LU FOR <STDIN>\N", CRC);
  22. {$7d} ELSE {$7b}
  23. FOR (I=1; I<ARGC; I++) {$7b}
  24. IF ( (FP=FOPEN(ARGV[I],"RB")) == null ) {$7b}
  25. PRINTF("ERROR OPENING FILE \"%S\"!\N", ARGV[I]);
  26. {$7d} ELSE {$7b}
  27. CRC = GETCRC( FP );
  28. PRINTF("CRC32A = %10LU FOR \"%S\"\N",
  29. CRC, ARGV[I]);
  30. FCLOSE( FP );
  31. {$7d}
  32. {$7d}
  33. {$7d}
  34. {$7d}
  35.  
  36. /******************************************************************************/
  37. UNSIGNED LONG GETCRC( FP )
  38. file *FP;
  39. {$7b}
  40. REGISTER UNSIGNED LONG CRCBIN, CRCoVERFLOW;
  41. INT C, I;
  42.  
  43. CRCBIN = 0;
  44. WHILE( (C=GETC(FP)) != eof ) {$7b}
  45. FOR (I=0X80; I; I >>= 1) {$7b}
  46. CRCoVERFLOW = CRCBIN & crc32_msb;
  47. CRCBIN = (CRCBIN << 1) {$7c} (I&C ? 1 : 0);
  48. IF (CRCoVERFLOW) CRCBIN ^= crc32_gen;
  49. {$7d}
  50. {$7d}
  51. RETURN( CRCBIN );
  52. {$7d}
  53.