aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Machata <pmachata@redhat.com>2012-01-09 04:25:31 +0100
committerPetr Machata <pmachata@redhat.com>2012-08-29 19:02:07 +0200
commitce034981e2880eecb8a196c78182dfb4ae67850f (patch)
tree77878ccac43b87b54f5ec5b20cc1031dffc75219
parent31af32cfcd61671cbb5e567870103766b3231521 (diff)
downloadltrace-ce034981e2880eecb8a196c78182dfb4ae67850f.tar.gz
Replace ARGTYPE_OCTAL with lens, add also hex lens
-rw-r--r--ChangeLog8
-rw-r--r--lens_default.c50
-rw-r--r--lens_default.h9
-rw-r--r--read_config_file.c13
-rw-r--r--testsuite/ltrace.main/parameters-lib.c5
-rw-r--r--testsuite/ltrace.main/parameters.c3
-rw-r--r--testsuite/ltrace.main/parameters.conf1
-rw-r--r--testsuite/ltrace.main/parameters.exp3
-rw-r--r--type.c3
-rw-r--r--type.h1
10 files changed, 82 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index eb65058..773fc94 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/type.c b/type.c
index f4099fc..ed3f6d8 100644
--- a/type.c
+++ b/type.c
@@ -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);
}
diff --git a/type.h b/type.h
index a76761b..6ad7094 100644
--- a/type.h
+++ b/type.h
@@ -33,7 +33,6 @@ enum arg_type {
ARGTYPE_UINT,
ARGTYPE_LONG,
ARGTYPE_ULONG,
- ARGTYPE_OCTAL,
ARGTYPE_CHAR,
ARGTYPE_SHORT,
ARGTYPE_USHORT,