Pārlūkot izejas kodu

Adding str header only library

Vinicius Teshima 1 gadu atpakaļ
vecāks
revīzija
78a0eec885
1 mainītis faili ar 117 papildinājumiem un 0 dzēšanām
  1. 117 0
      src/str.h

+ 117 - 0
src/str.h

@@ -0,0 +1,117 @@
+#ifndef STR_H
+#define STR_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+
+struct str {
+	const char *data;
+	size_t size;
+};
+
+struct str_tokenizer {
+	struct str str;
+	size_t cur;
+	char c;
+};
+
+struct str str_from_cstr(const char *cstr, size_t cstr_size);
+struct str str_rstrip(struct str str);
+struct str str_lstrip(struct str str);
+struct str str_strip(struct str str);
+
+struct str_tokenizer str_tokenize(struct str str, char c);
+struct str str_tokenizer_next(struct str_tokenizer *st);
+
+#if defined(IMP) || defined(IMP_STR)
+
+#include <ctype.h>
+
+struct str 
+str_from_cstr(const char *cstr, size_t cstr_size)
+{
+	struct str str;
+	str.data = cstr;
+	str.size = cstr_size;
+	return str;
+}
+
+struct str
+str_rstrip(struct str str)
+{
+	while ( isspace(str.data[str.size-1]) ) {
+		--str.size;
+	}
+	return str;
+}
+
+struct str 
+str_lstrip(struct str str)
+{
+	while ( isspace(*str.data) ) {
+		++str.data;
+		--str.size;
+	}
+	return str;
+}
+
+struct str 
+str_strip(struct str str)
+{
+	return str_lstrip(str_rstrip(str));
+}
+
+struct str_tokenizer 
+str_tokenize(struct str str, char c)
+{
+	struct str_tokenizer st = {0};
+	st.str = str;
+	st.c = c;
+	return st;
+}
+
+struct str 
+str_tokenizer_next(struct str_tokenizer *st)
+{
+	struct str str;
+
+	if ( st == NULL ) {
+		goto ret_empty;
+	}
+
+	if ( st->cur >= st->str.size ) {
+		goto ret_empty;
+	}
+
+	if ( st->str.data[st->cur] == '\0' ) {
+		goto ret_empty;
+	}
+
+	str = st->str;
+	str.data += st->cur;
+	str.size = 0;
+
+	while ( str.data[str.size] != st->c 
+		&& st->cur < st->str.size ) {
+		++str.size;
+		++st->cur;
+	}
+	++st->cur;
+
+	if ( str.size == 0 ) {
+		goto ret_empty;
+	}
+
+	return str;
+
+ret_empty:
+	str.data = "";
+	str.size = 0;
+	return str;
+}
+
+#endif /* defined(IMP) || defined(IMP_STR) */
+
+
+#endif /* STR_H */