Petr Machata 155cbc3
From 2e9f9f1f5d0fb223b109429b9c904504b7f638e2 Mon Sep 17 00:00:00 2001
Petr Machata 155cbc3
From: Petr Machata <pmachata@redhat.com>
Petr Machata 155cbc3
Date: Fri, 8 Aug 2014 16:53:41 +0200
Petr Machata 155cbc3
Subject: [PATCH] In config files, allow whitespace between identifier and
Petr Machata 155cbc3
 opening paren
Petr Machata 155cbc3
Petr Machata 155cbc3
---
Petr Machata 155cbc3
 read_config_file.c                    |   61 ++++++--------------------------
Petr Machata 155cbc3
 testsuite/ltrace.main/parameters2.exp |   14 +++++++-
Petr Machata 155cbc3
 2 files changed, 25 insertions(+), 50 deletions(-)
Petr Machata 155cbc3
Petr Machata 155cbc3
diff --git a/read_config_file.c b/read_config_file.c
Petr Machata 155cbc3
index ea3ab88..05ff283 100644
Petr Machata 155cbc3
--- a/read_config_file.c
Petr Machata 155cbc3
+++ b/read_config_file.c
Petr Machata 155cbc3
@@ -1,6 +1,6 @@
Petr Machata 155cbc3
 /*
Petr Machata 155cbc3
  * This file is part of ltrace.
Petr Machata 155cbc3
- * Copyright (C) 2011,2012,2013 Petr Machata, Red Hat Inc.
Petr Machata 155cbc3
+ * Copyright (C) 2011,2012,2013,2014 Petr Machata, Red Hat Inc.
Petr Machata 155cbc3
  * Copyright (C) 1998,1999,2003,2007,2008,2009 Juan Cespedes
Petr Machata 155cbc3
  * Copyright (C) 2006 Ian Wienand
Petr Machata 155cbc3
  * Copyright (C) 2006 Steve Fink
Petr Machata 155cbc3
@@ -168,38 +168,6 @@ parse_ident(struct locus *loc, char **str)
Petr Machata 155cbc3
 	return xstrndup(ident, *str - ident);
Petr Machata 155cbc3
 }
Petr Machata 155cbc3
 
Petr Machata 155cbc3
-/*
Petr Machata 155cbc3
-  Returns position in string at the left parenthesis which starts the
Petr Machata 155cbc3
-  function's argument signature. Returns NULL on error.
Petr Machata 155cbc3
-*/
Petr Machata 155cbc3
-static char *
Petr Machata 155cbc3
-start_of_arg_sig(char *str) {
Petr Machata 155cbc3
-	char *pos;
Petr Machata 155cbc3
-	int stacked = 0;
Petr Machata 155cbc3
-
Petr Machata 155cbc3
-	if (!strlen(str))
Petr Machata 155cbc3
-		return NULL;
Petr Machata 155cbc3
-
Petr Machata 155cbc3
-	pos = &str[strlen(str)];
Petr Machata 155cbc3
-	do {
Petr Machata 155cbc3
-		pos--;
Petr Machata 155cbc3
-		if (pos < str)
Petr Machata 155cbc3
-			return NULL;
Petr Machata 155cbc3
-		while ((pos > str) && (*pos != ')') && (*pos != '('))
Petr Machata 155cbc3
-			pos--;
Petr Machata 155cbc3
-
Petr Machata 155cbc3
-		if (*pos == ')')
Petr Machata 155cbc3
-			stacked++;
Petr Machata 155cbc3
-		else if (*pos == '(')
Petr Machata 155cbc3
-			stacked--;
Petr Machata 155cbc3
-		else
Petr Machata 155cbc3
-			return NULL;
Petr Machata 155cbc3
-
Petr Machata 155cbc3
-	} while (stacked > 0);
Petr Machata 155cbc3
-
Petr Machata 155cbc3
-	return (stacked == 0) ? pos : NULL;
Petr Machata 155cbc3
-}
Petr Machata 155cbc3
-
Petr Machata 155cbc3
 static int
Petr Machata 155cbc3
 parse_int(struct locus *loc, char **str, long *ret)
