aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMantas Mikulėnas <grawity@gmail.com>2019-05-06 12:02:18 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-05-06 14:29:36 +0200
commit91f462e8d1628d8e6c153796757559dd9bff804f (patch)
treef0663231e0d13839fd44fe41fb453b5d0c563287
parent72aafbcdafc91cee0a0507d68a282d0e88ad901b (diff)
downloadusbutils-91f462e8d1628d8e6c153796757559dd9bff804f.tar.gz
lsusb.py: replace usb.ids binary search with dict lookup
There is no significant gain in reinventing the wheel here. Signed-off-by: Mantas Mikulėnas <grawity@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--lsusb.py.in53
1 files changed, 23 insertions, 30 deletions
diff --git a/lsusb.py.in b/lsusb.py.in
index 7d3aca0..9504002 100644
--- a/lsusb.py.in
+++ b/lsusb.py.in
@@ -84,9 +84,9 @@ class UsbProduct:
def __eq__(self, oth):
return (self.vid, self.pid) == (oth.vid, oth.pid)
-usbvendors = []
-usbproducts = []
-usbclasses = []
+usbvendors = {}
+usbproducts = {}
+usbclasses = {}
def ishexdigit(str):
"return True if all digits are valid hex digits"
@@ -125,7 +125,7 @@ def parse_usb_ids():
if ishexdigit(ln[0:4]):
mode = modes.Vendor
vid = int(ln[:4], 16)
- usbvendors.append(UsbVendor(vid, ln[6:]))
+ usbvendors[vid] = UsbVendor(vid, ln[6:])
continue
if ln[0] == '\t' and ishexdigit(ln[1:3]):
# usb.ids has a device id of 01xy, sigh
@@ -135,7 +135,7 @@ def parse_usb_ids():
did = int(ln[1:5], 16)
# USB devices
if mode == modes.Vendor:
- usbproducts.append(UsbProduct(vid, did, ln[7:]))
+ usbproducts[vid, did] = UsbProduct(vid, did, ln[7:])
continue
elif mode == modes.Class:
nm = ln[5:]
@@ -143,17 +143,17 @@ def parse_usb_ids():
strg = cstrg + ":" + nm
else:
strg = cstrg + ":"
- usbclasses.append(UsbClass(vid, did, -1, strg))
+ usbclasses[vid, did, -1] = UsbClass(vid, did, -1, strg)
continue
if ln[0] == 'C':
mode = modes.Class
cid = int(ln[2:4], 16)
cstrg = ln[6:]
- usbclasses.append(UsbClass(cid, -1, -1, cstrg))
+ usbclasses[cid, -1, -1] = UsbClass(cid, -1, -1, cstrg)
continue
if mode == modes.Class and ln[0] == '\t' and ln[1] == '\t' and ishexdigit(ln[2:4]):
prid = int(ln[2:4], 16)
- usbclasses.append(UsbClass(cid, did, prid, strg + ":" + ln[6:]))
+ usbclasses[cid, did, prid] = UsbClass(cid, did, prid, strg + ":" + ln[6:])
continue
mode = modes.Misc
@@ -179,18 +179,14 @@ def bin_search(first, last, item, list):
def find_usb_prod(vid, pid):
"Return device name from USB Vendor:Product list"
strg = ""
- dev = UsbVendor(vid, "")
- lnvend = len(usbvendors)
- ix = bin_search(0, lnvend, dev, usbvendors)
- if ix != -1:
- strg = usbvendors[ix].__repr__()
+ vendor = usbvendors.get(vid)
+ if vendor:
+ strg = vendor.__repr__()
else:
return ""
- dev = UsbProduct(vid, pid, "")
- lnprod = len(usbproducts)
- ix = bin_search(0, lnprod, dev, usbproducts)
- if ix != -1:
- return strg + " " + usbproducts[ix].__repr__()
+ product = usbproducts.get((vid, pid))
+ if product:
+ return strg + " " + product.__repr__()
return strg
def find_usb_class(cid, sid, pid):
@@ -198,18 +194,15 @@ def find_usb_class(cid, sid, pid):
if cid == 0xff and sid == 0xff and pid == 0xff:
return "Vendor Specific"
lnlst = len(usbclasses)
- dev = UsbClass(cid, sid, pid, "")
- ix = bin_search(0, lnlst, dev, usbclasses)
- if ix != -1:
- return usbclasses[ix].__repr__()
- dev = UsbClass(cid, sid, -1, "")
- ix = bin_search(0, lnlst, dev, usbclasses)
- if ix != -1:
- return usbclasses[ix].__repr__()
- dev = UsbClass(cid, -1, -1, "")
- ix = bin_search(0, lnlst, dev, usbclasses)
- if ix != -1:
- return usbclasses[ix].__repr__()
+ cls = usbclasses.get((cid, sid, pid))
+ if cls:
+ return cls.__repr__()
+ cls = usbclasses.get((cid, sid, -1))
+ if cls:
+ return cls.__repr__()
+ cls = usbclasses.get((cid, -1, -1))
+ if cls:
+ return cls.__repr__()
return ""