Replace ARGTYPE_OCTAL with lens, add also hex lens
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 @@
 
 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 @@
 	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 @@
 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 @@
 	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 @@
 	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 @@
 	const char *name;
 	struct lens *lens;
 } lenses[] = {
+	{ "hide", &blind_lens },
+	{ "octal", &octal_lens },
+	{ "hex", &hex_lens },
 };
 
 static struct lens *
@@ -831,7 +832,13 @@
 	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 @@
 	       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 @@
 
   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(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 @@
 
 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 @@
 	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 @@
 	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 @@
 
 	/* 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 @@
 	ARGTYPE_UINT,
 	ARGTYPE_LONG,
 	ARGTYPE_ULONG,
-	ARGTYPE_OCTAL,
 	ARGTYPE_CHAR,
 	ARGTYPE_SHORT,
 	ARGTYPE_USHORT,