diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2011-02-23 16:18:09 +0200 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2011-02-26 16:40:31 +0200 |
commit | 962eec0440ad65a71c09a9e206e110c62d9de3c8 (patch) | |
tree | 7e1f2b9406fa34859dfe67de8d4ea6b80bc09408 /bstr.c | |
parent | e8af22db818f839f5ac25a309e8838ea53e831b2 (diff) | |
download | mpv-962eec0440ad65a71c09a9e206e110c62d9de3c8.tar.bz2 mpv-962eec0440ad65a71c09a9e206e110c62d9de3c8.tar.xz |
bstr.[ch], path.[ch]: add string and path handling functions
Add some new string and path handling functions to be used in
following commits.
Use new path handling functions to simplify find_files().
Diffstat (limited to 'bstr.c')
-rw-r--r-- | bstr.c | 91 |
1 files changed, 91 insertions, 0 deletions
@@ -18,6 +18,10 @@ #include <string.h> #include <libavutil/avutil.h> +#include <assert.h> + +#include "talloc.h" + #include "bstr.h" int bstrcmp(struct bstr str1, struct bstr str2) @@ -49,3 +53,90 @@ int bstrcasecmp(struct bstr str1, struct bstr str2) } return ret; } + +int bstrchr(struct bstr str, int c) +{ + for (int i = 0; i < str.len; i++) + if (str.start[i] == c) + return i; + return -1; +} + +struct bstr bstr_strip(struct bstr str) +{ + while (str.len && isspace(*str.start)) { + str.start++; + str.len--; + } + while (str.len && isspace(str.start[str.len - 1])) + str.len--; + return str; +} + +struct bstr bstr_split(struct bstr str, char *sep, struct bstr *rest) +{ + int start, end; + for (start = 0; start < str.len; start++) + if (!strchr(sep, str.start[start])) + break; + for (end = start; end < str.len; end++) + if (strchr(sep, str.start[end])) + break; + if (rest) { + *rest = bstr_cut(str, end); + } + str.start += start; + str.len = end - start; + return str; +} + + +struct bstr bstr_splice(struct bstr str, int start, int end) +{ + if (start < 0) + start += str.len; + if (end < 0) + end += str.len; + end = FFMIN(end, str.len); + start = FFMAX(start, 0); + if (start >= end) + return (struct bstr){NULL, 0}; + str.start += start; + str.len = end - start; + return str; +} + +long long bstrtoll(struct bstr str, struct bstr *rest, int base) +{ + char buf[51]; + int len = FFMIN(str.len, 50); + memcpy(buf, str.start, len); + buf[len] = 0; + char *endptr; + long long r = strtoll(buf, &endptr, base); + if (rest) + *rest = bstr_cut(str, endptr - buf); + return r; +} + +struct bstr *bstr_splitlines(void *talloc_ctx, struct bstr str) +{ + if (str.len == 0) + return NULL; + int count = 0; + for (int i = 0; i < str.len; i++) + if (str.start[i] == '\n') + count++; + if (str.start[str.len - 1] != '\n') + count++; + struct bstr *r = talloc_array_ptrtype(talloc_ctx, r, count); + unsigned char *p = str.start; + for (int i = 0; i < count - 1; i++) { + r[i].start = p; + while (*p++ != '\n'); + r[i].len = p - r[i].start; + } + r[count - 1].start = p; + r[count - 1].len = str.start + str.len - p; + return r; +} |