diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2010-03-23 12:16:56 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2010-03-23 12:16:56 -0400 |
| commit | 0840b9aa7d991c6d0c6aa16947bedf7aa89a4e69 (patch) | |
| tree | 4f920adab99fcf99c4f9bc9b1f7c531c91f72135 | |
| parent | 534080da20a95d4bb0d70bca42c0dac0305669da (diff) | |
parse-events: Handle operations within a condition
The conditon ? : does not handle other operations within it (like << which
the ext4 tracepoints added). This patch makes the conditions handle operations
within them.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
| -rw-r--r-- | parse-events.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/parse-events.c b/parse-events.c index e942916..3c2e9a0 100644 --- a/parse-events.c +++ b/parse-events.c | |||
| @@ -1419,6 +1419,9 @@ process_arg(struct event_format *event, struct print_arg *arg, char **tok) | |||
| 1419 | } | 1419 | } |
| 1420 | 1420 | ||
| 1421 | static enum event_type | 1421 | static enum event_type |
| 1422 | process_op(struct event_format *event, struct print_arg *arg, char **tok); | ||
| 1423 | |||
| 1424 | static enum event_type | ||
| 1422 | process_cond(struct event_format *event, struct print_arg *top, char **tok) | 1425 | process_cond(struct event_format *event, struct print_arg *top, char **tok) |
| 1423 | { | 1426 | { |
| 1424 | struct print_arg *arg, *left, *right; | 1427 | struct print_arg *arg, *left, *right; |
| @@ -1435,6 +1438,14 @@ process_cond(struct event_format *event, struct print_arg *top, char **tok) | |||
| 1435 | 1438 | ||
| 1436 | *tok = NULL; | 1439 | *tok = NULL; |
| 1437 | type = process_arg(event, left, &token); | 1440 | type = process_arg(event, left, &token); |
| 1441 | |||
| 1442 | again: | ||
| 1443 | /* Handle other operations in the arguments */ | ||
| 1444 | if (type == EVENT_OP && strcmp(token, ":") != 0) { | ||
| 1445 | type = process_op(event, left, &token); | ||
| 1446 | goto again; | ||
| 1447 | } | ||
| 1448 | |||
| 1438 | if (test_type_token(type, token, EVENT_OP, ":")) | 1449 | if (test_type_token(type, token, EVENT_OP, ":")) |
| 1439 | goto out_free; | 1450 | goto out_free; |
| 1440 | 1451 | ||
| @@ -1670,7 +1681,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok) | |||
| 1670 | goto out_free; | 1681 | goto out_free; |
| 1671 | } | 1682 | } |
| 1672 | 1683 | ||
| 1673 | if (type == EVENT_OP) { | 1684 | if (type == EVENT_OP && strcmp(*tok, ":") != 0) { |
| 1674 | int prio; | 1685 | int prio; |
| 1675 | 1686 | ||
| 1676 | /* higher prios need to be closer to the root */ | 1687 | /* higher prios need to be closer to the root */ |
| @@ -2860,6 +2871,14 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg | |||
| 2860 | if (typearg) | 2871 | if (typearg) |
| 2861 | val = eval_type(val, typearg, 1); | 2872 | val = eval_type(val, typearg, 1); |
| 2862 | break; | 2873 | break; |
| 2874 | } else if (strcmp(arg->op.op, "?") == 0) { | ||
| 2875 | left = eval_num_arg(data, size, event, arg->op.left); | ||
| 2876 | arg = arg->op.right; | ||
| 2877 | if (left) | ||
| 2878 | val = eval_num_arg(data, size, event, arg->op.left); | ||
| 2879 | else | ||
| 2880 | val = eval_num_arg(data, size, event, arg->op.right); | ||
| 2881 | break; | ||
| 2863 | } | 2882 | } |
| 2864 | default_op: | 2883 | default_op: |
| 2865 | left = eval_num_arg(data, size, event, arg->op.left); | 2884 | left = eval_num_arg(data, size, event, arg->op.left); |
