|
|
@@ -25,6 +25,8 @@ 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);
|
|
|
|
|
|
+struct str str_slice(struct str str, size_t from, size_t to);
|
|
|
+
|
|
|
bool str_eq_cstr(struct str str, const char *cstr, size_t cstr_size);
|
|
|
|
|
|
#if defined(IMP) || defined(IMP_STR)
|
|
|
@@ -124,6 +126,29 @@ ret_err:
|
|
|
return str;
|
|
|
}
|
|
|
|
|
|
+struct str
|
|
|
+str_slice(struct str str, size_t from, size_t to)
|
|
|
+{
|
|
|
+ if ( from > str.size ) {
|
|
|
+ goto ret_err;
|
|
|
+ }
|
|
|
+ if ( from > to ) {
|
|
|
+ goto ret_err;
|
|
|
+ }
|
|
|
+
|
|
|
+ to = ( to > str.size ) * str.size \
|
|
|
+ + ( to <= str.size ) * to;
|
|
|
+
|
|
|
+ str.data += from;
|
|
|
+ str.size = from - to;
|
|
|
+
|
|
|
+ return str;
|
|
|
+
|
|
|
+ret_err:
|
|
|
+ str.data = "";
|
|
|
+ str.size = (size_t) -2;
|
|
|
+ return str;
|
|
|
+}
|
|
|
|
|
|
bool
|
|
|
str_eq_cstr(struct str str, const char *cstr, size_t cstr_size)
|