summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xstr/str.c32
-rwxr-xr-xstr/str.h4
2 files changed, 36 insertions, 0 deletions
diff --git a/str/str.c b/str/str.c
index 32b8d59..4a4c709 100755
--- a/str/str.c
+++ b/str/str.c
@@ -254,6 +254,15 @@ str read_delim(char *buf, char d){
return s;
}
+str bread_delim(char *buf, char d){
+ u32 i = 0;
+ while(buf[i] != d) i++;
+ str s = {.cap = i, .len = i, .ptr = calloc(s.cap+1, sizeof(char))};
+ if(s.ptr == NULL) return (str){0};
+ memcpy(s.ptr, buf, i);
+ return s;
+}
+
str sread_delim(char *buf, char d){
u32 i = 0;
while(buf[i] && buf[i] != d) i++;
@@ -261,6 +270,13 @@ str sread_delim(char *buf, char d){
return s;
}
+str sbread_delim(char *buf, char d){
+ u32 i = 0;
+ while(buf[i] != d) i++;
+ str s = {.cap = 0, .len = i, .ptr = buf};
+ return s;
+}
+
str read_delim_f(char *buf, bool (*func)(char), bool func_cond){
u32 i = 0;
while(buf[i] && (func(buf[i]) != func_cond)) i++;
@@ -270,6 +286,15 @@ str read_delim_f(char *buf, bool (*func)(char), bool func_cond){
return s;
}
+str bread_delim_f(char *buf, bool (*func)(char), bool func_cond){
+ u32 i = 0;
+ while(func(buf[i]) != func_cond) i++;
+ str s = {.cap = i, .len = i, .ptr = calloc(s.cap+1, sizeof(char))};
+ if(s.ptr == NULL) return (str){0};
+ memcpy(s.ptr, buf, i);
+ return s;
+}
+
str sread_delim_f(char *buf, bool (*func)(char), bool func_cond){
u32 i = 0;
while(buf[i] && (func(buf[i]) != func_cond)) i++;
@@ -277,6 +302,13 @@ str sread_delim_f(char *buf, bool (*func)(char), bool func_cond){
return s;
}
+str sbread_delim_f(char *buf, bool (*func)(char), bool func_cond){
+ u32 i = 0;
+ while(func(buf[i]) != func_cond) i++;
+ str s = {.cap = 0, .len = i, .ptr = buf};
+ return s;
+}
+
u32 get_line_len(char *buf){
u32 l = 0;
while(buf[l] != '\0' && buf[l] != '\n') l++;
diff --git a/str/str.h b/str/str.h
index dbf91b9..84f1901 100755
--- a/str/str.h
+++ b/str/str.h
@@ -99,9 +99,13 @@ str vdup_nstrs(u64 n, va_list args);
dup_nstrs(NUMSTRS(__VA_ARGS__), __VA_ARGS__);
str read_delim(char *buf, char d);
+str bread_delim(char *buf, char d);
str sread_delim(char *buf, char d);
+str sbread_delim(char *buf, char d);
str read_delim_f(char *buf, bool (*func)(char), bool func_cond);
+str bread_delim_f(char *buf, bool (*func)(char), bool func_cond);
str sread_delim_f(char *buf, bool (*func)(char), bool func_cond);
+str sbread_delim_f(char *buf, bool (*func)(char), bool func_cond);
// probably do away with this
u32 get_line_len(char *buf);