#!/usr/bin/perl -w
# $Id: sort-sources,v 1.7 2016/10/02 23:43:34 tom Exp $
#
# Sort the list of parameters as if they are filenames containing a version.

use strict;

our %first_sort;

sub key_of($) {
    my $value = shift;
    $value =~ s,^.*/,,;
    $value =~ s,\.[a-z]*$,,;    # trim suffix
    $value =~ s,\.tar$,,;

    # letter on end, e.g., vile-9.8a
    my $minor = $value;
    $minor =~ s/^.*[[:digit:]]+//;
    $minor = "" if length($minor) > 2;

    my $major = "";

    # PRCS convention used for Lynx
    if ( $value =~ /^.*[[:digit:]](pre|dev|rel)\..*/ ) {
        $minor = $value;
        $minor =~ s/^(.*[[:digit:]])(pre|dev|rel)(\..*)/$2$3/;
        $minor =~ s/\./.00000000/;
        $minor =~ s/0+([[:digit:]]{8,8})/$1/;
        $major = "";
        $value =~ s/^(.*[[:digit:]])(pre|dev|rel)(\..*)/$1/;
    }

    my $number = $value;
    $number =~ s/^[[:alpha:]_-]+//;
    $number =~ s/[[:alpha:]]+$//;
    $number =~ s/[.-]/ /g;
    $number =~ s/[ ]+/ /g;
    $number =~ s/^/0000000/;
    $number =~ s/ / 0000000/g;
    $number =~ s/^[0]+([[:digit:]]{8,8})/$1/;
    $number =~ s/ [0]+([[:digit:]]{8,8})/ $1/g;

    $value =~ s/[.[:digit:]-]+([[:alpha:]])?$//;
    $value =~ s/[.[:digit:]]+//g;

    return $value . "\1" . $major . "\1" . $number . "\1" . $minor;
}

sub sort_sources() {
    my @ordered = sort keys(%first_sort);
    my $n;

    for $n ( 0 .. $#ordered ) {
        printf "%s\n", $first_sort{ $ordered[$n] };
    }
}

# If we have arguments, use those.  Otherwise read from standard input.
if ( $#ARGV >= 0 ) {
    my $n;
    for $n ( 0 .. $#ARGV ) {
        $first_sort{ &key_of( $ARGV[$n] ) } = $ARGV[$n];
    }
}
else {
    my @input = <STDIN>;
    my $l;
    foreach $l (@input) {
	chomp $l;
        $first_sort{ &key_of($l) } = $l;
    }
}
&sort_sources;
