diff options
author | 2015-11-08 12:56:12 +0100 | |
---|---|---|
committer | 2015-11-08 12:56:12 +0100 | |
commit | 7c19aac60e12d6f5ea301bdb34d7826a01e0b06f (patch) | |
tree | f310d86aa2c6bfc19d115307dedde4eb0cd52dad /src/lib/util/coreutil.cpp | |
parent | a57b46ae933badd7441ce1644711dbb851e2b504 (diff) |
Rename *.c -> *.cpp in our source (nw)
Diffstat (limited to 'src/lib/util/coreutil.cpp')
-rw-r--r-- | src/lib/util/coreutil.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/lib/util/coreutil.cpp b/src/lib/util/coreutil.cpp new file mode 100644 index 00000000000..90bcab9ab1a --- /dev/null +++ b/src/lib/util/coreutil.cpp @@ -0,0 +1,124 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + coreutil.c + + Miscellaneous utility code + +***************************************************************************/ + +#include "coreutil.h" +#include <assert.h> +#include <zlib.h> + + +/*************************************************************************** + BINARY CODED DECIMAL HELPERS +***************************************************************************/ + +int bcd_adjust(int value) +{ + if ((value & 0xf) >= 0xa) + value = value + 0x10 - 0xa; + if ((value & 0xf0) >= 0xa0) + value = value - 0xa0 + 0x100; + return value; +} + + +UINT32 dec_2_bcd(UINT32 a) +{ + UINT32 result = 0; + int shift = 0; + + while (a != 0) + { + result |= (a % 10) << shift; + a /= 10; + shift += 4; + } + return result; +} + + +UINT32 bcd_2_dec(UINT32 a) +{ + UINT32 result = 0; + UINT32 scale = 1; + + while (a != 0) + { + result += (a & 0x0f) * scale; + a >>= 4; + scale *= 10; + } + return result; +} + + + +/*************************************************************************** + GREGORIAN CALENDAR HELPERS +***************************************************************************/ + +int gregorian_is_leap_year(int year) +{ + return !((year % 100) ? (year % 4) : (year % 400)); +} + + +/* months are one counted */ + +/** + * @fn int gregorian_days_in_month(int month, int year) + * + * @brief Gregorian days in month. + * + * @param month The month. + * @param year The year. + * + * @return An int. + */ + +int gregorian_days_in_month(int month, int year) +{ + assert(month >= 1 && month <= 12); + + int days[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; + days[1] += gregorian_is_leap_year(year) ? 1 : 0; + return days[month-1]; +} + + +/*************************************************************************** + MISC +***************************************************************************/ + +/** + * @fn void rand_memory(void *memory, size_t length) + * + * @brief Random memory. + * + * @param [in,out] memory If non-null, the memory. + * @param length The length. + */ + +void rand_memory(void *memory, size_t length) +{ + static UINT32 seed = 0; + UINT8 *bytes = (UINT8 *) memory; + size_t i; + + for (i = 0; i < length; i++) + { + seed = seed * 214013 + 2531011; + bytes[i] = (UINT8) (seed >> 16); + } +} + + +UINT32 core_crc32(UINT32 crc, const UINT8 *buf, UINT32 len) +{ + return crc32(crc, buf, len); +} |