#!@prefix@/bin/php -Cq
<?php // -*- PHP -*-

main($argc, $argv, $_ENV);

// {{{ main()

function main(&$argc, &$argv, &$env)
{
	global $debug;
	$debug = false;
	$file = check_options($argc, $argv, $env);
	parse_package_file($file);
	make_makefile_in($env);
}

// }}}
// {{{ check_options()

function check_options($argc, $argv, $env)
{
	global $debug;
	array_shift($argv);
	while ($argv[0]{0} == '-' && $argv[0] != '-') {
		$opt = array_shift($argv);
		switch ($opt) {
			case '--': {
				break 2;
			}
			case '-d': {
				$debug = true;
				break;
			}
			default: {
				die("pearize: unrecognized option `$opt'\n");
			}
		}
	}
	$file = array_shift($argv);
	if (empty($file)) {
		$file = "package.xml";
	} elseif ($file == '-') {
		$file = "php://stdin";
	}
	return $file;
}

// }}}
// {{{ make_makefile_in()

function make_makefile_in(&$env)
{
	global $libdata, $debug;
	if (sizeof($libdata) > 1) {
		die("No support yet for multiple libraries in one package.\n");
	}

	if ($debug) {
		$wp = fopen("php://stdout", "w");
	} else {
		$wp = @fopen("Makefile.in", "w");
	}
	if (is_resource($wp)) {
		print "Creating Makefile.in...";
		flush();
	} else {
		die("Could not create Makefile.in in current directory.\n");
	}

	$who = $env["USER"];
	$when = gmdate('Y-m-d h:i');
	fwrite($wp, "# This file was generated by `pearize' by $who at $when GMT\n\n");

	foreach ($libdata as $lib => $info) {
		extract($info);
		fwrite($wp, "\
INCLUDES				= $includes
LTLIBRARY_NAME			= lib{$lib}.la
LTLIBRARY_SOURCES		= $sources
LTLIBRARY_SHARED_NAME	= {$lib}.la
LTLIBRARY_SHARED_LIBADD = $libadd
");
	}

	if (sizeof($libdata) > 0) {
		fwrite($wp, "include \$(top_srcdir)/build/dynlib.mk\n");
	}
	fclose($wp);
	print "done.\n";
}

// }}}
// {{{ parse_package_file()

function parse_package_file($file)
{
	global $in_file, $curlib, $curelem, $libdata, $cdata;
	global $currinstalldir, $baseinstalldir;
	
	$in_file = false;
	$curlib = '';
	$curelem = '';
	$libdata = array();
	$cdata = array();
	$baseinstalldir = array();
	$currinstalldir = array();
	
	$xp = xml_parser_create();
	xml_set_element_handler($xp, "start_handler", "end_handler");
	xml_set_character_data_handler($xp, "cdata_handler");
	xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, true);
	
	$fp = @fopen($file, "r");
	if (!is_resource($fp)) {
		die("Could not open file `$file'.\n");
	}
	while (!feof($fp)) {
		xml_parse($xp, fread($fp, 2048), feof($fp));
	}
	xml_parser_free($xp);
}

// }}}
// {{{ start_handler()

function start_handler($xp, $elem, $attrs)
{
	global $cdata, $in_file, $curelem, $curfile, $filerole;
	global $baseinstalldir, $currinstalldir;
	switch ($elem) {
		case "FILE": {
			$curfile = '';
			$filerole = $attrs['ROLE'];
			switch ($filerole) {
				case "ext": {
					$in_file = true;
					$cdata = array();
					break;
				}
				case "php": default: {
					break;
				}
			}
			break;
		}
		case "DIR": {
			$cdir = $currinstalldir[sizeof($currinstalldir)-1];
			$bdir = $baseinstalldir[sizeof($baseinstalldir)-1];
			array_push($currinstalldir, "$cdir/{$attrs[NAME]}");
			if (isset($attrs["BASEINSTALLDIR"])) {
				array_push($baseinstalldir, "$bdir/{$attrs[BASEINSTALLDIR]}");
			} else {
				array_push($baseinstalldir, $bdir);
			}
			break;
		}
		case "INCLUDES":
		case "LIBNAME":
		case "LIBADD":
		case "SOURCES": {
			$curelem = $elem;
			break;
		}
	}
}

// }}}
// {{{ end_handler()

function end_handler($xp, $elem)
{
	global $in_file, $curlib, $curelem, $libdata, $cdata;
	global $baseinstalldir, $currinstalldir;
	switch ($elem) {
		case "FILE": {
			if ($in_file === true) {
				$libname = trim($cdata['LIBNAME']);
				$libdata[$libname] = array(
					"sources" => trim($cdata['SOURCES']),
					"includes" => trim($cdata['INCLUDES']),
					"libadd" => trim($cdata['LIBADD']),
				);
				$in_file = false;
			}
			break;
		}
		case "DIR": {
			array_pop($currinstalldir);
			array_pop($baseinstalldir);
			break;
		}
	}
}

// }}}
// {{{ cdata_handler()

function cdata_handler($xp, $data)
{
	global $curelem, $cdata, $curfile;
	switch ($curelem) {
		case "FILE": {
			$curfile .= $data;
			break;
		}
		case "INCLUDES":
		case "LIBADD":
		case "LIBNAME":
		case "SOURCES": {
			$cdata[$curelem] .= $data;
			break;
		}
	}
}

// }}}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * indent-tabs-mode: t
 * End:
 */
?>
