2024-01-27 22:54:53 +01:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "lnm/common.h"
|
|
|
|
|
|
|
|
bool lnm_strneq(const char *s1, size_t s1_len, const char *s2, size_t s2_len) {
|
|
|
|
return (s1_len == s2_len) && (memcmp(s1, s2, s1_len) == 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool lnm_strnieq(const char *s1, size_t s1_len, const char *s2, size_t s2_len) {
|
|
|
|
bool equal = s1_len == s2_len;
|
|
|
|
|
|
|
|
for (size_t i = 0; i < s1_len && equal; i++) {
|
|
|
|
equal = s1[i] == s2[i] ||
|
|
|
|
(('a' <= s1[i]) && (s1[i] <= 'z') && (s1[i] - 32 == s2[i]));
|
|
|
|
}
|
|
|
|
|
|
|
|
return equal;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t lnm_ipow(uint64_t base, uint64_t power) {
|
|
|
|
uint64_t res = 1;
|
|
|
|
|
|
|
|
while (power > 0) {
|
|
|
|
res *= base;
|
|
|
|
power--;
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t lnm_atoi(const char *s, size_t len) {
|
|
|
|
uint64_t res = 0;
|
|
|
|
|
|
|
|
for (size_t i = 0; i < len; i++) {
|
|
|
|
if (s[i] < '0' || '9' < s[i]) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t val = s[i] - '0';
|
|
|
|
res += val * lnm_ipow(10, (len - 1) - i);
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t lnm_digits(uint64_t num) {
|
|
|
|
int digits = 1;
|
|
|
|
|
|
|
|
while (num > 9) {
|
|
|
|
digits++;
|
|
|
|
|
|
|
|
num /= 10;
|
|
|
|
}
|
|
|
|
|
|
|
|
return digits;
|
|
|
|
}
|
2024-03-02 22:36:58 +01:00
|
|
|
|
|
|
|
bool lnm_is_ascii(const char *s) {
|
|
|
|
bool valid = true;
|
|
|
|
|
|
|
|
while (valid && *s != '\0') {
|
|
|
|
valid = *s < 0;
|
|
|
|
|
|
|
|
s++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return valid;
|
|
|
|
}
|