#!perl
use strict;
use warnings;
open IN, "acm.c";
my @procs = ();
my @init = ();
while (<IN>) {
	if (/(\S+)\(#(\d+)\)/) { &replit($1,$2)}
}
sub replit {
	my ($n,$c) = @_;
	push @procs, "PROC p$n = NULL;\n";
	push @init, "p$n = GetProcAddress(acmhReal,\"$n\");\n";
	my $out = "PROC p$n = NULL;\n";
	my $out2="";
	$out .= 'extern "C" __declspec( dllexport ) __declspec( naked ) DWORD '.$n."(";
	$out2 .= 'extern "C" __declspec( dllexport ) __declspec( naked ) DWORD '.$n."() {\n\t__asm{\n\t\tjmp p$n;\n\t}\n}\n";
	for (my $i = 1; $i <= $c; $i++) {
		$out .= "DWORD p$i, ";
	}
	$out =~ s/, $//;
	$out .= "){\n";
#	$out .= "\tOutputDebugString(\"$n 1\");\n";
	$out .= "\tif (p$n == NULL) p$n = GetProcAddress(acmhReal,\"$n\");\n\t__asm{\n";
	for (my $i = $c; $i > 0; $i--) {
		$out .= "\t\tpush p$i;\n";
	}
	
	$out .= "\t\tcall p$n;\n";
	$out .= "\t\tret ".($c*4).";\n";
	$out .= "\t}\n}\n";
	print $out2;
}
print "\n\n";
print join("",@procs);
print "\n\n";
print join("",@init);
