You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

152 lines
3.6 KiB

#ifndef LSFS_STRING_H
#define LSFS_STRING_H
#include <stdbool.h>
typedef struct lsfs_string {
bool dynamic;
int length;
char *chars;
} lsfs_string;
typedef struct lsfs_string_array {
int length;
lsfs_string *strings;
} lsfs_string_array;
static inline lsfs_string lsfs_make_id_string(uint64_t *id) {
return (lsfs_string){
.dynamic = false,
.length = sizeof(*id),
.chars = (char *)id
};
}
static inline lsfs_string lsfs_create_id_string(uint64_t id) {
uint64_t *id_ = malloc(sizeof(id));
*id_ = id;
return (lsfs_string){
.dynamic = true,
.length = sizeof(id),
.chars = (char *)id_
};
}
static inline lsfs_string lsfs_make_string(int length, const char *chars) {
return (lsfs_string){
.dynamic = false,
.length = length,
.chars = (char *)chars
};
}
static inline lsfs_string lsfs_make_string_c(const char *cstring) {
return lsfs_make_string(strlen(cstring), cstring);
}
static inline lsfs_string lsfs_create_string(int length, const char *chars) {
char *copy = malloc(length + 1); // Space for null terminator
memcpy(copy, chars, length);
copy[length] = '\0';
return (lsfs_string){
.dynamic = true,
.length = length,
.chars = copy
};
}
static inline lsfs_string lsfs_clone_string(lsfs_string string) {
return lsfs_create_string(string.length, string.chars);
}
static inline void lsfs_destroy_string(lsfs_string string) {
if(string.dynamic) free(string.chars);
}
static inline bool lsfs_string_equal(lsfs_string a, lsfs_string b) {
if (a.length != b.length) return false;
return strncmp(a.chars, b.chars, b.length) == 0;
}
lsfs_string_array lsfs_create_string_array(size_t array_size) {
lsfs_string_array result;
result.length = array_size;
result.strings = malloc(array_size * sizeof(lsfs_string));
return result;
}
static inline void lsfs_destroy_string_array(lsfs_string_array array) {
for (int i = 0; i < array.length; ++i) {
lsfs_destroy_string(array.strings[i]);
}
free(array.strings);
}
lsfs_string_array lsfs_string_split(lsfs_string string, char delim, bool keep_delim) {
int i;
int last;
int count = 0;
i = 0;
last = 0;
while(i < string.length) {
if (string.chars[i] == delim) {
if (i > last+1) {
++count;
}
last = i;
}
++i;
}
if (i > last+1) {
++count;
}
lsfs_string_array result = lsfs_create_string_array(count);
int insert_index = 0;
int k = keep_delim ? 0 : 1;
i = 0;
last = 0;
while(i < string.length) {
if (string.chars[i] == delim) {
if (i > last+1) {
result.strings[insert_index++] = lsfs_create_string(i-(last+k), string.chars+(last+k));
}
last = i;
}
++i;
}
if (i > last+1) {
result.strings[insert_index++] = lsfs_create_string(i-(last+k), string.chars+(last+k));
}
return result;
}
static inline lsfs_string_array lsfs_string_split_c(const char *string, char delim, bool keep_delim) {
return lsfs_string_split(lsfs_make_string_c(string), delim, keep_delim);
}
char *dbg_strarr(lsfs_string_array strings) {
static char temp[8192];
memset(temp, 0, sizeof(temp));
int where = 0;
where += sprintf(temp+where, "{");
for (int i = 0; i < strings.length; ++i) {
where += sprintf(temp+where, "<'%.*s'>", strings.strings[i].length, strings.strings[i].chars);
}
where += sprintf(temp+where, "}");
return temp; // @Leak
}
#endif