diff options
author | mrb0nk500 <b0nk@b0nk.xyz> | 2022-07-27 15:35:15 -0300 |
---|---|---|
committer | mrb0nk500 <b0nk@b0nk.xyz> | 2022-07-27 15:35:15 -0300 |
commit | a459d34d124a2993a313d29cf8b84a5d0df42e87 (patch) | |
tree | 155f8240e26e8410f606b99fe12d1a18b3adaf83 /misc.c | |
parent | e6e2b766afa7d92ef38b356a745a47b2047bba07 (diff) |
misc: Add `find_delm()`, and `get_str_delm_range()`
`find_delm()` finds the first matched delimiter of the supplied
delimiter(s), and either returns the pointer to the first non-delimiter
character after the match, or the match itself if `skip_delm` is true,
or false respectivly.
`get_str_delm_range()` finds, and returns the string in between the
supplied starting, and ending delimiter(s). It also returns the pointer
to the first non-delimiter character after the end of the range in
`rhs`.
Diffstat (limited to 'misc.c')
-rw-r--r-- | misc.c | 33 |
1 files changed, 33 insertions, 0 deletions
@@ -69,6 +69,39 @@ char *get_line(char **str) { } } +char *find_delm(char *str, const char *delm, int skip_delm) { + if (!is_empty(str)) { + const size_t span = strcspn(str, delm); + return &str[(skip_delm) ? strspn(&str[span], delm) : span]; + } else { + return NULL; + } +} + +char *get_str_delm_range(char *str, const char *start_delm, const char *end_delm, char **rhs) { + if (!is_empty(str)) { + char *start = find_delm(str, start_delm, 1); + char *end; + char *dummy; + rhs = (rhs != NULL) ? rhs : &dummy; + + for (end = start; *end != '\0'; end += strcspn(end, end_delm)) { + if (*end++ == '\\') { + end += strspn(end, end_delm); + continue; + } else { + break; + } + } + + *end++ = '\0'; + *rhs = end; + return start; + } else { + return NULL; + } +} + char *make_str(const char *str) { const size_t length = strlen(str); char *s = calloc(length+1, sizeof(char)); |