home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
-
- # MS INF file -> CDB entry converter
- # by uli@suse.de
- # last changed 98/12/08
-
- $NOJOIN=0;
-
- sub verbatim
- # escapes all strange characters in a string
- {
- my $string=$_[0];
-
- $string =~ s/[^A-Za-z0-9-_]/\\$&/g;
-
- return $string;
- }
-
- #print verbatim("huhu"),"\n";
- #exit 0;
-
- sub findexp
- {
- return findexpno($_[0],0);
- }
-
- sub findexpno
- # returns the number of the first line in @file matching the parameter
- # or 0 if none found
- {
- my $regex=$_[0];
- my $startline=$_[1];
- #print $regex,"\n";
- my $i=$startline;
- while($i <= $#file)
- {
- if($file[$i] =~ /$regex/i)
- {
- return $i+1;
- }
- $i++;
- }
- return 0;
- }
-
- sub isrange
- # true if parameter is in range syntax ("x-y"), otherwise false
- {
- if($_[0] =~ /-/)
- {
- return 1;
- }
- return 0;
- }
-
- sub extractvals
- # returns a list containing the values of a range
- {
- $_[0] =~ /([0-9\.]+)-([0-9\.]+)/;
- return ($1,$2);
- }
-
- sub joinranges
- # merges two ranges
- {
- (my $low1,my $high1)=extractvals($_[0]);
- (my $low2,my $high2)=extractvals($_[1]);
-
- if (($high1 < $low2) || ($high2 < $low1))
- {
- my $result=$_[0] . "," . $_[1];
- return (0,$result);
- }
-
- if ($low2 < $low1)
- {
- my $result= $low2 . "-" . $high1;
- return (1,$result);
- }
-
- if ($low1 < $low2)
- {
- my $result= $low1 . "-" . $high2;
- return (1,$result);
- }
-
- if ($low1 <= $low2 && $high2 <= $high1)
- {
- my $result= $_[0];
- return (1,$result);
- }
-
- if ($low2 <= $low1 && $high1 <= $high2)
- {
- my $result= $_[1];
- return (1,$result);
- }
-
- die("joinranges won't work with $_[0] and $_[1]");
- }
-
- sub joinvalrange
- # merges a value into a range if possible
- # returns a list containing a number (true if join succeeded) and the resulting
- # range
- {
- my $val=$_[0];
- (my $rlow,my $rhigh)=extractvals($_[1]);
-
- if($val >= $rlow && $val <= $rhigh)
- {
- return (1,$_[1]);
- }
-
- my $result=$_[1] . "," . $_[0];
- return (0,$result);
- }
-
- # debugging stuff
- #print isrange("34.3"),"\n";
- #print isrange("12.2-32"),"\n";
- #print extractvals("34-32.2"),"\n";
- #print joinranges("25-50","1-24"),"\n";
- #print joinvalrange("53.3","1-25"),"\n";
- #exit 0;
-
- sub addval
- # merges a value (2nd param) into a list (1st param)
- {
- my $lref=$_[0];
- my $nuv=$_[1];
- my @nulist=();
- my $succ;
- my $res;
- my $v;
- my $joinflag=0;
-
- if($NOJOIN)
- {
- @$lref = (@$lref,$_[1]);
- return;
- }
-
- foreach $v (@$lref)
- {
- if($joinflag)
- {
- @nulist=(@nulist,$v);
- }
- else
- {
- if(isrange($v))
- {
- if(isrange($nuv))
- {
- ($succ,$res)=joinranges($nuv,$v);
- if ($succ == 1)
- {
- @nulist=(@nulist,$res);
- $joinflag=1;
- }
- else
- {
- @nulist=(@nulist,$v);
- }
- }
- else
- {
- ($succ,$res)=joinvalrange($nuv,$v);
- if($succ == 1)
- {
- $joinflag=1;
- }
- @nulist=(@nulist,$v);
- }
- }
- else
- {
- if(isrange($nuv))
- {
-
- ($succ,$res)=joinvalrange($v,$nuv);
- if ($succ == 1)
- {
- $joinflag=1;
- @nulist=(@nulist,$nuv);
- }
- else
- {
- @nulist=(@nulist,$v);
- }
- }
- else
- {
- if($v == $nuv)
- {
- $joinflag=1;
- }
- @nulist=(@nulist,$v);
- }
- }
- }
- }
- if ($joinflag == 0)
- {
- @nulist=(@nulist,$nuv);
- }
- else
- {
- # debugging
- #print "------------- join!! --------------\n";
- }
-
- @$lref=@nulist;
- }
-
- $login=`whoami`;
- chop $login;
-
- # read complete file into @file
- while (<STDIN>)
- {
- $file[$i++]=$_;
- }
-
- # sanity check
- findexp("^Class\\s*=\\s*Monitor\\s*\$") or die "This is not a monitor INF file";
-
- # find string table
- # FIXME: some INF files come without a string table
- $i=findexp("\\[Strings\\]") or die "Couldn't find [Strings] section";
-
- # copy string table to hash %strings
- while( $i <= $#file && (! ($file[$i] =~ /^\[/ )) )
- {
- if($file[$i] =~ /=/)
- {
- $file[$i] =~ /([^= ]*)\s*=(\s*")?([^"]*)("|\s*\x0d*$)/; # "
- #print "1 = $1, $3 = $3\n";
- $strings{$1}=$3;
- }
- $i++;
- }
-
- # debugging
- #print join("|\n",%strings);
- #exit 0;
-
- # find manufacturer table
- $i=findexp("\\[Manufacturer\\]") or die ("Couldn't find [Manufacturer] section");
-
- # copy manufacturer table to hash %manuf
- while ( $i <= $#file && (! ($file[$i] =~ /^\[/ )) )
- {
- if($file[$i] =~ /=/)
- {
- $file[$i] =~ /%([^%]*)%=([^=;\x0d\x0a]*)/;
- $manustring=$1;
- $manusec=$2;
- while( $manusec =~ /\s+$/ )
- {
- chop $manusec;
- }
- $manuf{$manustring}=$manusec;
- }
- $i++;
- }
-
- # debugging
- #print join(" ",%manuf);
-
- foreach $manukey (keys(%manuf))
- {
- # get monitors from manufacturer section
- %monis=();
-
- $i=findexp("\\[$manuf{$manukey}\\]") or die ("Couldn't find section for manuf. $manukey ($manuf{$manukey})");
-
- # debugging
- #print $i,"\n";
-
- while( $i <= $#file && (! ($file[$i] =~ /^\[/ )) )
- {
- if($file[$i] =~ /^[^;]*=/)
- {
- #print "found = at $i, line is $file[$i]";
- $file[$i] =~ /%([^%]*)%[ \t]*=[ \t]*([^;,\t\x0d]*)(,|\s*;|\x0d*$)/;
- #print"1 = $1, 2 = $2\n";
- $monstring=$1;
- $installsec=$2;
- while( $installsec =~ /\s+$/ )
- {
- chop $installsec;
- }
- $installsec=verbatim($installsec);
- if (! ($j=findexp("\\[$installsec\\]")) )
- {
- print STDERR "Couldn't find installsec $installsec\n";
- }
- else
- {
- $found=0;
- while ( $j <= $#file && (! ($file[$j] =~ /^\[/ )) )
- {
- if($file[$j] =~ /^AddReg=([^=\s,]*)/)
- {
- #print "found AddReg $1\n";
- $found=1;
- $monis{$monstring}=$1;
- }
- $j++;
- }
- if (!$found)
- {
- print STDERR "Couldn't find AddReg entry in $installsec\n";
- }
- }
-
- }
- $i++;
- }
- #print join(" ",%monis);
- #exit 0;
- $first = 1;
- print "\[\n";
- foreach $monikey (keys(%monis))
- {
- # find AddReg sections
- $secname=verbatim($monis{$monikey});
-
- # debugging
- #print "secname: $secname\n";
-
- $i=findexp("\\[$secname\\]");
- if ( $i == 0 )
- {
- print STDERR "Couldn't find AddReg section $monis{$monikey} for $monikey\n";
- print STDERR "attempting brute-force search... ";
-
- # chop extension including leading dot
- $secname =~ /^([^\\\.]*)/;
- $searchname=$1;
-
- $j=0;
- $found=0;
- while(! $found)
- {
- $j=findexpno($searchname,$j);
- if($j == 0)
- {
- $found=-1;
- }
- else
- {
- $k=$j;
- while ( $k <= $#file && (! ($file[$k] =~ /^\[/ )) )
- {
- if ( $file[$k] =~ /^HKR/)
- {
- $found=1;
- }
- $k++;
- }
- }
- }
-
- if($found==1)
- {
- $i=$j;
- print STDERR "succeeded.\n";
- }
- else
- {
- print STDERR "failed.\n";
- }
- #exit 1;
- }
-
- #print $i,"\n";
-
- @hf=();
- @vf=();
-
- while ( $i <= $#file && (! ($file[$i] =~ /^\[/ )) )
- {
- if ( $file[$i] =~ /^HKR/ )
- {
- #print $file[$i];
- if ( $file[$i] =~ /^HKR,".*",.*,.*,"([0-9\.-]*)\s*,\s*([0-9\.-]*)\s*(,\s*[+-],[+-])?"\x0d*$/ )
- {
- addval(\@hf,$1);
- addval(\@vf,$2);
- }
- }
- $i++;
- }
- if ( $#hf > -1 && $#vf > -1 ) # print valid entries only
- {
- print ", " unless ( $first );
- print "\$\[\n";
- print "vendor: \"$strings{$manukey}\",\n";
- print "model: \"$strings{$monikey}\",\n";
- ($lhf, $hhf) = split( /\s*-\s*/, $hf[0] );
-
- $hhf = $lhf unless( defined( $hhf ));
- print "hsync_min: $lhf,\n";
- print "hsync_max: $hhf,\n";
- ($lvf, $hvf) = split( /\s*-\s*/, $vf[0] );
- $hvf = $lvf unless( defined( $hvf ));
-
- print "vsync_min: $lvf,\n";
- print "vsync_max: $hvf\n";
- print "]\n";
- $first = 0;
- }
- else
- {
- print STDERR "invalid HF/VF ranges for $manukey/$monikey\n";
- }
- }
- print "]\n";
- }
-