#!/usr/bin/perl

$family   ="stm32f1xx";
$deffile  = "unilib.def";
$outfile  = ">unilib.h";
$outfile2  = ">unilib_internals.h";
$outfile1 = ">inc/unilib_defs.h";

$infunc=0;

open(WFILE,$outfile);
open(XWFILE,$outfile2);


open(RFILE,"/usr/local/share/addhead/header.c");
while(<RFILE>)
{
	chomp();
	$line=$_;
	$printit=1;
	if(substr($line,0,5) eq "//nop") {$printit = 0;}
	if(substr($line,0,5) eq "//pri") {$printit = 0;}
	if(((substr($line,0,3) ne "---")) && ($printit == 1))
	{
		print WFILE $line."\n";
		print XWFILE $line."\n";
	}
}

close(RFILE);


open(RFILE,$deffile);

#print WFILE $line."\n";
#printf WFILE "typedef unsigned char * va_list;\n";


while(<RFILE>)
{
	chomp();
	$line=$_;
	if((substr($line,0,3) ne "---"))
	{
		print WFILE $line."\n";
	}
}

close(RFILE);

$muster="src/*";
@lib_folders=<${muster}>;

foreach $folder (@lib_folders)
{
	print $folder."\n";
	if(!($folder =~ /syssrc/))
	{
	$muster=$folder."/*.c";
	@lib_files=<${muster}>;
	foreach $cfile (@lib_files)
	{
		print "\t".$cfile."\n";
#		print WFILE "\n//---------------------------------------------------------------------------------------\n"; 
#		print WFILE "// exports from ".$folder."/".$cfile; 
#		print WFILE "\n//---------------------------------------------------------------------------------------\n"; 

#		print XWFILE "\n//---------------------------------------------------------------------------------------\n"; 
#		print XWFILE "// internals from ".$folder."/".$cfile; 
#		print XWFILE "\n//---------------------------------------------------------------------------------------\n"; 

		open(RFILE,$cfile);
		$infunc=1;
		$xinfunc=1;
		$iscomm=0;
		$posthead=0;
		while(<RFILE>)
		{
			chomp();
			$line=$_;
			$line=~ s/_fresult/float/g;
			if(substr($line,0,8) eq "#include")
			{
				$posthead=1;
			}

			#my comments
			if((substr($line,0,3) eq "//#") && ($posthead==1))
			{
				print WFILE $line."\n";
			}
			#extern global vars
			elsif((substr($line,0,8) eq "volatile") && (!($line=~ /\(/)) && (!($line=~ /\/\/private/)) && (!($line=~ /\/\/internal/)))
			{
				print WFILE "extern ".$line."\n\n";
				$infunc=1;
			}
			#extern global vars
			elsif((substr($line,0,8) eq "unsigned") && (!($line=~ /\(/)) && (!($line=~ /\/\/private/)) && (!($line=~ /\/\/internal/)))
			{
				print WFILE "extern ".$line."\n\n";
				$infunc=1;
			}
			elsif((substr($line,0,4) eq "char") && (!($line=~ /\(/)) && (!($line=~ /\/\/private/)) && (!($line=~ /\/\/internal/)))
			{
				print WFILE "extern ".$line."\n\n";
				$infunc=1;
			}
			elsif((substr($line,0,3) eq "int") && (!($line=~ /\(/)) && (!($line=~ /\/\/private/)) && (!($line=~ /\/\/internal/)))
			{
				print WFILE "extern ".$line."\n\n";
				$infunc=1;
			}
			elsif((substr($line,0,4) eq "long") && (!($line=~ /\(/)) && (!($line=~ /\/\/private/)) && (!($line=~ /\/\/internal/)))
			{
				print WFILE "extern ".$line."\n\n";
				$infunc=1;
			}
			elsif((substr($line,0,5) eq "float") && (!($line=~ /\(/)) && (!($line=~ /\/\/private/)) && (!($line=~ /\/\/internal/)))
			{
				print WFILE "extern ".$line."\n\n";
				$infunc=1;
			}


			#my comments
			elsif((substr($line,0,4) eq "//1#") && ($posthead==1))
			{
				$xline=$line;
				$xline=~ s/1#/#/g;
				print XWFILE $xline."\n";
			}

			#extern global vars
			elsif((substr($line,0,8) eq "volatile") && (!($line=~ /\(/)) && (($line=~ /\/\/private/)))
			{
				$line=~ s/\/\/private//g;
				$line=~ s/\t$//g;
				$line=~ s/\t$//g;
				print XWFILE "extern ".$line."\n";
				$infunc=1;
			}
			#extern global vars
			elsif((substr($line,0,8) eq "unsigned") && (!($line=~ /\(/)) && (($line=~ /\/\/private/)))
			{
				$line=~ s/\/\/private//g;
				$line=~ s/\t$//g;
				$line=~ s/\t$//g;
				print XWFILE "extern ".$line."\n";
				$infunc=1;
			}
			elsif((substr($line,0,4) eq "char") && (!($line=~ /\(/)) && (($line=~ /\/\/private/)))
			{
				$line=~ s/\/\/private//g;
				$line=~ s/\t$//g;
				$line=~ s/\t$//g;
				print XWFILE "extern ".$line."\n";
				$infunc=1;
			}
			elsif((substr($line,0,3) eq "int") && (!($line=~ /\(/)) && (($line=~ /\/\/private/)))
			{
				$line=~ s/\/\/private//g;
				$line=~ s/\t$//g;
				$line=~ s/\t$//g;
				print XWFILE "extern ".$line."\n";
				$infunc=1;
			}
			elsif((substr($line,0,4) eq "long") && (!($line=~ /\(/)) && (($line=~ /\/\/private/)))
			{
				$line=~ s/\/\/private//g;
				$line=~ s/\t$//g;
				$line=~ s/\t$//g;
				print XWFILE "extern ".$line."\n";
				$infunc=1;
			}
			elsif((substr($line,0,5) eq "float") && (!($line=~ /\(/)) && (($line=~ /\/\/private/)))
			{
				$line=~ s/\/\/private//g;
				$line=~ s/\t$//g;
				$line=~ s/\t$//g;
				print XWFILE "extern ".$line."\n";
				$infunc=1;
			}

			if(substr($line,0,1) eq "{") {$infunc=1;}
			if(substr($line,0,1) eq "{") {$xinfunc=1;}
			if(substr($line,0,3) eq "//#") {$infunc=0;}
			if(substr($line,0,4) eq "//1#") {$xinfunc=0;}
			if(substr($line,0,6) eq "//ASM ") {$line=substr($line,6,length($line)-6);}

			if((substr($line,0,1) ne "#") && (length($line) > 2) && ($infunc == 0))	# ignore declares and empty lines
			{
				#functions
				if(($line=~ /^unsigned/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print WFILE $line.";\n\n";
				}
				elsif(($line=~ /^char/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print WFILE $line.";\n\n";
				}
				elsif(($line=~ /^int/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print WFILE $line.";\n\n";
				}
				elsif(($line=~ /^long/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print WFILE $line.";\n\n";
				}
				elsif(($line=~ /^float/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print WFILE $line.";\n\n";
				}
				elsif(($line=~ /^void/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print WFILE $line.";\n\n";
				}
				elsif(($line=~ /^size_t/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print WFILE $line.";\n\n";
				}
			}

			if((substr($line,0,1) ne "#") && (length($line) > 2) && ($xinfunc == 0)) # ignore declares and empty lines
			{
				#functions
				if(($line=~ /^unsigned/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print XWFILE $line.";\n\n";
				}
				elsif(($line=~ /^char/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print XWFILE $line.";\n\n";
				}
				elsif(($line=~ /^int/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print XWFILE $line.";\n\n";
				}
				elsif(($line=~ /^long/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print XWFILE $line.";\n\n";
				}
				elsif(($line=~ /^float/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print XWFILE $line.";\n\n";
				}
				elsif(($line=~ /^void/) && ($line=~ /\(/) && (!($line=~ /\;$/)))
				{
					print XWFILE $line.";\n\n";
				}
			}

		}
		close(RFILE)
	}
	}
}

close(WFILE);
close(XWFILE);




open(WFILE,$outfile1);
open(RFILE,$deffile);
$printit=1;
while(<RFILE>)
{
	chomp();
	$line=$_;
	if(substr($line,0,5) eq "//nop") {$printit = 0;}
	if(substr($line,0,5) eq "//pri") {$printit = 1;}
	
	if((substr($line,0,3) ne "---") && ($printit == 1))
	{
		print WFILE $line."\n";
	}
}

close(RFILE);
close(WFILE);


$cmd="cp unilib.h /usr/local/toolchain/unilib/$family/include/unilib.h";
$dummy=`$cmd`;print $dummy;
$cmd="cp unilib_internals.h /usr/local/toolchain/unilib/$family/include/unilib_internals.h";
$dummy=`$cmd`;print $dummy;
#$cmd="cp inc/stdarg.h /usr/local/toolchain/unilib/$family/include/stdarg.h";
#$dummy=`$cmd`;print $dummy;

$cmd="cp unilib.h inc/unilib.h";
$dummy=`$cmd`;print $dummy;
