crctable.c
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:8k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /****************************************************************************/
  2. /*                             Start of crctable.c                          */
  3. /****************************************************************************/
  4. /*                                                                          */
  5. /* Author  : Ross Williams (ross@guest.adelaide.edu.au.).                   */
  6. /* Date    : 3 June 1993.                                                   */
  7. /* Version : 1.0.                                                           */
  8. /* Status  : Public domain.                                                 */
  9. /*                                                                          */
  10. /* Description : This program writes a CRC lookup table (suitable for       */
  11. /* inclusion in a C program) to a designated output file. The program can be*/
  12. /* statically configured to produce any table covered by the Rocksoft^tm    */
  13. /* Model CRC Algorithm. For more information on the Rocksoft^tm Model CRC   */
  14. /* Algorithm, see the document titled "A Painless Guide to CRC Error        */
  15. /* Detection Algorithms" by Ross Williams (ross@guest.adelaide.edu.au.).    */
  16. /* This document is likely to be in "ftp.adelaide.edu.au/pub/rocksoft".     */
  17. /*                                                                          */
  18. /* Note: Rocksoft is a trademark of Rocksoft Pty Ltd, Adelaide, Australia.  */
  19. /*                                                                          */
  20. /****************************************************************************/
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include "crcmodel.h"
  24. /****************************************************************************/
  25. /* TABLE PARAMETERS                                                         */
  26. /* ================                                                         */
  27. /* The following parameters entirely determine the table to be generated.   */
  28. /* You should need to modify only the definitions in this section before    */
  29. /* running this program.                                                    */
  30. /*                                                                          */
  31. /*    TB_FILE  is the name of the output file.                              */
  32. /*    TB_WIDTH is the table width in bytes (either 2 or 4).                 */
  33. /*    TB_POLY  is the "polynomial", which must be TB_WIDTH bytes wide.      */
  34. /*    TB_REVER indicates whether the table is to be reversed (reflected).   */
  35. /*                                                                          */
  36. /* Example:                                                                 */
  37. /*                                                                          */
  38. /*    #define TB_FILE   "crctable.out"                                      */
  39. /*    #define TB_WIDTH  2                                                   */
  40. /*    #define TB_POLY   0x8005L                                             */
  41. /*    #define TB_REVER  TRUE                                                */
  42. #define TB_FILE   "crctable.out"
  43. #define TB_WIDTH  4
  44. #define TB_POLY   0x8001801BL
  45. #define TB_REVER  TRUE
  46. /****************************************************************************/
  47. /* Miscellaneous definitions.                                               */
  48. #define LOCAL static
  49. FILE *outfile;
  50. #define WR(X) fprintf(outfile,(X))
  51. #define WP(X,Y) fprintf(outfile,(X),(Y))
  52. /****************************************************************************/
  53. LOCAL void chk_err P_((char *));
  54. LOCAL void chk_err (mess)
  55. /* If mess is non-empty, write it out and abort. Otherwise, check the error */
  56. /* status of outfile and abort if an error has occurred.                    */
  57. char *mess;
  58. {
  59.  if (mess[0] != 0   ) {printf("%sn",mess); exit(EXIT_FAILURE);}
  60.  if (ferror(outfile)) {perror("chk_err");   exit(EXIT_FAILURE);}
  61. }
  62. /****************************************************************************/
  63. LOCAL void chkparam P_((void));
  64. LOCAL void chkparam ()
  65. {
  66.  if ((TB_WIDTH != 2) && (TB_WIDTH != 4))
  67.     chk_err("chkparam: Width parameter is illegal.");
  68.  if ((TB_WIDTH == 2) && (TB_POLY & 0xFFFF0000L))
  69.     chk_err("chkparam: Poly parameter is too wide.");
  70.  if ((TB_REVER != FALSE) && (TB_REVER != TRUE))
  71.     chk_err("chkparam: Reverse parameter is not boolean.");
  72. }
  73. /****************************************************************************/
  74. LOCAL void gentable P_((void));
  75. LOCAL void gentable ()
  76. {
  77.  WR("/*****************************************************************/n");
  78.  WR("/*                                                               */n");
  79.  WR("/* CRC LOOKUP TABLE                                              */n");
  80.  WR("/* ================                                              */n");
  81.  WR("/* The following CRC lookup table was generated automagically    */n");
  82.  WR("/* by the Rocksoft^tm Model CRC Algorithm Table Generation       */n");
  83.  WR("/* Program V1.0 using the following model parameters:            */n");
  84.  WR("/*                                                               */n");
  85.  WP("/*    Width   : %1lu bytes.                                         */n",
  86.     (ulong) TB_WIDTH);
  87.  if (TB_WIDTH == 2)
  88.  WP("/*    Poly    : 0x%04lX                                           */n",
  89.     (ulong) TB_POLY);
  90.  else
  91.  WP("/*    Poly    : 0x%08lXL                                      */n",
  92.     (ulong) TB_POLY);
  93.  if (TB_REVER)
  94.  WR("/*    Reverse : TRUE.                                            */n");
  95.  else
  96.  WR("/*    Reverse : FALSE.                                           */n");
  97.  WR("/*                                                               */n");
  98.  WR("/* For more information on the Rocksoft^tm Model CRC Algorithm,  */n");
  99.  WR("/* see the document titled "A Painless Guide to CRC Error        */n");
  100.  WR("/* Detection Algorithms" by Ross Williams                        */n");
  101.  WR("/* (ross@guest.adelaide.edu.au.). This document is likely to be  */n");
  102.  WR("/* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft".        */n");
  103.  WR("/*                                                               */n");
  104.  WR("/*****************************************************************/n");
  105.  WR("n");
  106.  switch (TB_WIDTH)
  107.    {
  108.     case 2: WR("unsigned short EDC_crctable[256] =n{n"); break;
  109.     case 4: WR("unsigned long  EDC_crctable[256] =n{n"); break;
  110.     default: chk_err("gentable: TB_WIDTH is invalid.");
  111.    }
  112.  chk_err("");
  113.  {
  114.   int i;
  115.   cm_t cm;
  116.   char *form    = (TB_WIDTH==2) ? "0x%04lX" : "0x%08lXL";
  117.   int   perline = (TB_WIDTH==2) ? 8 : 4;
  118.   cm.cm_width = TB_WIDTH*8;
  119.   cm.cm_poly  = TB_POLY;
  120.   cm.cm_refin = TB_REVER;
  121.   for (i=0; i<256; i++)
  122.     {
  123.      WR(" ");
  124.      WP(form,(ulong) cm_tab(&cm,i));
  125.      if (i != 255) WR(",");
  126.      if (((i+1) % perline) == 0) WR("n");
  127.      chk_err("");
  128.     }
  129.  WR("};n");
  130.  WR("n");
  131.  WR("/*****************************************************************/n");
  132.  WR("/*                   End of CRC Lookup Table                     */n");
  133.  WR("/*****************************************************************/n");
  134.  chk_err("");
  135. }
  136. }
  137. /****************************************************************************/
  138. int main (void)
  139. {
  140.  printf("n");
  141.  printf("Rocksoft^tm Model CRC Algorithm Table Generation Program V1.0n");
  142.  printf("-------------------------------------------------------------n");
  143.  printf("Output file is "%s".n",TB_FILE);
  144.  chkparam();
  145.  outfile = fopen(TB_FILE,"w"); chk_err("");
  146.  gentable();
  147.  if (fclose(outfile) != 0)
  148.     chk_err("main: Couldn't close output file.");
  149.  printf("nSUCCESS: The table has been successfully written.n");
  150.  return 0;
  151. }
  152. /****************************************************************************/
  153. /*                             End of crctable.c                            */
  154. /****************************************************************************/