summaryrefslogtreecommitdiffstats
path: root/bstr.c
diff options
context:
space:
mode:
authorwm4 <wm4@mplayer2.org>2012-01-01 17:28:01 +0100
committerwm4 <wm4@mplayer2.org>2012-01-18 04:24:38 +0100
commitf88674509e0a4f90180f26a9b8aa6879df38b056 (patch)
tree6e231b0d533c2b4fc5525b4e3bfaf800097d8cdd /bstr.c
parentbba96eca428711fa16aac0a9af096dc65fe6701f (diff)
downloadmpv-f88674509e0a4f90180f26a9b8aa6879df38b056.tar.bz2
mpv-f88674509e0a4f90180f26a9b8aa6879df38b056.tar.xz
bstr: add some utility functions
bstr_strip_ext and bstr_get_ext were taken from find_subfiles.c. bstr_cut is extended to work like bstr_splice: passing a negative argument will start counting from the end of the string, e.g. bstr_cut("abc", -2) == "bc"
Diffstat (limited to 'bstr.c')
-rw-r--r--bstr.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/bstr.c b/bstr.c
index 0c46b1d9b0..809b02e665 100644
--- a/bstr.c
+++ b/bstr.c
@@ -185,6 +185,19 @@ struct bstr *bstr_splitlines(void *talloc_ctx, struct bstr str)
return r;
}
+struct bstr bstr_getline(struct bstr str, struct bstr *rest)
+{
+ int pos = bstrchr(str, '\n');
+ if (pos < 0)
+ pos = str.len;
+ if (rest)
+ *rest = bstr_cut(str, pos + 1);
+ str.len = pos;
+ if (str.len > 0 && str.start[str.len - 1] == '\r')
+ str.len -= 1;
+ return str;
+}
+
void bstr_lower(struct bstr str)
{
for (int i = 0; i < str.len; i++)
@@ -233,3 +246,31 @@ int bstr_decode_utf8(struct bstr s, struct bstr *out_next)
*out_next = s;
return codepoint;
}
+
+bool bstr_case_startswith(struct bstr s, struct bstr prefix)
+{
+ struct bstr start = bstr_splice(s, 0, prefix.len);
+ return start.len == prefix.len && bstrcasecmp(start, prefix) == 0;
+}
+
+bool bstr_case_endswith(struct bstr s, struct bstr suffix)
+{
+ struct bstr end = bstr_cut(s, -suffix.len);
+ return end.len == suffix.len && bstrcasecmp(end, suffix) == 0;
+}
+
+struct bstr bstr_strip_ext(struct bstr str)
+{
+ int dotpos = bstrrchr(str, '.');
+ if (dotpos < 0)
+ return str;
+ return (struct bstr){str.start, dotpos};
+}
+
+struct bstr bstr_get_ext(struct bstr s)
+{
+ int dotpos = bstrrchr(s, '.');
+ if (dotpos < 0)
+ return (struct bstr){NULL, 0};
+ return bstr_splice(s, dotpos + 1, s.len);
+}