--- usbutils-0.11/names.c.hidcc 2002-06-17 11:13:47.000000000 +0200 +++ usbutils-0.11/names.c 2004-09-01 10:53:12.716443518 +0200 @@ -116,6 +116,7 @@ static struct genericstrtable *physdess[HASHSZ] = { NULL, }; static struct genericstrtable *hutus[HASHSZ] = { NULL, }; static struct genericstrtable *langids[HASHSZ] = { NULL, }; +static struct genericstrtable *countrycodes[HASHSZ] = { NULL, }; /* ---------------------------------------------------------------------- */ @@ -164,6 +165,11 @@ return names_genericstrtable(biass, b); } +const char *names_countrycode(unsigned int countrycode) +{ + return names_genericstrtable(countrycodes, countrycode); +} + const char *names_vendor(u_int16_t vendorid) { struct vendor *v; @@ -402,6 +408,11 @@ return new_genericstrtable(biass, name, b); } +static int new_countrycode(const char *name, unsigned int countrycode) +{ + return new_genericstrtable(countrycodes, name, countrycode); +} + /* ---------------------------------------------------------------------- */ #define DBG(x) @@ -553,6 +564,27 @@ DBG(printf("line %5u audio terminal type %02x %s\n", linectr, u, cp)); continue; } + if (buf[0] == 'H' && buf[1] == 'C' && buf[2] == 'C' && isspace(buf[3])) { + /* HID Descriptor bCountryCode */ + cp = buf+3; + while (isspace(*cp)) + cp++; + if (!isxdigit(*cp)) { + fprintf(stderr, "Invalid HID country code at line %u\n", linectr); + continue; + } + u = strtoul(cp, &cp, 10); + while (isspace(*cp)) + cp++; + if (!*cp) { + fprintf(stderr, "Invalid HID country code at line %u\n", linectr); + continue; + } + if (new_countrycode(cp, u)) + fprintf(stderr, "Duplicate HID country code at line %u country %02u %s\n", linectr, u, cp); + DBG(printf("line %5u keyboard country code %02u %s\n", linectr, u, cp)); + continue; + } if (isxdigit(*cp)) { /* vendor */ u = strtoul(cp, &cp, 16); --- usbutils-0.11/names.h.hidcc 2000-11-06 16:00:06.000000000 +0100 +++ usbutils-0.11/names.h 2004-09-01 10:53:14.097253193 +0200 @@ -44,6 +44,7 @@ extern const char *names_langid(u_int16_t langid); extern const char *names_physdes(u_int8_t ph); extern const char *names_bias(u_int8_t b); +extern const char *names_countrycode(unsigned int countrycode); extern int names_init(char *n); /* ---------------------------------------------------------------------- */ --- usbutils-0.11/lsusb.c.hidcc 2004-08-30 17:57:04.000000000 +0200 +++ usbutils-0.11/lsusb.c 2004-09-01 11:03:48.208861173 +0200 @@ -1205,9 +1205,9 @@ " bLength %5u\n" " bDescriptorType %5u\n" " bcdHID %2x.%02x\n" - " bCountryCode %5u\n" + " bCountryCode %5u %s\n" " bNumDescriptors %5u\n", - buf[0], buf[1], buf[3], buf[2], buf[4], buf[5]); + buf[0], buf[1], buf[3], buf[2], buf[4], names_countrycode(buf[4]) ? : "Unknown", buf[5]); for (i = 0; i < buf[5]; i++) printf(" bDescriptorType %5u %s\n" " wDescriptorLength %5u\n",