src/test/SDL_test_crc32.c
author Sam Lantinga <slouken@libsdl.org>
Fri, 15 Feb 2013 08:47:44 -0800
changeset 6885 700f1b25f77f
parent 6713 fa17a97389ed
child 7191 75360622e65f
permissions -rw-r--r--
Happy New Year!
aschiffler@6713
     1
/*
aschiffler@6713
     2
  Simple DirectMedia Layer
slouken@6885
     3
  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
aschiffler@6713
     4
aschiffler@6713
     5
  This software is provided 'as-is', without any express or implied
aschiffler@6713
     6
  warranty.  In no event will the authors be held liable for any damages
aschiffler@6713
     7
  arising from the use of this software.
aschiffler@6713
     8
aschiffler@6713
     9
  Permission is granted to anyone to use this software for any purpose,
aschiffler@6713
    10
  including commercial applications, and to alter it and redistribute it
aschiffler@6713
    11
  freely, subject to the following restrictions:
aschiffler@6713
    12
aschiffler@6713
    13
  1. The origin of this software must not be misrepresented; you must not
aschiffler@6713
    14
     claim that you wrote the original software. If you use this software
aschiffler@6713
    15
     in a product, an acknowledgment in the product documentation would be
aschiffler@6713
    16
     appreciated but is not required.
aschiffler@6713
    17
  2. Altered source versions must be plainly marked as such, and must not be
aschiffler@6713
    18
     misrepresented as being the original software.
aschiffler@6713
    19
  3. This notice may not be removed or altered from any source distribution.
aschiffler@6713
    20
*/
aschiffler@6713
    21
aschiffler@6713
    22
/*
aschiffler@6713
    23
aschiffler@6713
    24
 Used by the test execution component. 
aschiffler@6713
    25
 Original source code contributed by A. Schiffler for GSOC project.
aschiffler@6713
    26
aschiffler@6713
    27
*/
aschiffler@6713
    28
aschiffler@6713
    29
#include "SDL_config.h"
aschiffler@6713
    30
aschiffler@6713
    31
#include "SDL_test.h"
aschiffler@6713
    32
aschiffler@6713
    33
aschiffler@6713
    34
int SDLTest_Crc32Init(SDLTest_Crc32Context *crcContext)
aschiffler@6713
    35
{
aschiffler@6713
    36
  int i,j;
aschiffler@6713
    37
  CrcUint32 c;
aschiffler@6713
    38
aschiffler@6713
    39
  /* Sanity check context pointer */
aschiffler@6713
    40
  if (crcContext==NULL) {
aschiffler@6713
    41
   return -1;
aschiffler@6713
    42
  }  
aschiffler@6713
    43
 
aschiffler@6713
    44
  /*
aschiffler@6713
    45
   * Build auxiliary table for parallel byte-at-a-time CRC-32 
aschiffler@6713
    46
   */
aschiffler@6713
    47
#ifdef ORIGINAL_METHOD
aschiffler@6713
    48
  for (i = 0; i < 256; ++i) {
aschiffler@6713
    49
    for (c = i << 24, j = 8; j > 0; --j) {
aschiffler@6713
    50
      c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1);
aschiffler@6713
    51
    }
aschiffler@6713
    52
    crcContext->crc32_table[i] = c;
aschiffler@6713
    53
  }
aschiffler@6713
    54
#else
aschiffler@6713
    55
  for (i=0; i<256; i++) {
aschiffler@6713
    56
   c = i;
aschiffler@6713
    57
   for (j=8; j>0; j--) {
aschiffler@6713
    58
    if (c & 1) {
aschiffler@6713
    59
     c = (c >> 1) ^ CRC32_POLY;
aschiffler@6713
    60
    } else {
aschiffler@6713
    61
     c >>= 1;
aschiffler@6713
    62
    }
aschiffler@6713
    63
   }
aschiffler@6713
    64
   crcContext->crc32_table[i] = c;
aschiffler@6713
    65
  }
aschiffler@6713
    66
#endif
aschiffler@6713
    67
  
aschiffler@6713
    68
  return 0;
aschiffler@6713
    69
}
aschiffler@6713
    70
aschiffler@6713
    71
/* Complete CRC32 calculation on a memory block */
aschiffler@6713
    72
aschiffler@6713
    73
