98 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
#!/usr/local/bin/perl
 | 
						|
 | 
						|
$SCRIPT_NAME = $ENV{'SCRIPT_NAME'} || $0;
 | 
						|
$CGI = "file://$SCRIPT_NAME?";
 | 
						|
 | 
						|
if ($ENV{'QUERY_STRING'}) {
 | 
						|
  $file = $ENV{'QUERY_STRING'};
 | 
						|
} else {
 | 
						|
  $file = $ARGV[0];
 | 
						|
}
 | 
						|
$file = &cleanup($file);
 | 
						|
 | 
						|
if (-d $file) {
 | 
						|
  print <<EOF;
 | 
						|
Location: file:$file
 | 
						|
EOF
 | 
						|
  exit;
 | 
						|
}
 | 
						|
if (! open(FILE, "< $file")) {
 | 
						|
  $file = &html_quote($file);
 | 
						|
  $_ = "$file: " . &html_quote($!);
 | 
						|
  print <<EOF;
 | 
						|
Content-Type: text/html
 | 
						|
 | 
						|
<head><title>$file</title></head>
 | 
						|
<b>$_</b>
 | 
						|
EOF
 | 
						|
  exit 1;
 | 
						|
}
 | 
						|
 | 
						|
$file = &html_quote($file);
 | 
						|
($dir = $file) =~ s@[^/]*$@@;
 | 
						|
 | 
						|
print <<EOF;
 | 
						|
Content-Type: text/html
 | 
						|
 | 
						|
<head><title>$file</title></head>
 | 
						|
<pre>
 | 
						|
EOF
 | 
						|
while (<FILE>) {
 | 
						|
  $_ = &html_quote($_);
 | 
						|
 | 
						|
  s/^(\#\s*include\s+)(\".*\"|\<\;.*\>\;)/$1 . &header_ref($2)/ge;
 | 
						|
 | 
						|
  print;
 | 
						|
}
 | 
						|
close(FILE);
 | 
						|
print "</pre>\n";
 | 
						|
 | 
						|
sub header_ref {
 | 
						|
  local($_) = @_;
 | 
						|
  local($d);
 | 
						|
 | 
						|
  if (s/^\"//) {
 | 
						|
    s/\"$//;
 | 
						|
    return ""<a href=\"$CGI$dir$_\">$_</a>"";
 | 
						|
  }
 | 
						|
  s/^\<\;//;
 | 
						|
  s/\>\;$//;
 | 
						|
 | 
						|
  for $d (
 | 
						|
	"/usr/include",
 | 
						|
	"/usr/local/include",
 | 
						|
	"/usr/X11R6/include",
 | 
						|
	"/usr/X11/include",
 | 
						|
	"/usr/X/include",
 | 
						|
	"/usr/include/X11"
 | 
						|
  ) {
 | 
						|
    -f "$d/$_" && return "<<a href=\"$CGI$d/$_\">$_</a>>";
 | 
						|
  }
 | 
						|
  return $_;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
sub html_quote {
 | 
						|
  local($_) = @_;
 | 
						|
  local(%QUOTE) = (
 | 
						|
    '<', '<',
 | 
						|
    '>', '>',
 | 
						|
    '&', '&',
 | 
						|
    '"', '"',
 | 
						|
  );
 | 
						|
  s/[<>&"]/$QUOTE{$&}/g;
 | 
						|
  return $_;
 | 
						|
}
 | 
						|
 | 
						|
sub cleanup {
 | 
						|
  local($_) = @_;
 | 
						|
 | 
						|
  s@//+@/@g;
 | 
						|
  s@/\./@/@g;
 | 
						|
  while(m@/\.\./@) {
 | 
						|
    s@^/(\.\./)+@/@;
 | 
						|
    s@/[^/]+/\.\./@/@;
 | 
						|
  }
 | 
						|
  return $_;
 | 
						|
}
 |