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 $_;
 | |
| }
 |