summaryrefslogtreecommitdiffstats
path: root/bstr.c
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2011-02-23 16:18:09 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2011-02-26 16:40:31 +0200
commit962eec0440ad65a71c09a9e206e110c62d9de3c8 (patch)
tree7e1f2b9406fa34859dfe67de8d4ea6b80bc09408 /bstr.c
parente8af22db818f839f5ac25a309e8838ea53e831b2 (diff)
downloadmpv-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.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/bstr.c b/bstr.c
index 3cc3928086..d86b488912 100644
--- a/bstr.c
+++ b/bstr.c
@@ -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;
+}