#!/bin/nawk -f
#
# purpose: convert forms files into C++ header suitable for use with
# Forms.cc
#

BEGIN {
	infile = ARGV[1];

	if (infile == "")
	{
		print "usage: make-forms-h formfile [flags]";
		exit(0);
	}

	stub = substr(infile, 1, index(infile, ".") - 1);
	outfile =  stub "Forms.cc";
	headerfile = stub "Forms.h";
	extfile =  stub ".fd+";

	for (i = 2; i <= ARGC; i++)
	{
		flags = flags " " ARGV[i];
		ARGV[i] = "";
	}

	if (ENVIRON["CPP"] != "")
		extcmd = "$CPP -P " flags " " extfile;
	else
		extcmd = "cpp -P " flags " " extfile;

# Read in the fd+ extensions file. This contains menu definitions etc.

	while ((extcmd | getline line) > 0)
	{
		$0 = line;

		if ($1 == "c" || $1 == "cz" || $1 == "m")
		# menu!
		{
			if ($3 == "")
				current_menu = $2;
			else
				current_menu = $3;
			# strip leading '.' prefixes
			match(current_menu, /^.*\./);
			current_menu = substr(current_menu, RLENGTH + 1);
			menu[current_menu] = 0;	# count of items in menu
			print "menu " current_menu;
			if ($1 == "m")
				menu_type[current_menu] = "menu";
			else
				menu_type[current_menu] = "choice";
		}
		else if (substr($1,1,1) == "i" && current_menu != "")
		# menu item!
		{
			if ($1 != "i")	# ignore 2nd field for 'ib' etc.
			{
				print "  (button " $2 ")";
				$2 = "";
				item_suffix = "%" substr($1, 2);		   
			}
			else
				item_suffix = "";
			$1 = "";

			# strip leading whitespace
			match($0, /^[ \t]*/);
			$0 = substr($0, RLENGTH + 1); 

			print "  item " menu[current_menu] ":" $0 ":";
			# store for later.
			last_item = menu[current_menu];
			menu_item[current_menu, menu[current_menu]++] = $0 item_suffix;
			item_prefix = "";
		}
		else if ($1 == "sp") # separator
		{
			menu_item[current_menu, last_item] = menu_item[current_menu, last_item] "%l";
		}
	}
	close(extfile);	
	
	print "converting " infile " into " headerfile " and " outfile;
	
	print "#ifndef __" stub "__" > headerfile;
	print "#define __" stub "__\n" > headerfile;
	print "#include \"Forms.h\"\n" > headerfile; 
	print "#include \"" headerfile "\"\n" > outfile; 
	print "/* This file automatically generated from " infile " */\n\n" > headerfile;
	print "/* This file automatically generated from " infile " */\n\n" > outfile;
}

$1 == "FL_FORM" {
# Form definition...

# close off previous class if there was one.
	if (form != "")
	{
		print "};\n" > headerfile;
		print "};\n" > outfile;
	}
	
# Start new form class...
	form = substr($2, 2, length($2) - 2);
	formclass = form "Form";
	
	print "class " formclass " : public Form" > headerfile;
	print "{" > headerfile;
	print "public:" > headerfile;
	print "    " formclass "();" > headerfile;
	print "" > headerfile;
	print "    void InitForm();" > headerfile;
	print "" > headerfile;
		
	print formclass "::" formclass "()" > outfile;
	print "{" > outfile;
	print "    InitForm();\n" > outfile;
	print "    RegisterForm(form);" > outfile;
}

$1 == "FL_OBJECT" {
	name = substr($2, 2, length($2) - 2);
	print "    FL_OBJECT  *" name ";" > headerfile;
	print "    RegisterObj(" name ");" > outfile;

	if (menu[name])
	{
		for (i = 0; i < menu[name]; i++) 
			print "    fl_addto_" menu_type[name] "(" name ", \"" menu_item[name, i] "\");" > outfile;
	}
}

END {
	print "};\n\n#endif\n" > headerfile;
	print "}\n" > outfile;
	print "Done.";
}
