summaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
authorLukas Slebodnik <lslebodn@redhat.com>2014-07-25 10:22:59 +0200
committerJakub Hrozek <jhrozek@redhat.com>2014-07-28 10:11:49 +0200
commit022c6b90bb37851c0e8704c0e5388ebc113c6470 (patch)
treebec16e36bf26ddefc4b1d8e5be99be2ea5812680 /src/util
parent462db32918a05097652f8232cd6c8d78a826e63c (diff)
downloadsssd-022c6b90bb37851c0e8704c0e5388ebc113c6470.tar.gz
sssd-022c6b90bb37851c0e8704c0e5388ebc113c6470.tar.xz
sssd-022c6b90bb37851c0e8704c0e5388ebc113c6470.zip
UTIL: Add functions for replacing whitespaces.
Reviewed-by: Pavel Reichl <preichl@redhat.com> Reviewed-by: Michal Židek <mzidek@redhat.com>
Diffstat (limited to 'src/util')
-rw-r--r--src/util/string_utils.c150
-rw-r--r--src/util/util.h8
2 files changed, 158 insertions, 0 deletions
diff --git a/src/util/string_utils.c b/src/util/string_utils.c
new file mode 100644
index 000000000..8d878923f
--- /dev/null
+++ b/src/util/string_utils.c
@@ -0,0 +1,150 @@
+/*
+ SSSD
+
+ Authors:
+ Lukas Slebodnik <slebodnikl@redhat.com>
+
+ Copyright (C) 2014 Red Hat
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "util/util.h"
+
+const char * sss_replace_whitespaces(TALLOC_CTX *mem_ctx,
+ const char *orig_name,
+ const char *replace_string)
+{
+ char *new_name;
+ const char *ptr;
+ size_t replace_string_len;
+ TALLOC_CTX *tmp_ctx;
+
+ if (replace_string == NULL || replace_string[0] == '\0') {
+ return orig_name;
+ }
+
+ replace_string_len = strlen(replace_string);
+ /* faster implementations without multiple allocations */
+ if (replace_string_len == 1) {
+ char *p;
+ new_name = talloc_strdup(mem_ctx, orig_name);
+ if (new_name == NULL) {
+ return NULL;
+ }
+
+ for (p = new_name; *p != '\0'; ++p) {
+ if (isspace(*p)) {
+ *p = replace_string[0];
+ }
+ }
+
+ return new_name;
+ }
+
+ tmp_ctx = talloc_new(NULL);
+ if (tmp_ctx == NULL) {
+ return NULL;
+ }
+
+ new_name = talloc_strdup(tmp_ctx, "");
+ if (new_name == NULL) {
+ goto done;
+ }
+
+ ptr = orig_name;
+ while (*ptr != '\0') {
+ if (isspace(*ptr)) {
+ new_name = talloc_asprintf_append(new_name, "%s", replace_string);
+ } else {
+ new_name = talloc_asprintf_append(new_name, "%c", *ptr);
+ }
+ if (new_name == NULL) {
+ goto done;;
+ }
+
+ ++ptr;
+ }
+
+ new_name = talloc_steal(mem_ctx, new_name);
+done:
+ talloc_free(tmp_ctx);
+ return new_name;
+}
+
+char * sss_reverse_replace_whitespaces(TALLOC_CTX *mem_ctx,
+ char *orig_name,
+ const char *replace_string)
+{
+ TALLOC_CTX *tmp_ctx;
+ char *substr;
+ char *new_name;
+ const char *ptr = orig_name;
+ size_t replace_string_len;
+
+ if (replace_string == NULL || replace_string[0] == '\0') {
+ return orig_name;
+ }
+
+ replace_string_len = strlen(replace_string);
+ /* faster implementations without multiple allocations */
+ if (replace_string_len == 1) {
+ char *p;
+ new_name = talloc_strdup(mem_ctx, orig_name);
+ if (new_name == NULL) {
+ return NULL;
+ }
+
+ for (p = new_name; *p != '\0'; ++p) {
+ if (*p == replace_string[0] ) {
+ *p = ' ';
+ }
+ }
+
+ return new_name;
+ }
+
+ tmp_ctx = talloc_new(NULL);
+ if (tmp_ctx == NULL) {
+ return NULL;
+ }
+
+ new_name = talloc_strdup(tmp_ctx, "");
+ if (new_name == NULL) {
+ goto done;
+ }
+
+ do {
+ substr = strstr(ptr, replace_string);
+ if (substr != NULL) {
+ new_name = talloc_asprintf_append(new_name, "%.*s ",
+ (int)(substr - ptr), ptr);
+ if (new_name == NULL) {
+ goto done;
+ }
+ ptr += substr - ptr;
+ ptr += replace_string_len;
+ } else {
+ new_name = talloc_asprintf_append(new_name, "%s", ptr);
+ if (new_name == NULL) {
+ goto done;
+ }
+ }
+ } while (substr != NULL);
+
+ new_name = talloc_steal(mem_ctx, new_name);
+done:
+ talloc_free(tmp_ctx);
+ return new_name;
+}
diff --git a/src/util/util.h b/src/util/util.h
index cc1a38283..35a8814e5 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -567,4 +567,12 @@ errno_t well_known_sid_to_name(const char *sid, const char **dom,
errno_t name_to_well_known_sid(const char *dom, const char *name,
const char **sid);
+/* from string_utils.c */
+const char * sss_replace_whitespaces(TALLOC_CTX *mem_ctx,
+ const char *orig_name,
+ const char *replace_string);
+char * sss_reverse_replace_whitespaces(TALLOC_CTX *mem_ctx,
+ char *orig_name,
+ const char *replace_string);
+
#endif /* __SSSD_UTIL_H__ */