home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd2.bin / suse / inst-sys / lib / YaST2 / bin / pars-inf.pl < prev    next >
Encoding:
Perl Script  |  2000-03-30  |  7.6 KB  |  423 lines

  1. #!/usr/bin/perl
  2.  
  3. # MS INF file -> CDB entry converter
  4. # by uli@suse.de
  5. # last changed 98/12/08
  6.  
  7. $NOJOIN=0;
  8.  
  9. sub verbatim
  10. # escapes all strange characters in a string
  11. {
  12.     my $string=$_[0];
  13.  
  14.     $string =~ s/[^A-Za-z0-9-_]/\\$&/g;
  15.     
  16.     return $string;
  17. }
  18.  
  19. #print verbatim("huhu"),"\n";
  20. #exit 0;
  21.  
  22. sub findexp
  23. {
  24.     return findexpno($_[0],0);
  25. }
  26.  
  27. sub findexpno
  28. # returns the number of the first line in @file matching the parameter
  29. # or 0 if none found
  30. {
  31.     my $regex=$_[0];
  32.     my $startline=$_[1];
  33.     #print $regex,"\n";
  34.     my $i=$startline;
  35.     while($i <= $#file)
  36.     {
  37.         if($file[$i] =~ /$regex/i)
  38.         {
  39.             return $i+1;
  40.         }
  41.         $i++;
  42.     }
  43.     return 0;
  44. }
  45.  
  46. sub isrange
  47. # true if parameter is in range syntax ("x-y"), otherwise false
  48. {
  49.     if($_[0] =~ /-/)
  50.     {
  51.         return 1;
  52.     }
  53.     return 0;
  54. }
  55.  
  56. sub extractvals
  57. # returns a list containing the values of a range
  58. {
  59.     $_[0] =~ /([0-9\.]+)-([0-9\.]+)/;
  60.     return ($1,$2);
  61. }
  62.  
  63. sub joinranges
  64. # merges two ranges
  65. {
  66.     (my $low1,my $high1)=extractvals($_[0]);
  67.     (my $low2,my $high2)=extractvals($_[1]);
  68.     
  69.     if (($high1 < $low2) || ($high2 < $low1))
  70.     {
  71.         my $result=$_[0] . "," . $_[1];
  72.         return (0,$result);
  73.     }
  74.     
  75.     if ($low2 < $low1)
  76.     {
  77.         my $result= $low2 . "-" . $high1;
  78.         return (1,$result);
  79.     }
  80.  
  81.     if ($low1 < $low2)
  82.     {
  83.         my $result= $low1 . "-" . $high2;
  84.         return (1,$result);
  85.     }
  86.  
  87.     if ($low1 <= $low2 && $high2 <= $high1)
  88.     {
  89.         my $result= $_[0];
  90.         return (1,$result);
  91.     }
  92.     
  93.     if ($low2 <= $low1 && $high1 <= $high2)
  94.     {
  95.         my $result= $_[1];
  96.         return (1,$result);
  97.     }
  98.     
  99.     die("joinranges won't work with $_[0] and $_[1]");
  100. }
  101.  
  102. sub joinvalrange
  103. # merges a value into a range if possible
  104. # returns a list containing a number (true if join succeeded) and the resulting
  105. # range
  106. {
  107.     my $val=$_[0];
  108.     (my $rlow,my $rhigh)=extractvals($_[1]);
  109.     
  110.     if($val >= $rlow && $val <= $rhigh)
  111.     {
  112.         return (1,$_[1]);
  113.     }
  114.     
  115.     my $result=$_[1] . "," . $_[0];
  116.     return (0,$result);
  117. }
  118.  
  119. # debugging stuff
  120. #print isrange("34.3"),"\n";
  121. #print isrange("12.2-32"),"\n";
  122. #print extractvals("34-32.2"),"\n";
  123. #print joinranges("25-50","1-24"),"\n";
  124. #print joinvalrange("53.3","1-25"),"\n";
  125. #exit 0;
  126.  
  127. sub addval
  128. # merges a value (2nd param) into a list (1st param)
  129. {
  130.     my $lref=$_[0];
  131.     my $nuv=$_[1];
  132.     my @nulist=();
  133.     my $succ;
  134.     my $res;
  135.     my $v;
  136.     my $joinflag=0;
  137.     
  138.     if($NOJOIN)
  139.     {
  140.         @$lref = (@$lref,$_[1]);
  141.         return;
  142.     }
  143.     
  144.     foreach $v (@$lref)
  145.     {
  146.         if($joinflag)
  147.         {
  148.             @nulist=(@nulist,$v);
  149.         }
  150.         else
  151.         {
  152.             if(isrange($v))
  153.             {
  154.                 if(isrange($nuv))
  155.                 {
  156.                     ($succ,$res)=joinranges($nuv,$v);
  157.                     if ($succ == 1)
  158.                     {
  159.                         @nulist=(@nulist,$res);
  160.                         $joinflag=1;
  161.                     }
  162.                     else
  163.                     {
  164.                         @nulist=(@nulist,$v);
  165.                     }
  166.                 }
  167.                 else
  168.                 {
  169.                     ($succ,$res)=joinvalrange($nuv,$v);
  170.                     if($succ == 1)
  171.                     {
  172.                         $joinflag=1;
  173.                     }
  174.                     @nulist=(@nulist,$v);
  175.                 }
  176.             }
  177.             else
  178.             {
  179.                 if(isrange($nuv))
  180.                 {
  181.                 
  182.                     ($succ,$res)=joinvalrange($v,$nuv);
  183.                     if ($succ == 1)
  184.                     {
  185.                         $joinflag=1;
  186.                         @nulist=(@nulist,$nuv);
  187.                     }
  188.                     else
  189.                     {
  190.                         @nulist=(@nulist,$v);
  191.                     }
  192.                 }
  193.                 else
  194.                 {
  195.                     if($v == $nuv)
  196.                     {
  197.                         $joinflag=1;
  198.                     }
  199.                     @nulist=(@nulist,$v);
  200.                 }
  201.             }
  202.         }
  203.     }
  204.     if ($joinflag == 0)
  205.     {
  206.         @nulist=(@nulist,$nuv);
  207.     }
  208.     else
  209.     {
  210.         # debugging
  211.         #print "------------- join!! --------------\n";
  212.     }
  213.     
  214.     @$lref=@nulist;
  215. }
  216.  
  217. $login=`whoami`;
  218. chop $login;
  219.  
  220. # read complete file into @file
  221. while (<STDIN>)
  222. {
  223.     $file[$i++]=$_;
  224. }
  225.  
  226. # sanity check
  227. findexp("^Class\\s*=\\s*Monitor\\s*\$") or die "This is not a monitor INF file";
  228.  
  229. # find string table
  230. # FIXME: some INF files come without a string table
  231. $i=findexp("\\[Strings\\]") or die "Couldn't find [Strings] section";
  232.  
  233. # copy string table to hash %strings
  234. while( $i <= $#file && (! ($file[$i] =~ /^\[/ )) )
  235. {
  236.     if($file[$i] =~ /=/)
  237.     {
  238.         $file[$i] =~ /([^= ]*)\s*=(\s*")?([^"]*)("|\s*\x0d*$)/; # "
  239.         #print "1 = $1, $3 = $3\n";
  240.         $strings{$1}=$3;
  241.     }
  242.     $i++;
  243. }
  244.  
  245. # debugging
  246. #print join("|\n",%strings);
  247. #exit 0;
  248.  
  249. # find manufacturer table
  250. $i=findexp("\\[Manufacturer\\]") or die ("Couldn't find [Manufacturer] section");
  251.  
  252. # copy manufacturer table to hash %manuf
  253. while ( $i <= $#file && (! ($file[$i] =~ /^\[/ )) )
  254. {
  255.     if($file[$i] =~ /=/)
  256.     {
  257.         $file[$i] =~ /%([^%]*)%=([^=;\x0d\x0a]*)/;
  258.         $manustring=$1;
  259.         $manusec=$2;
  260.         while( $manusec =~ /\s+$/ )
  261.         {
  262.             chop $manusec;
  263.         }
  264.         $manuf{$manustring}=$manusec;
  265.     }
  266.     $i++;
  267. }
  268.  
  269. # debugging
  270. #print join(" ",%manuf);
  271.  
  272. foreach $manukey (keys(%manuf))
  273. {
  274.     # get monitors from manufacturer section
  275.     %monis=();
  276.     
  277.     $i=findexp("\\[$manuf{$manukey}\\]") or die ("Couldn't find section for manuf. $manukey ($manuf{$manukey})");
  278.  
  279.     # debugging
  280.     #print $i,"\n";
  281.     
  282.     while( $i <= $#file && (! ($file[$i] =~ /^\[/ )) )
  283.     {
  284.         if($file[$i] =~ /^[^;]*=/)
  285.         {
  286.             #print "found = at $i, line is $file[$i]";
  287.             $file[$i] =~ /%([^%]*)%[ \t]*=[ \t]*([^;,\t\x0d]*)(,|\s*;|\x0d*$)/;
  288.             #print"1 = $1, 2 = $2\n";
  289.             $monstring=$1;
  290.             $installsec=$2;
  291.             while( $installsec =~ /\s+$/ )
  292.             {
  293.                 chop $installsec;
  294.             }
  295.             $installsec=verbatim($installsec);
  296.             if (! ($j=findexp("\\[$installsec\\]")) )
  297.             {
  298.                 print STDERR "Couldn't find installsec $installsec\n";
  299.             }
  300.             else
  301.             {
  302.                 $found=0;
  303.                 while ( $j <= $#file && (! ($file[$j] =~ /^\[/ )) )
  304.                 {
  305.                     if($file[$j] =~ /^AddReg=([^=\s,]*)/)
  306.                     {
  307.                         #print "found AddReg $1\n";
  308.                         $found=1;
  309.                         $monis{$monstring}=$1;        
  310.                     }
  311.                     $j++;
  312.                 }
  313.                 if (!$found)
  314.                 {
  315.                     print STDERR "Couldn't find AddReg entry in $installsec\n";
  316.                 }
  317.             }
  318.             
  319.         }
  320.         $i++;
  321.     }
  322.     #print join(" ",%monis);
  323.     #exit 0;
  324.         $first = 1;
  325.         print "\[\n";
  326.     foreach $monikey (keys(%monis))
  327.     {
  328.         # find AddReg sections
  329.         $secname=verbatim($monis{$monikey});
  330.         
  331.         # debugging
  332.         #print "secname: $secname\n";
  333.         
  334.         $i=findexp("\\[$secname\\]");
  335.         if ( $i == 0 )
  336.         {
  337.             print STDERR "Couldn't find AddReg section $monis{$monikey} for $monikey\n";
  338.             print STDERR "attempting brute-force search... ";
  339.             
  340.             # chop extension including leading dot
  341.             $secname =~ /^([^\\\.]*)/;
  342.             $searchname=$1;
  343.             
  344.             $j=0;
  345.             $found=0;
  346.             while(! $found)
  347.             {            
  348.                 $j=findexpno($searchname,$j);
  349.                 if($j == 0)
  350.                 {
  351.                     $found=-1;
  352.                 }
  353.                 else
  354.                 {
  355.                     $k=$j;
  356.                     while ( $k <= $#file && (! ($file[$k] =~ /^\[/ )) )
  357.                     {
  358.                         if ( $file[$k] =~ /^HKR/)
  359.                         {
  360.                             $found=1;
  361.                         }
  362.                         $k++;
  363.                     }
  364.                 }
  365.             }
  366.             
  367.             if($found==1)
  368.             {
  369.                 $i=$j;
  370.                 print STDERR "succeeded.\n";
  371.             }
  372.             else
  373.             {
  374.                 print STDERR "failed.\n";
  375.             }
  376.             #exit 1;
  377.         }
  378.             
  379.         #print $i,"\n";
  380.         
  381.         @hf=();
  382.         @vf=();
  383.         
  384.         while ( $i <= $#file && (! ($file[$i] =~ /^\[/ )) )
  385.         {
  386.             if ( $file[$i] =~ /^HKR/ )
  387.             {
  388.                 #print $file[$i];
  389.                 if ( $file[$i] =~ /^HKR,".*",.*,.*,"([0-9\.-]*)\s*,\s*([0-9\.-]*)\s*(,\s*[+-],[+-])?"\x0d*$/ )
  390.                 {
  391.                     addval(\@hf,$1);
  392.                     addval(\@vf,$2);
  393.                 }
  394.             }
  395.             $i++;
  396.         }
  397.         if ( $#hf > -1 && $#vf > -1 )    # print valid entries only
  398.         {
  399.             print ", " unless ( $first );
  400.             print "\$\[\n";
  401.             print "vendor:       \"$strings{$manukey}\",\n";
  402.             print "model:        \"$strings{$monikey}\",\n";
  403.             ($lhf, $hhf) = split( /\s*-\s*/, $hf[0] );
  404.             
  405.             $hhf = $lhf unless( defined( $hhf ));
  406.             print "hsync_min:       $lhf,\n";
  407.             print "hsync_max:       $hhf,\n";
  408.             ($lvf, $hvf) = split( /\s*-\s*/, $vf[0] );
  409.             $hvf = $lvf unless( defined( $hvf ));    
  410.  
  411.             print "vsync_min:       $lvf,\n";
  412.             print "vsync_max:       $hvf\n";    
  413.             print "]\n";
  414.             $first = 0;
  415.         }
  416.         else
  417.         {
  418.             print STDERR "invalid HF/VF ranges for $manukey/$monikey\n";
  419.         }
  420.     }
  421.         print "]\n";
  422. }
  423.