#!/usr/bin/perl -w # vi: set ts=4: sub parse_devices; @ARGV = ('-') unless @ARGV; $ARGV=shift @ARGV; if(!open(FILE,$ARGV)){ warn "Can't open $ARGV: $!\n"; exit 1; } while(){ push @lines,$_; } $driver = ""; $mode = 0; while($line=shift @lines){ $_ = $line; if( $mode == 0){ if( m/^[\w-]+: / ){ chomp; $l=$_; $mode = 1; } }elsif($mode==1){ if( m/^ / ){ s/^ +//; chomp; $l="$l $_"; $mode = 1; }else{ #print "$l\n"; if($l =~ m/^Driver: /){ $_ = $l; s/^Driver: //; $driver = $_; } if($l =~ m/^Devices:/){ $l =~ s/^Devices://; parse_devices($l); } $l=""; $mode = 0; $_ = $line; if( m/^[\w-]+: / ){ chomp; $l=$_; $mode = 1; } } } } sub parse_devices { my $devs = $_[0]; my $mfr = "unknown"; my $dev = "unknown"; my $name = "unknown"; #print("parse_devices $devs\n"); while($devs){ $_=$devs; if(m/^ *\[([^\]]+)\](.*)/){ $mfr = $1; #print "recognized mfr $mfr\n"; $devs = $2; }elsif(m/^ *\(([^\)]+)\)(.*)/){ $name = $1; #print "recognized name $name\n"; $devs = $2; }elsif(m/^ *([^\(,]+)(.*)/){ $dev = $1; $devs = $2; $dev =~ s/ *$//; #print "recognized dev $dev\n"; }elsif(m/^ *,(.*)/){ $devs = $1; printf "%s\t%s\t%s\t%s\n", $mfr, $dev, $driver, $name; }else{ print "parse error $_\n"; $devs = ""; } } printf "%s\t%s\t%s\t%s\n", $mfr, $dev, $driver, $name; }