101 lines
1.8 KiB
C
101 lines
1.8 KiB
C
#include "include/conf.h"
|
|
|
|
#include <ctype.h>
|
|
|
|
#include "include/def.h"
|
|
|
|
uint64_t dp_buf2u64_le(const uint8_t buf[8]) {
|
|
if (!buf) {
|
|
return 0;
|
|
}
|
|
|
|
uint64_t result = 0;
|
|
for (uint8_t idx = 0; idx < 8; ++idx) {
|
|
result |= ((uint64_t)buf[idx]) << (uint64_t)(8 * idx);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
bool dp_u642buf_le(uint8_t buf[8], uint64_t num) {
|
|
if (!buf) {
|
|
return false;
|
|
}
|
|
|
|
for (uint8_t idx = 0; idx < 8; ++idx) {
|
|
buf[idx] = (uint8_t)((num >> (uint64_t)(8 * idx)) & (uint64_t)0xFF);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool dp_isnumber(const char *num) {
|
|
if (!num) {
|
|
return false;
|
|
}
|
|
|
|
for (const char *chr = num; *chr; ++chr) {
|
|
if (!isdigit((unsigned char)*chr)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int dp_u642str(char buf[21], uint64_t value) {
|
|
if (!buf) {
|
|
return -1;
|
|
}
|
|
|
|
if (value == 0) {
|
|
buf[0] = '0';
|
|
buf[1] = '\0';
|
|
return 1;
|
|
}
|
|
|
|
uint8_t idx = 0;
|
|
while (value > 0 && idx < 20) {
|
|
buf[idx++] = (char)((value % 10) + '0');
|
|
value /= 10;
|
|
}
|
|
|
|
if (value > 0) {
|
|
return -1;
|
|
}
|
|
|
|
for (uint8_t jdx = 0; jdx < idx / 2; ++jdx) {
|
|
const char temp = buf[jdx];
|
|
buf[jdx] = buf[idx - jdx - 1];
|
|
buf[idx - jdx - 1] = temp;
|
|
}
|
|
|
|
buf[idx] = '\0';
|
|
|
|
return idx;
|
|
}
|
|
|
|
uint64_t dp_str2u64(const char *num) {
|
|
if (!num || !*num) {
|
|
return 0;
|
|
}
|
|
|
|
uint64_t result = 0;
|
|
|
|
while (*num) {
|
|
const char chr = *num++;
|
|
if (chr < '0' || chr > '9') {
|
|
return false;
|
|
}
|
|
|
|
const uint64_t digit = (uint64_t)(chr - '0');
|
|
|
|
if (result > (UINT64_MAX - digit) / 10) {
|
|
break; /* Overflow */
|
|
}
|
|
|
|
result = result * 10 + digit;
|
|
}
|
|
|
|
return result;
|
|
}
|