From: Sebastian Harl Date: Wed, 29 Oct 2008 20:24:00 +0000 (+0100) Subject: utils_subst: Added a module providing functions for string substitution. X-Git-Tag: collectd-4.6.0~167 X-Git-Url: https://git.octo.it/?p=collectd.git;a=commitdiff_plain;h=7371e2680e5111ea23ffc7c625bc5f871fb43377 utils_subst: Added a module providing functions for string substitution. Currently, the functions subst() and asubst() are available which may be used to replace parts of a string with a specified replacement text. The latter automatically allocates the memory required for the return value while the former writes to a user specified buffer. --- diff --git a/src/Makefile.am b/src/Makefile.am index e9d53e50..cd50eea1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -38,6 +38,7 @@ collectd_SOURCES = collectd.c collectd.h \ utils_tail_match.c utils_tail_match.h \ utils_match.c utils_match.h \ utils_mount.c utils_mount.h \ + utils_subst.c utils_subst.h \ utils_tail.c utils_tail.h \ utils_threshold.c utils_threshold.h \ types_list.c types_list.h diff --git a/src/utils_subst.c b/src/utils_subst.c new file mode 100644 index 00000000..05dc8441 --- /dev/null +++ b/src/utils_subst.c @@ -0,0 +1,82 @@ +/** + * collectd - src/utils_subst.c + * Copyright (C) 2008 Sebastian Harl + * + * 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; only version 2 of the License is applicable. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: + * Sebastian "tokkee" Harl + **/ + +/* + * This module provides functions for string substitution. + */ + +#include "collectd.h" +#include "common.h" + +char *subst (char *buf, size_t buflen, const char *string, int off1, int off2, + const char *replacement) +{ + char *buf_ptr = buf; + size_t len = buflen; + + if ((NULL == buf) || (0 >= buflen) || (NULL == string) + || (0 > off1) || (0 > off2) || (off1 > off2) + || (NULL == replacement)) + return NULL; + + sstrncpy (buf_ptr, string, (off1 + 1 > buflen) ? buflen : off1 + 1); + buf_ptr += off1; + len -= off1; + + if (0 >= len) + return buf; + + sstrncpy (buf_ptr, replacement, len); + buf_ptr += strlen (replacement); + len -= strlen (replacement); + + if (0 >= len) + return buf; + + sstrncpy (buf_ptr, string + off2, len); + return buf; +} /* subst */ + +char *asubst (const char *string, int off1, int off2, const char *replacement) +{ + char *buf; + int len; + + char *ret; + + if ((NULL == string) || (0 > off1) || (0 > off2) || (off1 > off2) + || (NULL ==replacement)) + return NULL; + + len = off1 + strlen (replacement) + strlen (string) - off2 + 1; + + buf = (char *)malloc (len); + if (NULL == buf) + return NULL; + + ret = subst (buf, len, string, off1, off2, replacement); + if (NULL == ret) + free (buf); + return ret; +} /* asubst */ + +/* vim: set sw=4 ts=4 tw=78 noexpandtab : */ + diff --git a/src/utils_subst.h b/src/utils_subst.h new file mode 100644 index 00000000..bba33af4 --- /dev/null +++ b/src/utils_subst.h @@ -0,0 +1,81 @@ +/** + * collectd - src/utils_subst.h + * Copyright (C) 2008 Sebastian Harl + * + * 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; only version 2 of the License is applicable. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: + * Sebastian "tokkee" Harl + **/ + +/* + * This module provides functions for string substitution. + */ + +#ifndef UTILS_SUBST_H +#define UTILS_SUBST_H 1 + +#include + +/* + * subst: + * + * Replace a substring of a string with the specified replacement text. The + * resulting string is stored in the buffer pointed to by 'buf' of length + * 'buflen'. Upon success, the buffer will always be null-terminated. The + * result may be truncated if the buffer is too small. + * + * The substring to be replaces is identified by the two offsets 'off1' and + * 'off2' where 'off1' specifies the offset to the beginning of the substring + * and 'off2' specifies the offset to the first byte after the substring. + * + * The minimum buffer size to store the complete return value (including the + * terminating '\0' character) thus has to be: + * off1 + strlen(replacement) + strlen(string) - off2 + 1 + * + * Example: + * + * 01234567890 + * string = "foo_____bar" + * ^ ^ + * | | + * off1 off2 + * + * off1 = 3 + * off2 = 8 + * + * replacement = " - " + * + * -> "foo - bar" + * + * The function returns 'buf' on success, NULL else. + */ +char *subst (char *buf, size_t buflen, const char *string, int off1, int off2, + const char *replacement); + +/* + * asubst: + * + * This function is very similar to subst(). It differs in that it + * automatically allocates the memory required for the return value which the + * user then has to free himself. + * + * Returns the newly allocated result string on success, NULL else. + */ +char *asubst (const char *string, int off1, int off2, const char *replacement); + +#endif /* UTILS_SUBST_H */ + +/* vim: set sw=4 ts=4 tw=78 noexpandtab : */ +