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 a8831b9..962fcfe 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 c4994a2..2286088 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 5b9f02c..7209808 100644 (file)
@@ -179,6 +179,29 @@ 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
  *
  * DESCRIPTION
index d48a2ef..2911bf0 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);