AnyEvent-GDB
view release on metacpan or search on metacpan
defined $len || $self->eof;
$self->feed ("$1")
while $self->{rbuf} =~ s/^([^\r\n]*)\r?\n//;
};
$self->{wcb} = sub {
my $len = syswrite $self->{fh}, $self->{wbuf};
substr $self->{wbuf}, 0, $len, "";
delete $self->{ww} unless length $self->{wbuf};
};
}
$self->{stdio} = sprintf "<&%d >&%d", fileno $stdin, fileno $stdout;
$self->cmd_raw ("set exec-wrapper $self->{stdio}", sub { });
$self
}
#sub DESTROY {
#)}
sub eof {
my ($self) = @_;
$self->event ("eof");
%$self = ();
}
sub send {
my ($self, $data) = @_;
print "> $data"
if $self->{trace};
$self->{wbuf} .= $data;
$self->{ww} ||= AE::io $self->{fh}, 1, $self->{wcb};
}
our %C_ESCAPE = (
"\\" => "\\",
'"' => '"',
"'" => "'",
"?" => "?",
a => "\x07",
b => "\x08",
t => "\x09",
n => "\x0a",
v => "\x0b",
f => "\x0c",
r => "\x0d",
);
sub _parse_c_string {
my $r = "";
# syntax is not documented, so we do full C99, except unicode
while () {
if (/\G([^"\\\n]+)/gc) {
$r .= $1;
} elsif (/\G\\([abtnvfr\\"'?])/gc) {
$r .= $C_ESCAPE{$1};
} elsif (/\G\\([0-8]{1,3})/gc) {
$r .= chr oct $1;
} elsif (/\G\\x([0-9a-fA-F]+)/gc) {
$r .= chr hex $1;
} elsif (/\G"/gc) {
last;
} else {
die "invalid string syntax\n";
}
}
$r
}
sub _parse_value {
if (/\G"/gc) { # c-string
&_parse_c_string
} elsif (/\G\{/gc) { # tuple
my $r = &_parse_results;
/\G\}/gc
or die "tuple does not end with '}'\n";
$r
} elsif (/\G\[/gc) { # list
my @r;
until (/\G\]/gc) {
# if GDB outputs "result" in lists, let me know and uncomment the following lines
# # list might also contain key value pairs, but apparently
# # those are supposed to be ordered, so we use an array in perl.
# push @r, $1
# if /\G([^=,\[\]\{\}]+)=/gc;
push @r, &_parse_value;
/\G,/gc
or last;
}
/\G\]/gc
or die "list does not end with ']'\n";
\@r
} else {
die "value expected\n";
}
}
sub _parse_results {
my %r;
( run in 0.877 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )