summaryrefslogtreecommitdiff
path: root/support/dktools/dk3maod8.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/dk3maod8.ctr
Initial commit
Diffstat (limited to 'support/dktools/dk3maod8.ctr')
-rw-r--r--support/dktools/dk3maod8.ctr170
1 files changed, 170 insertions, 0 deletions
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 <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 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;
+}
+