#!/usr/bin/perl
# Program to match CGPLATFORM environment variable against available machine
# architectures.

$chip_level{"r3k"} = 1;
$chip_level{"r4k"} = 2;
$chip_level{"r8k"} = 3;
$chip_level{"r10k"} = 3;
$chip_level{"r5k"} = 3;
$chip_priority = 5;

$irix_level{"i5.3"} = 1;
$irix_level{"i6.1"} = 2;
$irix_level{"i6.2"} = 3;
$irix_level{"i6.3"} = 4;
$irix_level{"i6.4"} = 4;
$irix_level{"i6.5"} = 4;
$irix_priority = 1;

$compiler_level{"c5.3"} = 1;
$compiler_level{"c6.1"} = 2;
$compiler_level{"c6.2"} = 3;
$compiler_level{"c7.0"} = 4;
$compiler_level{"c7.1"} = 5;
$compiler_level{"c7.2"} = 6;
$compiler_level{"c7.2.1"} = 6;
$compiler_level{"c7.3"} = 7;
$compiler_level{"c7.4"} = 8;
$compiler_priority = 3;

$isa_level{"m1"} = 1;
$isa_level{"m2"} = 2;
$isa_level{"m3"} = 3;
$isa_level{"m4"} = 4;
$isa_level{"m5"} = 5;
$isa_priority = 5;

$abi_level{"a32"} = 1;
$abi_level{"an32"} = 2;
$abi_level{"a64"} = 3;
$abi_priority = 4;

$cgplatform = $ENV{"CGPLATFORM"};

if ($cgplatform eq "") {
    die "Error in CONGEN setup -- No CGPLATFORM environment variable.\n";
}

@components = split(/_/, $cgplatform);

if (shift(@components) ne "sgi") {
    die "Error in CONGEN setup -- CGPLATFORM variable does not start with \"sgi\"\n";
}

if ($#components != 4) {
    die "Error in CONGEN setup -- CGPLATFORM variable does not have five components.\n";
}

@directories = &get_congen_directories;

$bestdir = "";
foreach $dir (@directories) {
    $match = &match_dir($dir);
    if ($match >= 0) {
	if ($bestdir eq "") {
	    $bestmatch = $match;
	    $bestdir = $dir;
	}
	elsif ($match < $bestmatch) {
	    $bestmatch = $match;
	    $bestdir = $dir;
	}
    }
}

if ($bestdir eq "") {
    $bestdir = "sgi_r3k_i5.3_c5.3_m1_a32"; # Lowest common denominator
}

print "$bestdir\n";


sub get_congen_directories {
    local (@ret);
    local ($cgroot);

    $cgroot = $ENV{"CGROOT"};
    if ($cgroot eq "") {
	die "Error in CONGEN setup -- No CGROOT environment variable.\n";
    }
    opendir(CGROOT, $cgroot) || die "Unable to opendir $cgroot " . $! . "\n";
    
    @ret = grep((-d $cgroot . "/" . $_) && /^sgi/, readdir(CGROOT));
    closedir(CGROOT);
#    print "ret = ", join(" ", @ret), "\n";
    return @ret;
}

sub match_dir {
    local ($dir) = @_;
    local (@dirpieces);

    @dirpieces = split(/_/, $dir);
    if (shift(@dirpieces) ne "sgi") {
	return -1;
    }
    return (&match_component($dirpieces[0],
			     $components[0],
			     $chip_priority,
			     %chip_level) +
	    &match_component($dirpieces[1],
			     $components[1],
			     $irix_priority,
			     %irix_level) +
	    &match_component($dirpieces[2],
			     $components[2],
			     $compiler_priority,
			     %compiler_level) +
	    &match_component($dirpieces[3],
			     $components[3],
			     $isa_priority,
			     %isa_level) +
	    &match_component($dirpieces[4],
			     $components[4],
			     $abi_priority,
			     %abi_level));
}

sub match_component {
    local ($dir_component,
	   $platform_component,
	   $priority,
	   %levels) = @_;
    local ($level_dir, $level_platform, $ret);

    if ($dir_component eq $platform_component) {
	$ret = 0;
    }
    else {
	$level_dir = $levels{$dir_component};
	$level_platform = $levels{$platform_component};
	if ($level_platform == 0) {
	    $ret = -99999;
	}
	elsif ($level_dir >= $level_platform) {
	    $ret = -99999;
	}
	else {
	    $ret = ($level_platform - $level_dir) * $priority;
	}
    }
#    print STDERR "For dir_component $dir_component matched against platform component $platform_component, return = $ret\n";
    return $ret;
}
