Added silc_subst, regex matching and substitution with the
[silc.git] / lib / silcutil / tests / test_silcregex.c
index 41c51ad3fc969a19d036f053b76b48b9946071a3..c1c6b44b8093c297f872242d423ef2bb4d7dd816 100644 (file)
@@ -6,8 +6,8 @@ int main(int argc, char **argv)
 {
   SilcBool success = FALSE;
   SilcRegexStruct reg;
-  SilcRegexMatchStruct match[10];
-  int i, num_match = 10;
+  SilcRegexMatchStruct match[20];
+  int i, num_match = 20;
   char *regex, *string, *sub;
   SilcBufferStruct bmatch;
 
@@ -15,9 +15,261 @@ int main(int argc, char **argv)
     silc_log_debug(TRUE);
     silc_log_quick(TRUE);
     silc_log_debug_hexdump(TRUE);
-    silc_log_set_debug_string("*regex*,*errno*");
+    silc_log_set_debug_string("*regex*,*errno*,*buffmt*");
   }
 
+  string = silc_strdup("foobar");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "s/foo/bar/"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch, "barbar", 6))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar foobar");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "s/foo/bar/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch, "barbar barbar", 13))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar foobar");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "s/foo/bar/"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch, "barbar foobar", 13))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar foobar\nfoobar");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "s/foo/BARBAR/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch, "BARBARbar\nBARBARbar BARBARbar\nBARBARbar",
+                         39))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar foobar\nfoobar");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "s/foo/BARBAR/"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch, "BARBARbar\nBARBARbar foobar\nBARBARbar",
+                         36))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar foobar\nfoobar");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "s/foo//"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch, "bar\nbar foobar\nbar",
+                         18))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar foobar\nfoobar");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "s/foo/B/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch, "Bbar\nBbar Bbar\nBbar",
+                         19))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar foobar\nfoobar");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "s/foo/B/"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch, "Bbar\nBbar foobar\nBbar",
+                         21))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nBfoobar foobar\nBfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "/^B/s/foo/B/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch, "foobar\nBBbar Bbar\nBBbar\nfoo",
+                         27))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "/baz/s/foo/BARBAR/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+                         "foobar\nBARBARbar baz BARBARbar\nbazBARBARbar\nfoo",
+                         47))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "/baz/s/foo/BARBAR/"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+                         "foobar\nBARBARbar baz foobar\nbazBARBARbar\nfoo",
+                         44))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "/baz/!s/foo/BARBAR/"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+                         "BARBARbar\nfoobar baz foobar\nbazfoobar\nBARBAR",
+                         44))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "2s/foo/BARBAR/"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+                         "foobar\nBARBARbar baz foobar\nbazfoobar\nfoo",
+                         41))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "2s/foo/BARBAR/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+                         "foobar\nBARBARbar baz BARBARbar\nbazfoobar\nfoo",
+                         44))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "200s/foo/BARBAR/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+                         "foobar\nfoobar baz foobar\nbazfoobar\nfoo",
+                         38))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "2!s/foo/BARBAR/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+                         "BARBARbar\nfoobar baz foobar\nbazBARBARbar\nBARBAR",
+                         47))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "/xxx/s/foo/BARBAR/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+                         "foobar\nfoobar baz foobar\nbazfoobar\nfoo",
+                         38))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "!s/foo/BARBAR/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+                         "foobar\nfoobar baz foobar\nbazfoobar\nfoo",
+                         38))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "$s/foo/BARBAR/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+                         "foobar\nfoobar baz foobar\nbazfoobar\nBARBAR",
+                         41))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "$!s/foo/BARBAR/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+               "BARBARbar\nBARBARbar baz BARBARbar\nbazBARBARbar\nfoo",
+                         50))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar /baz/ foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "s/\\//BARBAR/g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+               "foobar\nfoobar BARBARbazBARBAR foobar\nbazfoobar\nfoo",
+                         50))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
+  string = silc_strdup("foobar\nfoobar /baz/ foobar\nbazfoobar\nfoo");
+  SILC_LOG_DEBUG(("Replace %s", string));
+  silc_buffer_set(&bmatch, string, strlen(string));
+  if (!silc_subst(&bmatch, "s/\\//\\/\\//g"))
+    goto err;
+  silc_buffer_printf(&bmatch, TRUE);
+  if (!silc_buffer_memcmp(&bmatch,
+               "foobar\nfoobar //baz// foobar\nbazfoobar\nfoo",
+                         42))
+    goto err;
+  silc_buffer_purge(&bmatch);
+
   regex = ".{5}";
   SILC_LOG_DEBUG(("Regex %s", regex));
   string = "abcdefghijklmn";
@@ -199,7 +451,6 @@ int main(int argc, char **argv)
   if (silc_regex(string, regex, &bmatch, NULL))
     goto err;
 
-
   regex = "(H..).(o..)";
   SILC_LOG_DEBUG(("Regex %s", regex));
   if (!silc_regex_compile(&reg, regex, 0))
@@ -213,7 +464,7 @@ int main(int argc, char **argv)
     if (match[i].start != -1) {
       SILC_LOG_DEBUG(("Match start %d, end %d", match[i].start,
                      match[i].end));
-      sub = silc_memdup(string + match[i].start, match[i].end - 
+      sub = silc_memdup(string + match[i].start, match[i].end -
                        match[i].start);
       SILC_LOG_DEBUG(("Match substring '%s'", sub));
       silc_free(sub);
@@ -255,7 +506,7 @@ int main(int argc, char **argv)
   for (i = 0; i < num_match; i++) {
     if (match[i].start != -1) {
       SILC_LOG_DEBUG(("Match start %d", match[i].start));
-      sub = silc_memdup(string + match[i].start, match[i].end - 
+      sub = silc_memdup(string + match[i].start, match[i].end -
                        match[i].start);
       SILC_LOG_DEBUG(("Match substring '%s'", sub));
       silc_free(sub);
@@ -277,7 +528,7 @@ int main(int argc, char **argv)
   for (i = 0; i < num_match; i++) {
     if (match[i].start != -1) {
       SILC_LOG_DEBUG(("Match start %d", match[i].start));
-      sub = silc_memdup(string + match[i].start, match[i].end - 
+      sub = silc_memdup(string + match[i].start, match[i].end -
                        match[i].start);
       SILC_LOG_DEBUG(("Match substring '%s'", sub));
       silc_free(sub);
@@ -292,7 +543,7 @@ int main(int argc, char **argv)
   for (i = 0; i < num_match; i++) {
     if (match[i].start != -1) {
       SILC_LOG_DEBUG(("Match start %d", match[i].start));
-      sub = silc_memdup(string + match[i].start, match[i].end - 
+      sub = silc_memdup(string + match[i].start, match[i].end -
                        match[i].start);
       SILC_LOG_DEBUG(("Match substring '%s'", sub));
       silc_free(sub);
@@ -314,7 +565,7 @@ int main(int argc, char **argv)
   for (i = 0; i < num_match; i++) {
     if (match[i].start != -1) {
       SILC_LOG_DEBUG(("Match start %d", match[i].start));
-      sub = silc_memdup(string + match[i].start, match[i].end - 
+      sub = silc_memdup(string + match[i].start, match[i].end -
                        match[i].start);
       SILC_LOG_DEBUG(("Match substring '%s'", sub));
       silc_free(sub);
@@ -363,4 +614,3 @@ int main(int argc, char **argv)
 
   return success;
 }
-