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/dk4numl.ctr | 135 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 support/dktools/dk4numl.ctr (limited to 'support/dktools/dk4numl.ctr') diff --git a/support/dktools/dk4numl.ctr b/support/dktools/dk4numl.ctr new file mode 100644 index 0000000000..5e97883bca --- /dev/null +++ b/support/dktools/dk4numl.ctr @@ -0,0 +1,135 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2015-xxxx +license = bsd + + + +%% header + +/** @file + Text representation length for numbers. + When showing information in a table one needs to know the length + of each field. + This module provides the dk4numlength() funtion to find the string + length needed for an integer value of a given size (number of bytes). + + CRT on Windows: Not used. +*/ + +#ifndef DK4CONF_H_INCLUDED +#include "dk4conf.h" +#endif + +#ifndef DK4TYPES_H_INCLUDED +#include "dk4types.h" +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +/** Find number of digits for data type. + @param isz Integer data type size in bytes. + @param sgn Flag: Signed data type (0=unsigned, other=signed). + @return Maximum string length used when data is shown as text. +*/ +size_t +dk4numlength(size_t isz, int sgn); + +#ifdef __cplusplus +} +#endif + +%% module + +#include "dk4conf.h" +#include "dk4error.h" +#include "dk4numl.h" +#include "dk4maadu.h" + +size_t +dk4numlength(size_t isz, int sgn) +{ + dk4_er_t er; + dk4_um_t co; + size_t back = 0; + if (1 < isz) { + if (2 < isz) { + if (4 < isz) { + if (8 < isz) { + if (16 < isz) { +#if VERSION_BEFORE_20141122 + if (0 != (isz % 2)) { isz++; } + back = 5 * (isz / 2); + if (0 != sgn) { back++; } +#else + dk4error_init(&er); + if (0 != sgn) { + co = dk4ma_um_mul( + (dk4_um_t)30104UL, + dk4ma_um_sub( + dk4ma_um_mul((dk4_um_t)8UL, (dk4_um_t)isz, &er), + (dk4_um_t)1UL, + &er + ), + &er + ); + if ((dk4_um_t)0UL != (co % (dk4_um_t)100000UL)) { + co = co / (dk4_um_t)100000UL; + co++; + } else { + co = co / (dk4_um_t)100000UL; + } + co++; + if ((dk4_um_t)(SIZE_MAX) >= co) { + back = (size_t)co; + } else { + back = (size_t)co; + er.ec = DK4_E_MATH_OVERFLOW; + } + } else { + co = dk4ma_um_mul( + (dk4_um_t)30104UL, + dk4ma_um_mul((dk4_um_t)8UL, (dk4_um_t)isz, &er), + &er + ); + if ((dk4_um_t)0UL != (co % (dk4_um_t)100000UL)) { + co = co / (dk4_um_t)100000UL; + co++; + } else { + co = co / (dk4_um_t)100000UL; + } + if ((dk4_um_t)(SIZE_MAX) >= co) { + back = (size_t)co; + } else { + back = (size_t)co; + er.ec = DK4_E_MATH_OVERFLOW; + } + } + if (DK4_E_NONE != er.ec) { + if (0 != (isz % 2)) { isz++; } + back = 5 * (isz / 2); + if (0 != sgn) { back++; } + } +#endif + } else { + back = ((0 != sgn) ? 41 : 40); + } + } else { + back = ((0 != sgn) ? 21 : 20); + } + } else { + back = ((0 != sgn) ? 11 : 10); + } + } else { + back = ((0 != sgn) ? 6 : 5); + } + } else { + back = ((0 != sgn) ? 4 : 3); + } + return back; +} + -- cgit v1.2.3