X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fcommon%2Fstring-utils%2Fstring-utils.cpp;h=63de5267442721ac861ffb666c6a6b42d332ccb4;hb=cd9adb8b829564212158943a0d279bb35322ab30;hp=3051644f34adf1a77853a7c63e2d3096318b6ff0;hpb=6e53c52d3bf42bac72d7437684657ac442499616;p=lttng-tools.git diff --git a/src/common/string-utils/string-utils.cpp b/src/common/string-utils/string-utils.cpp index 3051644f3..63de52674 100644 --- a/src/common/string-utils/string-utils.cpp +++ b/src/common/string-utils/string-utils.cpp @@ -1,32 +1,34 @@ /* * Copyright (C) 2017 Philippe Proulx * - * SPDX-License-Identifier: GPL-2.0-only + * SPDX-License-Identifier: LGPL-2.1-only * */ #define _LGPL_SOURCE +#include "../macros.hpp" +#include "string-utils.hpp" + +#include +#include +#include +#include +#include #include #include -#include #include -#include "string-utils.h" -#include "../macros.h" - enum star_glob_pattern_type_flags { STAR_GLOB_PATTERN_TYPE_FLAG_NONE = 0, STAR_GLOB_PATTERN_TYPE_FLAG_PATTERN = 1, STAR_GLOB_PATTERN_TYPE_FLAG_END_ONLY = 2, }; -static -star_glob_pattern_type_flags &operator|=(star_glob_pattern_type_flags &l, - star_glob_pattern_type_flags r) +static star_glob_pattern_type_flags& operator|=(star_glob_pattern_type_flags& l, + star_glob_pattern_type_flags r) { using T = std::underlying_type::type; - l = static_cast ( - static_cast (l) | static_cast (r)); + l = static_cast(static_cast(l) | static_cast(r)); return l; } @@ -62,7 +64,7 @@ void strutils_normalize_star_glob_pattern(char *pattern) goto end; } - /* Fall through default case. */ + /* fall through */ default: got_star = false; break; @@ -77,11 +79,9 @@ end: *np = '\0'; } -static -enum star_glob_pattern_type_flags strutils_test_glob_pattern(const char *pattern) +static enum star_glob_pattern_type_flags strutils_test_glob_pattern(const char *pattern) { - enum star_glob_pattern_type_flags ret = - STAR_GLOB_PATTERN_TYPE_FLAG_NONE; + enum star_glob_pattern_type_flags ret = STAR_GLOB_PATTERN_TYPE_FLAG_NONE; const char *p; LTTNG_ASSERT(pattern); @@ -118,8 +118,7 @@ end: */ bool strutils_is_star_glob_pattern(const char *pattern) { - return strutils_test_glob_pattern(pattern) & - STAR_GLOB_PATTERN_TYPE_FLAG_PATTERN; + return strutils_test_glob_pattern(pattern) & STAR_GLOB_PATTERN_TYPE_FLAG_PATTERN; } /* @@ -128,8 +127,7 @@ bool strutils_is_star_glob_pattern(const char *pattern) */ bool strutils_is_star_at_the_end_only_glob_pattern(const char *pattern) { - return strutils_test_glob_pattern(pattern) & - STAR_GLOB_PATTERN_TYPE_FLAG_END_ONLY; + return strutils_test_glob_pattern(pattern) & STAR_GLOB_PATTERN_TYPE_FLAG_END_ONLY; } /* @@ -144,7 +142,7 @@ char *strutils_unescape_string(const char *input, char only_char) const char *i; LTTNG_ASSERT(input); - output = (char *) zmalloc(strlen(input) + 1); + output = calloc(strlen(input) + 1); if (!output) { goto end; } @@ -247,9 +245,9 @@ void strutils_free_null_terminated_array_of_strings(char **array) * Returns -1 if there's an error. */ int strutils_split(const char *input, - char delim, - bool escape_delim, - struct lttng_dynamic_pointer_array *out_strings) + char delim, + bool escape_delim, + struct lttng_dynamic_pointer_array *out_strings) { int ret; size_t at; @@ -295,14 +293,13 @@ int strutils_split(const char *input, for (at = 0, s = input; at < number_of_substrings; at++) { const char *ss; char *d; - char *substring = (char *) zmalloc(longest_substring_len + 1); + char *substring = calloc(longest_substring_len + 1); if (!substring) { goto error; } - ret = lttng_dynamic_pointer_array_add_pointer( - out_strings, substring); + ret = lttng_dynamic_pointer_array_add_pointer(out_strings, substring); if (ret) { free(substring); goto error; @@ -360,9 +357,9 @@ end: return ret; } -size_t strutils_array_of_strings_len(char * const *array) +size_t strutils_array_of_strings_len(char *const *array) { - char * const *item; + char *const *item; size_t count = 0; LTTNG_ASSERT(array); @@ -373,3 +370,69 @@ size_t strutils_array_of_strings_len(char * const *array) return count; } + +int strutils_append_str(char **s, const char *append) +{ + char *old = *s; + char *new_str; + size_t oldlen = (old == nullptr) ? 0 : strlen(old); + size_t appendlen = strlen(append); + + new_str = zmalloc(oldlen + appendlen + 1); + if (!new_str) { + return -ENOMEM; + } + if (oldlen) { + strcpy(new_str, old); + } + strcat(new_str, append); + *s = new_str; + free(old); + return 0; +} + +int strutils_appendf(char **s, const char *fmt, ...) +{ + char *new_str; + size_t oldlen = (*s) ? strlen(*s) : 0; + int ret; + va_list args; + + /* Compute length of formatted string we append. */ + va_start(args, fmt); + ret = vsnprintf(nullptr, 0, fmt, args); + va_end(args); + + if (ret == -1) { + goto end; + } + + /* Allocate space for old string + new string + \0. */ + new_str = zmalloc(oldlen + ret + 1); + if (!new_str) { + ret = -ENOMEM; + goto end; + } + + /* Copy old string, if there was one. */ + if (oldlen) { + strcpy(new_str, *s); + } + + /* Format new string in-place. */ + va_start(args, fmt); + ret = vsprintf(&new_str[oldlen], fmt, args); + va_end(args); + + if (ret == -1) { + ret = -1; + goto end; + } + + free(*s); + *s = new_str; + new_str = nullptr; + +end: + return ret; +}