int SDLTest_Crc32Calc(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32)
aschiffler@6713
    74
{
aschiffler@6713
    75
  if (SDLTest_Crc32CalcStart(crcContext,crc32)) {
aschiffler@6713
    76
   return -1;
aschiffler@6713
    77
  }
aschiffler@6713
    78
  
aschiffler@6713
    79
  if (SDLTest_Crc32CalcBuffer(crcContext, inBuf, inLen, crc32)) {
aschiffler@6713
    80
   return -1;
aschiffler@6713
    81
  }
aschiffler@6713
    82
  
aschiffler@6713
    83
  if (SDLTest_Crc32CalcEnd(crcContext, crc32)) {
aschiffler@6713
    84
   return -1;
aschiffler@6713
    85
  }
aschiffler@6713
    86
   
aschiffler@6713
    87
  return 0;
aschiffler@6713
    88
}
aschiffler@6713
    89
aschiffler@6713
    90
/* Start crc calculation */
aschiffler@6713
    91
aschiffler@6713
    92
int SDLTest_Crc32CalcStart(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32)
aschiffler@6713
    93
{
aschiffler@6713
    94
  /* Sanity check pointers */
aschiffler@6713
    95
  if (crcContext==NULL) {
aschiffler@6713
    96
   *crc32=0;
aschiffler@6713
    97
   return -1;
aschiffler@6713
    98
  }  
aschiffler@6713
    99
aschiffler@6713
   100
  /*
aschiffler@6713
   101
   * Preload shift register, per CRC-32 spec 
aschiffler@6713
   102
   */
aschiffler@6713
   103
  *crc32 = 0xffffffff;
aschiffler@6713
   104
aschiffler@6713
   105
  return 0;
aschiffler@6713
   106
}
aschiffler@6713
   107
aschiffler@6713
   108
/* Finish crc calculation */
aschiffler@6713
   109
aschiffler@6713
   110
int SDLTest_Crc32CalcEnd(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32)
aschiffler@6713
   111
{
aschiffler@6713
   112
  /* Sanity check pointers */
aschiffler@6713
   113
  if (crcContext==NULL) {
aschiffler@6713
   114
   *crc32=0;
aschiffler@6713
   115
   return -1;
aschiffler@6713
   116
  }  
aschiffler@6713
   117
  
aschiffler@6713
   118
  /*
aschiffler@6713
   119
   * Return complement, per CRC-32 spec 
aschiffler@6713
   120
   */
aschiffler@6713
   121
  *crc32 = (~(*crc32));
aschiffler@6713
   122
aschiffler@6713
   123
  return 0;
aschiffler@6713
   124
}
aschiffler@6713
   125
aschiffler@6713
   126
/* Include memory block in crc */
aschiffler@6713
   127
aschiffler@6713
   128
int SDLTest_Crc32CalcBuffer(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32)
aschiffler@6713
   129
{
aschiffler@6713
   130
  CrcUint8    *p;
aschiffler@6713
   131
  register CrcUint32    crc;
aschiffler@6713
   132
aschiffler@6713
   133
  if (crcContext==NULL) {
aschiffler@6713
   134
   *crc32=0;
aschiffler@6713
   135
   return -1;
aschiffler@6713
   136
  }
aschiffler@6713
   137
  
aschiffler@6713
   138
  if (inBuf==NULL) {
aschiffler@6713
   139
   return -1;
aschiffler@6713
   140
  }
aschiffler@6713
   141
aschiffler@6713
   142
  /*
aschiffler@6713
   143
   * Calculate CRC from data 
aschiffler@6713
   144
   */
aschiffler@6713
   145
  crc = *crc32;
aschiffler@6713
   146
  for (p = inBuf; inLen > 0; ++p, --inLen) {
aschiffler@6713
   147
#ifdef ORIGINAL_METHOD  
aschiffler@6713
   148
    crc = (crc << 8) ^ crcContext->crc32_table[(crc >> 24) ^ *p];
aschiffler@6713
   149
#else
aschiffler@6713
   150
    crc = ((crc >> 8) & 0x00FFFFFF) ^ crcContext->crc32_table[ (crc ^ *p) & 0xFF ];
aschiffler@6713
   151
#endif         
aschiffler@6713
   152
  }  
aschiffler@6713
   153
  *crc32 = crc;
aschiffler@6713
   154
  
aschiffler@6713
   155
  return 0;
aschiffler@6713
   156
}
aschiffler@6713
   157
aschiffler@6713
   158
int SDLTest_Crc32Done(SDLTest_Crc32Context * crcContext)
aschiffler@6713
   159
{
aschiffler@6713
   160
  if (crcContext==NULL) {
aschiffler@6713
   161
     return -1;
aschiffler@6713
   162
  }  
aschiffler@6713
   163
aschiffler@6713
   164
  return 0;
aschiffler@6713
   165
}