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/dk3maod8.ctr | 170 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 support/dktools/dk3maod8.ctr (limited to 'support/dktools/dk3maod8.ctr') diff --git a/support/dktools/dk3maod8.ctr b/support/dktools/dk3maod8.ctr new file mode 100644 index 0000000000..188845e042 --- /dev/null +++ b/support/dktools/dk3maod8.ctr @@ -0,0 +1,170 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2014-xxxx +license = bsd + + + +%% header + +/** @file dk3maod8.h Write numbers to decimal char 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 integer to string. + @param rb Result buffer. + @param sz Result buffer size (number of bytes). + @param va Value to convert. + @return 1 on success, 0 on error. +*/ +int +dk3ma_im_to_c8_string(char *rb, size_t sz, dk3_im_t va); + +/** Convert largest size unsigned integer to string. + @param rb Result buffer. + @param sz Result buffer size (number of bytes). + @param va Value to convert. + @return 1 on success, 0 on error. +*/ +int +dk3ma_um_to_c8_string(char *rb, size_t sz, dk3_um_t va); + +#ifdef __cplusplus +} +#endif + +%% module + +#include "dk3ma.h" + + + +$!trace-include + + + +/** Size correction for alignment. +*/ +#define DK3MAOD8_ALIGN(sz,al) \ +((0 == (sz % al)) ? (sz) : (((sz / al) + 1) * al)) + + +int +dk3ma_um_to_c8_string(char *rb, size_t sz, dk3_um_t va) +{ + char buf[DK3MAOD8_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] = '\0'; + ptr = buf; + if (2 <= szmax) { + do { + x = va % 10; + va = va / 10; + 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; + } + 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) { + for (i = 0; i < szused; i++) { + rb[i] = buf[szused - i - 1]; + } + rb[szused] = '\0'; + } else { + back = 0; + } + } + } + } + return back; +} + + + +int +dk3ma_im_to_c8_string(char *rb, size_t sz, dk3_im_t va) +{ + char *orb; + dk3_um_t umva; + int back = 0; + if ((NULL != rb) && (0 < sz)) { + orb = rb; + rb[0] = '\0'; + if (2 < sz) { + if (DK3_IM_0 > va) { + *(rb++) = '-'; + sz--; + if (DK3_IM_MIN == va) { + umva = (dk3_um_t)DK3_IM_MAX; + umva++; + } else { + umva = (dk3_um_t)(DK3_IM_0 - va); + } + } else { + umva = (dk3_um_t)va; + } + back = dk3ma_um_to_c8_string(rb, sz, umva); + } + if (0 == back) { *orb = '\0'; } + } + return back; +} + -- cgit v1.2.3