]> git.sesse.net Git - ffmpeg/blobdiff - libavutil/avstring.c
error.c: fix compile flags
[ffmpeg] / libavutil / avstring.c
index 8ee2a6b12fc50ab16c7c1a4f33b7f5b99667b64f..b573dd676157be484f14797c86794b217f2b7d89 100644 (file)
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <ctype.h>
 #include "avstring.h"
+#include "mem.h"
 
 int av_strstart(const char *str, const char *pfx, const char **ptr)
 {
@@ -47,6 +48,19 @@ int av_stristart(const char *str, const char *pfx, const char **ptr)
     return !*pfx;
 }
 
+char *av_stristr(const char *s1, const char *s2)
+{
+    if (!*s2)
+        return s1;
+
+    do {
+        if (av_stristart(s1, s2, NULL))
+            return s1;
+    } while (*s1++);
+
+    return NULL;
+}
+
 size_t av_strlcpy(char *dst, const char *src, size_t size)
 {
     size_t len = 0;
@@ -76,3 +90,98 @@ size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...)
 
     return len;
 }
+
+char *av_d2str(double d)
+{
+    char *str= av_malloc(16);
+    if(str) snprintf(str, 16, "%f", d);
+    return str;
+}
+
+#define WHITESPACES " \n\t"
+
+char *av_get_token(const char **buf, const char *term)
+{
+    char *out = av_malloc(strlen(*buf) + 1);
+    char *ret= out, *end= out;
+    const char *p = *buf;
+    if (!out) return NULL;
+    p += strspn(p, WHITESPACES);
+
+    while(*p && !strspn(p, term)) {
+        char c = *p++;
+        if(c == '\\' && *p){
+            *out++ = *p++;
+            end= out;
+        }else if(c == '\''){
+            while(*p && *p != '\'')
+                *out++ = *p++;
+            if(*p){
+                p++;
+                end= out;
+            }
+        }else{
+            *out++ = c;
+        }
+    }
+
+    do{
+        *out-- = 0;
+    }while(out >= end && strspn(out, WHITESPACES));
+
+    *buf = p;
+
+    return ret;
+}
+
+#ifdef TEST
+
+#undef printf
+
+int main(void)
+{
+    int i;
+
+    printf("Testing av_get_token()\n");
+    {
+        const char *strings[] = {
+            "''",
+            "",
+            ":",
+            "\\",
+            "'",
+            "    ''    :",
+            "    ''  ''  :",
+            "foo   '' :",
+            "'foo'",
+            "foo     ",
+            "  '  foo  '  ",
+            "foo\\",
+            "foo':  blah:blah",
+            "foo\\:  blah:blah",
+            "foo\'",
+            "'foo :  '  :blahblah",
+            "\\ :blah",
+            "     foo",
+            "      foo       ",
+            "      foo     \\ ",
+            "foo ':blah",
+            " foo   bar    :   blahblah",
+            "\\f\\o\\o",
+            "'foo : \\ \\  '   : blahblah",
+            "'\\fo\\o:': blahblah",
+            "\\'fo\\o\\:':  foo  '  :blahblah"
+        };
+
+        for (i=0; i < FF_ARRAY_ELEMS(strings); i++) {
+            const char *p= strings[i];
+            printf("|%s|", p);
+            printf(" -> |%s|", av_get_token(&p, ":"));
+            printf(" + |%s|\n", p);
+        }
+    }
+
+    return 0;
+}
+
+#endif /* TEST */