#!/usr/bin/perl -w

use strict;
use Getopt::Std;

my (%opts, $ll, $ur, $n, $x, $y, $fn);
%opts = (
    l => "N21E120",
    u => "N25E122",
    s => 30,
);

getopts('l:u:s:', \%opts);

@$ll = parse($opts{l}) or die "'-l' parse error";
@$ur = parse($opts{u}) or die "'-u' parse error";
die "-s must be a divisor of 1200. e.g. 6, 40, 100, ..."
    unless 1200 % $opts{s} == 0;

$n = 0;
for ($y=$ll->[1]; $y<=$ur->[1]; ++$y) {
    for ($x=$ll->[0]; $x<=$ur->[0]; ++$x) {
	$fn = coord2fn($x, $y);
	if (not -r $fn) {
	    print STDERR "missing file(s):" if $n <= 0;
	    ++$n;
	    print STDERR " $fn";
	}
    }
}
if ($n > 0) {
    print STDERR "\n";
#    die "\n";
}

my (@fh, $i, $j);
for ($y=$ll->[1]; $y<=$ur->[1]; ++$y) {
    for ($x=$ll->[0]; $x<=$ur->[0]; ++$x) {
	$fn = coord2fn($x, $y);
	if (-r $fn) {
	    open $fh[fhid($x)], $fn;
	} else {
	    $fh[fhid($x)] = undef;
	}
    }
    for ($i=0; $i*$opts{s}<1200; ++$i) {
	for ($x=$ll->[0]; $x<=$ur->[0]; ++$x) {
	    for ($j=0; $j*$opts{s}<1200; ++$j) {
		my ($d, @a);
		if (defined $fh[fhid($x)]) {
		    seek $fh[fhid($x)], ((1200/$opts{s}-$i)*$opts{s}*1201+$j*$opts{s})*2, 0;
		    read($fh[fhid($x)], $d, 2);
		    @a = unpack("C*", $d);
		    $d = $a[0]*256 + $a[1];
		} else {
		    $d = 32768;
		}
		print $d<1e4 ? "$d\n" : "nan\n";
	    }
	}
	print "\n";
    }
    for ($x=$ll->[0]; $x<=$ur->[0]; ++$x) {
	close $fh[fhid($x)] if defined $fh[fhid($x)];
    }
}

sub parse {
    return undef unless $_[0] =~ /^([ns])(\d+)([ew])(\d+)$/i;
    my ($long, $lat) = ($4, $2);
    $long = - $long if "\L$1" eq "s";
    $lat = - $lat if "\L$3" eq "w";
    return ($long, $lat);
}

sub coord2fn {
    my ($x, $y) = @_;
    return sprintf "%s%02d%s%03d.hgt", ($y>=0?"N":"S"), abs($y),
	  ($x>=0?"E":"W"), abs($x);
}

sub fhid { return $_[0]-$ll->[0]; }
