]> sourceware.org Git - lvm2.git/commitdiff
add -r to print out closer to original regex format
authorAlasdair Kergon <agk@redhat.com>
Thu, 22 Apr 2010 03:12:01 +0000 (03:12 +0000)
committerAlasdair Kergon <agk@redhat.com>
Thu, 22 Apr 2010 03:12:01 +0000 (03:12 +0000)
old-tests/regex/parse_t.c

index dff191e1b876f428e253aa0107917359e60588ab..4c3071ca3850a1c1f3c3232450bc4e5069d88b83 100644 (file)
@@ -67,13 +67,96 @@ static void _pretty_print(struct rx_node *rx, int depth)
                _pretty_print(rx->right, depth + 1);
 }
 
+static void _regex_print(struct rx_node *rx, int depth)
+{
+       int i, numchars;
+       int left_and_right = (rx->left && rx->right);
+
+       if (left_and_right && rx->type == CAT && rx->left->type == OR)
+               printf("(");
+
+       if (rx->left)
+               _regex_print(rx->left, depth + 1);
+
+       if (left_and_right && rx->type == CAT && rx->left->type == OR)
+               printf(")");
+
+       /* display info about the node */
+       switch (rx->type) {
+       case CAT:
+               //printf("Cat");
+               break;
+
+       case OR:
+               printf("|");
+               break;
+
+       case STAR:
+               printf("*");
+               break;
+
+       case PLUS:
+               printf("+");
+               break;
+
+       case QUEST:
+               printf("?");
+               break;
+
+       case CHARSET:
+               numchars = 0;
+               for (i = 0; i < 256; i++)
+                       if (dm_bit(rx->charset, i) && (isprint(i) || i == HAT_CHAR || i == DOLLAR_CHAR))
+                               numchars++;
+               if (numchars == 97) {
+                       printf(".");
+                       break;
+               }
+               if (numchars > 1)
+                       printf("[");
+               for (i = 0; i < 256; i++)
+                       if (dm_bit(rx->charset, i)) {
+                               if isprint(i)
+                                       printf("%c", (char) i);
+                               else if (i == HAT_CHAR)
+                                       printf("^");
+                               else if (i == DOLLAR_CHAR)
+                                       printf("$");
+                       }
+               if (numchars > 1)
+                       printf("]");
+               break;
+
+       default:
+               fprintf(stderr, "Unknown type");
+       }
+
+       if (left_and_right && rx->type == CAT && rx->right->type == OR)
+               printf("(");
+       if (rx->right)
+               _regex_print(rx->right, depth + 1);
+       if (left_and_right && rx->type == CAT && rx->right->type == OR)
+               printf(")");
+
+       if (!depth)
+               printf("\n");
+}
+
 int main(int argc, char **argv)
 {
        struct dm_pool *mem;
        struct rx_node *rx;
+       int regex_print = 0;
+       int regex_arg = 1;
+
+       if (argc == 3 && !strcmp(argv[1], "-r")) {
+               regex_print++;
+               regex_arg++;
+               argc--;
+       }
 
        if (argc != 2) {
-               fprintf(stderr, "Usage : %s <regex>\n", argv[0]);
+               fprintf(stderr, "Usage : %s [-r] <regex>\n", argv[0]);
                exit(0);
        }
 
@@ -84,13 +167,17 @@ int main(int argc, char **argv)
                exit(1);
        }
 
-       if (!(rx = rx_parse_str(mem, argv[1]))) {
+       if (!(rx = rx_parse_str(mem, argv[regex_arg]))) {
                dm_pool_destroy(mem);
                fprintf(stderr, "Couldn't parse regex\n");
                exit(1);
        }
 
-       _pretty_print(rx, 0);
+       if (regex_print)
+               _regex_print(rx, 0);
+       else
+               _pretty_print(rx, 0);
+
        dm_pool_destroy(mem);
 
        return 0;
This page took 0.035366 seconds and 5 git commands to generate.