Files
fastfetch/src/common/stringUtils.h
T

101 lines
2.8 KiB
C
Raw Normal View History

2023-02-01 15:56:25 +01:00
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
2024-01-11 16:27:53 +08:00
#include <ctype.h>
2026-03-29 09:28:49 +08:00
static inline bool ffStrSet(const char* str) {
if (str == NULL) {
2024-01-11 16:27:53 +08:00
return false;
2026-03-29 09:28:49 +08:00
}
2024-01-11 16:27:53 +08:00
2026-03-29 09:28:49 +08:00
while (isspace(*str)) {
2024-01-11 16:27:53 +08:00
str++;
2026-03-29 09:28:49 +08:00
}
2024-01-11 16:27:53 +08:00
return *str != '\0';
}
2023-02-01 15:56:25 +01:00
2026-03-29 09:28:49 +08:00
static inline bool ffStrStartsWithIgnCase(const char* str, const char* compareTo) {
return strncasecmp(str, compareTo, strlen(compareTo)) == 0;
}
2026-03-29 09:28:49 +08:00
static inline bool ffStrEqualsIgnCase(const char* str, const char* compareTo) {
return strcasecmp(str, compareTo) == 0;
}
2026-03-29 09:28:49 +08:00
static inline bool ffStrStartsWith(const char* str, const char* compareTo) {
return strncmp(str, compareTo, strlen(compareTo)) == 0;
}
2026-03-29 09:28:49 +08:00
static inline bool ffStrEndsWith(const char* str, const char* compareTo) {
size_t strLength = strlen(str);
size_t compareToLength = strlen(compareTo);
2026-03-29 09:28:49 +08:00
if (strLength < compareToLength) {
return false;
2026-03-29 09:28:49 +08:00
}
return memcmp(str + strLength - compareToLength, compareTo, compareToLength) == 0;
}
2026-03-29 09:28:49 +08:00
static inline bool ffStrEndsWithIgnCase(const char* str, const char* compareTo) {
2023-10-07 13:40:40 +08:00
size_t strLength = strlen(str);
size_t compareToLength = strlen(compareTo);
2026-03-29 09:28:49 +08:00
if (strLength < compareToLength) {
2023-10-07 13:40:40 +08:00
return false;
2026-03-29 09:28:49 +08:00
}
2023-10-07 13:40:40 +08:00
return strncasecmp(str + strLength - compareToLength, compareTo, compareToLength) == 0;
}
2026-03-29 09:28:49 +08:00
static inline bool ffStrEquals(const char* str, const char* compareTo) {
return strcmp(str, compareTo) == 0;
}
2026-03-29 09:28:49 +08:00
static inline bool ffStrContains(const char* str, const char* compareTo) {
return strstr(str, compareTo) != NULL;
}
2026-03-29 09:28:49 +08:00
static inline bool ffStrContainsIgnCase(const char* str, const char* compareTo) {
return strcasestr(str, compareTo) != NULL;
}
2024-04-21 17:35:47 +08:00
2026-03-29 09:28:49 +08:00
static inline bool ffStrContainsC(const char* str, char compareTo) {
2024-04-21 17:35:47 +08:00
return strchr(str, compareTo) != NULL;
}
2024-05-05 07:10:51 +08:00
2026-03-29 09:28:49 +08:00
static inline bool ffCharIsEnglishAlphabet(char c) {
2024-05-05 07:10:51 +08:00
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
}
2024-05-28 15:34:59 +08:00
2026-03-29 09:28:49 +08:00
static inline bool ffCharIsDigit(char c) {
2024-05-28 15:34:59 +08:00
return '0' <= c && c <= '9';
}
2024-10-17 22:29:38 +08:00
2026-03-29 09:28:49 +08:00
static inline bool ffCharIsHexDigit(char c) {
return ffCharIsDigit(c) || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F');
}
2026-03-29 09:28:49 +08:00
static inline int8_t ffHexCharToInt(char c) {
if (ffCharIsDigit(c)) {
return (int8_t) (c - '0');
2026-03-29 09:28:49 +08:00
} else if ('a' <= c && c <= 'f') {
return (int8_t) (c - 'a' + 10);
2026-03-29 09:28:49 +08:00
} else if ('A' <= c && c <= 'F') {
return (int8_t) (c - 'A' + 10);
2026-03-29 09:28:49 +08:00
} else {
return -1;
2026-03-29 09:28:49 +08:00
}
}
// Copies at most (dstBufSiz - 1) bytes from src to dst; dst is always null-terminated
2026-03-29 09:28:49 +08:00
static inline char* ffStrCopy(char* __restrict__ dst, const char* __restrict__ src, size_t dstBufSiz) {
if (__builtin_expect(dst == NULL, false) || dstBufSiz == 0) {
return dst;
}
2024-10-17 22:29:38 +08:00
size_t len = strnlen(src, dstBufSiz - 1);
2024-10-17 22:29:38 +08:00
memcpy(dst, src, len);
dst[len] = '\0';
return dst + len;
}