From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- support/dktools/dk3maohd.ctr | 195 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 support/dktools/dk3maohd.ctr (limited to 'support/dktools/dk3maohd.ctr') diff --git a/support/dktools/dk3maohd.ctr b/support/dktools/dk3maohd.ctr new file mode 100644 index 0000000000..cb87f0fc4e --- /dev/null +++ b/support/dktools/dk3maohd.ctr @@ -0,0 +1,195 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2014-xxxx +license = bsd + + + +%% header + +/** @file dk3maohd.h Write numbers to hexadecimal dkChar strings. +*/ + +#include + +#include +#if DK3_HAVE_SYS_TYPES_H +#include +#endif +#if DK3_HAVE_STDINT +#include +#endif +#if DK3_HAVE_INTTYPES_H +#include +#endif +#if DK3_HAVE_LIMITS_H +#include +#endif +#if DK3_HAVE_MATH_H +#include +#endif +#if DK3_HAVE_FLOAT_H +#include +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Convert largest size unsigned integer to hexadecimal string. + @param rb Result buffer. + @param sz Result buffer size (number of bytes). + @param va Value to convert. + @param leftpad Padding-Length: 0 for no padding, 1 for automatic + detection of size, other values are specified directly. + @return 1 on success, 0 on error. +*/ +int +dk3ma_um_to_hex_string(dkChar *rb, size_t sz, dk3_um_t va, size_t leftpad); + +/** Convert largest size unsigned integer to hexadecimal string. + @param rb Result buffer. + @param sz Result buffer size (number of bytes). + @param va Value to convert. + @param leftpad Padding-Length: 0 for no padding, 1 for automatic + detection of size, other values are specified directly. + @return 1 on success, 0 on error. +*/ +int +dk3ma_im_to_hex_string(dkChar *rb, size_t sz, dk3_im_t va, size_t leftpad); + +#ifdef __cplusplus +} +#endif + +%% module + +#include "dk3ma.h" + + + +$!trace-include + + + +/** Size correction for alignment. +*/ +#define DK3MAOHD_ALIGN(sz,al) \ +((0 == (sz % al)) ? (sz) : (((sz / al) + 1) * al)) + + + +int +dk3ma_um_to_hex_string(dkChar *rb, size_t sz, dk3_um_t va, size_t leftpad) +{ +#if DK3_CHAR_SIZE > 1 + char buf[DK3MAOHD_ALIGN((8*DK3_SIZEOF_UM),16)]; + char *ptr; + dk3_um_t x; + size_t szmax = sizeof(buf); + size_t szused = 0; + size_t i; + int back = 1; + char c; + + if ((NULL != rb) && (0 < sz)) { + rb[0] = dkT('\0'); + ptr = buf; + if (2 <= szmax) { + do { + x = va % 16; + va = va / 16; + c = '\0'; + switch((int)x) { + case 0: { c = '0'; } break; + case 1: { c = '1'; } break; + case 2: { c = '2'; } break; + case 3: { c = '3'; } break; + case 4: { c = '4'; } break; + case 5: { c = '5'; } break; + case 6: { c = '6'; } break; + case 7: { c = '7'; } break; + case 8: { c = '8'; } break; + case 9: { c = '9'; } break; + case 10: { c = 'A'; } break; + case 11: { c = 'B'; } break; + case 12: { c = 'C'; } break; + case 13: { c = 'D'; } break; + case 14: { c = 'E'; } break; + case 15: { c = 'F'; } break; + } + if (szused < szmax) { + *(ptr++) = c; + szused++; + } else { + back = 0; + } + } while((DK3_UM_0 != va) && (szused < szmax) && (1 == back)); + if (szused < szmax) { + buf[szused] = '\0'; + } else { + back = 0; + buf[szmax - 1] = '\0'; + } + if (1 == back) { + if (szused < sz) { +#if VERSION_BEFORE_20141005 + if ((0 != leftpad) && ((2 * DK3_SIZEOF_UM) < sz)) { + for (i = 0; i < (2 * DK3_SIZEOF_UM); i++) { + rb[i] = dkT('0'); + } + rb[2 * DK3_SIZEOF_UM] = dkT('\0'); + for (i = 0; i < szused; i++) { + rb[(2 * DK3_SIZEOF_UM) - 1 - i] = (dkChar)(buf[i]); + } + } else { + for (i = 0; i < szused; i++) { + rb[i] = (dkChar)(buf[szused - i - 1]); + } + rb[szused] = dkT('\0'); + } +#else + if (1 == leftpad) { leftpad = 2 * DK3_SIZEOF_UM; } + if (0 != leftpad) { + if ((szused <= leftpad) && (leftpad < sz)) { + for (i = 0; i < leftpad; i++) { + rb[i] = dkT('0'); + } + rb[leftpad] = dkT('\0'); + for (i = 0; i < szused; i++) { + rb[leftpad - 1 - i] = (dkChar)(buf[i]); + } + } else { + back = 0; + } + } else { + for (i = 0; i < szused; i++) { + rb[i] = (dkChar)(buf[szused - i - 1]); + } + rb[szused] = dkT('\0'); + } +#endif + } else { + back = 0; + } + } + } + } + return back; +#else + return (dk3ma_um_to_c8_hex_string(rb, sz, va, leftpad)); +#endif +} + + + +int +dk3ma_im_to_hex_string(dkChar *rb, size_t sz, dk3_im_t va, size_t leftpad) +{ + return (dk3ma_um_to_hex_string(rb, sz, (dk3_um_t)va, leftpad)); +} + + -- cgit v1.2.3