diff options
Diffstat (limited to 'tools/lib/traceevent/event-parse.c')
| -rw-r--r-- | tools/lib/traceevent/event-parse.c | 49 | 
1 files changed, 43 insertions, 6 deletions
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index 5a824e355d0..82b0606dcb8 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c @@ -13,8 +13,7 @@   * GNU Lesser General Public License for more details.   *   * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * License along with this program; if not,  see <http://www.gnu.org/licenses>   *   * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   * @@ -1224,6 +1223,34 @@ static int field_is_long(struct format_field *field)  	return 0;  } +static unsigned int type_size(const char *name) +{ +	/* This covers all FIELD_IS_STRING types. */ +	static struct { +		const char *type; +		unsigned int size; +	} table[] = { +		{ "u8",   1 }, +		{ "u16",  2 }, +		{ "u32",  4 }, +		{ "u64",  8 }, +		{ "s8",   1 }, +		{ "s16",  2 }, +		{ "s32",  4 }, +		{ "s64",  8 }, +		{ "char", 1 }, +		{ }, +	}; +	int i; + +	for (i = 0; table[i].type; i++) { +		if (!strcmp(table[i].type, name)) +			return table[i].size; +	} + +	return 0; +} +  static int event_read_fields(struct event_format *event, struct format_field **fields)  {  	struct format_field *field = NULL; @@ -1233,6 +1260,8 @@ static int event_read_fields(struct event_format *event, struct format_field **f  	int count = 0;  	do { +		unsigned int size_dynamic = 0; +  		type = read_token(&token);  		if (type == EVENT_NEWLINE) {  			free_token(token); @@ -1391,6 +1420,7 @@ static int event_read_fields(struct event_format *event, struct format_field **f  				field->type = new_type;  				strcat(field->type, " ");  				strcat(field->type, field->name); +				size_dynamic = type_size(field->name);  				free_token(field->name);  				strcat(field->type, brackets);  				field->name = token; @@ -1463,7 +1493,8 @@ static int event_read_fields(struct event_format *event, struct format_field **f  			if (read_expect_type(EVENT_ITEM, &token))  				goto fail; -			/* add signed type */ +			if (strtoul(token, NULL, 0)) +				field->flags |= FIELD_IS_SIGNED;  			free_token(token);  			if (read_expected(EVENT_OP, ";") < 0) @@ -1478,10 +1509,14 @@ static int event_read_fields(struct event_format *event, struct format_field **f  		if (field->flags & FIELD_IS_ARRAY) {  			if (field->arraylen)  				field->elementsize = field->size / field->arraylen; +			else if (field->flags & FIELD_IS_DYNAMIC) +				field->elementsize = size_dynamic;  			else if (field->flags & FIELD_IS_STRING)  				field->elementsize = 1; -			else -				field->elementsize = event->pevent->long_size; +			else if (field->flags & FIELD_IS_LONG) +				field->elementsize = event->pevent ? +						     event->pevent->long_size : +						     sizeof(long);  		} else  			field->elementsize = field->size; @@ -1785,6 +1820,8 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok)  		   strcmp(token, "/") == 0 ||  		   strcmp(token, "<") == 0 ||  		   strcmp(token, ">") == 0 || +		   strcmp(token, "<=") == 0 || +		   strcmp(token, ">=") == 0 ||  		   strcmp(token, "==") == 0 ||  		   strcmp(token, "!=") == 0) { @@ -2481,7 +2518,7 @@ process_dynamic_array(struct event_format *event, struct print_arg *arg, char **  	free_token(token);  	arg = alloc_arg(); -	if (!field) { +	if (!arg) {  		do_warning("%s: not enough memory!", __func__);  		*tok = NULL;  		return EVENT_ERROR;  |