Added SILC_STR_REGEX macro to SILC Buffer Format API.
[crypto.git] / lib / silcutil / tests / test_silcbuffmt.c
diff --git a/lib/silcutil/tests/test_silcbuffmt.c b/lib/silcutil/tests/test_silcbuffmt.c
new file mode 100644 (file)
index 0000000..dba97fd
--- /dev/null
@@ -0,0 +1,123 @@
+/* Buffer formatting tests */
+
+#include "silc.h"
+
+int print(SilcStack stack, SilcBuffer buf, void *value, void *context)
+{
+  fwrite(silc_buffer_data(buf), 1, silc_buffer_len(buf), stdout);
+  if (!silc_buffer_strchr(buf, '\n', TRUE))
+    printf("\n");
+  fflush(stdout);
+  return silc_buffer_len(buf);
+}
+
+int main(int argc, char **argv)
+{
+  SilcBool success = FALSE;
+  char string[1024];
+  SilcBufferStruct buf;
+
+  if (argc > 1 && !strcmp(argv[1], "-d")) {
+    silc_log_debug(TRUE);
+    silc_log_quick(TRUE);
+    silc_log_debug_hexdump(TRUE);
+    silc_log_set_debug_string("*buf*,*regex*,*errno*");
+  }
+
+  silc_snprintf(string, sizeof(string), "This is foobar");
+  silc_buffer_set(&buf, string, strlen(string));
+  SILC_LOG_DEBUG(("sed 's/foo/bar/'"));
+  SILC_LOG_DEBUG(("string: %s", string));
+  if (silc_buffer_format(&buf,
+                        SILC_STR_REGEX("foo", 0),
+                          SILC_STR_STRING("bar"),
+                        SILC_STR_END,
+                        SILC_STR_END) < 0)
+    goto err;
+  SILC_LOG_DEBUG(("string: %s", silc_buffer_data(&buf)));
+  if (strcmp("This is barbar", silc_buffer_data(&buf)))
+    goto err;
+
+  silc_snprintf(string, sizeof(string), "This is foobar\n");
+  silc_buffer_set(&buf, string, strlen(string));
+  SILC_LOG_DEBUG(("sed 's/\\n/\\0/'"));
+  SILC_LOG_DEBUG(("string: %s", string));
+  if (silc_buffer_format(&buf,
+                        SILC_STR_REGEX("\n", 0),
+                          SILC_STR_UINT8(0),
+                        SILC_STR_END,
+                        SILC_STR_END) < 0)
+    goto err;
+  SILC_LOG_DEBUG(("string: %s", silc_buffer_data(&buf)));
+  if (strcmp("This is foobar", silc_buffer_data(&buf)))
+    goto err;
+
+  silc_snprintf(string, sizeof(string), "foo\nfoobar\nbarfoofoo\nbar\n\nfoo");
+  silc_buffer_set(&buf, string, strlen(string));
+  SILC_LOG_DEBUG(("sed 's/foo/bar/g'"));
+  SILC_LOG_DEBUG(("string: %s", string));
+  if (silc_buffer_format(&buf,
+                        SILC_STR_REGEX("foo", SILC_STR_REGEX_NL |
+                                              SILC_STR_REGEX_ALL),
+                          SILC_STR_STRING("bar"),
+                        SILC_STR_END,
+                        SILC_STR_END) < 0)
+    goto err;
+  SILC_LOG_DEBUG(("string: %s", silc_buffer_data(&buf)));
+  if (strcmp("bar\nbarbar\nbarbarbar\nbar\n\nbar", silc_buffer_data(&buf)))
+    goto err;
+
+  silc_snprintf(string, sizeof(string),
+       "foo\nbazfoobar\nbarfoofoo\nbar\nbaz\nbazfoo");
+  silc_buffer_set(&buf, string, strlen(string));
+  SILC_LOG_DEBUG(("sed '/baz/s/foo/bar/"));
+  SILC_LOG_DEBUG(("string: %s", string));
+  if (silc_buffer_format(&buf,
+                         SILC_STR_REGEX("baz", SILC_STR_REGEX_NL),
+                           SILC_STR_REGEX("foo", SILC_STR_REGEX_ALL),
+                             SILC_STR_STRING("bar"),
+                           SILC_STR_END,
+                         SILC_STR_END, SILC_STR_END) < 0)
+    goto err;
+  SILC_LOG_DEBUG(("string: %s", silc_buffer_data(&buf)));
+  if (strcmp("foo\nbazbarbar\nbarfoofoo\nbar\nbaz\nbazbar",
+       silc_buffer_data(&buf)))
+    goto err;
+
+  silc_snprintf(string, sizeof(string),
+       "foo\nbazfoobar\nbarfoofoo\nbar\nbaz\nbazfoo");
+  silc_buffer_set(&buf, string, strlen(string));
+  SILC_LOG_DEBUG(("sed '/baz/!s/foo/bar/"));
+  SILC_LOG_DEBUG(("string: %s", string));
+  if (silc_buffer_format(&buf,
+                         SILC_STR_REGEX("baz", SILC_STR_REGEX_NL |
+                                              SILC_STR_REGEX_NOT),
+                           SILC_STR_REGEX("foo", SILC_STR_REGEX_ALL),
+                             SILC_STR_STRING("bar"),
+                           SILC_STR_END,
+                         SILC_STR_END, SILC_STR_END) < 0)
+    goto err;
+  SILC_LOG_DEBUG(("string: %s", silc_buffer_data(&buf)));
+  if (strcmp("bar\nbazfoobar\nbarbarbar\nbar\nbaz\nbazfoo",
+       silc_buffer_data(&buf)))
+    goto err;
+
+  SILC_LOG_DEBUG(("Print all lines starting with 'R'"));
+  silc_snprintf(string, sizeof(string),
+       "Rfoo\nbazfoobar\nRbarfoofoo\nRbar\nbaz\nRbazfoo");
+  silc_buffer_set(&buf, string, strlen(string));
+  SILC_LOG_DEBUG(("string: %s", string));
+  if (silc_buffer_unformat(&buf,
+                           SILC_STR_REGEX("^R", SILC_STR_REGEX_NL),
+                            SILC_STR_FUNC(print, NULL, NULL),
+                           SILC_STR_END, SILC_STR_END) < 0)
+    goto err;
+
+  success = TRUE;
+
+ err:
+  SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+  fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+
+  return success;
+}