[BACK]Return to cvsweb.cgi CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / cvsweb

Diff for /cvsweb/cvsweb.cgi between version 4.11 and 4.17

version 4.11, 2019/11/10 14:39:55 version 4.17, 2019/11/11 13:28:36
Line 75  use vars qw (
Line 75  use vars qw (
   $tablepadding $hr_breakable $showfunc $hr_ignwhite $hr_ignkeysubst    $tablepadding $hr_breakable $showfunc $hr_ignwhite $hr_ignkeysubst
   $inputTextSize $mime_types $allow_annotate $allow_markup $allow_mailtos    $inputTextSize $mime_types $allow_annotate $allow_markup $allow_mailtos
   $allow_log_extra $allow_dir_extra $allow_source_extra    $allow_log_extra $allow_dir_extra $allow_source_extra
   $allow_cvsgraph $cvsgraph_config $use_java_script $edit_option_form    $allow_cvsgraph $cvsgraph_config $edit_option_form
   $show_subdir_lastmod $show_log_in_markup $preformat_in_markup    $show_subdir_lastmod $show_log_in_markup $preformat_in_markup
   $tabstop $state $annTable $sel @ForbiddenFiles    $tabstop $state $annTable $sel @ForbiddenFiles
   $use_descriptions %descriptions @mytz $dwhere    $use_descriptions %descriptions @mytz $dwhere
Line 86  use vars qw (
Line 86  use vars qw (
   $allow_enscript @enscript_options %enscript_types    $allow_enscript @enscript_options %enscript_types
 );  );
   
   require Compress::Zlib;
 use Cwd                   qw(abs_path);  use Cwd                   qw(abs_path);
 use File::Path            qw(rmtree);  use File::Path            qw(rmtree);
 use File::Spec::Functions qw(canonpath catdir catfile curdir devnull rootdir  use File::Spec::Functions qw(canonpath catdir catfile curdir devnull rootdir
Line 102  use constant CVSWEBMARKUP => qr{^text/(x-cvsweb|vnd\.v
Line 103  use constant CVSWEBMARKUP => qr{^text/(x-cvsweb|vnd\.v
 use constant LOG_FILESEPR => qr/^={77}$/o;  use constant LOG_FILESEPR => qr/^={77}$/o;
 use constant LOG_REVSEPR  => qr/^-{28}$/o;  use constant LOG_REVSEPR  => qr/^-{28}$/o;
   
 use constant HAS_ZLIB     => eval { require Compress::Zlib; };  
 use constant HAS_EDIFF    => eval { require String::Ediff;  };  
   
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
   
 # All global initialization that can be done in compile time should go to  # All global initialization that can be done in compile time should go to
Line 121  BEGIN
Line 119  BEGIN
   
   $HTML_META = <<EOM;    $HTML_META = <<EOM;
 <meta name="robots" content="nofollow" />  <meta name="robots" content="nofollow" />
 <meta name="generator" content="FreeBSD-CVSweb $VERSION" />  <meta name="generator" content="CVSweb $VERSION" />
 <meta http-equiv="Content-Script-Type" content="text/javascript" />  
 <meta http-equiv="Content-Style-Type" content="text/css" />  <meta http-equiv="Content-Style-Type" content="text/css" />
 EOM  EOM
   
Line 138  EOM
Line 135  EOM
   
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
   
 sub printDiffSelect($);  sub printDiffSelect();
 sub printDiffSelectStickyVars();  sub printDiffSelectStickyVars();
 sub getDiffLinks($$$);  sub getDiffLinks($$$);
 sub printLogSortSelect($);  sub printLogSortSelect();
 sub findLastModifiedSubdirs(@);  sub findLastModifiedSubdirs(@);
 sub htmlify_sub(&$);  sub htmlify_sub(&$);
 sub htmlify($;$);  sub htmlify($;$);
Line 214  $cvstreedefault = $logo = $defaulttitle =
Line 211  $cvstreedefault = $logo = $defaulttitle =
   $address = $long_intro = $short_instruction = $shortLogLen = $show_author =    $address = $long_intro = $short_instruction = $shortLogLen = $show_author =
   $tablepadding = $hr_breakable = $showfunc = $hr_ignwhite =    $tablepadding = $hr_breakable = $showfunc = $hr_ignwhite =
   $hr_ignkeysubst = $inputTextSize = $mime_types = $allow_annotate =    $hr_ignkeysubst = $inputTextSize = $mime_types = $allow_annotate =
   $allow_markup = $allow_compress = $use_java_script = $edit_option_form =    $allow_markup = $allow_compress = $edit_option_form =
   $show_subdir_lastmod = $show_log_in_markup = $preformat_in_markup =    $show_subdir_lastmod = $show_log_in_markup = $preformat_in_markup =
   $tabstop = $use_moddate = $gzip_open = $DEBUG = $allow_cvsgraph =    $tabstop = $use_moddate = $gzip_open = $DEBUG = $allow_cvsgraph =
   $cvsgraph_config = $cvshistory_url = $allow_tar = undef;    $cvsgraph_config = $cvshistory_url = $allow_tar = undef;
Line 317  $maycompress = (
Line 314  $maycompress = (
     && $ENV{HTTP_ACCEPT_ENCODING} =~ /gzip/)      && $ENV{HTTP_ACCEPT_ENCODING} =~ /gzip/)
    || $is_mozilla3)     || $is_mozilla3)
   && !$is_msie    && !$is_msie
   && !(defined($ENV{MOD_PERL}) && !HAS_ZLIB)    && !(defined($ENV{MOD_PERL}))
 );  );
   
 # Parameters that will be sticky in all constructed links/query strings.  # Parameters that will be sticky in all constructed links/query strings.
Line 365  if (defined($ENV{QUERY_STRING})) {
Line 362  if (defined($ENV{QUERY_STRING})) {
       $val = uri_unescape($val);        $val = uri_unescape($val);
       $val =~ /([^a-zA-Z_01-9.\/-])/ and fatal('404 Not Found',        $val =~ /([^a-zA-Z_01-9.\/-])/ and fatal('404 Not Found',
         'Invalid character "%s" in the value "%s" of the query parameter "%s"',          'Invalid character "%s" in the value "%s" of the query parameter "%s"',
         $1, $value, $key);          $1, $val, $key);
     } else {      } else {
       $val = 1;        $val = 1;
     }      }
Line 1129  EOF
Line 1126  EOF
                 || $input{$var} ne $DEFAULTVALUE{$var})                  || $input{$var} ne $DEFAULTVALUE{$var})
             && $var ne 'only_with_tag');              && $var ne 'only_with_tag');
     }      }
     printf(<<EOF, ($use_java_script ? ' onchange="this.form.submit()"' : ''));      print <<EOF;
 <span class="nowrap">  <span class="nowrap">
 <label for="only_with_tag" accesskey="T">Show only files with tag:  <label for="only_with_tag" accesskey="T">Show only files with tag:
 <select id="only_with_tag" name="only_with_tag"%s>  <select id="only_with_tag" name="only_with_tag">
 <option value="">All tags / default branch</option>  <option value="">All tags / default branch</option>
 EOF  EOF
     foreach my $tag (reverse sort { lc $a cmp lc $b } keys %tags) {      foreach my $tag (reverse sort { lc $a cmp lc $b } keys %tags) {
Line 1179  EOF
Line 1176  EOF
 <legend>General options</legend>  <legend>General options</legend>
 <input type="hidden" name="copt" value="1" />  <input type="hidden" name="copt" value="1" />
 EOF  EOF
     for my $v qw(hidecvsroot hidenonreadable) {      for my $v (qw(hidecvsroot hidenonreadable)) {
       printf(qq{<input type="hidden" name="%s" value="%s" />\n},        printf(qq{<input type="hidden" name="%s" value="%s" />\n},
              $v, $input{$v} || 0);               $v, $input{$v} || 0);
     }      }
Line 1230  EOF
Line 1227  EOF
 </td>  </td>
 <td class="opt-value">  <td class="opt-value">
 EOF  EOF
     printLogSortSelect(0);      printLogSortSelect();
     print <<EOF;      print <<EOF;
 </td>  </td>
 <td class="opt-label">  <td class="opt-label">
Line 1249  EOF
Line 1246  EOF
 </td>  </td>
 <td>  <td>
 EOF  EOF
     printDiffSelect(0);      printDiffSelect();
     print <<EOF;      print <<EOF;
 </td>  </td>
 <td colspan="2" class="opt-label">  <td colspan="2" class="opt-label">
Line 1373  gzipclose();
Line 1370  gzipclose();
 ## End MAIN  ## End MAIN
   
   
 sub printDiffSelect($)  sub printDiffSelect()
 {  {
   my ($use_java_script) = @_;  
   
   print '<select id="f" name="f"';    print '<select id="f" name="f"';
   print ' onchange="this.form.submit()"' if $use_java_script;  
   print ">\n";    print ">\n";
   
   for my $difftype (@DIFFTYPES) {    for my $difftype (@DIFFTYPES) {
Line 1402  sub printDiffSelectStickyVars()
Line 1396  sub printDiffSelectStickyVars()
 }  }
   
   
 sub printLogSortSelect($)  sub printLogSortSelect()
 {  {
   my ($use_java_script) = @_;  
   
   print '<select id="logsort" name="logsort"';    print '<select id="logsort" name="logsort"';
   print ' onchange="this.form.submit()"' if $use_java_script;  
   print ">\n";    print ">\n";
   
   for my $sortkey (@LOGSORTKEYS) {    for my $sortkey (@LOGSORTKEYS) {
Line 2348  EOF
Line 2339  EOF
 EOF  EOF
     printDiffSelectStickyVars();      printDiffSelectStickyVars();
     print 'Diff format: ';      print 'Diff format: ';
     printDiffSelect($use_java_script);      printDiffSelect();
     print "<input type=\"submit\" value=\"Show\" />\n</form>\n";      print "<input type=\"submit\" value=\"Show\" />\n</form>\n";
     html_footer();      html_footer();
     gzipclose();      gzipclose();
Line 3266  EOF
Line 3257  EOF
 </td>  </td>
 <td class="opt-value">  <td class="opt-value">
 EOF  EOF
   printDiffSelect($use_java_script);    printDiffSelect();
   print <<EOF;    print <<EOF;
 </td>  </td>
 <td></td>  <td></td>
Line 3275  EOF
Line 3266  EOF
   
   if (@branchnames) {    if (@branchnames) {
   
     printf(<<EOF, $use_java_script ? ' onchange="this.form.submit()"' : '');      print <<EOF;
 <tr>  <tr>
 <td class="opt-label">  <td class="opt-label">
 <label for="only_with_tag" accesskey="B">View only branch:</label>  <label for="only_with_tag" accesskey="B">View only branch:</label>
 </td>  </td>
 <td class="opt-value">  <td class="opt-value">
 <a name="branch">  <a name="branch">
 <select id="only_with_tag" name="only_with_tag"%s>  <select id="only_with_tag" name="only_with_tag">
 EOF  EOF
   
     my @tmp = ();      my @tmp = ();
Line 3315  EOF
Line 3306  EOF
 </td>  </td>
 <td>  <td>
 EOF  EOF
   printLogSortSelect($use_java_script);    printLogSortSelect();
   print <<EOF;    print <<EOF;
 </td>  </td>
 <td><input type="submit" value="Set" accesskey="S" /></td>  <td><input type="submit" value="Set" accesskey="S" /></td>
Line 3353  EOF
Line 3344  EOF
     }      }
   } elsif ($state eq "PreChange") {     # state eq "PreChange"    } elsif ($state eq "PreChange") {     # state eq "PreChange"
                                         # we got removes with subsequent adds                                          # we got removes with subsequent adds
     if (HAS_EDIFF) {  
       # construct the suffix tree  
       my $left_diff = join("\n", @$leftColRef[0..$leftRow-1]);  
       my $right_diff = join("\n", @$rightColRef[0..$rightRow-1]);  
       my $diff_str = String::Ediff::ediff($left_diff, $right_diff);  
   
       my @diff_str = split(/ /, $diff_str);  
       my $INFINITY = 10000000;  
       push(@diff_str, ($INFINITY) x 8);  
       my ($idx, $b1, $e1, $lb1, $le1, $b2, $e2, $lb2, $le2) =  
         (0, @diff_str[0..7]);  
       my ($l_cul, $r_cul) = (0, 0);  
       my ($ldx, $rdx) = (0, 0);  
       my (@left_html, @right_html);  
       for (my $j = 0; $j < $leftRow; $j++) {  
         my $line_len = length(@$leftColRef[$j]);  
         my $line = @$leftColRef[$j];  
         $l_cul += length($line) + 1; # includes "\n"  
         my $l_culx = $l_cul - 1; # not includes "\n"  
         if ($j < $lb1) {  
           $line = spacedHtmlText($line);  
           push(@left_html, "<td class=\"diff diff-changed\">$line</td>");  
         } elsif ($lb1 == $j) {  
           my $html_line;  
           while ($lb1 == $j) {  
             my $begin_char = $l_culx - $b1;  
   
             $line =~ /^(.*)(.{$begin_char})$/;  
             $html_line .= spacedHtmlText($1) .  
               '</span><span class="diff diff-unchanged">';  
             $line = $2;  
             last if ($j != $le1);  
   
             my $end_char = $l_culx - $e1;  
             $line =~ /^(.*)(.{$end_char})$/;  
             $html_line .= spacedHtmlText($1) .  
               '</span><span class="diff diff-changed">';  
             $line = $2;  
   
             $idx++;  
             my ($tb1, $te1, $tlb1, $tle1, $tb2, $te2, $tlb2, $tle2) =  
               ($b1, $e1, $lb1, $le1, $b2, $e2, $lb2, $le2);  
             ($b1, $e1, $lb1, $le1, $b2, $e2, $lb2, $le2) =  
               @diff_str[$idx*8..($idx+1)*8-1];  
             $lb1 = $INFINITY if ($lb1 < 0);  
             $lb2 = $INFINITY if ($lb2 < 0);  
             $le1 = $INFINITY if ($le1 < 0);  
             $le2 = $INFINITY if ($le2 < 0);  
             if ($te1 > $b1) {  
               ($b1, $lb1) = ($te1, $tle1);  
             }  
             if ($te2 > $b2) {  
               ($b2, $lb2) = ($te2, $tle2);  
             }  
           }  
           push(@left_html,  
                sprintf('<td><span class="diff diff-changed">%s%s</span></td>',  
                        $html_line, spacedHtmlText($line)));  
         } elsif ($le1 == $j) {  
           my $html_line;  
           while ($le1 == $j) {  
             my $end_char = $l_culx - $e1;  
             $line =~ /^(.*)(.{$end_char})$/;  
             $html_line .= spacedHtmlText($1) .  
               '</span><span class="diff diff-changed">';  
             $line = $2;  
   
             $idx++;  
             my ($tb1, $te1, $tlb1, $tle1, $tb2, $te2, $tlb2, $tle2) =  
               ($b1, $e1, $lb1, $le1, $b2, $e2, $lb2, $le2);  
             ($b1, $e1, $lb1, $le1, $b2, $e2, $lb2, $le2) =  
               @diff_str[$idx*8..($idx+1)*8-1];  
             $lb1 = $INFINITY if ($lb1 < 0);  
             $lb2 = $INFINITY if ($lb2 < 0);  
             $le1 = $INFINITY if ($le1 < 0);  
             $le2 = $INFINITY if ($le2 < 0);  
             if ($te1 > $b1) {  
               ($b1, $lb1) = ($te1, $tle1);  
             }  
             if ($te2 > $b2) {  
               ($b2, $lb2) = ($te2, $tle2);  
             }  
   
             last if ($lb1 != $j);  
   
             my $begin_char = $l_culx - $b1;  
   
             $line =~ /^(.*)(.{$begin_char})$/;  
             $html_line .= spacedHtmlText($1) .  
               '</span><span class="diff diff-unchanged">';  
             $line = $2;  
           }  
           push(@left_html,  
               sprintf('<td><span class="diff diff-unchanged">%s%s</span></td>',  
                       $html_line, spacedHtmlText($line)));  
         } else {  
           $line = spacedHtmlText($line);  
           push(@left_html, "<td class=\"diff diff-unchanged\">$line</td>");  
         }  
       }  
       ($idx, $b1, $e1, $lb1, $le1, $b2, $e2, $lb2, $le2) =  
         (0, @diff_str[0..7]);  
       $lb1 = $INFINITY if ($lb1 < 0);  
       $lb2 = $INFINITY if ($lb2 < 0);  
       $le1 = $INFINITY if ($le1 < 0);  
       $le2 = $INFINITY if ($le2 < 0);  
       for (my $j = 0; $j < $rightRow; $j++) {  
         my $line_len = length(@$rightColRef[$j]);  
         my $line = @$rightColRef[$j];  
         $r_cul += length($line) + 1; # includes "\n"  
         my $r_culx = $r_cul - 1; # not includes "\n"  
         if ($j < $lb2) {  
           $line = spacedHtmlText($line);  
           push(@right_html, "<td class=\"diff diff-changed\">$line</td>");  
         } elsif ($lb2 == $j) {  
           my $html_line;  
           while ($lb2 == $j) {  
             my $begin_char = $r_culx - $b2;  
   
             $line =~ /^(.*)(.{$begin_char})$/;  
             $html_line .= spacedHtmlText($1) .  
               '</span><span class="diff diff-unchanged">';  
             $line = $2;  
   
             last if ($j != $le2);  
   
             my $end_char = $r_culx - $e2;  
             $line =~ /^(.*)(.{$end_char})$/;  
             $html_line .= spacedHtmlText($1) .  
               '</span><span class="diff diff-changed">';  
             $line = $2;  
   
             $idx++;  
             my ($tb1, $te1, $tlb1, $tle1, $tb2, $te2, $tlb2, $tle2) =  
               ($b1, $e1, $lb1, $le1, $b2, $e2, $lb2, $le2);  
             ($b1, $e1, $lb1, $le1, $b2, $e2, $lb2, $le2) =  
               @diff_str[$idx*8..($idx+1)*8-1];  
             $lb1 = $INFINITY if ($lb1 < 0);  
             $lb2 = $INFINITY if ($lb2 < 0);  
             $le1 = $INFINITY if ($le1 < 0);  
             $le2 = $INFINITY if ($le2 < 0);  
             if ($te1 > $b1) {  
               ($b1, $lb1) = ($te1, $tle1);  
             }  
             if ($te2 > $b2) {  
               ($b2, $lb2) = ($te2, $tle2);  
             }  
           }  
           push(@right_html,  
                sprintf('<td><span class="diff diff-changed">%s%s</span></td>',  
                        $html_line, spacedHtmlText($line)));  
         } elsif ($le2 == $j) {  
           my $html_line;  
           while ($le2 == $j) {  
             my $end_char = $r_culx - $e2;  
             $line =~ /^(.*)(.{$end_char})$/;  
             $html_line .= spacedHtmlText($1) .  
               '</span><span class="diff diff-changed">';  
             $line = $2;  
   
             $idx++;  
             my ($tb1, $te1, $tlb1, $tle1, $tb2, $te2, $tlb2, $tle2) =  
               ($b1, $e1, $lb1, $le1, $b2, $e2, $lb2, $le2);  
             ($b1, $e1, $lb1, $le1, $b2, $e2, $lb2, $le2) =  
               @diff_str[$idx*8..($idx+1)*8-1];  
             $lb1 = $INFINITY if ($lb1 < 0);  
             $lb2 = $INFINITY if ($lb2 < 0);  
             $le1 = $INFINITY if ($le1 < 0);  
             $le2 = $INFINITY if ($le2 < 0);  
             if ($te1 > $b1) {  
               ($b1, $lb1) = ($te1, $tle1);  
             }  
             if ($te2 > $b2) {  
               ($b2, $lb2) = ($te2, $tle2);  
             }  
   
             last if ($lb2 != $j);  
   
             my $begin_char = $r_culx - $b2;  
             $line =~ /^(.*)(.{$begin_char})$/;  
             $html_line .= spacedHtmlText($1) .  
               '</span><span class="diff diff-unchanged">';  
             $line = $2;  
           }  
           push(@right_html,  
                sprintf('<td nowrap="nowrap"><span class="diff diff-unchanged"'.  
                        '>%s%s</span></td>',  
                        $html_line, spacedHtmlText($line)));  
         } else {  
           $line = spacedHtmlText ($line);  
           push @right_html, "<td class=\"diff diff-unchanged\">$line</td>";  
         }  
       }  
       for (my $j = 0; $j < $leftRow || $j < $rightRow ; $j++) { # dump out both cols  
         print  '<tr>';  
         if ($j < $leftRow) {  
           print $left_html[$j];  
         } else {  
           print '<td class="diff diff-changed-missing">&nbsp;</td>';  
         }  
         if ($j < $rightRow) {  
           print $right_html[$j];  
         } else {  
           print '<td class="diff diff-changed-missing">&nbsp;</td>';  
         }  
         print "</tr>\n";  
       }  
     } else {  
       for (my $j = 0; $j < $leftRow || $j < $rightRow; $j++) { # dump both cols        for (my $j = 0; $j < $leftRow || $j < $rightRow; $j++) { # dump both cols
         print "<tr>\n";          print "<tr>\n";
         if ($j < $leftRow) {          if ($j < $leftRow) {
Line 3579  EOF
Line 3362  EOF
         }          }
         print "\n</tr>\n";          print "\n</tr>\n";
       }        }
     }  
   }    }
 }  }
   
Line 3750  EOF
Line 3532  EOF
 <label for="f">Diff format:<br />  <label for="f">Diff format:<br />
 EOF  EOF
   printDiffSelectStickyVars();    printDiffSelectStickyVars();
   printDiffSelect($use_java_script);    printDiffSelect();
   printf(<<EOF, $rev1, $rev2);    printf(<<EOF, $rev1, $rev2);
 </label>  </label>
 <input type="submit" value="Show" />  <input type="submit" value="Show" />
Line 3960  sub chooseCVSRoot()
Line 3742  sub chooseCVSRoot()
         if ($input{$k} && $k ne 'cvsroot');          if ($input{$k} && $k ne 'cvsroot');
     }      }
   
     printf(<<EOF, $use_java_script ? ' onchange="this.form.submit()"' : '');      print <<EOF;
 <label for="cvsroot" accesskey="C">CVS Root:  <label for="cvsroot" accesskey="C">CVS Root:
 <select id="cvsroot" name="cvsroot"%s>  <select id="cvsroot" name="cvsroot">
 EOF  EOF
   
     foreach my $k (@CVSROOT) {      foreach my $k (@CVSROOT) {
Line 4247  sub http_header(;$$)
Line 4029  sub http_header(;$$)
     "img-src 'self'; style-src 'unsafe-inline'");      "img-src 'self'; style-src 'unsafe-inline'");
   
   if ($allow_compress && $maycompress) {    if ($allow_compress && $maycompress) {
     if (HAS_ZLIB  
         || (defined($CMD{gzip}) && open(GZIP, "| $CMD{gzip} -1 -c")))  
     {  
   
       push(@headers, 'Content-Encoding: gzip');        push(@headers, 'Content-Encoding: gzip');
       push(@headers, 'Vary: Accept-Encoding');     # RFC 2616, 14.44        push(@headers, 'Vary: Accept-Encoding');     # RFC 2616, 14.44
       print join("\r\n", @headers) . "\r\n\r\n";        print join("\r\n", @headers) . "\r\n\r\n";
Line 4258  sub http_header(;$$)
Line 4036  sub http_header(;$$)
       $| = 1;        $| = 1;
       $| = 0;                                      # Flush header output.        $| = 0;                                      # Flush header output.
   
       tie(*GZIP, __PACKAGE__, \*STDOUT) if HAS_ZLIB;        tie(*GZIP, __PACKAGE__, \*STDOUT);
       select(GZIP);        select(GZIP);
       $gzip_open = 1;        $gzip_open = 1;
   
     } else {  
   
       print join("\r\n", @headers) . "\r\n\r\n";  
       printf  
         '<span style="font-size: smaller">Unable to find gzip binary in the <b>$command_path</b> (<code>%s</code>) to compress output</span><br />',  
           htmlquote(join(':', @command_path));  
     }  
   
   } else {    } else {
     print join("\r\n", @headers) . "\r\n\r\n";      print join("\r\n", @headers) . "\r\n\r\n";
   }    }
Line 4437  sub TIEHANDLE
Line 4206  sub TIEHANDLE
               crc    => 0,                crc    => 0,
               len    => 0,                len    => 0,
             };              };
   my ($header) = pack("c10",    my ($header) = pack("C10",
                       MAGIC1, MAGIC2, Compress::Zlib::Z_DEFLATED(),                        MAGIC1, MAGIC2, Compress::Zlib::Z_DEFLATED(),
                       0, 0, 0, 0, 0, 0, OSCODE);                        0, 0, 0, 0, 0, 0, OSCODE);
   print {$o->{handle}} $header;    print {$o->{handle}} $header;

Legend:
Removed from v.4.11  
changed lines
  Added in v.4.17

CVSweb