diff options
Diffstat (limited to 'str')
| -rwxr-xr-x | str/str.c | 57 | ||||
| -rwxr-xr-x | str/str.h | 24 |
2 files changed, 63 insertions, 18 deletions
@@ -64,6 +64,24 @@ str dnstr(u32 cap){ return s; } +str dsstr(char *s){ + str r = { + .cap = 0, + .len = len(s), + .ptr = s + }; + return r; +} + +str dsnstr(char *s, u32 len){ + str r = { + .cap = 0, + .len = len, + .ptr = s + }; + return r; +} + int resize_str(str *s, u32 nsize){ if(nsize == 0) return 1; char *nptr = realloc(s->ptr, nsize); @@ -108,6 +126,7 @@ str utostr(u64 n, int b){ } // TODO add support for different bases +// TODO check length u64 strtou(str s){ u64 i = 0, r = 0; while(charisnum(s.ptr[i])){ @@ -121,7 +140,7 @@ int streq(str s1, str s2){ if(s1.len != s2.len){ return 0; } - int i = 0; + u32 i = 0; while(i < s1.len){ if(s1.ptr[i] != s2.ptr[i]){ return 0; @@ -131,6 +150,20 @@ int streq(str s1, str s2){ return 1; } +int streqn(str s1, str s2, u32 n){ + if(s1.len < n || s2.len < n){ + return 0; + } + u32 i = 0; + while(i < n){ + if(s1.ptr[i] != s2.ptr[i]){ + return 0; + } + i++; + } + return 1; +} + u64 len_nstrs(u64 n, ...){ u64 s = 0; va_list vl; @@ -364,6 +397,28 @@ void unmap_file(str *s){ s->cap = 0; } +str fread_str(int fd, int max){ + str s = dnstr(max); + s.len = read(fd, s.ptr, s.cap); + if(s.len == 0){ + free_str(&s); + return (str){0}; + } + if(s.ptr[s.len-1] == '\n'){ + s.ptr[--s.len] = '\0'; + } + if(s.len != s.cap){ + char *p = realloc(s.ptr, s.len+1); + if(p == NULL){ + free_str(&s); + return (str){0}; + } + s.ptr = p; + s.cap = s.len; + } + return s; +} + void print_str(str s){ for(u32 i = 0; i < s.len; i++){ putchar(s.ptr[i]); @@ -25,24 +25,21 @@ typedef struct str { bool charisalpha(char c); - bool charisnum(char c); - bool charisblank(char c); - bool charislinebreak(char c); - bool charisspace(char c); char lowerchar(char c); - u32 lowers(char *s); u32 len(const char *s); +// reorder? str dstr(char *s); - str dnstr(u32 cap); +str dsstr(char *s); +str dsnstr(char *s, u32 len); #define slen(s) (sizeof(s)-1) @@ -61,6 +58,7 @@ str utostr(u64 n, int b); u64 strtou(str s); int streq(str s1, str s2); +int streqn(str s1, str s2, u32 n); #define NUMSTRS(...) (sizeof((str[]){{0}, ##__VA_ARGS__})/sizeof(str)-1) @@ -86,36 +84,26 @@ u64 vlen_nstrs(u64 n, va_list args); } void copy_nstrs(str dst, u64 n, ...); - void vcopy_nstrs(str dst, u64 n, va_list args); - void move_nstrs(str dst, u64 n, ...); - void vmove_nstrs(str dst, u64 n, va_list args); - str dup_nstrs(u64 n, ...); - str vdup_nstrs(u64 n, va_list args); - #define copy_strs(d, ...) \ copy_nstrs(d, NUMSTRS(__VA_ARGS__), __VA_ARGS__); \ (d).len += len_nstrs(NUMSTRS(__VA_ARGS__), __VA_ARGS__) - #define move_strs(d, ...) \ move_nstrs(d, NUMSTRS(__VA_ARGS__), __VA_ARGS__); \ (d).len += len_nstrs(NUMSTRS(__VA_ARGS__), __VA_ARGS__) - #define dup_strs(...) \ dup_nstrs(NUMSTRS(__VA_ARGS__), __VA_ARGS__); str read_delim(char *buf, char d); - str sread_delim(char *buf, char d); - str read_delim_f(char *buf, bool (*func)(char), bool func_cond); - str sread_delim_f(char *buf, bool (*func)(char), bool func_cond); +// probably do away with this u32 get_line_len(char *buf); str fd_to_str(int fd); @@ -129,6 +117,8 @@ str map_file(char *filename); str map_file_at(char *filename, int len, int at); void unmap_file(str *s); +#define read_str(max) fread_str(STDIN_FILENO, max) +str fread_str(int fd, int max); void print_str(str s); void free_str(str *s); |
