[X2Go-Commits] [libx2goclient] 10/13: src/x2goclient-utils.{c, h}: add new documented function x2goclient_strbrk_dup ().
git-admin at x2go.org
git-admin at x2go.org
Sat Jun 27 14:42:21 CEST 2020
This is an automated email from the git hooks/post-receive script.
x2go pushed a commit to branch master
in repository libx2goclient.
commit c13cccb5daa1c0a5e427210c8ca3a46b73e18b40
Author: Mihai Moldovan <ionic at ionic.de>
Date: Sat Jun 27 12:51:16 2020 +0200
src/x2goclient-utils.{c,h}: add new documented function x2goclient_strbrk_dup ().
The general idea is to scan for a character and return either a copy of
the original string up until the first occurrence of the searched-for
character or bypass the copy if the original string does not contain the
searched-for character.
Additionally, if a copy took place successfully, the original string is
g_free()'d upon request and the truncated string's size returned in an
out parameter.
The error case behavior is complicated, so refer to the documentation.
---
src/x2goclient-utils.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/x2goclient-utils.h | 1 +
2 files changed, 80 insertions(+)
diff --git a/src/x2goclient-utils.c b/src/x2goclient-utils.c
index bc8c358..28eaf85 100644
--- a/src/x2goclient-utils.c
+++ b/src/x2goclient-utils.c
@@ -150,3 +150,82 @@ long long x2goclient_str_to_int (const gchar *restrict str, _Bool min, long long
return (ret);
}
+
+/**
+ * x2goclient_strbrk_dup:
+ * @haystack: (inout) (not nullable) (transfer none): pointer to input string
+ * @needle: (in): character to split/break at
+ * @free_orig: (in): request that the original string be g_free()'d at the end
+ * @new_size: (out) (nullable): will be set to the copied string's size if a
+ * copy was created
+ *
+ * Searches for the first occurrence of a specific character in a string and
+ * returns a copy of the string up to that location, potentially freeing the
+ * original string if necessary and requested via @free_orig. The truncated
+ * string's (iff truncated) size is returned via @new_size, unless an error
+ * occurred.
+ *
+ * The input parameter @haystack MUST NOT be %NULL at any time.
+ * The input parameter @needle CAN be %NULL, but that's hardly useful, since it
+ * effectively degrades the function to (a probably slower implementation of)
+ * strdup().
+ * The output parameter @new_size CAN be %NULL.
+ *
+ * Errors are indicated by returning %NULL:
+ * - If the value of @haystack is %NULL, no work will be done.
+ * - If the value pointed to by @haystack is %NULL, no work will be done.
+ * - If memory allocation failed, the value pointed to by @haystack WILL
+ * NOT be changed and NOT be g_free()'d. The caller will have to clean
+ * up. @new_size will not be touched.
+ *
+ * Otherwise, the return value will be non-%NULL:
+ * - If the value pointed to by @haystack does not contain @needle, a copy
+ * is avoided by returning the value pointed to by @haystack and setting
+ * the value pointed to by @haystack to %NULL. @free_orig will be ignored
+ * in this case. @new_size will not be touched.
+ * - Otherwise, the value pointed to by @haystack is g_free()'d and set to
+ * %NULL iff @free_orig is set to %TRUE and a copy up until the first
+ * occurrence of @needle returned. @new_size will be set to the truncated
+ * size iff it is not %NULL.
+ *
+ * Returns: either a copy of the original string up until the first occurrence
+ * of @needle or the value pointed to by @haystack (i.e., the
+ * original string) if @needle was not found, unless an error
+ * occurred
+ */
+gchar* x2goclient_strbrk_dup (gchar *restrict *haystack, const char needle, const _Bool free_orig, gsize * const new_size) {
+ gchar *ret = NULL;
+
+ g_return_val_if_fail (((NULL != haystack) && (NULL != *haystack)), ret);
+
+ const gchar *needle_pos = strchr (*haystack, needle);
+
+ if (!(needle_pos)) {
+ /* Optimization: don't copy. */
+ ret = *haystack;
+ *haystack = NULL;
+ }
+ else {
+ /* Since needle was found, the difference must be at least one. */
+ g_assert (needle_pos - *haystack);
+
+ gsize truncate_size = ((needle_pos - *haystack) - 1);
+
+ /* Don't copy the needle. */
+ ret = g_strndup (*haystack, truncate_size);
+
+ if (ret) {
+ if (free_orig) {
+ /* Get rid of the original string. */
+ g_free (*haystack);
+ *haystack = NULL;
+ }
+
+ if (new_size) {
+ *new_size = truncate_size;
+ }
+ }
+ }
+
+ return (ret);
+}
diff --git a/src/x2goclient-utils.h b/src/x2goclient-utils.h
index 5b94e52..89e0425 100644
--- a/src/x2goclient-utils.h
+++ b/src/x2goclient-utils.h
@@ -52,6 +52,7 @@ G_BEGIN_DECLS
void x2goclient_clear_strings (gpointer data);
long long x2goclient_str_to_int (const gchar *restrict str, _Bool min, long long limit_min, _Bool max, long long limit_max, const gchar **restrict end, _Bool *restrict conv_err, _Bool *restrict min_err, _Bool *restrict max_err);
+gchar* x2goclient_strbrk_dup (gchar *restrict *haystack, const char needle, const _Bool free_orig, gsize * const new_size);
G_END_DECLS
--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
More information about the x2go-commits
mailing list