From 3dbe5353f5f03263956a6182aed19cd15a24cafe Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 28 Aug 2018 17:29:38 -0700 Subject: [PATCH] garmin: teach the parser to show undefined values for unknown fields too Make it easier to see which of the unknown fields don't contain anything interesting. Soon this will be at the stage where the parser skeleton itself doesn't need much work, and I should look at the actual data and turn it into samples instead. Signed-off-by: Linus Torvalds --- src/garmin_parser.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/garmin_parser.c b/src/garmin_parser.c index c6cacf7..ec6bac5 100644 --- a/src/garmin_parser.c +++ b/src/garmin_parser.c @@ -407,21 +407,31 @@ static int traverse_regular(struct garmin_parser_t *garmin, field_desc->parse(garmin, data); } else { #if 1 - fprintf(stderr, "%s/%d:", msg_name, field_nr); - if (base_type == 7) - fprintf(stderr, " %s\n", data); - else { + static const unsigned long long inval_value_array[] = { + 0xff, 0x7f, 0xff, 0x7fff, 0xffff, 0x7fffffff, 0xffffffff, 0, + 0xffffffff, 0xfffffffffffffffful, 0x00, 0x0000, 0x00000000, 0xff, + 0x7fffffffffffffff, 0xffffffffffffffff, 0x0000000000000000 }; + const unsigned long long inval = inval_value_array[base_type]; + + switch (base_type) { + case 7: + if (!*data) + break; + fprintf(stderr, "%s/%d: %s\n", msg_name, field_nr, data); + break; + default: + fprintf(stderr, "%s/%d:", msg_name, field_nr); for (int i = 0; i < len; i += base_size) { - unsigned long long value; + unsigned long long val; const char *fmt; const unsigned char *ptr = data + i; switch (base_size) { - default: value = *ptr; fmt = " %02llx"; break; - case 2: value = *(unsigned short *)ptr; fmt = " %04llx"; break; - case 4: value = *(unsigned int *)ptr; fmt = " %08llx"; break; - case 8: value = *(unsigned long long *)ptr; fmt = " %016llx"; break; + default: val = *ptr; fmt = val == inval ? " --" : " %02llx"; break; + case 2: val = *(unsigned short *)ptr; fmt = val == inval ? " ----" : " %04llx"; break; + case 4: val = *(unsigned int *)ptr; fmt = val == inval ? " --------" : " %08llx"; break; + case 8: val = *(unsigned long long *)ptr; fmt = val == inval ? " ----------------" : " %016llx"; break; } - fprintf(stderr, fmt, value); + fprintf(stderr, fmt, val); } fprintf(stderr, "\n"); }