[0001]
[0002]
[0003]
[0004]
[0005]
[0006]
[0007]
[0008]
[0009]
[0010]
[0011]
[0012]
[0013]
[0014]
[0015]
[0016]
[0017]
[0018]
[0019]
[0020]
[0021]
[0022]
[0023]
[0024]
[0025]
[0026]
[0027]
[0028]
[0029]
[0030]
[0031]
[0032]
[0033]
[0034]
[0035]
[0036]
[0037]
[0038]
[0039]
[0040]
[0041]
[0042]
[0043]
[0044]
[0045]
[0046]
[0047]
[0048]
[0049]
[0050]
[0051]
[0052]
[0053]
[0054]
[0055]
[0056]
[0057]
[0058]
[0059]
[0060]
[0061]
[0062]
[0063]
[0064]
[0065]
[0066]
[0067]
[0068]
[0069]
[0070]
[0071]
[0072]
[0073]
[0074]
[0075]
[0076]
[0077]
[0078]
[0079]
[0080]
[0081]
[0082]
[0083]
[0084]
[0085]
[0086]
[0087]
[0088]
[0089]
[0090]
[0091]
[0092]
[0093]
[0094]
[0095]
[0096]
[0097]
[0098]
[0099]
[0100]
[0101]
[0102]
[0103]
[0104]
[0105]
[0106]
[0107]
[0108]
[0109]
[0110]
[0111]
[0112]
[0113]
[0114]
[0115]
[0116]
[0117]
[0118]
[0119]
[0120]
[0121]
[0122]
[0123]
[0124]
[0125]
[0126]
[0127]
[0128]
[0129]
[0130]
[0131]
[0132]
[0133]
[0134]
[0135]
[0136]
[0137]
[0138]
[0139]
[0140]
[0141]
[0142]
[0143]
[0144]
[0145]
[0146]
[0147]
[0148]
[0149]
[0150]
[0151]
[0152]
[0153]
[0154]
[0155]
[0156]
[0157]
[0158]
[0159]
[0160]
[0161]
[0162]
[0163]
[0164]
[0165]
[0166]
[0167]
[0168]
[0169]
[0170]
[0171]
[0172]
[0173]
[0174]
[0175]
[0176]
[0177]
[0178]
[0179]
[0180]
[0181]
[0182]
[0183]
[0184]
[0185]
[0186]
[0187]
[0188]
[0189]
[0190]
[0191]
[0192]
[0193]
[0194]
[0195]
[0196]
[0197]
[0198]
[0199]
[0200]
[0201]
[0202]
[0203]
[0204]
[0205]
[0206]
[0207]
[0208]
[0209]
[0210]
[0211]
[0212]
[0213]
[0214]
[0215]
[0216]
[0217]
[0218]
[0219]
[0220]
[0221]
[0222]
[0223]
[0224]
[0225]
[0226]
[0227]
[0228]
[0229]
[0230]
[0231]
[0232]
[0233]
[0234]
[0235]
#
# Dick Munroe (munroe@csworks.com)
#
# The following performs a simple conversion from an OSU specific
# CGI to a "server neutral" framework that can run (more or less)
# unchanged under:
#
#	1. OSU
#	2. WASD with OSU emulation.
#	3. WASD with (sub)processes.
#
# The script was designed to do a "good" not perfect job of
# conversion.  In other works, the output must be checked to make
# sure that it REALLY does what you want.  It may also need to be
# slightly modified to process your cgis as the coding
# conventions at your site are probably different from ours.
#
# Run it like this:
#
# perl framework.pl < cgi.com > convertedcgi.com
#

my @theFile ;
my @theStandard ;

sub dcl
{
	my $theLine = shift ;

	return '$ ' . $theLine . "\n" ;
}

