static void
_format_param_parse(const char *item, const char **key, const char **val)
{
- const char *equal, *end;
+ const char *start, *end, *quote;
+
+ start = strchr(item, '=');
+ *key = eina_stringshare_add_length(item, start - item);
+ start++; /* Advance after the '=' */
+ /* If we can find a quote, our new delimiter is a quote, not a space. */
+ if ((quote = strchr(start, '\'')))
+ {
+ start = quote + 1;
+ end = strchr(start, '\'');
+ }
+ else
+ {
+ end = strchr(start, ' ');
+ }
- equal = strchr(item, '=');
- *key = eina_stringshare_add_length(item, equal - item);
- equal++; /* Advance after the '=' */
/* Null terminate before the spaces */
- end = strchr(equal, ' ');
if (end)
{
- *val = eina_stringshare_add_length(equal, end - equal);
+ *val = eina_stringshare_add_length(start, end - start);
}
else
{
- *val = eina_stringshare_add(equal);
+ *val = eina_stringshare_add(start);
}
}
/**
* @internal
- * FIXME: comment.
+ * This function parses the format passed in *s and advances s to point to the
+ * next format item, while returning the current one as the return value.
+ * @param s The current and returned position in the format string.
+ * @return the current item parsed from the string.
*/
static const char *
_format_parse(const char **s)
{
- const char *p, *item;
+ const char *p;
const char *s1 = NULL, *s2 = NULL;
+ Eina_Bool quote = EINA_FALSE;;
p = *s;
if (*p == 0) return NULL;
}
else if (!s2)
{
- if ((p > *s) && (p[-1] != '\\'))
+ if (*p == '\'')
+ {
+ quote = !quote;
+ }
+
+ if ((p > *s) && (p[-1] != '\\') && (!quote))
{
if (*p == ' ') s2 = p;
}
p++;
if (s1 && s2)
{
- item = s1;
-
*s = s2;
- return item;
+ return s1;
}
}
*s = p;