#!/usr/bin/perl -w

use strict;

my $verbose = 1;
my $program = undef;
my @cmd = ();

my $topsrc = &find_topsrc ();

for (my $i = 0; $i < @ARGV;) {
    my $a = $ARGV[$i++];

    if ($a !~ /^-/) {
	if (!-x $a) {
	    die "$0: failed to understand command line.\n";
	}
	if (-s _ < 50000) {
	    push @cmd, "$topsrc/libtool", "--mode=execute";
	}
	$program = $a;
	last;
    }
}
die "$0: usage $0 [gdb options] gnumeric [gnumeric-options]\n"
    unless $program;

#&add_debug_flag ('G_SLICE', 'always-malloc');

push @cmd, 'gdb';
push @cmd, "--args";
push @cmd, @ARGV;

print STDERR "Executing ", join (' ', map { &quotearg ($_) } @cmd), "\n" if $verbose;
exec { $cmd[0] } @cmd
    or die "$0: failed to execute gdb.\n";


sub add_debug_flag {
    my ($var,$flag) = @_;

    if (exists $ENV{$var}) {
	foreach my $f2 (split (':', $ENV{$var})) {
	    return if $f2 eq $flag;
	}
	$ENV{$var} .= ":$flag";
    } else {
	$ENV{$var} = $flag;
    }
    print STDERR "Setting $var=", $ENV{$var}, "\n" if $verbose;
}

sub find_topsrc {
    my $dir = '.';

    for (1 ... 5) {
	if (-r "$dir/configure" && -r "$dir/gnumeric.xsd") {
	    return $dir;
	}

	$dir = "$dir/..";
	$dir =~ s{^\./}{};
    }

    $dir = $0;
    $dir =~ s{/[^/]*$}{};
    for (1 ... 5) {
	if (-r "$dir/configure" && -r "$dir/gnumeric.xsd") {
	    return $dir;
	}

	$dir = "$dir/..";
	$dir =~ s{^\./}{};
    }



    die "$0: Cannot find top-level directory.\n";
}

sub quotearg {
    my ($arg) = @_;

    return $arg if $arg =~ m{^[-a-zA-Z0-9_/=.,]+$};
    return "'$arg'" if $arg =~ m{^[-a-zA-Z0-9_/=., *?<>%&^!@#]*$};

    my $res = '';
    while ($arg ne '') {
	if ($arg =~ m{^([-a-zA-Z0-9_/=.,]+)}) {
	    $res .= $1;
	    $arg = substr ($arg, length $1);
	} else {
	    $res .= "\\" . substr ($arg, 0, 1);
	    $arg = substr ($arg, 1);
	}
    }
    return $res;
}
