diff options
author | Petr Machata <pmachata@redhat.com> | 2012-01-09 04:25:31 +0100 |
---|---|---|
committer | Petr Machata <pmachata@redhat.com> | 2012-08-29 19:02:07 +0200 |
commit | ce034981e2880eecb8a196c78182dfb4ae67850f (patch) | |
tree | 77878ccac43b87b54f5ec5b20cc1031dffc75219 | |
parent | 31af32cfcd61671cbb5e567870103766b3231521 (diff) | |
download | ltrace-ce034981e2880eecb8a196c78182dfb4ae67850f.tar.gz |
Replace ARGTYPE_OCTAL with lens, add also hex lens
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | lens_default.c | 50 | ||||
-rw-r--r-- | lens_default.h | 9 | ||||
-rw-r--r-- | read_config_file.c | 13 | ||||
-rw-r--r-- | testsuite/ltrace.main/parameters-lib.c | 5 | ||||
-rw-r--r-- | testsuite/ltrace.main/parameters.c | 3 | ||||
-rw-r--r-- | testsuite/ltrace.main/parameters.conf | 1 | ||||
-rw-r--r-- | testsuite/ltrace.main/parameters.exp | 3 | ||||
-rw-r--r-- | type.c | 3 | ||||
-rw-r--r-- | type.h | 1 |
10 files changed, 82 insertions, 14 deletions
@@ -1,5 +1,13 @@ 2012-01-08 Petr Machata <pmachata@redhat.com> + * lens_default.c, lens_default.h (hex_lens, octal_lens): New + global variables + * read_config_file.c: Use it + * type.c, type.h (enum arg_type): Drop ARGTYPE_OCTAL + * testsuite/ltrace.main/parameters*: Test the new lenses + +2012-01-08 Petr Machata <pmachata@redhat.com> + * lens.c, lens.h: New module * display_args.c: Move this code... * lens_default.c, lens_default.h: ... here diff --git a/lens_default.c b/lens_default.c index e39f228..2693734 100644 --- a/lens_default.c +++ b/lens_default.c @@ -309,7 +309,8 @@ format_array(FILE *stream, struct value *value, struct value_dict *arguments, static int toplevel_format_lens(struct lens *lens, FILE *stream, - struct value *value, struct value_dict *arguments) + struct value *value, struct value_dict *arguments, + enum int_fmt_t int_fmt) { switch (value->type->type) { struct value *tmp; @@ -325,15 +326,14 @@ toplevel_format_lens(struct lens *lens, FILE *stream, case ARGTYPE_SHORT: case ARGTYPE_INT: case ARGTYPE_LONG: - return format_integer(stream, value, INT_FMT_i, arguments); + return format_integer(stream, value, int_fmt, arguments); case ARGTYPE_USHORT: case ARGTYPE_UINT: case ARGTYPE_ULONG: - return format_integer(stream, value, INT_FMT_u, arguments); - - case ARGTYPE_OCTAL: - return format_integer(stream, value, INT_FMT_o, arguments); + if (int_fmt == INT_FMT_i) + int_fmt = INT_FMT_u; + return format_integer(stream, value, int_fmt, arguments); case ARGTYPE_CHAR: return format_char(stream, value, arguments); @@ -379,9 +379,45 @@ static int default_lens_format_cb(struct lens *lens, FILE *stream, struct value *value, struct value_dict *arguments) { - return toplevel_format_lens(lens, stream, value, arguments); + return toplevel_format_lens(lens, stream, value, arguments, INT_FMT_i); } struct lens default_lens = { .format_cb = default_lens_format_cb, }; + + +static int +blind_lens_format_cb(struct lens *lens, FILE *stream, + struct value *value, struct value_dict *arguments) +{ + return 0; +} + +struct lens blind_lens = { + .format_cb = blind_lens_format_cb, +}; + + +static int +octal_lens_format_cb(struct lens *lens, FILE *stream, + struct value *value, struct value_dict *arguments) +{ + return toplevel_format_lens(lens, stream, value, arguments, INT_FMT_o); +} + +struct lens octal_lens = { + .format_cb = octal_lens_format_cb, +}; + + +static int +hex_lens_format_cb(struct lens *lens, FILE *stream, + struct value *value, struct value_dict *arguments) +{ + return toplevel_format_lens(lens, stream, value, arguments, INT_FMT_x); +} + +struct lens hex_lens = { + .format_cb = hex_lens_format_cb, +}; diff --git a/lens_default.h b/lens_default.h index f872b88..9269fea 100644 --- a/lens_default.h +++ b/lens_default.h @@ -26,4 +26,13 @@ /* Default lens that does reasonable job for most cases. */ extern struct lens default_lens; +/* A lens that doesn't output anything. */ +extern struct lens blind_lens; + +/* A lens that formats integers in octal. */ +extern struct lens octal_lens; + +/* A lens that formats integers in hexadecimal. */ +extern struct lens hex_lens; + #endif /* LENS_DEFAULT_H */ diff --git a/read_config_file.c b/read_config_file.c index 262aa17..2b82272 100644 --- a/read_config_file.c +++ b/read_config_file.c @@ -72,7 +72,6 @@ parse_arg_type(char **name, enum arg_type *ret) KEYWORD("uint", ARGTYPE_UINT); KEYWORD("long", ARGTYPE_LONG); KEYWORD("ulong", ARGTYPE_ULONG); - KEYWORD("octal", ARGTYPE_OCTAL); KEYWORD("char", ARGTYPE_CHAR); KEYWORD("short", ARGTYPE_SHORT); KEYWORD("ushort", ARGTYPE_USHORT); @@ -718,7 +717,6 @@ parse_nonpointer_type(char **str, struct param **extra_param, size_t param_num, case ARGTYPE_UINT: case ARGTYPE_LONG: case ARGTYPE_ULONG: - case ARGTYPE_OCTAL: case ARGTYPE_CHAR: case ARGTYPE_SHORT: case ARGTYPE_USHORT: @@ -772,6 +770,9 @@ static struct named_lens { const char *name; struct lens *lens; } lenses[] = { + { "hide", &blind_lens }, + { "octal", &octal_lens }, + { "hex", &hex_lens }, }; static struct lens * @@ -831,7 +832,13 @@ parse_lens(char **str, struct param **extra_param, size_t param_num, int *ownp) if (lens != NULL) { eat_spaces(str); - if (parse_char(str, '(') < 0) { + /* Octal lens gets special treatment, because of + * backward compatibility. */ + if (lens == &octal_lens && **str != '(') { + has_args = 0; + info = type_get_simple(ARGTYPE_INT); + *ownp = 0; + } else if (parse_char(str, '(') < 0) { report_error(filename, line_no, "expected type argument after the lens"); return NULL; diff --git a/testsuite/ltrace.main/parameters-lib.c b/testsuite/ltrace.main/parameters-lib.c index dc3e2ce..54e6a91 100644 --- a/testsuite/ltrace.main/parameters-lib.c +++ b/testsuite/ltrace.main/parameters-lib.c @@ -202,3 +202,8 @@ func_many_args(int a, int b, long c, double d, char e, int f, float g, char h, float x, float y) { } + +void +func_lens(int a, long b, short c, long d) +{ +} diff --git a/testsuite/ltrace.main/parameters.c b/testsuite/ltrace.main/parameters.c index 0d5c924..0377b73 100644 --- a/testsuite/ltrace.main/parameters.c +++ b/testsuite/ltrace.main/parameters.c @@ -197,5 +197,8 @@ main () printf("sotnuh3 %*s\n", 4, "a trimmed string"); + void func_lens(int, long, short, long); + func_lens(22, 23, 24, 25); + return 0; } diff --git a/testsuite/ltrace.main/parameters.conf b/testsuite/ltrace.main/parameters.conf index e3ee6bc..3f8fea5 100644 --- a/testsuite/ltrace.main/parameters.conf +++ b/testsuite/ltrace.main/parameters.conf @@ -23,3 +23,4 @@ struct(char,char,long,long) func_struct_large2(struct(char,char,long,long), stru struct(long,long,char,char) func_struct_large3(struct(long,long,char,char), struct(long,long,char,char)); void func_many_args(int, int, long, double, char, int, float, char, int, double, int, double, char, int, short, int, char, float, float, double, long, float, float, float, float); int printf(format); +void func_lens(octal, octal(long), hex(short), hex(long)); diff --git a/testsuite/ltrace.main/parameters.exp b/testsuite/ltrace.main/parameters.exp index 7b2fa7e..8975abe 100644 --- a/testsuite/ltrace.main/parameters.exp +++ b/testsuite/ltrace.main/parameters.exp @@ -114,3 +114,6 @@ ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1 set pattern "printf(\\\"many_args%d %d %ld %g %c %d %g .*, 1, 2, 3, 4.00*, '5', 6, 7.00*, '8', 9, 10.00*, 11, 12.00*, 'A', 14, 15, 16, 'B', 18.00*, 19.00*, 20.00*, 21, 22.00*, 23.00*, 24.00*, 25.00*)" ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1 + +set pattern "func_lens(026, 027, 0x18, 0x19)" +ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1 @@ -43,7 +43,6 @@ type_get_simple(enum arg_type type) HANDLE(ARGTYPE_UINT) HANDLE(ARGTYPE_LONG) HANDLE(ARGTYPE_ULONG) - HANDLE(ARGTYPE_OCTAL) HANDLE(ARGTYPE_CHAR) HANDLE(ARGTYPE_SHORT) HANDLE(ARGTYPE_USHORT) @@ -326,7 +325,6 @@ type_destroy(struct arg_type_info *info) case ARGTYPE_UINT: case ARGTYPE_LONG: case ARGTYPE_ULONG: - case ARGTYPE_OCTAL: case ARGTYPE_CHAR: case ARGTYPE_SHORT: case ARGTYPE_USHORT: @@ -444,7 +442,6 @@ type_sizeof(struct Process *proc, struct arg_type_info *type) /* XXX these are in fact formatting conventions, not * data types. They should be handled differently. */ - case ARGTYPE_OCTAL: case ARGTYPE_UNKNOWN: return sizeof(long); } @@ -33,7 +33,6 @@ enum arg_type { ARGTYPE_UINT, ARGTYPE_LONG, ARGTYPE_ULONG, - ARGTYPE_OCTAL, ARGTYPE_CHAR, ARGTYPE_SHORT, ARGTYPE_USHORT, |