summaryrefslogtreecommitdiff
path: root/str
diff options
context:
space:
mode:
authorSoikk2025-10-02 17:38:16 +0200
committerSoikk2025-10-02 17:38:16 +0200
commit463e7bae5faa755dc23092736cb7886442acf998 (patch)
tree5fd89e02b54a0b75b9a70ac571d731b4418b5dad /str
parent5333160b241e15d46b920300a103ac8cd1583f73 (diff)
downloadsoikk-libs-463e7bae5faa755dc23092736cb7886442acf998.tar.xz
soikk-libs-463e7bae5faa755dc23092736cb7886442acf998.tar.zst
Added dsstr dsnstr and streqn
Diffstat (limited to 'str')
-rwxr-xr-xstr/str.c57
-rwxr-xr-xstr/str.h24
2 files changed, 63 insertions, 18 deletions
diff --git a/str/str.c b/str/str.c
index 6cc9418..145aca9 100755
--- a/str/str.c
+++ b/str/str.c
@@ -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]);
diff --git a/str/str.h b/str/str.h
index c81771b..9c68595 100755
--- a/str/str.h
+++ b/str/str.h
@@ -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);