00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <stdarg.h>
00023 #include <stdint.h>
00024 #include <stdio.h>
00025 #include <string.h>
00026 #include <ctype.h>
00027 #include "avstring.h"
00028 #include "mem.h"
00029
00030 int av_strstart(const char *str, const char *pfx, const char **ptr)
00031 {
00032 while (*pfx && *pfx == *str) {
00033 pfx++;
00034 str++;
00035 }
00036 if (!*pfx && ptr)
00037 *ptr = str;
00038 return !*pfx;
00039 }
00040
00041 int av_stristart(const char *str, const char *pfx, const char **ptr)
00042 {
00043 while (*pfx && toupper((unsigned)*pfx) == toupper((unsigned)*str)) {
00044 pfx++;
00045 str++;
00046 }
00047 if (!*pfx && ptr)
00048 *ptr = str;
00049 return !*pfx;
00050 }
00051
00052 char *av_stristr(const char *s1, const char *s2)
00053 {
00054 if (!*s2)
00055 return (char*)(intptr_t)s1;
00056
00057 do {
00058 if (av_stristart(s1, s2, NULL))
00059 return (char*)(intptr_t)s1;
00060 } while (*s1++);
00061
00062 return NULL;
00063 }
00064
00065 size_t av_strlcpy(char *dst, const char *src, size_t size)
00066 {
00067 size_t len = 0;
00068 while (++len < size && *src)
00069 *dst++ = *src++;
00070 if (len <= size)
00071 *dst = 0;
00072 return len + strlen(src) - 1;
00073 }
00074
00075 size_t av_strlcat(char *dst, const char *src, size_t size)
00076 {
00077 size_t len = strlen(dst);
00078 if (size <= len + 1)
00079 return len + strlen(src);
00080 return len + av_strlcpy(dst + len, src, size - len);
00081 }
00082
00083 size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...)
00084 {
00085 int len = strlen(dst);
00086 va_list vl;
00087
00088 va_start(vl, fmt);
00089 len += vsnprintf(dst + len, size > len ? size - len : 0, fmt, vl);
00090 va_end(vl);
00091
00092 return len;
00093 }
00094
00095 char *av_asprintf(const char *fmt, ...)
00096 {
00097 char *p = NULL;
00098 va_list va;
00099 int len;
00100
00101 va_start(va, fmt);
00102 len = vsnprintf(NULL, 0, fmt, va);
00103 va_end(va);
00104 if (len < 0)
00105 goto end;
00106
00107 p = av_malloc(len + 1);
00108 if (!p)
00109 goto end;
00110
00111 va_start(va, fmt);
00112 len = vsnprintf(p, len + 1, fmt, va);
00113 va_end(va);
00114 if (len < 0)
00115 av_freep(&p);
00116
00117 end:
00118 return p;
00119 }
00120
00121 char *av_d2str(double d)
00122 {
00123 char *str= av_malloc(16);
00124 if(str) snprintf(str, 16, "%f", d);
00125 return str;
00126 }
00127
00128 #define WHITESPACES " \n\t"
00129
00130 char *av_get_token(const char **buf, const char *term)
00131 {
00132 char *out = av_malloc(strlen(*buf) + 1);
00133 char *ret= out, *end= out;
00134 const char *p = *buf;
00135 if (!out) return NULL;
00136 p += strspn(p, WHITESPACES);
00137
00138 while(*p && !strspn(p, term)) {
00139 char c = *p++;
00140 if(c == '\\' && *p){
00141 *out++ = *p++;
00142 end= out;
00143 }else if(c == '\''){
00144 while(*p && *p != '\'')
00145 *out++ = *p++;
00146 if(*p){
00147 p++;
00148 end= out;
00149 }
00150 }else{
00151 *out++ = c;
00152 }
00153 }
00154
00155 do{
00156 *out-- = 0;
00157 }while(out >= end && strspn(out, WHITESPACES));
00158
00159 *buf = p;
00160
00161 return ret;
00162 }
00163
00164 char *av_strtok(char *s, const char *delim, char **saveptr)
00165 {
00166 char *tok;
00167
00168 if (!s && !(s = *saveptr))
00169 return NULL;
00170
00171
00172 s += strspn(s, delim);
00173
00174
00175 if (!*s) {
00176 *saveptr = NULL;
00177 return NULL;
00178 }
00179 tok = s++;
00180
00181
00182 s += strcspn(s, delim);
00183 if (*s) {
00184 *s = 0;
00185 *saveptr = s+1;
00186 } else {
00187 *saveptr = NULL;
00188 }
00189
00190 return tok;
00191 }
00192
00193 int av_strcasecmp(const char *a, const char *b)
00194 {
00195 uint8_t c1, c2;
00196 do {
00197 c1 = av_tolower(*a++);
00198 c2 = av_tolower(*b++);
00199 } while (c1 && c1 == c2);
00200 return c1 - c2;
00201 }
00202
00203 int av_strncasecmp(const char *a, const char *b, size_t n)
00204 {
00205 const char *end = a + n;
00206 uint8_t c1, c2;
00207 do {
00208 c1 = av_tolower(*a++);
00209 c2 = av_tolower(*b++);
00210 } while (a < end && c1 && c1 == c2);
00211 return c1 - c2;
00212 }
00213
00214 #ifdef TEST
00215
00216 #include "common.h"
00217
00218 int main(void)
00219 {
00220 int i;
00221
00222 printf("Testing av_get_token()\n");
00223 {
00224 const char *strings[] = {
00225 "''",
00226 "",
00227 ":",
00228 "\\",
00229 "'",
00230 " '' :",
00231 " '' '' :",
00232 "foo '' :",
00233 "'foo'",
00234 "foo ",
00235 " ' foo ' ",
00236 "foo\\",
00237 "foo': blah:blah",
00238 "foo\\: blah:blah",
00239 "foo\'",
00240 "'foo : ' :blahblah",
00241 "\\ :blah",
00242 " foo",
00243 " foo ",
00244 " foo \\ ",
00245 "foo ':blah",
00246 " foo bar : blahblah",
00247 "\\f\\o\\o",
00248 "'foo : \\ \\ ' : blahblah",
00249 "'\\fo\\o:': blahblah",
00250 "\\'fo\\o\\:': foo ' :blahblah"
00251 };
00252
00253 for (i=0; i < FF_ARRAY_ELEMS(strings); i++) {
00254 const char *p = strings[i];
00255 char *q;
00256 printf("|%s|", p);
00257 q = av_get_token(&p, ":");
00258 printf(" -> |%s|", q);
00259 printf(" + |%s|\n", p);
00260 av_free(q);
00261 }
00262 }
00263
00264 return 0;
00265 }
00266
00267 #endif