summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-03-20 14:24:04 +0100
committerThomas Haller <thaller@redhat.com>2019-03-24 09:21:55 +0100
commit7ead2c2ff3ded34f46afe0d23c528ce900da49bc (patch)
treecd924931e4fdb78ac61b76748da6dbbdb25cb873
parentaf64a8c1f20face09f4d3d525f4e28b8fbaaf82f (diff)
downloadNetworkManager-7ead2c2ff3ded34f46afe0d23c528ce900da49bc.tar.gz
shared: add _nm_utils_escape_plain() API
-rw-r--r--shared/nm-utils/nm-shared-utils.c36
-rw-r--r--shared/nm-utils/nm-shared-utils.h16
2 files changed, 40 insertions, 12 deletions
diff --git a/shared/nm-utils/nm-shared-utils.c b/shared/nm-utils/nm-shared-utils.c
index e74ee0c7bc..2802f44ee7 100644
--- a/shared/nm-utils/nm-shared-utils.c
+++ b/shared/nm-utils/nm-shared-utils.c
@@ -962,6 +962,15 @@ comp_l:
/*****************************************************************************/
+static void
+_char_lookup_table_init (guint8 lookup[static 256],
+ const char *candidates)
+{
+ memset (lookup, 0, 256);
+ while (candidates[0] != '\0')
+ lookup[(guint8) ((candidates++)[0])] = 1;
+}
+
/**
* nm_utils_strsplit_set:
* @str: the string to split.
@@ -1007,9 +1016,8 @@ nm_utils_strsplit_set (const char *str, const char *delimiters, gboolean allow_e
/* initialize lookup table for delimiter */
if (!delimiters)
delimiters = " \t\n";
- memset (delimiters_table, 0, sizeof (delimiters_table));
- for (i = 0; delimiters[i]; i++)
- delimiters_table[(guint8) delimiters[i]] = 1;
+
+ _char_lookup_table_init (delimiters_table, delimiters);
#define _is_delimiter(ch, delimiters_table, allow_esc, esc) \
((delimiters_table)[(guint8) (ch)] != 0 && (!allow_esc || !esc))
@@ -2371,21 +2379,26 @@ _nm_utils_user_data_unpack (gpointer user_data, int nargs, ...)
/*****************************************************************************/
+#define _CH_LOOKUP(ch_lookup, ch) (!!((ch_lookup)[(guint8) (ch)]))
+
const char *
-_nm_utils_escape_spaces (const char *str, char **to_free)
+_nm_utils_escape_plain (const char *str, const char *candidates, char **to_free)
{
const char *ptr = str;
char *ret, *r;
+ guint8 ch_lookup[256];
*to_free = NULL;
if (!str)
return NULL;
+ _char_lookup_table_init (ch_lookup, candidates ?: NM_ASCII_SPACES);
+
while (TRUE) {
if (!*ptr)
return str;
- if (g_ascii_isspace (*ptr))
+ if (_CH_LOOKUP (ch_lookup, *ptr))
break;
ptr++;
}
@@ -2395,7 +2408,7 @@ _nm_utils_escape_spaces (const char *str, char **to_free)
r = ret;
*to_free = ret;
while (*ptr) {
- if (g_ascii_isspace (*ptr))
+ if (_CH_LOOKUP (ch_lookup, *ptr))
*r++ = '\\';
*r++ = *ptr++;
}
@@ -2405,23 +2418,26 @@ _nm_utils_escape_spaces (const char *str, char **to_free)
}
char *
-_nm_utils_unescape_spaces (char *str, gboolean do_strip)
+_nm_utils_unescape_plain (char *str, const char *candidates, gboolean do_strip)
{
gsize i = 0;
gsize j = 0;
gsize preserve_space_at = 0;
+ guint8 ch_lookup[256];
if (!str)
return NULL;
+ _char_lookup_table_init (ch_lookup, candidates ?: NM_ASCII_SPACES);
+
if (do_strip) {
- while (str[i] && g_ascii_isspace (str[i]))
+ while (str[i] && _CH_LOOKUP (ch_lookup, str[i]))
i++;
}
for (; str[i]; i++) {
if ( str[i] == '\\'
- && g_ascii_isspace (str[i+1])) {
+ && _CH_LOOKUP (ch_lookup, str[i+1])) {
preserve_space_at = j;
i++;
}
@@ -2431,7 +2447,7 @@ _nm_utils_unescape_spaces (char *str, gboolean do_strip)
if (do_strip && j > 0) {
while ( --j > preserve_space_at
- && g_ascii_isspace (str[j]))
+ && _CH_LOOKUP (ch_lookup, str[j]))
str[j] = '\0';
}
diff --git a/shared/nm-utils/nm-shared-utils.h b/shared/nm-utils/nm-shared-utils.h
index d05273a11b..2033ff0864 100644
--- a/shared/nm-utils/nm-shared-utils.h
+++ b/shared/nm-utils/nm-shared-utils.h
@@ -1072,8 +1072,20 @@ void _nm_utils_user_data_unpack (gpointer user_data, int nargs, ...);
/*****************************************************************************/
-const char *_nm_utils_escape_spaces (const char *str, char **to_free);
-char *_nm_utils_unescape_spaces (char *str, gboolean do_strip);
+const char *_nm_utils_escape_plain (const char *str, const char *candidates, char **to_free);
+char *_nm_utils_unescape_plain (char *str, const char *candidates, gboolean do_strip);
+
+static inline const char *
+_nm_utils_escape_spaces (const char *str, char **to_free)
+{
+ return _nm_utils_escape_plain (str, NM_ASCII_SPACES, to_free);
+}
+
+static inline char *
+_nm_utils_unescape_spaces (char *str, gboolean do_strip)
+{
+ return _nm_utils_unescape_plain (str, NM_ASCII_SPACES, do_strip);
+}
/*****************************************************************************/