github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/pkg/pci/parse.go (about) 1 // Copyright 2017-2018 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package pci 6 7 import ( 8 "bufio" 9 "bytes" 10 ) 11 12 func isHex(b byte) bool { 13 return ('a' <= b && b <= 'f') || ('A' <= b && b <= 'F') || ('0' <= b && b <= '9') 14 } 15 16 // scan searches for Vendor and Device lines from the input *bufio.Scanner based 17 // on pci.ids format. Found Vendors and Devices are added to the input ids map. 18 func scan(s *bufio.Scanner, ids map[string]Vendor) { 19 var currentVendor string 20 var line string 21 22 for s.Scan() { 23 line = s.Text() 24 25 switch { 26 case isHex(line[0]) && isHex(line[1]): 27 currentVendor = line[:4] 28 ids[currentVendor] = Vendor{Name: line[6:], Devices: make(map[string]Device)} 29 case currentVendor != "" && line[0] == '\t' && isHex(line[1]) && isHex(line[3]): 30 ids[currentVendor].Devices[line[1:5]] = Device(line[7:]) 31 } 32 } 33 } 34 35 func parse(input []byte) idMap { 36 ids := make(map[string]Vendor) 37 s := bufio.NewScanner(bytes.NewReader(input)) 38 scan(s, ids) 39 return ids 40 }