AsciiStringParsingUtils/Src/AsciiStringParsingUtils.c

123 lines
3.2 KiB
C
Executable File

//
// Created by xemon on 10.09.22.
//
#include "AsciiStringParsingUtils.h"
#include <stdlib.h>
#include <string.h>
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
}