Parcourir la source

[str.h] Adding a simple str lib

Vinicius Teshima il y a 1 an
Parent
commit
0d594efdd1
1 fichiers modifiés avec 91 ajouts et 0 suppressions
  1. 91 0
      src/str.h

+ 91 - 0
src/str.h

@@ -0,0 +1,91 @@
+#ifndef STR_H
+#define STR_H
+
+#include <stdlib.h>
+#include <stddef.h>
+
+#include "da.h"
+
+struct str {
+	const char *data;
+	size_t size;
+};
+
+DA_DEF_STRUCT(struct str, str_da);
+
+struct str str_from_cstr(const char *cstr, size_t size);
+struct str str_from_cstr_ns(const char *cstr);
+
+struct str str_strip_left(struct str str);
+struct str str_strip_right(struct str str);
+struct str str_strip(struct str str);
+struct str_da str_split(struct str str, char c);
+
+#if defined(STR_IMP) || defined(IMP)
+
+
+#include <string.h>
+#include <ctype.h>
+
+struct str
+str_from_cstr(const char *cstr, size_t size)
+{
+	return (struct str) { .data=cstr, .size=size };
+}
+
+struct str
+str_from_cstr_ns(const char *cstr)
+{
+	return str_from_cstr(cstr, strlen(cstr));
+}
+
+struct str
+str_strip_left(struct str str)
+{
+	while ( isspace(*str.data) && str.size > 0 ) {
+		++str.data;
+		--str.size;
+	}
+	return str;
+}
+
+struct str
+str_strip_right(struct str str)
+{
+	while ( isspace(str.data[str.size-1]) && str.size > 0 ) {
+		--str.size;
+	}
+	return str;
+}
+
+struct str
+str_strip(struct str str)
+{
+	return str_strip_right(str_strip_left(str));
+}
+
+struct str_da
+str_split(struct str str, char c)
+{
+	struct str_da da = {0};
+	DA_CREATE(da);
+
+	struct str part = {
+		.data = str.data,
+	};
+	for ( size_t i = 0; i < str.size; ++i ) {
+		if ( str.data[i] == c ) {
+			part.size = i - (size_t)(part.data - str.data);
+			DA_APPEND(da, part);
+			part.data += part.size+1;
+		}
+	}
+	part.size = str.size - (size_t)(part.data - str.data);
+	DA_APPEND(da, part);
+
+	return da;
+}
+
+#endif /* defined(STR_IMP) || defined(IMP) */
+
+#endif