File ltrace.trunk-r62.patch of Package ltrace

------------------------------------------------------------------------
r62 | ianw-guest | 2006-08-07 03:59:59 +0000 (Mon, 07 Aug 2006) | 3 lines
Changed paths:
   M /ltrace/trunk/ChangeLog
   M /ltrace/trunk/etc/ltrace.conf
   M /ltrace/trunk/read_config_file.c
   M /ltrace/trunk/testsuite/ltrace.main/parameters-lib.c
   M /ltrace/trunk/testsuite/ltrace.main/parameters.c
   M /ltrace/trunk/testsuite/ltrace.main/parameters.conf
   M /ltrace/trunk/testsuite/ltrace.main/parameters.exp

typedefs


------------------------------------------------------------------------
---
 ChangeLog                              |    8 +++
 etc/ltrace.conf                        |    9 ++++
 read_config_file.c                     |   71 +++++++++++++++++++++++++++++++++
 testsuite/ltrace.main/parameters-lib.c |    5 ++
 testsuite/ltrace.main/parameters.c     |    3 +
 testsuite/ltrace.main/parameters.conf  |    2 
 testsuite/ltrace.main/parameters.exp   |    2 
 7 files changed, 100 insertions(+)

Index: read_config_file.c
===================================================================
--- read_config_file.c.orig
+++ read_config_file.c
@@ -15,6 +15,8 @@ static int line_no;
 static char *filename;
 static int error_count = 0;
 
+static arg_type_info *parse_type(char **str);
+
 struct function *list_of_functions = NULL;
 
 static struct list_of_pt_t {
@@ -214,13 +216,82 @@ static int parse_argnum(char **str)
     return n * multiplier;
 }
 
+struct typedef_node_t {
+    char *name;
+    arg_type_info *info;
+    struct typedef_node_t *next;
+} *typedefs = NULL;
+
+static arg_type_info *lookup_typedef(char **str)
+{
+    struct typedef_node_t *node;
+    char *end = *str;
+    while (*end && (isalnum(*end) || *end == '_'))
+	++end;
+    if (end == *str)
+	return NULL;
+
+    for (node = typedefs; node != NULL; node = node->next) {
+	if (strncmp(*str, node->name, end - *str) == 0) {
+	    (*str) += strlen(node->name);
+	    return node->info;
+	}
+    }
+
+    return NULL;
+}
+
+static void parse_typedef(char **str)
+{
+    char *name;
+    arg_type_info *info;
+    struct typedef_node_t *binding;
+
+    (*str) += strlen("typedef");
+    eat_spaces(str);
+
+    // Grab out the name of the type
+    name = parse_ident(str);
+
+    // Skip = sign
+    eat_spaces(str);
+    if (**str != '=') {
+	output_line(0,
+		    "Syntax error in `%s', line %d: expected '=', got '%c'",
+		    filename, line_no, **str);
+	error_count++;
+	return;
+    }
+    (*str)++;
+    eat_spaces(str);
+
+    // Parse the type
+    info = parse_type(str);
+
+    // Insert onto beginning of linked list
+    binding = malloc(sizeof(*binding));
+    binding->name = name;
+    binding->info = info;
+    binding->next = typedefs;
+    typedefs = binding;
+}
+
 static arg_type_info *parse_nonpointer_type(char **str)
 {
 	arg_type_info *simple;
 	arg_type_info *info;
 
+	if (strncmp(*str, "typedef", 7) == 0) {
+	    parse_typedef(str);
+	    return lookup_singleton(ARGTYPE_UNKNOWN);
+	}
+
 	simple = str2type(str);
 	if (simple->type == ARGTYPE_UNKNOWN) {
+	    info = lookup_typedef(str);
+	    if (info)
+		return info;
+	    else
 		return simple;		// UNKNOWN
 	}
 
Index: ChangeLog
===================================================================
--- ChangeLog.orig
+++ ChangeLog
@@ -1,5 +1,13 @@
 2006-08-07  Steve Fink <sphink@gmail.com>
 
+	* etc/ltrace.conf, read_config_file.c,
+	testsuite/ltrace.main/parameters-lib.c,
+	testsuite/ltrace.main/parameters.c,
+	testsuite/ltrace.main/parameters.conf,
+	testsuite/ltrace.main/parameters.exp: add ability to typedef
+
+2006-08-07  Steve Fink <sphink@gmail.com>
+
 	* display_args.c, etc/ltrace.conf, ltrace.h, read_config_file.c,
 	testsuite/ltrace.main/parameters-lib.c,
 	testsuite/ltrace.main/parameters.c,
Index: testsuite/ltrace.main/parameters.c
===================================================================
--- testsuite/ltrace.main/parameters.c.orig
+++ testsuite/ltrace.main/parameters.c
@@ -31,6 +31,7 @@ typedef enum {
   PETUNIA
 } color_t;
 void func_enum(color_t);
+void func_typedef(color_t);
 
 int 
 main ()
@@ -67,5 +68,7 @@ main ()
   func_ushort(33, 34);
   func_float(3.4, -3.4);
 
+  func_typedef(BLUE);
+
   return 0;
 }
Index: testsuite/ltrace.main/parameters.conf
===================================================================
--- testsuite/ltrace.main/parameters.conf.orig
+++ testsuite/ltrace.main/parameters.conf
@@ -9,3 +9,5 @@ void func_enum(enum (RED=0,GREEN=1,BLUE=
 void func_short(short,short)
 void func_ushort(ushort, ushort)
 void func_float(float,float)
+typedef color = enum (RED=0,GREEN=1,BLUE=2,CHARTREUSE=3,PETUNIA=4)
+void func_typedef(color)
Index: testsuite/ltrace.main/parameters-lib.c
===================================================================
--- testsuite/ltrace.main/parameters-lib.c.orig
+++ testsuite/ltrace.main/parameters-lib.c
@@ -56,3 +56,8 @@ void func_float(float f1, float f2)
 {
 	printf("%f %f\n", f1, f2);
 }
+
+void func_typedef(int x)
+{
+	printf("typedef'd enum: %d\n", x);
+}
Index: testsuite/ltrace.main/parameters.exp
===================================================================
--- testsuite/ltrace.main/parameters.exp.orig
+++ testsuite/ltrace.main/parameters.exp
@@ -58,5 +58,7 @@ set pattern "func_ushort(33, 34)"
 ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 1
 set pattern "func_float(3.40*, -3.40*)"
 ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 1
+set pattern "func_typedef(BLUE)"
+ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 1
 set pattern "exited (status 0)"
 ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 1
Index: etc/ltrace.conf
===================================================================
--- etc/ltrace.conf.orig
+++ etc/ltrace.conf
@@ -32,6 +32,15 @@
 ; string0	== (char *)			[same as string[retval]]
 ; stringN	== (char *)		[N>0]	[same as string[argN]]
 
+; Typedefs
+;
+; To make it easier to specify argument lists, you can use 'typedef'
+; directives to avoid repeating complex parameter descriptors:
+;
+;   typedef color = enum(RED=1,BLUE=2,GREEN=3)
+;   void draw_line(color,int,int,int,int)
+;   void draw_square(color,int,int,int,int)
+;
 ; Enumerations
 ;
 ; The syntax is a parenthesized list of key=value assignments, like so:
openSUSE Build Service is sponsored by