Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int cstrings_intbase(const char * s)
- {
- if (s != NULL && s[0] != 0) {
- int offset = (s[0] == '+' || s[0] == '-' ? 1 : 0);
- if ((s[offset] == '0' && (s[offset + 1] == 'd' || s[offset + 1] == 'D'))
- || (s[offset] >= '0' && s[offset] <= '9' && (s[offset + 1] == 0 || (s[offset + 1] >= '0' && s[offset + 1] <= '9'))))
- return 10;
- else if ((s[offset] == '$' || (s[offset] == '0' && (s[offset + 1] == 'x' || s[offset + 1] == 'X')))
- && ((s[offset + 2] >= '0' && s[offset + 2] <= '9') || (s[offset + 2] >= 'a' && s[offset + 2] <= 'f') || (s[offset + 2] >= 'A' && s[offset + 2] <= 'F')))
- return 16;
- else if ((s[offset] == '@' || (s[offset] == '0' && (s[offset + 1] == 'o' || s[offset + 1] == 'O')))
- && (s[offset + 2] >= '0' && s[offset + 2] <= '7'))
- return 8;
- else if ((s[offset] == '%' || (s[offset] == '0' && (s[offset + 1] == 'b' || s[offset + 1] == 'B')))
- && (s[offset + 2] >= '0' && s[offset + 2] <= '1'))
- return 2;
- }
- return 0;
- }
- #define CSTRINGS_DEFINE_INT_FUNC(funcsuffix, inttype, intmax, intmin) \
- bool cstrings_is##funcsuffix(const char * s, int base, inttype * ret_value) \
- { \
- if (base <= 0) \
- base = cstrings_intbase(s); \
- if (base == 10 || base == 16 || base == 8 || base == 2) { \
- int start = (s[0] == '+' || s[0] == '-' ? 1 : 0); \
- if (base == 16) \
- start += (s[start] == '$' ? 1 : (s[start] == '0' && (s[start + 1] == 'x' || s[start + 1] == 'X')) ? 2 : 0); \
- else if (base == 8) \
- start += (s[start] == '@' ? 1 : (s[start] == '0' && (s[start + 1] == 'o' || s[start + 1] == 'O')) ? 2 : 0); \
- else if (base == 2) \
- start += (s[start] == '%' ? 1 : (s[start] == '0' && (s[start + 1] == 'b' || s[start + 1] == 'B')) ? 2 : 0); \
- int len = start; \
- while (s[len] != 0) \
- len++; \
- inttype multiplier = (s[0] == '-' ? -1 : 1); \
- inttype result = 0; \
- int offset = len - 1; \
- while (offset >= start) { \
- inttype digitvalue = 0; \
- if (base == 10) { \
- if (s[offset] >= '0' && s[offset] <= '9') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'0'); \
- else \
- return false; \
- } else if (base == 16) { \
- if (s[offset] >= '0' && s[offset] <= '9') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'0'); \
- else if (s[offset] >= 'a' && s[offset] <= 'f') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'a') + 10; \
- else if (s[offset] >= 'A' && s[offset] <= 'F') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'A') + 10; \
- else \
- return false; \
- } else if (base == 8) { \
- if (s[offset] >= '0' && s[offset] <= '7') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'0'); \
- else \
- return false; \
- } else if (base == 2) { \
- if (s[offset] >= '0' && s[offset] <= '1') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'0'); \
- else \
- return false; \
- } else \
- return false; \
- inttype value = digitvalue * multiplier; \
- if (value / multiplier != digitvalue) \
- return false; \
- if (multiplier > 0 && value > intmax - result) \
- return false; \
- else if (multiplier < 0 && value < intmin - result) \
- return false; \
- result += value; \
- if (offset >= start) { \
- inttype premult = multiplier * (inttype)base; \
- if (premult / (inttype)base != multiplier) { \
- offset--; \
- while (offset >= start) \
- if (s[offset--] != '0') \
- return false; \
- break; \
- } \
- multiplier = premult; \
- } \
- offset--; \
- } \
- if (ret_value != NULL) \
- *ret_value = result; \
- return true; \
- } \
- return false; \
- } \
- inttype cstrings_to##funcsuffix(const char * s, int base, inttype errvalue) \
- { \
- inttype ret = errvalue; \
- cstrings_is##funcsuffix(s, base, &ret); \
- return ret; \
- }
- #define CSTRINGS_DEFINE_UINT_FUNC(funcsuffix, inttype, intmax) \
- bool cstrings_is##funcsuffix(const char * s, int base, inttype * ret_value) \
- { \
- if (base <= 0) \
- base = cstrings_intbase(s); \
- if (base == 10 || base == 16 || base == 8 || base == 2) { \
- int start = (s[0] == '+' ? 1 : 0); \
- if (base == 16) \
- start += (s[start] == '$' ? 1 : (s[start] == '0' && (s[start + 1] == 'x' || s[start + 1] == 'X')) ? 2 : 0); \
- else if (base == 8) \
- start += (s[start] == '@' ? 1 : (s[start] == '0' && (s[start + 1] == 'o' || s[start + 1] == 'O')) ? 2 : 0); \
- else if (base == 2) \
- start += (s[start] == '%' ? 1 : (s[start] == '0' && (s[start + 1] == 'b' || s[start + 1] == 'B')) ? 2 : 0); \
- int len = start; \
- while (s[len] != 0) \
- len++; \
- inttype multiplier = 1; \
- inttype result = 0; \
- int offset = len - 1; \
- while (offset >= start) { \
- inttype digitvalue = 0; \
- if (base == 10) { \
- if (s[offset] >= '0' && s[offset] <= '9') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'0'); \
- else \
- return false; \
- } else if (base == 16) { \
- if (s[offset] >= '0' && s[offset] <= '9') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'0'); \
- else if (s[offset] >= 'a' && s[offset] <= 'f') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'a') + 10; \
- else if (s[offset] >= 'A' && s[offset] <= 'F') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'A') + 10; \
- else \
- return false; \
- } else if (base == 8) { \
- if (s[offset] >= '0' && s[offset] <= '7') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'0'); \
- else \
- return false; \
- } else if (base == 2) { \
- if (s[offset] >= '0' && s[offset] <= '1') \
- digitvalue = ((inttype)s[offset]) - ((inttype)'0'); \
- else \
- return false; \
- } else \
- return false; \
- inttype value = digitvalue * multiplier; \
- if (value / multiplier != digitvalue) \
- return false; \
- if (value > intmax - result) \
- return false; \
- result += value; \
- if (offset >= start) { \
- inttype premult = multiplier * (inttype)base; \
- if (premult / (inttype)base != multiplier) { \
- offset--; \
- while (offset >= start) \
- if (s[offset--] != '0') \
- return false; \
- break; \
- } \
- multiplier = premult; \
- } \
- offset--; \
- } \
- if (ret_value != NULL) \
- *ret_value = result; \
- return true; \
- } \
- return false; \
- } \
- inttype cstrings_to##funcsuffix(const char * s, int base, inttype errvalue) \
- { \
- inttype ret = errvalue; \
- cstrings_is##funcsuffix(s, base, &ret); \
- return ret; \
- }
- CSTRINGS_DEFINE_INT_FUNC(short, short, SHRT_MAX, SHRT_MIN)
- CSTRINGS_DEFINE_UINT_FUNC(ushort, unsigned short, USHRT_MAX)
- CSTRINGS_DEFINE_INT_FUNC(int, int, INT_MAX, INT_MIN)
- CSTRINGS_DEFINE_UINT_FUNC(uint, unsigned int, UINT_MAX)
- CSTRINGS_DEFINE_INT_FUNC(long, long, LONG_MAX, LONG_MIN)
- CSTRINGS_DEFINE_UINT_FUNC(ulong, unsigned long, ULONG_MAX)
- CSTRINGS_DEFINE_INT_FUNC(longlong, long long, LLONG_MAX, LLONG_MIN)
- CSTRINGS_DEFINE_UINT_FUNC(ulonglong, unsigned long long, ULLONG_MAX)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement