#
# general code to read dpkg-cross configuration
#

sub read_config {
	my $package;
	
	open( F, "<$conffile" ) || return;
	while( <F> ) {
		next if /^(\s*#|$)/;
		if (/\s*([\w\d_-]+)\s*=\s*(.*)\s*$/) {
			my($var, $val) = ($1, $2);
			if ($package) {
				${$pkgvars{$package}}{$var} = $val;
			}
			elsif ($var =~ /^crossroot-(\S+)$/) {
				$crossroot = $val if $1 eq $arch;
			}
			elsif (grep $_ eq $var, @intern_vars) {
				eval "\$$var = '$val'";
			}
			else {
				warn "$progname: Warning: definition of unknown variable ".
					 "$var in $conffile, line $.\n";
				next;
			}
		}
		elsif (/^\s*([\w\d.-]+):\s*$/) {
			$package = $1;
		}
		else {
			warn "$progname: unrecognized line in $conffile, line $.\n";
		}
	}
	close( F );
}


sub setup {
	my( $package, $var, $os );
	my @vars = ( "arch", @intern_vars );

	# finalize, no subst possible crossbase
	$crossbase ||= "/usr/local";
	# determine OS and CPU from $arch
	$arch_os = ($arch =~ /(^hurd-)|(-gnu$)/) ? "gnu" : "linux";
	($arch_cpu = $arch) =~ s/-?(hurd|gnu|linux)-?//;
	
	# set defaults for internal vars, if not set
	$crossprefix   ||= "${arch_cpu}-${arch_os}-";
	$crossdir      ||= "\$(CROSSBASE)/${arch_cpu}-${arch_os}";
	$crossbin      ||= "\$(CROSSDIR)/bin";
	if ($crossroot) {
		$crosslib  ||= "\$(CROSSROOT)/lib";
		$crossinc  ||= "\$(CROSSROOT)/usr/include";
		push( @vars, "crossroot" );
	}
	else {
		$crosslib  ||= "\$(CROSSDIR)/lib";
		$crossinc  ||= "\$(CROSSDIR)/include";
		$crossinfo ||= "\$(CROSSLIB)/dpkg-cross-info";
	}
	# and substitute references in them
	foreach $var ( @intern_vars ) {
		next if $var eq "crossbase" || $var eq "maintainer";
		subst( eval "\\\$$var", $var, @vars );
	}

	# substitute variable references in package var definitions
	foreach $package ( keys %pkgvars ) {
		foreach $var ( keys %{$pkgvars{$package}} ) {
			subst( \${$pkgvars{$package}}{$var}, $var, @vars );
		}
	}
}


sub subst {
	my $valref = shift(@_);
	my $varname = shift(@_);
	my @defined_vars = @_;
	my( $fulltext, $name, $newval );

	while( $$valref =~ /\$\((\w+)\)/ ) {
		$name = $1;
		if (grep "\U$_\E" eq $name, @defined_vars ) {
			$newval = eval "\"\$\L$name\E\"";
		}
		elsif (!($newval = $ENV{$name})) {
			warn "$progname: Cannot substitute \$($name) in definition ".
				 "of $varname\n";
			$newval = "";
		}
		$$valref =~ s/\$\($name\)/$newval/;
	}
}
