Code

table plugin, src/common: Un-escape '\t', '\n' and '\r' in column separators.
authorSebastian Harl <sh@tokkee.org>
Thu, 19 Feb 2009 12:14:35 +0000 (13:14 +0100)
committerSebastian Harl <sh@tokkee.org>
Thu, 19 Feb 2009 12:14:35 +0000 (13:14 +0100)
For this purpose, the function strunescape() has been added to the "common"
module. Currently, any escape sequence that's not '\t', '\n' or '\r' will be
expanded to the literal escaped character.

src/collectd.conf.pod
src/common.c
src/common.h
src/table.c

index a8831b92af91de222bae35b4b85acacd6f25017f..962fcfe7b9ae27261c8074aea6d2f42294cb8aca 100644 (file)
@@ -2486,6 +2486,10 @@ table is considered to be a single delimiter, i.E<nbsp>e. there cannot be any
 empty columns. The plugin uses the L<strtok_r(3)> function to parse the lines
 of a table - see its documentation for more details. This option is mandatory.
 
+A horizontal tab, newline and carriage return may be specified by C<\\t>,
+C<\\n> and C<\\r> respectively. Please note that the double backslashes are
+required because of collectd's config parsing.
+
 =back
 
 The following options are available inside a B<Result> block:
index c4994a2c2e017e44ae7c2108ed29550698b71f0e..2286088a7aa2a6488824f475f9d79066a2bc50f3 100644 (file)
@@ -315,6 +315,40 @@ int strsubstitute (char *str, char c_from, char c_to)
        return (ret);
 } /* int strsubstitute */
 
+int strunescape (char *buf, size_t buf_len)
+{
+       size_t i;
+
+       for (i = 0; (i < buf_len) && (buf[i] != '\0'); ++i)
+       {
+               if (buf[i] != '\\')
+                       continue;
+
+               if ((i >= buf_len) || (buf[i + 1] == '\0')) {
+                       ERROR ("string unescape: backslash found at end of string.");
+                       return (-1);
+               }
+
+               switch (buf[i + 1]) {
+                       case 't':
+                               buf[i] = '\t';
+                               break;
+                       case 'n':
+                               buf[i] = '\n';
+                               break;
+                       case 'r':
+                               buf[i] = '\r';
+                               break;
+                       default:
+                               buf[i] = buf[i + 1];
+                               break;
+               }
+
+               memmove (buf + i + 1, buf + i + 2, buf_len - i - 2);
+       }
+       return (0);
+} /* int strunescape */
+
 int escape_slashes (char *buf, int buf_len)
 {
        int i;
index 5b9f02cc4d8b1fbdda48fa22f7cf152f9da71dd5..72098083e53be05744a6b78e806bc9413a4c1b8d 100644 (file)
@@ -177,6 +177,29 @@ void replace_special (char *buffer, size_t buffer_size);
 
 int strsubstitute (char *str, char c_from, char c_to);
 
+/*
+ * NAME
+ *   strunescape
+ *
+ * DESCRIPTION
+ *   Replaces any escaped characters in a string with the appropriate special
+ *   characters. The following escaped characters are recognized:
+ *
+ *     \t -> <tab>
+ *     \n -> <newline>
+ *     \r -> <carriage return>
+ *
+ *   For all other escacped characters only the backslash will be removed.
+ *
+ * PARAMETERS
+ *   `buf'         String to be unescaped.
+ *   `buf_len'     Length of the string, including the terminating null-byte.
+ *
+ * RETURN VALUE
+ *   Returns zero upon success, a value less than zero else.
+ */
+int strunescape (char *buf, size_t buf_len);
+
 /*
  * NAME
  *   timeval_cmp
index d48a2ef6fffac02d05acbe8e6a9f2321aee3cb44..2911bf026a6405371f89a7719864e8a3c711fee0 100644 (file)
@@ -279,6 +279,7 @@ static int tbl_config_table (oconfig_item_t *ci)
                log_err ("Table \"%s\" does not specify any separator.", tbl->file);
                status = 1;
        }
+       strunescape (tbl->sep, strlen (tbl->sep) + 1);
 
        if (NULL == tbl->instance) {
                tbl->instance = sstrdup (tbl->file);