hwdb: fix parser to work with newer pyparsing
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 29 Mar 2022 10:17:51 +0000 (12:17 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 28 Apr 2022 17:43:04 +0000 (19:43 +0200)
The handling of whitespace in pyparsing is a bother. There's some
global state, and per-element state, and it's hard to get a handle on
things. With python3-pyparsing-2.4.7-10.fc36.noarch the grammar would
not match. After handling of tabs was fixed to not accept duplicate tabs,
the grammar passes.

It seems that the entry for usb:v8087p8087*
was generated incorrectly because we treated the interface line
(with two TABs) as a device line (with one TAB).

(cherry picked from commit f73d6895872cb9caffc523e1eddc53c9b98cfdec)
(cherry picked from commit 1fe496fc3bd581947698b483fc044bcf08ef2a55)

hwdb.d/20-usb-vendor-model.hwdb
hwdb.d/ids_parser.py

index 0e2bdea7a2c1a2638529b7d1fabd27538b596385..63ab031afa4facd55ed2e7977b0d06e0822f94f2 100644 (file)
@@ -69491,9 +69491,6 @@ usb:v8087p8008*
 usb:v8087p800A*
  ID_MODEL_FROM_DATABASE=Hub
 
-usb:v8087p8087*
- ID_MODEL_FROM_DATABASE=07da  Centrino Advanced-N 6235
-
 usb:v80EE*
  ID_VENDOR_FROM_DATABASE=VirtualBox
 
index 6f3a88f840ab1e0d7f0d96eee7dcdb208c4ca5d9..093a4cf24cfe1624cc8a1c3fd43914b99c2b3c33 100755 (executable)
@@ -5,7 +5,7 @@ import sys
 from pyparsing import (Word, White, Literal, Regex,
                        LineEnd, SkipTo,
                        ZeroOrMore, OneOrMore, Combine, Optional, Suppress,
-                       Group,
+                       Group, ParserElement,
                        stringEnd, pythonStyleComment)
 
 EOL = LineEnd().suppress()
@@ -19,6 +19,8 @@ COMMENTLINE = pythonStyleComment + EOL
 EMPTYLINE = LineEnd()
 text_eol = lambda name: Regex(r'[^\n]+')(name) + EOL
 
+ParserElement.set_default_whitespace_chars(' \n')
+
 def klass_grammar():
     klass_line = Literal('C ').suppress() + NUM2('klass') + text_eol('text')
     subclass_line = TAB + NUM2('subclass') + text_eol('text')
@@ -34,8 +36,12 @@ def klass_grammar():
 def usb_ids_grammar():
     vendor_line = NUM4('vendor') + text_eol('text')
     device_line = TAB + NUM4('device') + text_eol('text')
+    interface_line = TAB + TAB + NUM4('interface') + NUM4('interface2') + text_eol('text')
+    device = (device_line +
+              ZeroOrMore(Group(interface_line)
+                         ^ COMMENTLINE.suppress()))
     vendor = (vendor_line('VENDOR') +
-              ZeroOrMore(Group(device_line)('VENDOR_DEV*') ^ COMMENTLINE.suppress()))
+              ZeroOrMore(Group(device)('VENDOR_DEV*') ^ COMMENTLINE.suppress()))
 
     klass = klass_grammar()