|
@@ -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 */
|