#! /usr/bin/perl -w


sub output_state {
    my ($tex, $line, @lines) = @_;
    my ($in_state) = 0;

    for ( ; $line <= $#lines ; $line++) {

	$_ = $lines[$line];
	
	if (/bind-texture (\d*)/) {	    
	    if ($1 eq $tex) {
		$in_state = 1;
		next;		# don't emit redundant binds.
	    } else {
		$in_state = 0;
	    }
	}
	elsif (/end-display-list/) {
	    return;
	}

	print if ($in_state);
    }
}


sub sort_list {
    my(@lines) = @_;
    my($quiet) = 0;
    my(@seen_texture);

    for ( $line = 0 ; $line <= $#lines ; $line++ ) {
	$_ = $lines[$line];

	if (/bind-texture (\d*)/) {	    
	    $quiet = 1;	    
	    if (!defined($seen_texture[$1])) {
		print;
		$seen_texture[$1] = 1;
		&output_state($1, $line, @lines);
	    }
	}
	elsif (/end-display-list/) {
	    @seen_texture = undef;
	    $quiet = 0;
	}

	print if (!$quiet);
    }
}

sub read_list {
    my(@lines);
    
    while (<>) {
	$lines[++$#lines] = $_;

	last if (/end-display-list/);
    }

    @lines;
}
	

sub sort_file {
    while (<>) {
	print $_;
	if (/begin-display-list/) {
	    &sort_list( &read_list );
	}
    }
}
		
&sort_file;
