AnyEvent-GDB
view release on metacpan or search on metacpan
if $self->{trace};
for ($line) {
if (/^\(gdb\)\s*$/gc) { # docs say "(gdb)", but reality says "(gdb) "
# nop
} else {
/^([0-9]*)/gc; # [token], actually ([0-9]+)?
my $token = $1;
eval {
if (/\G\^(done|running|connected|error|exit)/gc) { # result
my $class = $1 eq "running" ? "done" : $1;
# documented for error is an incompatible format, but in reality it is sane
my $results = /\G,/gc ? &_parse_results : {};
if (my $cb = delete $self->{cb}{$token}) {
# unfortunately, gdb sometimes outputs multiple result records for one command
$cb->($class, $results, delete $self->{console});
}
} elsif (/\G([*+=])([^,]+)/gc) { # *exec-async, +status-async, =notify-async
my ($type, $class) = ($type_map{$1}, $2);
my $results = /\G,/gc ? &_parse_results : {};
$class =~ y/-/_/;
$self->event ($type => $class, $results);
$self->event ("$type\_$class" => $results);
} elsif (/\G~"/gc) {
push @{ $self->{console} }, &_parse_c_string;
} elsif (/\G&"/gc) {
my $log = &_parse_c_string;
chomp $log;
print "$log\n" if $self->{verbose};
$self->event (log => $log);
} elsif (/\G\@"/gc) {
$self->event (target => &_parse_c_string);
}
};
/\G(.{0,16})/gcs;
$@ = "extra data\n" if !$@ and length $1;
if ($@) {
chop $@;
warn "AnyEvent::GDB: parse error: $@, at ...$1\n";
$self->eof;
}
}
}
}
sub _q($) {
return $_[0]
if $_[0] =~ /^[A-Za-z0-9_]+$/; # we are a lot more strict than the spec
local $_ = shift;
utf8::encode $_; # just in case
s/([^\x20-\x21\x23-\x5b\x5d-\x7e])/sprintf "\\x%02x", ord $1/ge;
"\"$_\""
}
=item $gdb->cmd_raw ($command, $cb->($class, $results, $console))
Execute a raw command: C<$command> is sent unchanged to GDB. See C<cmd_>
for a description of the callback arguments.
Example: execute a CLI command and print its output.
$gdb->cmd_raw ("info sh", sub {
print "$_[3]\n";
});
=cut
sub cmd_raw {
my ($self, $cmd, $cb) = @_;
my $token = ++$self->{token};
$self->send ("$token$cmd\n");
$self->{cb}{$token} = $cb;
}
=item $gdb->cmd ($command => [$option...], $parameter..., $cb->($class, $results, $console))
Execute a MI command and invoke the callback with the results.
C<$command> is a MI command name. The leading minus sign can be omitted,
and instead of minus signs, you can use underscores, i.e. all the
following command names are equivalent:
"-break-insert" # as documented in the GDB manual
-break_insert # using underscores and _ to avoid having to quote
break_insert # ditto, when e.g. used to the left of a =>
"break-insert" # no leading minus
The second argument is an optional array reference with options (i.e. it
can simply be missing). Each C<$option> is either an option name (similar
rules as with command names, i.e. no initial C<-->) or an array reference
with the first element being the option name, and the remaining elements
being parameters: [$option, $parameter...].
The remaining arguments, excluding the last one, are simply the parameters
passed to GDB.
All options and parameters will be properly quoted.
When the command is done, the callback C<$cb> will be invoked with
C<$class> being one of C<done>, C<connected>, C<error> or C<exit>
(note: not C<running>), C<$results> being a has reference with all the
C<variable=value> pairs from the result list.
C<$console> is an array reference with all the GDB console messages
written while command executes (for MI commands, this should always be
C<undef> and can be ignored).
Example: #todo#
( run in 1.056 second using v1.01-cache-2.11-cpan-39bf76dae61 )