sub update
{
	my $theLine = shift ;

	undef @theStandard ;

	push @theFile,dcl('theDecnetFlag = (f$type(wwwexec_rundown_string) .nes. "")') ;
	push @theFile,dcl('if (theDecnetFlag)') ;
	push @theFile,dcl('then') ;
	push @theFile,dcl('    nl = f$fao("!/")         !  CR/LF sequence') ;
	push @theFile,dcl('    say = "write net_link"') ;
	push @theFile,dcl('    say "<DNETRECMODE>"      ! Set implied carriage control.') ;
	push @theFile,dcl('    cgisymbols := $cgi-bin:[000000]osu-cgi_symbols.exe') ;
	push @theFile,$theLine ;
	push @theFile,dcl('else') ;
	push @theFile,dcl('    say = "write sys$output"') ;
	push @theFile,dcl('    cgiutl := $cgi-bin:[000000]cgiutl.exe') ;

	my $theCgiutlLine = $theLine ;

	$theCgiutlLine =~ s{cgisymbols}{cgiutl /URLDECODE /SYMBOL} ;
	$theCgiutlLine =~ s{[ \t]{2,}}{ }g ;
	$theCgiutlLine =~ s{"www_"\s+}{}i ;
	$theCgiutlLine =~ s{^\$ }{\$     } ;
	$theCgiutlLine =~ s{([^\s]+)='([^' ]+)'{0,1}}{/FIELD=$1 /OUTPUT=*$2}g ;

 	if ($theCgiutlLine =~ s{([^\s]+)>'([^' ]+)'{0,1}}{/FIELD=$1 /OUTPUT=*$2}g)
	{
		$theCgiutlLine =~ s{URLDECODE}{MULTIPART} ;
	}

	$theCgiutlLine =~ s{([^\s]+)=([^ \.]+\.[^ ]+)}{/FIELD=$1 /OUTPUT=$2}g ;

	if ($theCgiutlLine =~ s{([^\s]+)>([^ \.]+\.[^ ]+)}{/FIELD=$1 /OUTPUT=$2}g)
	{
		$theCgiutlLine =~ s{URLDECODE}{MULTIPART} ;
	}

	$theCgiutlLine =~ s{\"(.*?)\"}{/PREFIX=$1FLD}i ;

	if ($theCgiutlLine =~ m/\@/)
	{
		print STDERR 'Manual intervention is necessary due to @ in CGIUTL invocation',"\n" ;
		$theCgiutlLine =~ s{URLDECODE}{MULTIPART} ;
		
		my $theDefineLine = $theCgiutlLine ;

		$theDefineLine =~ s{cgiutl}{DEFINE/USER CGIUTL\$PARAM}i ;
		$theDefineLine =~ s{("\@'*.*?'*")}{} ;
	
		push @theFile,$theDefineLine ;
		push @theFile,'$     DEFINE/USER CGIUTL$PARAM_1 ' . $1 . "\n" ;

		$theCgiutlLine = '$     cgiutl' . "\n" ;
	}

	$theCgiutlLine =~ s{/FIELD}{-\n              /FIELD}gi ;

	$theCgiutlLine =~ s{^\$\s*}{          } ;

	push @theFile,'$     if (f$type(theNotAFormFlag) .eqs. "") then -' . "\n" ;

	push @theFile,$theCgiutlLine ;

	push @theFile,dcl('endif') ;
	push @theFile,dcl('') ;
	push @theFile,dcl('theOSUFlag = (f$extract(0,3,www_server_software) .eqs. "OSU")') ;
	push @theFile,dcl('theVerifyFlag = (f$trnlnm("httpd$verify") .nes. "")') ;
	push @theFile,dcl('theWASDFlag = (f$extract(0,10,www_server_software) .eqs. "HTTPd-WASD")') ;
	push @theFile,dcl('if (theWASDFlag) .and. (.not. theVerifyFlag)') ;
	push @theFile,dcl('then') ;
	push @theFile,dcl('    set message /nofacility /noidentification /noseverity /notext') ;
	push @theFile,dcl('endif') ;
	push @theFile,dcl('if (theVerifyFlag)') ;
	push @theFile,dcl('then') ;
	push @theFile,dcl('    if (theDecnetFlag)') ;
	push @theFile,dcl('    then') ;
	push @theFile,dcl('        say "Content-type: text/plain",nl,nl') ;
	push @theFile,dcl('        define sys$output net_link:') ;
	push @theFile,dcl('        set verify') ;
	push @theFile,dcl('    endif') ;
	push @theFile,dcl('    show symbol/global/all') ;
	push @theFile,dcl('    show symbol/local/all') ;
	push @theFile,dcl('endif') ;
} ;

use strict ;


