home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / CRC.HPP < prev    next >
C/C++ Source or Header  |  1997-07-05  |  3KB  |  88 lines

  1. // +++Date last modified: 05-Jul-1997
  2.  
  3. /*
  4. **    CRC Calculator by Paul Johnston
  5. **    Version 1.0 Copyright 10/9/96 (September)
  6. **    Explicitly released to the public domain 30-Oct-1996 by the author
  7. */
  8.  
  9. /* Custom Hungarian types:
  10. **
  11. ** crp  - CRC Polynomial
  12. ** crgi - CRC reGister Inital value
  13. ** crxo - CRC Xor Out value
  14. ** crpt - CRC Precalculated Table
  15. ** crr  - is CRC Reversed
  16. ** crst - CRC Standard Type
  17. */
  18.  
  19. #ifndef PAJ_CRC
  20. #define PAJ_CRC
  21.  
  22. class PData {
  23. public:
  24.        unsigned long l;
  25.        void *pData;
  26. };
  27.  
  28. unsigned long Reflect(unsigned long toref, char w);
  29.  
  30. enum Crst {
  31.        Crc16=0,
  32.        Crc32,
  33.        JamCrc,
  34.        XModemCrc,
  35.        ZModemCrc16,
  36.        ZModemCrc32
  37. };
  38.  
  39. class CheckCalc {
  40. public:
  41.        virtual unsigned long Add (unsigned long crc, char *sCrc)=0;
  42.        virtual unsigned long Add (unsigned long crc, unsigned char sCrc)=0;
  43.        virtual unsigned long Add (unsigned long crc, PData sCrc)=0;
  44.        virtual unsigned long Init()=0;
  45. };
  46.  
  47. class CrcCalc : CheckCalc {
  48. private:
  49.        unsigned long acrpt[256], crp, crgi, crxo;
  50.        unsigned char fcrr, crwd;
  51.        void InitCalc (unsigned long crpNew, unsigned long crgiNew,
  52.                   unsigned long crxoNew, unsigned char fcrrNew,
  53.                   unsigned char crwdNew);
  54.  
  55. public:
  56.        unsigned long Add (unsigned long crc, char *sCrc);
  57.        unsigned long Add (unsigned long crc, unsigned char sCrc);
  58.        unsigned long Add (unsigned long crc, PData sCrc);
  59.        unsigned long Init();
  60.        CrcCalc (unsigned long crpNew, unsigned long crgiNew=0,
  61.             unsigned long crxoNew=0, unsigned char fcrrNew=1,
  62.             unsigned char crwdNew=32);
  63.             CrcCalc (Crst crst);
  64. };
  65.  
  66. class Crc {
  67. private:
  68.        unsigned long crc;
  69.        CheckCalc *crccalc;
  70.  
  71. public:
  72.        unsigned long crcGet()    { return crc; };
  73.        void Add (char *sCrc)     { crc=crccalc->Add(crc, sCrc); }
  74.        void Add (char sCrc)      { crc=crccalc->Add(crc, sCrc); }
  75.        void Add (PData sCrc)   { crc=crccalc->Add(crc, sCrc); }
  76.        void NewCrc ()        { crc=crccalc->Init(); }
  77.  
  78.        operator unsigned long ()   { return crcGet(); }
  79.        void operator << (char *sCrc)  { Add(sCrc); }
  80.        void operator << (char sCrc)  { Add(sCrc); }
  81.        void operator << (PData sCrc)   { Add(sCrc); }
  82.        void operator = (int iNew)   { if (iNew==0) NewCrc(); }
  83.  
  84.        Crc(CheckCalc *crccalcNew)   { crccalc=crccalcNew; NewCrc(); }
  85. };
  86.  
  87. #endif // PAJ_CRC
  88.