34 #define FROM_HEX(c) ((c) < 'A' ? (c) - '0' : (c) < 'a' ? 10 + (c) - 'A' : 10 + (c) - 'a')
35 #define TO_HEX(i) ((i) < 10 ? '0' + (i) : 'A' + (i) - 10)
36 #define IS_LEGAL(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z') \
37 || ((c) >= '0' && (c) <= '9') || (strchr ("-_.~/", (c))))
41 return ! g_ascii_strncasecmp (str, prefix, strlen (prefix));
46 int len1 = strlen (str);
47 int len2 = strlen (suffix);
52 return ! g_ascii_strcasecmp (str + len1 - len2, suffix);
55 static char * (* str_to_utf8_impl) (
const char *) =
NULL;
56 static char * (* str_to_utf8_full_impl) (
const char *,
int,
int *,
int *) =
NULL;
59 char * (* stuf_impl) (
const char *,
int,
int *,
int *))
71 EXPORT
char *
str_to_utf8_full (
const char * str,
int len,
int * bytes_read,
int * bytes_written)
79 while ((
string = strchr (
string, old_str)) !=
NULL)
98 if (c ==
'%' && len >= 2 && str[0] && str[1])
131 * out ++ =
TO_HEX ((
unsigned char) c >> 4);
132 * out ++ =
TO_HEX (c & 0xF);
145 char * utf8 = g_locale_to_utf8 (name, -1,
NULL,
NULL,
NULL);
148 fprintf (stderr,
"Cannot convert filename from system locale: %s\n", name);
155 char enc[3 * strlen (utf8) + 1];
161 return g_strdup_printf (
"file:///%s", enc);
163 return g_strdup_printf (
"file://%s", enc);
174 g_return_val_if_fail (! strncmp (uri,
"file:///", 8),
NULL);
175 char buf[strlen (uri + 8) + 1];
178 g_return_val_if_fail (! strncmp (uri,
"file://", 7),
NULL);
179 char buf[strlen (uri + 7) + 1];
188 fprintf (stderr,
"Cannot convert filename to system locale: %s\n", buf);
198 if (! strncmp (uri,
"cdda://?", 8))
199 return g_strdup_printf (
_(
"Audio CD, track %s"), uri + 8);
201 char buf[strlen (uri) + 1];
204 if (! strncmp (uri,
"file:///", 8))
210 if (! strncmp (uri,
"file://", 7))
216 return g_strdup (buf);
219 EXPORT
void uri_parse (
const char * uri,
const char * * base_p,
const char * * ext_p,
220 const char * * sub_p,
int * isub_p)
222 const char * end = uri + strlen (uri);
223 const char * base, * ext, * sub, * c;
227 if ((c = strrchr (uri,
'/')))
232 if ((c = strrchr (base,
'?')) && sscanf (c + 1,
"%d%c", & isub, & junk) == 1)
237 char buf[sub - base + 1];
238 memcpy (buf, base, sub - base);
241 if ((c = strrchr (buf,
'.')))
242 ext = base + (c - buf);
263 return (bp ==
NULL) ? 0 : -1;
267 unsigned char a = * ap ++,
b = * bp ++;
268 for (; a ||
b; a = * ap ++, b = * bp ++)
270 if (a >
'9' || b >
'9' || a <
'0' || b <
'0')
272 if (a <= 'Z' && a >=
'A')
274 if (b <= 'Z' && b >=
'A')
285 for (; (a = * ap) <=
'9' && a >=
'0'; ap ++)
286 x = 10 * x + (a -
'0');
289 for (; (b = * bp) >=
'0' && b <=
'9'; bp ++)
290 y = 10 * y + (b -
'0');
307 return (bp ==
NULL) ? 0 : -1;
311 unsigned char a = * ap ++,
b = * bp ++;
312 for (; a ||
b; a = * ap ++, b = * bp ++)
314 if (a ==
'%' && ap[0] && ap[1])
319 if (b ==
'%' && bp[0] && bp[1])
325 if (a >
'9' || b >
'9' || a <
'0' || b <
'0')
327 if (a <= 'Z' && a >=
'A')
329 if (b <= 'Z' && b >=
'A')
340 for (; (a = * ap) <=
'9' && a >=
'0'; ap ++)
341 x = 10 * x + (a -
'0');
344 for (; (b = * bp) >=
'0' && b <=
'9'; bp ++)
345 y = 10 * y + (b -
'0');
361 int left = strlen(s);
362 int avail = size - (left + 1);
363 int oldlen = strlen(old);
364 int newlen = strlen(
new);
365 int diff = newlen - oldlen;
367 while (left >= oldlen)
369 if (strncmp(ptr, old, oldlen))
380 memmove(ptr + oldlen + diff, ptr + oldlen, left + 1 - oldlen);
382 memcpy(ptr,
new, newlen);
407 bool_t neg = (
string[0] ==
'-');
414 while ((c = *
string ++))
416 if (c < '0' || c >
'9' || val > 100000000)
419 val = val * 10 + (c -
'0');
422 if (val > 1000000000)
425 * addr = neg ? -val : val;
434 bool_t neg = (
string[0] ==
'-');
438 const char * p = strchr (
string,
'.');
450 memcpy (buf,
string, len);
456 len = strlen (p + 1);
460 memcpy (buf, p + 1, len);
461 memset (buf + len,
'0', 6 - len);
475 double val = i + (double) f / 1000000;
476 if (val > 1000000000)
479 * addr = neg ? -val : val;
488 g_return_val_if_fail (val >= -1000000000 && val <= 1000000000,
NULL);
489 return g_strdup_printf (
"%d", val);
494 g_return_val_if_fail (val >= -1000000000 && val <= 1000000000,
NULL);
501 int f = round ((val - i) * 1000000);
509 char *
s = neg ? g_strdup_printf (
"-%d.%06d", i, f) : g_strdup_printf (
"%d.%06d", i, f);
511 char * c = s + strlen (s);
512 while (* (c - 1) ==
'0')
514 if (* (c - 1) ==
'.')
523 char * * split = g_strsplit (
string,
",", -1);
524 if (g_strv_length (split) != count)
527 for (
int i = 0; i < count; i ++)
543 char * * split = g_malloc0 (
sizeof (
char *) * (count + 1));
545 for (
int i = 0; i < count; i ++)
552 char *
string = g_strjoinv (
",", split);