/* WARNING: This file was generated by dkct. 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: dk4mai8dbl.ctr */ /* Copyright (C) 2015-2017, Dirk Krause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above opyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @file dk4mai8dbl.c The dk4mai8dbl module. */ #line 76 "dk4mai8dbl.ctr" #include "dk4mai8dbl.h" #include "dk4str8.h" #if DK4_HAVE_ERRNO_H #ifndef ERRNO_H_INCLUDED #include #define ERRNO_H_INCLUDED 1 #endif #endif #if DK4_HAVE_LOCALE_H #ifndef LOCALE_H_INCLUDED #include #define LOCALE_H_INCLUDED 1 #endif #endif #if DK4_HAVE_STDLIB_H #ifndef STDLIB_H_INCLUDED #include #define STDLIB_H_INCLUDED 1 #endif #endif #if DK4_HAVE_MATH_H #ifndef MATH_H_INCLUDED #include #define MATH_H_INCLUDED 1 #endif #endif /** Default locale to use. */ static const char locale_kw[] = { "C" }; /** Read double value from char string. @param rp Address of result variable. @param src String to process. @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 here. The pointer variable is probably left unchanged on errors or if strtod() is not available on your system (the sscanf() function is used as fallback). @param atg Allow trailing garbage: 0=no unprocessable trailing bytes allowed, 1=trailing whitespaces allowed, 2=any trailing characaters 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_SYNTAX if there are unexpected characters in the string, DK4_E_MATH_OVERFLOW if a mathematical overflow occurs, DK4_E_MATH_UNDERFLOW if a mathematical underflow occurs. */ static int dk4ma_internal_input_c8_double( double *rp, const char *src, const char **endptr, int atg, dk4_er_t *erp ) { #if DK4_HAVE_STRTOD || DK4_HAVE__STRTOD double val = 0.0; char *myend = NULL; int back = 0; int xerr = 0; if ((NULL != rp) && (NULL != src)) { errno = 0; #if DK4_HAVE_STRTOD val = strtod(src, &myend); #else val = _strtod(src, &myend); #endif xerr = errno; if (NULL != endptr) { *endptr = myend; } if (myend != src) { switch (atg) { case 2: { back = 1; } break; case 1: { if (NULL != dk4str8_start(myend, NULL)) { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } else { back = 1; } } break; default: { if ('\0' == *myend) { back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } } break; } if (1 == back) { if (ERANGE == xerr) { if (HUGE_VAL == val) { back = 0; dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } if ((-HUGE_VAL) == val) { back = 0; dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } if (0.0 == val) { back = 0; dk4error_set_simple_error_code(erp, DK4_E_MATH_UNDERFLOW); } } } } else { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } if (1 == back) { *rp = val; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; #else #if DK4_USE_PRINTF_SCANF double val = 0.0; int back = 0; if ((NULL != rp) && (NULL != src)) { if (1 == sscanf(src, "%lf", &val)) { *rp = val; back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); return 0; #endif #endif } int dk4ma_input_c8_double( double *rp, const char *src, const char **endptr, int atg, dk4_er_t *erp ) { #if (DK4_HAVE_SETLOCALE) && defined(LC_NUMERIC) char *oldloc = NULL; #endif int back = 0; #if (DK4_HAVE_SETLOCALE) && defined(LC_NUMERIC) oldloc = setlocale(LC_NUMERIC, NULL); (void)setlocale(LC_NUMERIC, locale_kw); back = dk4ma_internal_input_c8_double(rp, src, endptr, atg, erp); (void)setlocale(LC_NUMERIC, oldloc); #else back = dk4ma_internal_input_c8_double(rp, src, endptr, atg, erp); #endif return back; }