Petr Machata 155cbc3
 {
Petr Machata 155cbc3
@@ -1110,7 +1078,6 @@ static int
Petr Machata 155cbc3
 process_line(struct protolib *plib, struct locus *loc, char *buf)
Petr Machata 155cbc3
 {
Petr Machata 155cbc3
 	char *str = buf;
Petr Machata 155cbc3
-	char *tmp;
Petr Machata 155cbc3
 
Petr Machata 155cbc3
 	debug(3, "Reading line %d of `%s'", loc->line_no, loc->filename);
Petr Machata 155cbc3
 	eat_spaces(&str);
Petr Machata 155cbc3
@@ -1148,22 +1115,13 @@ process_line(struct protolib *plib, struct locus *loc, char *buf)
Petr Machata 155cbc3
 	debug(4, " return_type = %d", fun.return_info->type);
Petr Machata 155cbc3
 
Petr Machata 155cbc3
 	eat_spaces(&str);
Petr Machata 155cbc3
-	tmp = start_of_arg_sig(str);
Petr Machata 155cbc3
-	if (tmp == NULL) {
Petr Machata 155cbc3
-		report_error(loc->filename, loc->line_no, "syntax error");
Petr Machata 155cbc3
+	proto_name = parse_ident(loc, &str);
Petr Machata 155cbc3
+	if (proto_name == NULL)
Petr Machata 155cbc3
 		goto err;
Petr Machata 155cbc3
-	}
Petr Machata 155cbc3
-	*tmp = '\0';
Petr Machata 155cbc3
 
Petr Machata 155cbc3
-	proto_name = strdup(str);
Petr Machata 155cbc3
-	if (proto_name == NULL) {
Petr Machata 155cbc3
-	oom:
Petr Machata 155cbc3
-		report_error(loc->filename, loc->line_no,
Petr Machata 155cbc3
-			     "%s", strerror(errno));
Petr Machata 155cbc3
+	eat_spaces(&str);
Petr Machata 155cbc3
+	if (parse_char(loc, &str, '(') < 0)
Petr Machata 155cbc3
 		goto err;
Petr Machata 155cbc3
-	}
Petr Machata 155cbc3
-
Petr Machata 155cbc3
-	str = tmp + 1;
Petr Machata 155cbc3
 	debug(3, " name = %s", proto_name);
Petr Machata 155cbc3
 
Petr Machata 155cbc3
 	struct param *extra_param = NULL;
Petr Machata 155cbc3
@@ -1177,8 +1135,13 @@ process_line(struct protolib *plib, struct locus *loc, char *buf)
Petr Machata 155cbc3
 			if (have_stop == 0) {
Petr Machata 155cbc3
 				struct param param;
Petr Machata 155cbc3
 				param_init_stop(¶m;;
Petr Machata 155cbc3
-				if (prototype_push_param(&fun, &param) < 0)
Petr Machata 155cbc3
-					goto oom;
Petr Machata 155cbc3
+				if (prototype_push_param(&fun, &param) < 0) {
Petr Machata 155cbc3
+				oom:
Petr Machata 155cbc3
+					report_error(loc->filename,
Petr Machata 155cbc3
+						     loc->line_no,
Petr Machata 155cbc3
+						     "%s", strerror(errno));
Petr Machata 155cbc3
+					goto err;
Petr Machata 155cbc3
+				}
Petr Machata 155cbc3
 				have_stop = 1;
Petr Machata 155cbc3
 			}
Petr Machata 155cbc3
 			str++;
Petr Machata 155cbc3
diff --git a/testsuite/ltrace.main/parameters2.exp b/testsuite/ltrace.main/parameters2.exp
Petr Machata 155cbc3
index 6318fc5..9850079 100644
Petr Machata 155cbc3
--- a/testsuite/ltrace.main/parameters2.exp
Petr Machata 155cbc3
+++ b/testsuite/ltrace.main/parameters2.exp
Petr Machata 155cbc3
@@ -1,5 +1,5 @@
Petr Machata 155cbc3
 # This file is part of ltrace.
Petr Machata 155cbc3
-# Copyright (C) 2012, 2013 Petr Machata, Red Hat Inc.
Petr Machata 155cbc3
+# Copyright (C) 2012, 2013, 2014 Petr Machata, Red Hat Inc.
Petr Machata 155cbc3
 #
Petr Machata 155cbc3
 # This program is free software; you can redistribute it and/or
Petr Machata 155cbc3
 # modify it under the terms of the GNU General Public License as
Petr Machata 155cbc3
@@ -259,4 +259,16 @@ ltraceMatch1 [ltraceLibTest {
Petr Machata 155cbc3
     somefunc();
Petr Machata 155cbc3
 }] {somefunc\(\) *= nil} == 1
Petr Machata 155cbc3
 
Petr Machata 155cbc3
+# Test that spaces in function name make no difference.
Petr Machata 155cbc3
+
Petr Machata 155cbc3
+ltraceMatch1 [ltraceLibTest {
Petr Machata 155cbc3
+    void somefunc ();
Petr Machata 155cbc3
+} {
Petr Machata 155cbc3
+    void somefunc(void);
Petr Machata 155cbc3
+} {
Petr Machata 155cbc3
+    void somefunc(void) {}
Petr Machata 155cbc3
+} {
Petr Machata 155cbc3
+    somefunc();
Petr Machata 155cbc3
+}] {somefunc\(\)} == 1
Petr Machata 155cbc3
+
Petr Machata 155cbc3
 ltraceDone
Petr Machata 155cbc3
-- 
Petr Machata 155cbc3
1.7.6.5
Petr Machata 155cbc3