my $theEnvironmentFlag = 1 ;
my $theExitFlag = 1 ;
my $theFormFlag = 1 ;
my $theLine ;
my $theLocationFlag = 0 ;
my $theNlFlag = 0 ;
my $theSayFlag = 0 ;

while (defined($theLine = <STDIN>))
{
	$theExitFlag = 1 ;

	if ($theLine =~ m/^\$\s*exit/i)
	{
		$theExitFlag = 0 ;
	}
	elsif ($theLine =~ m/f\$length\(www_path_info\)/i)
	{
		push @theStandard,'$ theNotAFormFlag = 1' . "\n" if ($theFormFlag) ;
		$theFormFlag = 0 ;
	}
	elsif ($theLine =~ s{say\s+"location:\s+}{call location "})
	{
		if ((! $theLocationFlag) && ($theEnvironmentFlag))
		{
			push @theStandard,'$ nl = f$fao("!/")' . "\n" if (! $theNlFlag) ;
			push @theStandard,'$ say = "write net_link"' . "\n" if (! $theSayFlag) ;
			push @theStandard,'$ cgisymbols := $cgi-bin:[000000]osu-cgi_symbols.exe' . "\n" ;
			push @theStandard,'$ cgiutl := $cgi-bin:[000000]cgiutl.exe' . "\n" ;
		} ;
		$theLine =~ s{,nl,nl}{} ;
		$theLocationFlag = 1 ;
	}
	elsif ($theLine =~ s{^\$\s*[mcr]*\s*cgi-bin:\[000000\]osu-cgi_symbols[\.ex]*}{\$     cgisymbols}i)
	{
		if ($theEnvironmentFlag)
		{
			update($theLine) ;
			$theEnvironmentFlag = 0 ;
			next ;
		}
	}
	elsif ($theLine =~ s{^\$\s*[mcr]*\s*www_root:\[bin\]cgi_symbols[\.ex]*}{\$     cgisymbols}i)
	{
		if ($theEnvironmentFlag)
		{
			update($theLine) ;
			$theEnvironmentFlag = 0 ;
			next ;
		}
	}
	elsif ($theLine =~ m/^(\$\s*)run/i)
	{
		push @theFile,$1,'if (theDecnetFlag) then define/user sys$output net_link:',"\n" if (! $theEnvironmentFlag) ;
	}
	else
	{
		if ($theLine =~ m/^\$\s*nl\s*=\s*f\$fao/i)
		{
			push @theStandard,$theLine ;
			$theNlFlag = 1 ;
			next ;
		}
		elsif ($theLine =~ m/^\$\s*say\s*=\s*"write/i)
		{
			push @theStandard,$theLine ;
			$theSayFlag = 1 ;
			next ;
		}
		elsif ($theLine =~ m/^\$\s*say\s*"<DNETRECMODE>"/i)
		{
			push @theStandard,$theLine ;
			next ;
		}
		elsif ($theLine =~ m/^\$\s*write\s*net_link\s*"<DNETRECMODE>"/i)
		{
			push @theStandard,'$ nl = f$fao("!/")' . "\n" if (! $theNlFlag) ;
			push @theStandard,'$ say = "write net_link"' . "\n" if (! $theSayFlag) ;
			push @theStandard,'$ say "<DNETRECMODE>"' . "\n" ;
			$theNlFlag = 1 ;
			$theSayFlag = 1 ;
			next ;
		}
		else
		{
			next if (($theLine =~ m/^\$\s*define.*?sys\$output.*?net_link/i) && (! $theEnvironmentFlag)) ;
		}
	} ;
	
	push @theFile,$theLine ;
} ;

print join '',@theStandard if (@theStandard) ;
print join '',@theFile ;

exit() if (($theEnvironmentFlag) && (!$theLocationFlag)) ;

if ($theExitFlag)
{
	print dcl('') ;
	print dcl('exit') ;
}

if ($theLocationFlag)
{
	print dcl('') ;
	print dcl('Location: subroutine') ;
	print dcl('if (theDecnetFlag)') ;
	print dcl('then say "Location: " + P1,nl,nl') ;
	print dcl('else cgiutl /location=*p1') ;
	print dcl('endif') ;
	print dcl('exit') ;
	print dcl('endsubroutine') ;
}