summaryrefslogtreecommitdiff
path: root/support/dktools/dk3maohd.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk3maohd.ctr
Initial commit
Diffstat (limited to 'support/dktools/dk3maohd.ctr')
-rw-r--r--support/dktools/dk3maohd.ctr195
1 files changed, 195 insertions, 0 deletions
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 <dk3conf.h>
+
+#include <stdio.h>
+#if DK3_HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if DK3_HAVE_STDINT
+#include <stdint.h>
+#endif
+#if DK3_HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+#if DK3_HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#if DK3_HAVE_MATH_H
+#include <math.h>
+#endif
+#if DK3_HAVE_FLOAT_H
+#include <float.h>
+#endif
+
+#include <dk3types.h>
+
+#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));
+}
+
+