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 <torvalds@linux-foundation.org>
This commit is contained in:
Linus Torvalds 2018-08-28 17:29:38 -07:00
parent 6d53e31cba
commit 3dbe5353f5

View File

@ -407,21 +407,31 @@ static int traverse_regular(struct garmin_parser_t *garmin,
field_desc->parse(garmin, data);
} else {
#if 1
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);
if (base_type == 7)
fprintf(stderr, " %s\n", data);
else {
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");
}