#!/usr/local/bin/perl
##############################################################################
# PRINT OUT THE MAIN LOOPING STRUCTURE
##############################################################################
print <<EOF;
while(\$file=shift(\@ARGV))
{

  \$infile  = \$file ;
  \$outfile = \$file . "pp" ;

  open(INFILE, "<\$infile" ) || die "Can't open \$infile for input: \$!\\n" ;
  open(OUTFILE,">\$outfile") || die "Can't open \$outfile for output: \$!\\n" ; 
EOF

#############################################################################
# ADD THE INCLUDE STATEMENT FOR EACH HEADER FILE BEING PROCESSED
#############################################################################
foreach $arg (@ARGV) {
print <<EOF;

  print OUTFILE "#include \\"$arg\\"\\n" ;

EOF
}

print <<EOF;

  while(<INFILE>)
  {

EOF

while (<>)
{
	# split the macro definition into in name and value
	if(/\s*#define\s*(\w*)\s*(\S.*\S)\s*$/) {
		$macro = $1 ;
		$value = $2 ;

		@pieces = split(/(\W)/,$value) ;
		foreach $piece (@pieces) {
			if($value_of{$piece}) {
				$piece = $value_of{$piece} ;
			}
		}

		#join the pieces back together
		$value = join("",@pieces) ;

		#set the macro value
		$value_of{$macro} = $value ;

		#escape every character for safety
		@chars = split(//,$value) ;
		foreach $char (@chars) {
			if($char =~ /[^\|bBnnrtfdDwWsS0-9xcea]/) {
				$char = "\\$char" ;
			}
		}
		$value = join("",@chars) ;

		unshift(@output,"    s/$value/$macro/gi ;\n") ;

	}
}

print @output ;

print <<EOF;

   print OUTFILE ;

  }

  close(INFILE) ;
  close(OUTFILE);

}
EOF
