src/test/SDL_test_crc32.c
author Ryan C. Gordon
Thu, 23 Feb 2017 22:38:04 -0500
changeset 10907 e64cf9261cc7
parent 10737 3406a0f8b041
child 11465 9843b1895c45
permissions -rw-r--r--
cmake: add WASAPI audio target to the build (thanks, Martin!).

Fixes Bugzilla #3588.
aschiffler@6713
     1
/*
aschiffler@6713
     2
  Simple DirectMedia Layer
slouken@10737
     3
  Copyright (C) 1997-2017 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
slouken@7191
    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;
slouken@7191
    42
  }
slouken@7191
    43
aschiffler@6713
    44
  /*
slouken@7191
    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
slouken@7191
    67
aschiffler@6713
    68
  return 0;
aschiffler@6713
    69
}
aschiffler@6713
    70
aschiffler@6713
    71
/* Complete CRC32 calculation on a memory block */
slouken@10609
    72
/* un-used
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
  }
slouken@7191
    78
aschiffler@6713
    79
  if (SDLTest_Crc32CalcBuffer(crcContext, inBuf, inLen, crc32)) {
aschiffler@6713
    80
   return -1;
aschiffler@6713
    81
  }
slouken@7191
    82
aschiffler@6713
    83
  if (SDLTest_Crc32CalcEnd(crcContext, crc32)) {
aschiffler@6713
    84
   return -1;
aschiffler@6713
    85
  }
slouken@7191
    86
aschiffler@6713
    87
  return 0;
aschiffler@6713
    88
}
slouken@10609
    89
*/
aschiffler@6713
    90
aschiffler@6713
    91
/* Start crc calculation */
aschiffler@6713
    92
aschiffler@6713
    93
int SDLTest_Crc32CalcStart(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32)
aschiffler@6713
    94
{
aschiffler@6713
    95
  /* Sanity check pointers */
aschiffler@6713
    96
  if (crcContext==NULL) {
aschiffler@6713
    97
   *crc32=0;
aschiffler@6713
    98
   return -1;
slouken@7191
    99
  }
aschiffler@6713
   100
aschiffler@6713
   101
  /*
slouken@7191
   102
   * Preload shift register, per CRC-32 spec
aschiffler@6713
   103
   */
aschiffler@6713
   104
  *crc32 = 0xffffffff;
aschiffler@6713
   105
aschiffler@6713
   106
  return 0;
aschiffler@6713
   107
}
aschiffler@6713
   108
aschiffler@6713
   109
/* Finish crc calculation */
aschiffler@6713
   110
aschiffler@6713
   111
int SDLTest_Crc32CalcEnd(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32)
aschiffler@6713
   112
{
aschiffler@6713
   113
  /* Sanity check pointers */
aschiffler@6713
   114
  if (crcContext==NULL) {
aschiffler@6713
   115
   *crc32=0;
aschiffler@6713
   116
   return -1;
slouken@7191
   117
  }
slouken@7191
   118
aschiffler@6713
   119
  /*
slouken@7191
   120
   * Return complement, per CRC-32 spec
aschiffler@6713
   121
   */
aschiffler@6713
   122
  *crc32 = (~(*crc32));
aschiffler@6713
   123
aschiffler@6713
   124
  return 0;
aschiffler@6713
   125
}
aschiffler@6713
   126
aschiffler@6713
   127
/* Include memory block in crc */
aschiffler@6713
   128
aschiffler@6713
   129
int SDLTest_Crc32CalcBuffer(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32)
aschiffler@6713
   130
{
aschiffler@6713
   131
  CrcUint8    *p;
aschiffler@6713
   132
  register CrcUint32    crc;
aschiffler@6713
   133
aschiffler@6713
   134
  if (crcContext==NULL) {
aschiffler@6713
   135
   *crc32=0;
aschiffler@6713
   136
   return -1;
aschiffler@6713
   137
  }
slouken@7191
   138
aschiffler@6713
   139
  if (inBuf==NULL) {
aschiffler@6713
   140
   return -1;
aschiffler@6713
   141
  }
aschiffler@6713
   142
aschiffler@6713
   143
  /*
slouken@7191
   144
   * Calculate CRC from data
aschiffler@6713
   145
   */
aschiffler@6713
   146
  crc = *crc32;
aschiffler@6713
   147
  for (p = inBuf; inLen > 0; ++p, --inLen) {
slouken@7191
   148
#ifdef ORIGINAL_METHOD
aschiffler@6713
   149
    crc = (crc << 8) ^ crcContext->crc32_table[(crc >> 24) ^ *p];
aschiffler@6713
   150
#else
aschiffler@6713
   151
    crc = ((crc >> 8) & 0x00FFFFFF) ^ crcContext->crc32_table[ (crc ^ *p) & 0xFF ];
slouken@7191
   152
#endif
slouken@7191
   153
  }
aschiffler@6713
   154
  *crc32 = crc;
slouken@7191
   155
aschiffler@6713
   156
  return 0;
aschiffler@6713
   157
}
aschiffler@6713
   158
aschiffler@6713
   159
int SDLTest_Crc32Done(SDLTest_Crc32Context * crcContext)
aschiffler@6713
   160
{
aschiffler@6713
   161
  if (crcContext==NULL) {
aschiffler@6713
   162
     return -1;
slouken@7191
   163
  }
aschiffler@6713
   164
aschiffler@6713
   165
  return 0;
aschiffler@6713
   166
}