diff options
author | Thomas Haller <thaller@redhat.com> | 2019-03-20 14:24:04 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-03-24 09:21:55 +0100 |
commit | 7ead2c2ff3ded34f46afe0d23c528ce900da49bc (patch) | |
tree | cd924931e4fdb78ac61b76748da6dbbdb25cb873 | |
parent | af64a8c1f20face09f4d3d525f4e28b8fbaaf82f (diff) | |
download | NetworkManager-7ead2c2ff3ded34f46afe0d23c528ce900da49bc.tar.gz |
shared: add _nm_utils_escape_plain() API
-rw-r--r-- | shared/nm-utils/nm-shared-utils.c | 36 | ||||
-rw-r--r-- | shared/nm-utils/nm-shared-utils.h | 16 |
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); +} /*****************************************************************************/ |