mirror of https://github.com/djcb/mu.git
* add mu-server (previous commit) functions for parsing commands
This commit is contained in:
parent
ce97c491eb
commit
e95908cd93
67
src/mu-str.c
67
src/mu-str.c
|
@ -334,6 +334,70 @@ mu_str_to_list (const char *str, char sepa, gboolean strip)
|
||||||
return lst;
|
return lst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gchar*
|
||||||
|
eat_esc_string (char **strlst)
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
gboolean quoted;
|
||||||
|
GString *gstr;
|
||||||
|
|
||||||
|
str = g_strchug (*strlst);
|
||||||
|
gstr = g_string_sized_new (strlen(str));
|
||||||
|
|
||||||
|
for (quoted = FALSE; *str; ++str) {
|
||||||
|
|
||||||
|
if (*str == '"') {
|
||||||
|
quoted = !quoted;
|
||||||
|
continue;
|
||||||
|
} else if (quoted)
|
||||||
|
gstr = g_string_append_c (gstr, *str);
|
||||||
|
else if (*str == '\\') {
|
||||||
|
if (str[1] != ' ' && str[1] != '"' && str[1] != '\\')
|
||||||
|
goto err; /* invalid escaping */
|
||||||
|
g_string_append_c (gstr, *(str++));
|
||||||
|
continue;
|
||||||
|
} else if (*str == ' ') {
|
||||||
|
++str;
|
||||||
|
goto leave;
|
||||||
|
} else
|
||||||
|
g_string_append_c (gstr, *str);
|
||||||
|
}
|
||||||
|
leave:
|
||||||
|
*strlst = str;
|
||||||
|
return g_string_free (gstr, FALSE);
|
||||||
|
err:
|
||||||
|
g_warning ("error in string");
|
||||||
|
*strlst = NULL;
|
||||||
|
return g_string_free (gstr, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GSList*
|
||||||
|
mu_str_esc_to_list (const char *strings)
|
||||||
|
{
|
||||||
|
GSList *lst;
|
||||||
|
char *str, *mystrings, *freeme;
|
||||||
|
|
||||||
|
g_return_val_if_fail (strings, NULL);
|
||||||
|
|
||||||
|
freeme = mystrings = g_strdup (strings);
|
||||||
|
mystrings = g_strdup(g_strchug(mystrings));
|
||||||
|
lst = NULL;
|
||||||
|
|
||||||
|
do {
|
||||||
|
str = eat_esc_string (&mystrings);
|
||||||
|
if (str)
|
||||||
|
lst = g_slist_prepend (lst, str);
|
||||||
|
} while (mystrings && *mystrings);
|
||||||
|
|
||||||
|
g_free (freeme);
|
||||||
|
return g_slist_reverse (lst);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
mu_str_free_list (GSList *lst)
|
mu_str_free_list (GSList *lst)
|
||||||
{
|
{
|
||||||
|
@ -455,7 +519,8 @@ mu_str_escape_c_literal (const gchar* str, gboolean in_quotes)
|
||||||
|
|
||||||
if (in_quotes)
|
if (in_quotes)
|
||||||
g_string_append_c (tmp, '"');
|
g_string_append_c (tmp, '"');
|
||||||
return g_string_free (tmp, FALSE);
|
|
||||||
|
return g_string_free (tmp, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
15
src/mu-str.h
15
src/mu-str.h
|
@ -254,7 +254,7 @@ char* mu_str_from_list (const GSList *lst, char sepa);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* convert a #se0pa-separated list of strings in to a GSList
|
* convert a #sepa-separated list of strings in to a GSList
|
||||||
*
|
*
|
||||||
* @param str a #sepa-separated list of strings
|
* @param str a #sepa-separated list of strings
|
||||||
* @param the separator character
|
* @param the separator character
|
||||||
|
@ -265,6 +265,19 @@ char* mu_str_from_list (const GSList *lst, char sepa);
|
||||||
GSList* mu_str_to_list (const char *str, char sepa, gboolean strip);
|
GSList* mu_str_to_list (const char *str, char sepa, gboolean strip);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* convert a string (with possible escaping) to a list. list items are
|
||||||
|
* separated by one or more spaces. list items can be quoted (using
|
||||||
|
* '"'), and '"', ' ' and '\' use their special meaning when prefixed
|
||||||
|
* with \.
|
||||||
|
*
|
||||||
|
* @param str a string
|
||||||
|
*
|
||||||
|
* @return a list of elements or NULL in case of error
|
||||||
|
*/
|
||||||
|
GSList* mu_str_esc_to_list (const char *str);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* free a GSList consisting of allocated strings
|
* free a GSList consisting of allocated strings
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue