Introspection fixes
[gnumeric.git] / tools / gnmgdb
blob7c36bf1ce6ea8aade95726c861851e14e3de4801
1 #!/usr/bin/perl -w
3 use strict;
5 my $verbose = 1;
6 my $program = undef;
7 my @cmd = ();
9 my $topsrc = &find_topsrc ();
11 for (my $i = 0; $i < @ARGV;) {
12 my $a = $ARGV[$i++];
14 if ($a !~ /^-/) {
15 if (!-x $a) {
16 die "$0: failed to understand command line.\n";
18 if (-s _ < 50000) {
19 push @cmd, "$topsrc/libtool", "--mode=execute";
21 $program = $a;
22 last;
25 die "$0: usage $0 [gdb options] gnumeric [gnumeric-options]\n"
26 unless $program;
28 #&add_debug_flag ('G_SLICE', 'always-malloc');
30 push @cmd, 'gdb';
31 push @cmd, "--args";
32 push @cmd, @ARGV;
34 print STDERR "Executing ", join (' ', map { &quotearg ($_) } @cmd), "\n" if $verbose;
35 exec { $cmd[0] } @cmd
36 or die "$0: failed to execute gdb.\n";
39 sub add_debug_flag {
40 my ($var,$flag) = @_;
42 if (exists $ENV{$var}) {
43 foreach my $f2 (split (':', $ENV{$var})) {
44 return if $f2 eq $flag;
46 $ENV{$var} .= ":$flag";
47 } else {
48 $ENV{$var} = $flag;
50 print STDERR "Setting $var=", $ENV{$var}, "\n" if $verbose;
53 sub find_topsrc {
54 my $dir = '.';
56 for (1 ... 5) {
57 if (-r "$dir/configure" && -r "$dir/gnumeric.xsd") {
58 return $dir;
61 $dir = "$dir/..";
62 $dir =~ s{^\./}{};
65 $dir = $0;
66 $dir =~ s{/[^/]*$}{};
67 for (1 ... 5) {
68 if (-r "$dir/configure" && -r "$dir/gnumeric.xsd") {
69 return $dir;
72 $dir = "$dir/..";
73 $dir =~ s{^\./}{};
78 die "$0: Cannot find top-level directory.\n";
81 sub quotearg {
82 my ($arg) = @_;
84 return $arg if $arg =~ m{^[-a-zA-Z0-9_/=.,]+$};
85 return "'$arg'" if $arg =~ m{^[-a-zA-Z0-9_/=., *?<>%&^!@#]*$};
87 my $res = '';
88 while ($arg ne '') {
89 if ($arg =~ m{^([-a-zA-Z0-9_/=.,]+)}) {
90 $res .= $1;
91 $arg = substr ($arg, length $1);
92 } else {
93 $res .= "\\" . substr ($arg, 0, 1);
94 $arg = substr ($arg, 1);
97 return $res;