/* Copyright (C) 2014-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk3masts.ctr */ /** @file dk3masts.c The dk3masts module. */ #line 39 "dk3masts.ctr" #include "dk3ma.h" #include #include "dk3mem.h" #include "dk3str.h" #include "dk3masts.h" #line 49 "dk3masts.ctr" int dk3ma_sz_from_string(size_t *rp, dkChar const *src, int *ec) { /* Private copy of string, can be modified. */ dkChar buffer[DK3_MEM_ALIGN((8*sizeof(dk3_um_t)+1),16)]; dkChar const *ptr; /* Start of original text */ size_t lgt; /* Length of text in buffer */ dk3_um_t convres = (dk3_um_t)1; /* Conversion result */ dk3_um_t factor = (dk3_um_t)1; /* Constant factor */ int myec = 0; /* Private error code */ int back = 0; /* Function result */ int done = 0; /* Flag: No conversion necessary */ #line 65 "dk3masts.ctr" if ((NULL != rp) && (NULL != src)) { ptr = dk3str_start(src, NULL); if (NULL != ptr) { if (dk3str_len(ptr) < DK3_SIZEOF(buffer,dkChar)) { dk3str_cpy(buffer, ptr); dk3str_chomp(buffer, NULL); lgt = dk3str_len(buffer); if (0 < lgt) { switch(buffer[lgt-1]) { case dkT('k'): case dkT('K'): { factor = (dk3_um_t)1024; buffer[lgt-1] = dkT('\0'); if (1 == lgt) { done = 1; } } break; case dkT('m'): case dkT('M'): { factor = dk3ma_um_mul_ok((dk3_um_t)1024, (dk3_um_t)1024, &myec); buffer[lgt-1] = dkT('\0'); if (1 == lgt) { done = 1; } } break; case dkT('g'): case dkT('G'): { factor = dk3ma_um_mul_ok( dk3ma_um_mul_ok((dk3_um_t)1024, (dk3_um_t)1024, &myec), (dk3_um_t)1024, &myec ); buffer[lgt-1] = dkT('\0'); if (1 == lgt) { done = 1; } } break; } if (0 == myec) { if (0 == done) { #line 95 "dk3masts.ctr" if (0 != dk3ma_um_from_string(&convres, buffer, ec)) { #line 97 "dk3masts.ctr" convres = dk3ma_um_mul_ok(convres, factor, &myec); if ((dk3_um_t)DK3_SIZE_T_MAX >= convres) { *rp = (size_t)convres; back = 1; #if DK3_ON_WINDOWS #line 103 "dk3masts.ctr" #else #line 105 "dk3masts.ctr" #endif } else { #line 107 "dk3masts.ctr" if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } } else { #line 110 "dk3masts.ctr" } } else { #line 112 "dk3masts.ctr" convres = dk3ma_um_mul_ok(convres, factor, &myec); if ((dk3_um_t)DK3_SIZE_T_MAX >= convres) { *rp = (size_t)convres; back = 1; #line 116 "dk3masts.ctr" #if DK3_ON_WINDOWS #line 118 "dk3masts.ctr" #else #line 120 "dk3masts.ctr" #endif } else { #line 122 "dk3masts.ctr" if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } } if (1 == back) { if (0 != myec) { #line 127 "dk3masts.ctr" back = 0; if (NULL != ec) { *ec = myec; } } } } else { #line 132 "dk3masts.ctr" if (NULL != ec) { *ec = myec; } } } else { #line 135 "dk3masts.ctr" if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; } } } else { #line 138 "dk3masts.ctr" if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; } } } else { #line 141 "dk3masts.ctr" if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; } } } else { #line 144 "dk3masts.ctr" if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; } } #line 146 "dk3masts.ctr" return back; }