diff options
author | Norbert Preining <norbert@preining.info> | 2020-09-20 03:03:26 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-09-20 03:03:26 +0000 |
commit | 1f457376b478257b88d4a857f5ec1b6155442dd7 (patch) | |
tree | 2a06a60551dea362cf8cb0cb0ba66c78608717c4 /support/dktools/dk4maiwdsz.ctr | |
parent | ac690ca29ad5bf8a5203a65fd6252f7b564f4727 (diff) |
CTAN sync 202009200303
Diffstat (limited to 'support/dktools/dk4maiwdsz.ctr')
-rw-r--r-- | support/dktools/dk4maiwdsz.ctr | 160 |
1 files changed, 125 insertions, 35 deletions
diff --git a/support/dktools/dk4maiwdsz.ctr b/support/dktools/dk4maiwdsz.ctr index 5a70963f03..4574c912d2 100644 --- a/support/dktools/dk4maiwdsz.ctr +++ b/support/dktools/dk4maiwdsz.ctr @@ -2,7 +2,7 @@ copyright owner = Dirk Krause copyright year = 2015-xxxx -license = bsd +SPDX-License-Identifier: BSD-3-Clause @@ -14,15 +14,27 @@ license = bsd */ #ifndef DK4CONF_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 #include "dk4conf.h" +#else +#include <dktools-4/dk4conf.h> +#endif #endif #ifndef DK4TYPES_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 #include "dk4types.h" +#else +#include <dktools-4/dk4types.h> +#endif #endif #ifndef DK4ERROR_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 #include "dk4error.h" +#else +#include <dktools-4/dk4error.h> +#endif #endif @@ -34,6 +46,13 @@ extern "C" { /** Retrieve numeric value from string, decimal notation. @param rp Pointer to result variable for the found value. @param src String to check for numeric value. + In addition to the numeric value the string can + contain a suffix 'K', 'M', 'G', 'T', 'P', 'E', + 'Z' or 'Y' to indicate multiples of powers of 1024 + (kibibytes, mibibytes...). + Suffixes 'k', 'm', 'g', 't', 'p', 'e', 'z' or 'y' + indicate multiples of powers of 1000 + (kilobytes, megabytes...). @param endptr Address of pointer variable. A pointer to the first character not processed is stored here. @@ -53,6 +72,7 @@ extern "C" { DK4_E_MATH_OVERFLOW if the number is out of range, or DK4_E_SYNTAX if src contains illegal characters. */ + int dk4ma_input_wc_dec_size_t( size_t *rp, @@ -62,43 +82,61 @@ dk4ma_input_wc_dec_size_t( dk4_er_t *erp ); -#ifdef __cplusplus -} -#endif - -%% module - -#include "dk4maiwddu.h" -#include "dk4maiwdui.h" -#include "dk4numco.h" -#include "dk4strw.h" - +/** Retrieve numeric value from string, decimal notation. + @param rp Pointer to result variable for the found value. + @param src String to check for numeric value. + No suffixes allowed. + @param endptr Address of pointer variable. + A pointer to the first character not processed + is stored here. + The function may also store a NULL pointer in this + variable. + The variable points to the correct error position + only if er.ec is DK4_E_SYNTAX. + @param atg Allow trailing garbage: + 0=no unprocessable trailing bytes allowed, + 1=trailing whitespaces allowed, + 2=any trailing characters allowed. + @param erp Error report, may be NULL. + @return 1 on success, 0 on error. + + Error codes: + DK4_E_INVALID_ARGUMENTS if rp or src is NULL, + DK4_E_MATH_OVERFLOW if the number is out of range, or + DK4_E_SYNTAX if src contains illegal characters. +*/ -#if 0 int -dk4ma_input_wc_dec_size_t( +dk4ma_input_wc_dec_size_t_simple( size_t *rp, const wchar_t *src, const wchar_t **endptr, int atg, dk4_er_t *erp -) -{ - dk4_um_t res; - int back = 0; - if (0 != dk4ma_input_wc_dec_dk4_um_t(&res, src, endptr, atg, erp)) { - if (((dk4_um_t)(SIZE_MAX)) >= res) { - *rp = (size_t)res; - back = 1; - } else { - dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); - } - } - return back; +); + +#ifdef __cplusplus } #endif +%% module + +#include "dk4conf.h" + +#if DK4_HAVE_ASSERT_H +#ifndef ASSERT_H_INCLUDED +#include <assert.h> +#define ASSERT_H_INCLUDED 1 +#endif +#endif + +#include "dk4maiwddu.h" +#include "dk4maiwdui.h" +#include "dk4maiwdsz.h" +#include "dk4numco.h" +#include "dk4strw.h" + int @@ -113,25 +151,43 @@ dk4ma_input_wc_dec_size_t( const wchar_t *myend = NULL; dk4_um_t um = (dk4_um_t)0UL; size_t res = 0; + size_t xf = 1024; size_t factor = 1; size_t nloop = 0; int back = 0; - +#if DK4_USE_ASSERT + assert(NULL != rp); + assert(NULL != src); +#endif if ((NULL != rp) && (NULL != src)) { if (0 != dk4ma_input_wc_dec_dk4_um_t(&um, src, &myend, 2, erp)) { if (((dk4_um_t)(SIZE_MAX)) >= um) { res = (size_t)um; if (NULL != myend) { back = 1; - switch (*myend) { - case 'k': case 'K': { nloop = 1; myend++; } break; - case 'm': case 'M': { nloop = 2; myend++; } break; - case 'g': case 'G': { nloop = 3; myend++; } break; - case 't': case 'T': { nloop = 4; myend++; } break; + if (*myend <= (wchar_t)(0x00FFU)) { + switch ((int)(*myend)) { + case 'K': { nloop = 1; myend++; } break; + case 'M': { nloop = 2; myend++; } break; + case 'G': { nloop = 3; myend++; } break; + case 'T': { nloop = 4; myend++; } break; + case 'P': { nloop = 5; myend++; } break; + case 'E': { nloop = 6; myend++; } break; + case 'Z': { nloop = 7; myend++; } break; + case 'Y': { nloop = 8; myend++; } break; + case 'k': { nloop = 1; myend++; xf = 1000; } break; + case 'm': { nloop = 2; myend++; xf = 1000; } break; + case 'g': { nloop = 3; myend++; xf = 1000; } break; + case 't': { nloop = 4; myend++; xf = 1000; } break; + case 'p': { nloop = 5; myend++; xf = 1000; } break; + case 'e': { nloop = 6; myend++; xf = 1000; } break; + case 'z': { nloop = 7; myend++; xf = 1000; } break; + case 'y': { nloop = 8; myend++; xf = 1000; } break; + } } while (nloop--) { - if ((SIZE_MAX / 1024) >= factor) { - factor *= 1024; + if ((SIZE_MAX / xf) >= factor) { + factor *= xf; } else { back = 0; dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); @@ -180,3 +236,37 @@ dk4ma_input_wc_dec_size_t( return back; } + + +int +dk4ma_input_wc_dec_size_t_simple( + size_t *rp, + const wchar_t *src, + const wchar_t **endptr, + int atg, + dk4_er_t *erp +) +{ + const wchar_t *myend = NULL; + dk4_um_t um = (dk4_um_t)0UL; + int back = 0; +#if DK4_USE_ASSERT + assert(NULL != rp); + assert(NULL != src); +#endif + if ((NULL != rp) && (NULL != src)) { + if (0 != dk4ma_input_wc_dec_dk4_um_t(&um, src, &myend, atg, erp)) { + if (((dk4_um_t)(SIZE_MAX)) >= um) { + *rp = (size_t)um; + back = 1; + } else { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + } + if (NULL != endptr) { *endptr = myend; } + return back; +} + |