#include "helpers.hpp" #include #include #include #include STR2NUM_ERROR str2num(int64_t &i, char const *s, int base) { char *end; long long l; errno = 0; l = strtoll(s, &end, base); if (errno == ERANGE && l == LLONG_MAX) { return OVERFLOW; } if (errno == ERANGE && l == LLONG_MIN) { return UNDERFLOW; } if (*s == '\0' || *end != '\0') { return INCONVERTIBLE; } i = l; return SUCCESS; } STR2NUM_ERROR str2num(uint64_t &i, char const *s, int base) { char *end; long long l; errno = 0; l = strtoull(s, &end, base); if (errno == ERANGE && l == LLONG_MAX) { return OVERFLOW; } if (errno == ERANGE && l == LLONG_MIN) { return UNDERFLOW; } if (*s == '\0' || *end != '\0') { return INCONVERTIBLE; } i = l; return SUCCESS; } STR2NUM_ERROR str2num(int32_t &i, char const *s, int base) { char *end; long l; errno = 0; l = strtol(s, &end, base); if (errno == ERANGE && l == LONG_MAX) { return OVERFLOW; } if (errno == ERANGE && l == LONG_MIN) { return UNDERFLOW; } if (*s == '\0' || *end != '\0') { return INCONVERTIBLE; } i = l; return SUCCESS; } STR2NUM_ERROR str2num(uint32_t &i, char const *s, int base) { char *end; long l; errno = 0; l = strtoul(s, &end, base); if (errno == ERANGE && l == LONG_MAX) { return OVERFLOW; } if (errno == ERANGE && l == LONG_MIN) { return UNDERFLOW; } if (*s == '\0' || *end != '\0') { return INCONVERTIBLE; } i = l; return SUCCESS; } STR2NUM_ERROR str2num(int16_t &i, char const *s, int base) { char *end; long l; errno = 0; l = strtol(s, &end, base); if (errno == ERANGE && l == LONG_MAX) { return OVERFLOW; } if (errno == ERANGE && l == LONG_MIN) { return UNDERFLOW; } if (*s == '\0' || *end != '\0') { return INCONVERTIBLE; } i = l; return SUCCESS; } STR2NUM_ERROR str2num(uint16_t &i, char const *s, int base) { char *end; long l; errno = 0; l = strtoul(s, &end, base); if (errno == ERANGE && l == LONG_MAX) { return OVERFLOW; } if (errno == ERANGE && l == LONG_MIN) { return UNDERFLOW; } if (*s == '\0' || *end != '\0') { return INCONVERTIBLE; } i = l; return SUCCESS; } STR2NUM_ERROR str2num(int8_t &i, char const *s, int base) { char *end; long l; errno = 0; l = strtol(s, &end, base); if (errno == ERANGE && l == LONG_MAX) { return OVERFLOW; } if (errno == ERANGE && l == LONG_MIN) { return UNDERFLOW; } if (*s == '\0' || *end != '\0') { return INCONVERTIBLE; } i = l; return SUCCESS; } STR2NUM_ERROR str2num(uint8_t &i, char const *s, int base) { char *end; long l; errno = 0; l = strtoul(s, &end, base); if (errno == ERANGE && l == LONG_MAX) { return OVERFLOW; } if (errno == ERANGE && l == LONG_MIN) { return UNDERFLOW; } if (*s == '\0' || *end != '\0') { return INCONVERTIBLE; } i = l; return SUCCESS; } STR2NUM_ERROR str2num(float &f, char const *s, char *&pEnd) { float l; errno = 0; l = strtof(s, &pEnd); if (errno == ERANGE && l == HUGE_VALF) { return OVERFLOW; } if (errno == ERANGE && l == -HUGE_VALF) { return UNDERFLOW; } if (*s == '\0' || s == pEnd) { return INCONVERTIBLE; } f = l; return SUCCESS; } STR2NUM_ERROR str2num(float &f, char const *s) { char *end; return str2num(f, s, end); } STR2NUM_ERROR str2num(double &d, char const *s, char *&pEnd) { float l; errno = 0; l = strtod(s, &pEnd); if (errno == ERANGE && l == HUGE_VAL) { return OVERFLOW; } if (errno == ERANGE && l == -HUGE_VAL) { return UNDERFLOW; } if (*s == '\0' || s == pEnd) { return INCONVERTIBLE; } d = l; return SUCCESS; } STR2NUM_ERROR str2num(double &d, char const *s) { char *end; return str2num(d, s, end); }