diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/mm-util.c | 54 | ||||
-rw-r--r-- | src/mm-util.h | 20 |
3 files changed, 77 insertions, 1 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 8896e47e..b8fe2894 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -36,7 +36,9 @@ modem_manager_SOURCES = \ mm-serial.c \ mm-serial.h \ mm-serial-parsers.c \ - mm-serial-parsers.h + mm-serial-parsers.h \ + mm-util.c \ + mm-util.h mm-manager-glue.h: $(top_srcdir)/introspection/mm-manager.xml dbus-binding-tool --prefix=mm_manager --mode=glib-server --output=$@ $< diff --git a/src/mm-util.c b/src/mm-util.c new file mode 100644 index 00000000..33796ac6 --- /dev/null +++ b/src/mm-util.c @@ -0,0 +1,54 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ + +#include "mm-util.h" + +static gboolean +remove_eval_cb (const GMatchInfo *match_info, + GString *result, + gpointer user_data) +{ + int *result_len = (int *) user_data; + int start; + int end; + + if (g_match_info_fetch_pos (match_info, 0, &start, &end)) + *result_len -= (end - start); + + return FALSE; +} + +void +mm_util_strip_string (GString *string, + GRegex *regex, + MMUtilStripFn callback, + gpointer user_data) +{ + GMatchInfo *match_info; + gboolean matches; + char *str; + + matches = g_regex_match_full (regex, string->str, string->len, 0, 0, &match_info, NULL); + if (callback) { + while (g_match_info_matches (match_info)) { + str = g_match_info_fetch (match_info, 1); + callback (str, user_data); + g_free (str); + + g_match_info_next (match_info, NULL); + } + } + + g_match_info_free (match_info); + + if (matches) { + /* Remove matches */ + int result_len = string->len; + + str = g_regex_replace_eval (regex, string->str, string->len, 0, 0, + remove_eval_cb, &result_len, NULL); + + g_string_truncate (string, 0); + g_string_append_len (string, str, result_len); + g_free (str); + } +} diff --git a/src/mm-util.h b/src/mm-util.h new file mode 100644 index 00000000..049b5f94 --- /dev/null +++ b/src/mm-util.h @@ -0,0 +1,20 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ + +#ifndef MM_UTIL_H +#define MM_UTIL_H + +#include <glib.h> + +typedef void (*MMUtilStripFn) (const char *str, + gpointer user_data); + +/* Applies the regexp on string and calls the callback (if provided) + with each match and user_data. After that, the matches are removed + from the string. +*/ +void mm_util_strip_string (GString *string, + GRegex *regex, + MMUtilStripFn callback, + gpointer user_data); + +#endif /* MM_UTIL_H */ |