Implemented self-test.

This commit is contained in:
LoRd_MuldeR 2022-09-14 00:49:38 +02:00
parent 9937ad3cba
commit 92cc30b6be
2 changed files with 67 additions and 3 deletions

View File

@ -20,6 +20,7 @@ Options:
--no-flush Do *not* flush the standard output stream after each file --no-flush Do *not* flush the standard output stream after each file
--init-with-zero Initialize CRC with zero (default is 0xFFF...FFF) --init-with-zero Initialize CRC with zero (default is 0xFFF...FFF)
--negate-final Negate the final CRC result --negate-final Negate the final CRC result
--self-test Run integreated self-test and exit program
``` ```
One output line is generated per input file: One output line is generated per input file:

69
crc64.c
View File

@ -32,8 +32,9 @@ static const int VERSION_PATCH = 2;
#define OPT_IGNERR 0x020 #define OPT_IGNERR 0x020
#define OPT_SILENT 0x040 #define OPT_SILENT 0x040
#define OPT_NOFLSH 0x080 #define OPT_NOFLSH 0x080
#define OPT_NEGATE 0x100 #define OPT_ZEROIN 0x100
#define OPT_ZEROIN 0x200 #define OPT_NEGATE 0x200
#define OPT_SLFTST 0x400
/* ======================================================================== */ /* ======================================================================== */
/* Compiler */ /* Compiler */
@ -351,6 +352,56 @@ clean_up:
return retval; return retval;
} }
/* ======================================================================== */
/* Self-test */
/* ======================================================================== */
static const struct
{
uint64_t expected;
size_t iterations;
const char *input;
}
TEST_VECTOR[] =
{
{ 0xffffffffffffffffULL, 0x0000001, "" },
{ 0xfb747ec5060b68fdULL, 0x0000001, "abc" },
{ 0xe48092e3bf0112faULL, 0x0000001, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
{ 0x763e5273763ec641ULL, 0x0000001, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
{ 0x80459bd12d319927ULL, 0x00F4240, "a" },
{ 0x5343b9581532ecbdULL, 0x1000000, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno" },
{ 0x0000000000000000ULL, 0x0000000, NULL }
};
static int self_test(void)
{
uint64_t crc;
size_t len, i, j;
for (i = 0U; TEST_VECTOR[i].input; ++i)
{
len = strlen(TEST_VECTOR[i].input);
crc = CRC64_INITIALIZER;
for (j = 0U; j < TEST_VECTOR[i].iterations; ++j)
{
crc = crc64_update(crc, (const uint8_t*)TEST_VECTOR[i].input, len);
}
if (crc == TEST_VECTOR[i].expected)
{
FPRINTF(stderr, T("%016") T(PRIx64) T(" [OK]\n"), crc);
fflush(stderr);
}
else
{
FPRINTF(stderr, T("%016") T(PRIx64) T(" [Failed!]\n"), crc);
return EXIT_FAILURE;
}
}
FPUTS(T("All tests completed successfully.\n"), stderr);
return EXIT_SUCCESS;
}
/* ======================================================================== */ /* ======================================================================== */
/* MAIN */ /* MAIN */
/* ======================================================================== */ /* ======================================================================== */
@ -417,6 +468,10 @@ int MAIN(int argc, CHAR *argv[])
{ {
options |= OPT_NEGATE; options |= OPT_NEGATE;
} }
else if (!STRCASECMP(arg_val, T("self-test")))
{
options |= OPT_SLFTST;
}
else else
{ {
FPRINTF(stderr, T("Error: Option \"--%s\" is not recognized!\n"), arg_val); FPRINTF(stderr, T("Error: Option \"--%s\" is not recognized!\n"), arg_val);
@ -450,10 +505,18 @@ int MAIN(int argc, CHAR *argv[])
FPUTS(T(" --ignore-errors Ignore I/O errors and proceeed with the next file\n"), stderr); FPUTS(T(" --ignore-errors Ignore I/O errors and proceeed with the next file\n"), stderr);
FPUTS(T(" --no-flush Do *not* flush the standard output stream after each file\n"), stderr); FPUTS(T(" --no-flush Do *not* flush the standard output stream after each file\n"), stderr);
FPUTS(T(" --init-with-zero Initialize CRC with zero (default is 0xFFF...FFF)\n"), stderr); FPUTS(T(" --init-with-zero Initialize CRC with zero (default is 0xFFF...FFF)\n"), stderr);
FPUTS(T(" --negate-final Negate the final CRC result\n\n"), stderr); FPUTS(T(" --negate-final Negate the final CRC result\n"), stderr);
FPUTS(T(" --self-test Run integreated self-test and exit program\n\n"), stderr);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
if (options & OPT_SLFTST)
{
FPUTS(T("Running CRC-64 self-test, please wait...\n"), stderr);
fflush(stderr);
return self_test();
}
#ifdef _WIN32 #ifdef _WIN32
_setmode(_fileno(stdout), (options & OPT_BINARY) ? _O_BINARY : _O_U8TEXT); _setmode(_fileno(stdout), (options & OPT_BINARY) ? _O_BINARY : _O_U8TEXT);
#endif #endif