1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-10-27 01:55:10 +03:00

Move regex printing code from test to main tree (may use in debug messages).

Yet another optimiser fix attempt.
This commit is contained in:
Alasdair Kergon 2010-04-22 17:42:38 +00:00
parent 6753ff894f
commit d9c67df256
2 changed files with 95 additions and 76 deletions

View File

@ -16,6 +16,85 @@
#include "dmlib.h"
#include "parse_rx.h"
#ifdef DEBUG
#include <ctype.h>
static void _regex_print(struct rx_node *rx, int depth, unsigned show_nodes)
{
int i, numchars;
if (rx->left) {
if (rx->left->type != CHARSET && (show_nodes || (!((rx->type == CAT || rx->type == OR) && rx->left->type == CAT))))
printf("(");
_regex_print(rx->left, depth + 1, show_nodes);
if (rx->left->type != CHARSET && (show_nodes || (!((rx->type == CAT || rx->type == OR) && rx->left->type == CAT))))
printf(")");
}
/* display info about the node */
switch (rx->type) {
case 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 (rx->right) {
if (rx->right->type != CHARSET && (show_nodes || (!(rx->type == CAT && rx->right->type == CAT) && rx->right->right)))
printf("(");
_regex_print(rx->right, depth + 1, show_nodes);
if (rx->right->type != CHARSET && (show_nodes || (!(rx->type == CAT && rx->right->type == CAT) && rx->right->right)))
printf(")");
}
if (!depth)
printf("\n");
}
#endif /* DEBUG */
struct parse_sp { /* scratch pad for the parsing process */
struct dm_pool *mem;
int type; /* token type, 0 indicates a charset */
@ -342,10 +421,16 @@ static struct rx_node *_or_term(struct parse_sp *ps)
static unsigned _depth(struct rx_node *r, unsigned leftmost)
{
int count = 1;
int or_count = 0;
while (r->type != CHARSET && LEFT(r)) {
count++;
r = LEFT(r);
/* Stop if we pass another OR */
if (or_count)
break;
if (r->type == OR)
or_count++;
}
return count;

View File

@ -14,6 +14,7 @@
*/
/* hack - using unexported internal function */
#define DEBUG
#include "regex/parse_rx.c"
#include <stdio.h>
@ -67,86 +68,12 @@ 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 show_nodes = 0;
int regex_arg = 1;
if (argc == 3 && !strcmp(argv[1], "-r")) {
@ -155,6 +82,13 @@ int main(int argc, char **argv)
argc--;
}
if (argc == 3 && !strcmp(argv[1], "-R")) {
regex_print++;
show_nodes++;
regex_arg++;
argc--;
}
if (argc != 2) {
fprintf(stderr, "Usage : %s [-r] <regex>\n", argv[0]);
exit(0);
@ -174,7 +108,7 @@ int main(int argc, char **argv)
}
if (regex_print)
_regex_print(rx, 0);
_regex_print(rx, 0, show_nodes);
else
_pretty_print(rx, 0);