// // Created by xemon on 10.09.22. // #include "AsciiStringParsingUtils.h" #include #include uint8_t iAsciiStringParseCharToDecimalInt(char symbol) { return (symbol - '0'); // return overvalue if not a decimal number } uint8_t iAsciiStringParseHexCharToInt(char symbol) { if (symbol >= '0' && symbol <= '9') { return iAsciiStringParseCharToDecimalInt(symbol); } else if (symbol >= 'a' && symbol <= 'f') { return 0xA + symbol - 'a'; } else if (symbol >= 'A' && symbol <= 'F') { return 0xA + (symbol - 'A'); } else { return 0x10; //not a hex number, return overvalue } } uint8_t iAsciiStringParseHexByte(const char *str) { return iAsciiStringParseHexCharToInt(*str) * 0x10 + iAsciiStringParseHexCharToInt(*(str + 1)); } size_t iAsciiStringParseHexBytes(uint8_t *bytesData, char *str, size_t stringLen) { char *end = str + stringLen; size_t dataLen = stringLen / 2; while (end > str) { *bytesData = iAsciiStringParseHexByte(str); str += 2; ++bytesData; } return dataLen; } uint64_t iAsciiStringParseUIntDecimalNumberWhitEnd(char **str, const char *strEnd) { uint32_t value = 0; uint8_t digit; while ((*str) < strEnd) { digit = iAsciiStringParseCharToDecimalInt(**str); if (digit > 9) { return value; } else { value = (value * 10) + digit; } ++(*str); } return value; } int64_t iAsciiStringParseSignedLongDecimalNumber(char *str, const char *strEnd) { int8_t sign = 1; if (*str == '-') { sign = -1; ++str; } return iAsciiStringParseUIntDecimalNumberWhitEnd(&str, strEnd) * sign; } uint64_t iAsciiStringParseUnsignedLongDecimalNumber(char *str, const char *strEnd) { return iAsciiStringParseUIntDecimalNumberWhitEnd(&str, strEnd); } char *xAsciiStringSkipChar(char *utcString, char const *utcStringEnd, char symbol) { while ((utcString < utcStringEnd) && (*utcString == symbol)) { ++utcString; } return utcString; } char *xAsciiStringSeekChar(char *utcString, char const *utcStringEnd, char symbol) { while ((utcString < utcStringEnd) && (*utcString != symbol)) { ++utcString; } return utcString; } double dAsciiStringParseDouble(char *str, const char *strEnd) { double sign = 1; if (str[0] == '-') { sign = -1; ++str; } char *dividerSymbol = xAsciiStringSeekChar(str, strEnd, '.'); double result = iAsciiStringParseUnsignedLongDecimalNumber(str, dividerSymbol); if (dividerSymbol < (strEnd - 1)) { ++dividerSymbol; char *fractionalStr = dividerSymbol; double fractional = iAsciiStringParseUIntDecimalNumberWhitEnd(&fractionalStr, strEnd); for (; dividerSymbol < fractionalStr; ++dividerSymbol) { fractional /= 10; } result += fractional; } return result * sign; } uint8_t iAsciiStringMoveToNextParsingBlock(char **blockBeginPos, char **blockDividerPos, char *strEnd, char divider) { *blockBeginPos = xAsciiStringSkipSpace((*blockDividerPos + 1), strEnd); *blockDividerPos = xAsciiStringSeekChar(*blockBeginPos, strEnd, divider); return *blockDividerPos - *blockBeginPos; //return block length }