mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-08 08:58:50 +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:
parent
6753ff894f
commit
d9c67df256
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user