cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

SDL_test_crc32.c (3488B)


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