#!/usr/bin/perl

# genSort 

my $Rev = '$Revision: 1.1 $';
use strict;

use Number::Spell;

my ($low, $high) = (0, 10);

if (@ARGV == 0) {
} elsif (@ARGV == 1) {
    $high = &readNum($ARGV[0]);
} elsif (@ARGV == 2) {
    $low = &readNum($ARGV[0]);
    $high = &readNum($ARGV[1]);
} else {
    die &usage();
}

print "# \$Id\$
# Generated by <http://www.w3.org/2001/sw/DataAccess/tests/data/Sorting/genSort> $Rev

\@prefix r: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
\@prefix srt: <http://www.w3.org/2001/sw/DataAccess/tests/data/Sorting/sort-0#> .
\@prefix air: <http://www.daml.org/2001/10/html/airport-ont#> .
\@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

";

foreach my $i ($low .. $high) {
    my $dupeStr = '';
    print &genSort($i, ''), " .\n\n";
    if ($i % 7 == 1) {
	print &genSort($i, 'B'), " .\n\n";
    }
    if ($i % 14 == 1) {
	print &genSort($i, 'C'), " .\n\n";
    }
}

sub usage {
    return "usage: genSort [[lower] upper]\n";
}

sub readNum {
    my ($str) = @_;
    if ($str !~ m/^\-?\d+$/) {
	die "\"$str\" isn't an integer\n".&usage();
    }
    return $str;
}

my $Type = 0;

sub genSort {
    my ($int, $dupeStr) = @_;

my ($NULL, $BNODE, $URI, $PLAIN, $LANG, $STR, $INT, $FLOAT) = (0..99);
my ($MIN, $MAX) = ($NULL, $FLOAT);
my %Renderers = ($NULL => sub {""}, 
		 $BNODE => sub {"_:$_[1]"}, 
		 $URI => sub {"srt:h$_[2]"}, 
		 $PLAIN => sub {"\"$_[0]\""}, 
		 $LANG => sub {"\"$_[0]\"\@EN"}, 
		 $STR => sub {"\"$_[0]\"^^xsd:string"}, 
		 $INT => sub {"\"$_[0]\"^^xsd:integer"}, 
		 $FLOAT => sub {"\"$_[0]\"^^xsd:float"}, 
		 );

    my $localName = $int < 0 ? 'm'.-$int : 'p'.$int;
    my $str = &spell_number($int);
    if ($str =~ s/ negative$//) {
	$str = "minus $str";
    }
    $str =~ s/ /_/g;
    my $type = $Type++;
    if ($Type > $MAX) {
	$Type = $MIN;
    }
    my $hetStr = &{$Renderers{$type}}($int, $str, $localName);
    if ($hetStr) {
	$hetStr = " ;\n		srt:het1	$hetStr";
    }
    return "srt:${str}${dupeStr}	srt:str1	\"str ${int}\" ;
		srt:str2	\"${int}\" ;
		srt:int1	\"${int}\"^^xsd:integer ;
		srt:bNode1	_:${localName} ;
		srt:bNode2	_:${str}${dupeStr} ;
		srt:uri1	srt:${localName} ;
		srt:uri2	srt:${str}$hetStr";
}

