diff options
author | Steven Rostedt <srostedt@redhat.com> | 2010-06-17 16:20:46 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-06-17 16:20:46 -0400 |
commit | 11c82fa61b369684e8d4761c82712d8c7de978b7 (patch) | |
tree | 16b0b75e936e80e4f6231840d44b034e3f7b533a | |
parent | 315ff6f8c9e9e899d655d75d5f5203c8b0047b0b (diff) |
parse-events: Use all the printf fields of a %s
If a %s has options like %8.2s, we still want to process it.
Pass the format off to the string processing to do so.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | parse-events.c | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/parse-events.c b/parse-events.c index c0118aa..082fe3b 100644 --- a/parse-events.c +++ b/parse-events.c | |||
@@ -3041,15 +3041,23 @@ static unsigned long long eval_flag(const char *flag) | |||
3041 | return 0; | 3041 | return 0; |
3042 | } | 3042 | } |
3043 | 3043 | ||
3044 | static void print_str_to_seq(struct trace_seq *s, const char *format, | ||
3045 | int len_arg, const char *str) | ||
3046 | { | ||
3047 | if (len_arg >= 0) | ||
3048 | trace_seq_printf(s, format, len_arg, str); | ||
3049 | else | ||
3050 | trace_seq_printf(s, format, str); | ||
3051 | } | ||
3052 | |||
3044 | static void print_str_arg(struct trace_seq *s, void *data, int size, | 3053 | static void print_str_arg(struct trace_seq *s, void *data, int size, |
3045 | struct event_format *event, | 3054 | struct event_format *event, const char *format, |
3046 | int len_arg, struct print_arg *arg) | 3055 | int len_arg, struct print_arg *arg) |
3047 | { | 3056 | { |
3048 | struct pevent *pevent = event->pevent; | 3057 | struct pevent *pevent = event->pevent; |
3049 | struct print_flag_sym *flag; | 3058 | struct print_flag_sym *flag; |
3050 | unsigned long long val, fval; | 3059 | unsigned long long val, fval; |
3051 | unsigned long addr; | 3060 | unsigned long addr; |
3052 | int len_as_arg = len_arg >= 0; | ||
3053 | char *str; | 3061 | char *str; |
3054 | int print; | 3062 | int print; |
3055 | int len; | 3063 | int len; |
@@ -3059,7 +3067,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, | |||
3059 | /* ?? */ | 3067 | /* ?? */ |
3060 | return; | 3068 | return; |
3061 | case PRINT_ATOM: | 3069 | case PRINT_ATOM: |
3062 | trace_seq_puts(s, arg->atom.atom); | 3070 | print_str_to_seq(s, format, len_arg, arg->atom.atom); |
3063 | return; | 3071 | return; |
3064 | case PRINT_FIELD: | 3072 | case PRINT_FIELD: |
3065 | if (!arg->field.field) { | 3073 | if (!arg->field.field) { |
@@ -3084,10 +3092,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, | |||
3084 | str = malloc_or_die(len + 1); | 3092 | str = malloc_or_die(len + 1); |
3085 | memcpy(str, data + arg->field.field->offset, len); | 3093 | memcpy(str, data + arg->field.field->offset, len); |
3086 | str[len] = 0; | 3094 | str[len] = 0; |
3087 | if (len_as_arg) | 3095 | print_str_to_seq(s, format, len_arg, str); |
3088 | trace_seq_printf(s, "%.*s", len_arg, str); | ||
3089 | else | ||
3090 | trace_seq_puts(s, str); | ||
3091 | free(str); | 3096 | free(str); |
3092 | break; | 3097 | break; |
3093 | case PRINT_FLAGS: | 3098 | case PRINT_FLAGS: |
@@ -3096,19 +3101,13 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, | |||
3096 | for (flag = arg->flags.flags; flag; flag = flag->next) { | 3101 | for (flag = arg->flags.flags; flag; flag = flag->next) { |
3097 | fval = eval_flag(flag->value); | 3102 | fval = eval_flag(flag->value); |
3098 | if (!val && !fval) { | 3103 | if (!val && !fval) { |
3099 | if (len_as_arg) | 3104 | print_str_to_seq(s, format, len_arg, flag->str); |
3100 | trace_seq_printf(s, "%.*s", len_arg, flag->str); | ||
3101 | else | ||
3102 | trace_seq_puts(s, flag->str); | ||
3103 | break; | 3105 | break; |
3104 | } | 3106 | } |
3105 | if (fval && (val & fval) == fval) { | 3107 | if (fval && (val & fval) == fval) { |
3106 | if (print && arg->flags.delim) | 3108 | if (print && arg->flags.delim) |
3107 | trace_seq_puts(s, arg->flags.delim); | 3109 | trace_seq_puts(s, arg->flags.delim); |
3108 | if (len_as_arg) | 3110 | print_str_to_seq(s, format, len_arg, flag->str); |
3109 | trace_seq_printf(s, "%.*s", len_arg, flag->str); | ||
3110 | else | ||
3111 | trace_seq_puts(s, flag->str); | ||
3112 | print = 1; | 3111 | print = 1; |
3113 | val &= ~fval; | 3112 | val &= ~fval; |
3114 | } | 3113 | } |
@@ -3119,10 +3118,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, | |||
3119 | for (flag = arg->symbol.symbols; flag; flag = flag->next) { | 3118 | for (flag = arg->symbol.symbols; flag; flag = flag->next) { |
3120 | fval = eval_flag(flag->value); | 3119 | fval = eval_flag(flag->value); |
3121 | if (val == fval) { | 3120 | if (val == fval) { |
3122 | if (len_as_arg) | 3121 | print_str_to_seq(s, format, len_arg, flag->str); |
3123 | trace_seq_printf(s, "%.*s", len_arg, flag->str); | ||
3124 | else | ||
3125 | trace_seq_puts(s, flag->str); | ||
3126 | break; | 3122 | break; |
3127 | } | 3123 | } |
3128 | } | 3124 | } |
@@ -3141,10 +3137,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, | |||
3141 | } | 3137 | } |
3142 | str_offset = data2host4(pevent, data + arg->string.offset); | 3138 | str_offset = data2host4(pevent, data + arg->string.offset); |
3143 | str_offset &= 0xffff; | 3139 | str_offset &= 0xffff; |
3144 | if (len_as_arg) | 3140 | print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset); |
3145 | trace_seq_printf(s, "%.*s", len_arg, ((char *)data) + str_offset); | ||
3146 | else | ||
3147 | trace_seq_puts(s, ((char *)data) + str_offset); | ||
3148 | break; | 3141 | break; |
3149 | } | 3142 | } |
3150 | case PRINT_OP: | 3143 | case PRINT_OP: |
@@ -3155,9 +3148,11 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, | |||
3155 | return; | 3148 | return; |
3156 | val = eval_num_arg(data, size, event, arg->op.left); | 3149 | val = eval_num_arg(data, size, event, arg->op.left); |
3157 | if (val) | 3150 | if (val) |
3158 | print_str_arg(s, data, size, event, len_arg, arg->op.right->op.left); | 3151 | print_str_arg(s, data, size, event, |
3152 | format, len_arg, arg->op.right->op.left); | ||
3159 | else | 3153 | else |
3160 | print_str_arg(s, data, size, event, len_arg, arg->op.right->op.right); | 3154 | print_str_arg(s, data, size, event, |
3155 | format, len_arg, arg->op.right->op.right); | ||
3161 | break; | 3156 | break; |
3162 | case PRINT_FUNC: | 3157 | case PRINT_FUNC: |
3163 | process_defined_func(s, data, size, event, arg); | 3158 | process_defined_func(s, data, size, event, arg); |
@@ -3202,7 +3197,7 @@ process_defined_func(struct trace_seq *s, void *data, int size, | |||
3202 | break; | 3197 | break; |
3203 | case PEVENT_FUNC_ARG_STRING: | 3198 | case PEVENT_FUNC_ARG_STRING: |
3204 | trace_seq_init(&str); | 3199 | trace_seq_init(&str); |
3205 | print_str_arg(&str, data, size, event, -1, farg); | 3200 | print_str_arg(&str, data, size, event, "%s", -1, farg); |
3206 | trace_seq_terminate(&str); | 3201 | trace_seq_terminate(&str); |
3207 | string = malloc_or_die(sizeof(*string)); | 3202 | string = malloc_or_die(sizeof(*string)); |
3208 | string->next = strings; | 3203 | string->next = strings; |
@@ -3612,7 +3607,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event | |||
3612 | (unsigned long)saveptr; | 3607 | (unsigned long)saveptr; |
3613 | 3608 | ||
3614 | /* should never happen */ | 3609 | /* should never happen */ |
3615 | if (len > 32) | 3610 | if (len > 31) |
3616 | die("bad format!"); | 3611 | die("bad format!"); |
3617 | 3612 | ||
3618 | memcpy(format, saveptr, len); | 3613 | memcpy(format, saveptr, len); |
@@ -3671,9 +3666,19 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event | |||
3671 | if (!arg) | 3666 | if (!arg) |
3672 | die("no matching argument"); | 3667 | die("no matching argument"); |
3673 | 3668 | ||
3669 | len = ((unsigned long)ptr + 1) - | ||
3670 | (unsigned long)saveptr; | ||
3671 | |||
3672 | /* should never happen */ | ||
3673 | if (len > 31) | ||
3674 | die("bad format!"); | ||
3675 | |||
3676 | memcpy(format, saveptr, len); | ||
3677 | format[len] = 0; | ||
3674 | if (!len_as_arg) | 3678 | if (!len_as_arg) |
3675 | len_arg = -1; | 3679 | len_arg = -1; |
3676 | print_str_arg(s, data, size, event, len_arg, arg); | 3680 | print_str_arg(s, data, size, event, |
3681 | format, len_arg, arg); | ||
3677 | arg = arg->next; | 3682 | arg = arg->next; |
3678 | break; | 3683 | break; |
3679 | default: | 3684 | default: |