summaryrefslogtreecommitdiff
path: root/str
diff options
context:
space:
mode:
authorSoikk2025-06-07 21:41:00 +0200
committerSoikk2025-06-07 21:41:00 +0200
commit3158a49e571dffcb6a17227fed290856c333ae54 (patch)
tree61223d3a582a723be8fc8244164a2838422d187b /str
parent16191cdeeb03f62bdc1bd4d38b87b386e6beb48b (diff)
downloadsoikk-libs-3158a49e571dffcb6a17227fed290856c333ae54.tar.xz
soikk-libs-3158a49e571dffcb6a17227fed290856c333ae54.tar.zst
Added streq and strdup¨
Diffstat (limited to 'str')
-rwxr-xr-xstr/str.c63
-rwxr-xr-xstr/str.h17
2 files changed, 80 insertions, 0 deletions
diff --git a/str/str.c b/str/str.c
index feb6b45..89dc053 100755
--- a/str/str.c
+++ b/str/str.c
@@ -117,6 +117,20 @@ u64 strtou(str s){
return r;
}
+int streq(str s1, str s2){
+ if(s1.len != s2.len){
+ return 0;
+ }
+ int i = 0;
+ while(i < s1.len){
+ if(s1.ptr[i] != s2.ptr[i]){
+ return 0;
+ }
+ i++;
+ }
+ return 1;
+}
+
u64 len_nstrs(u64 n, ...){
u64 s = 0;
va_list vl;
@@ -129,6 +143,15 @@ u64 len_nstrs(u64 n, ...){
return s;
}
+u64 vlen_nstrs(u64 n, va_list args){
+ u64 s = 0;
+ for(u64 i = 0; i < n; i++) {
+ str t = va_arg(args, str);
+ s += t.len;
+ }
+ return s;
+}
+
void copy_nstrs(str dst, u64 n, ...){
va_list vl;
va_start(vl, n);
@@ -139,6 +162,13 @@ void copy_nstrs(str dst, u64 n, ...){
va_end(vl);
}
+void vcopy_nstrs(str dst, u64 n, va_list args){
+ for(u64 i = 0; i < n; i++) {
+ str t = va_arg(args, str);
+ copy_str(dst, t);
+ }
+}
+
void move_nstrs(str dst, u64 n, ...){
va_list vl;
va_start(vl, n);
@@ -149,6 +179,39 @@ void move_nstrs(str dst, u64 n, ...){
va_end(vl);
}
+void vmove_nstrs(str dst, u64 n, va_list args){
+ for(u64 i = 0; i < n; i++) {
+ str t = va_arg(args, str);
+ move_str(dst, t);
+ }
+}
+
+str dup_nstrs(u64 n, ...){
+ va_list vl, vlc;
+ va_start(vl, n);
+ va_copy(vlc, vl);
+ str r = dnstr(vlen_nstrs(n, vlc));
+ for(u64 i = 0; i < n; i++) {
+ str t = va_arg(vl, str);
+ copy_str(r, t);
+ }
+ va_end(vlc);
+ va_end(vl);
+ return r;
+}
+
+str vdup_nstrs(u64 n, va_list args){
+ va_list vlc;
+ va_copy(vlc, args);
+ str r = dnstr(vlen_nstrs(n, vlc));
+ for(u64 i = 0; i < n; i++) {
+ str t = va_arg(args, str);
+ copy_str(r, t);
+ }
+ va_end(vlc);
+ return r;
+}
+
str read_delim(char *buf, char d){
u32 i = 0;
while(buf[i] && buf[i] != d) i++;
diff --git a/str/str.h b/str/str.h
index 8afd0aa..4ba897f 100755
--- a/str/str.h
+++ b/str/str.h
@@ -57,13 +57,19 @@ str utostr(u64 n, int b);
u64 strtou(str s);
+int streq(str s1, str s2);
+
#define NUMSTRS(...) (sizeof((str[]){{0}, ##__VA_ARGS__})/sizeof(str)-1)
+// look into calling vlen_nstrs from len_nstrs
u64 len_nstrs(u64 n, ...);
+u64 vlen_nstrs(u64 n, va_list args);
+
#define len_strs(...) \
len_nstrs(NUMSTRS(__VA_ARGS__), __VA_ARGS__)
+// probably should change to append or something
#define copy_str(dest, src) \
if(dest.ptr != NULL && src.ptr != NULL){ \
memcpy((dest).ptr+(dest).len, (src).ptr, (src).len); \
@@ -78,8 +84,16 @@ u64 len_nstrs(u64 n, ...);
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__)
@@ -88,6 +102,9 @@ void move_nstrs(str dst, u64 n, ...);
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);