Skip Menu |

Preferred bug tracker

Please visit the preferred bug tracker to report your issue.

This queue is for tickets about the Term-EditLine CPAN distribution.

Report information
The Basics
Id: 83107
Status: resolved
Priority: 0/
Queue: Term-EditLine

People
Owner: Nobody in particular
Requestors: tokuhirom+cpan [...] gmail.com
Cc:
AdminCc:

Bug Information
Severity: (no value)
Broken in: (no value)
Fixed in: (no value)



Subject: History related APIs does not works.
Term::EditLine's history related APIs does not works. I need a history related APIs for implementing Term::ReadLine::EditLine. I wrote a patch to fix history related APIs and attached it. Please apply and ship it. If you don't want to maintain this module, please make me as co-maintainer for this module. Best Regards,
Subject: Term-EditLine-History.diff
diff --git a/EditLine.xs b/EditLine.xs index f541083..5abbc4a 100644 --- a/EditLine.xs +++ b/EditLine.xs @@ -352,7 +352,7 @@ CODE: free(he); } -void +int el_history_set_size(he,size) HistEdit *he int size @@ -360,10 +360,12 @@ PREINIT: HistEvent ev; CODE: { - history(he->hist,&ev,H_SETSIZE,size); + RETVAL = history(he->hist,&ev,H_SETSIZE,size); } +OUTPUT: + RETVAL -void +int el_history_enter(he,str) HistEdit *he char *str @@ -371,10 +373,12 @@ PREINIT: HistEvent ev; CODE: { - history(he->hist,&ev,H_ENTER,str); + RETVAL = history(he->hist,&ev,H_ENTER,str); } +OUTPUT: + RETVAL -void +int el_history_append (he,str) HistEdit *he char *str @@ -382,10 +386,12 @@ PREINIT: HistEvent ev; CODE: { - history(he->hist,&ev,H_APPEND,str); + RETVAL = history(he->hist,&ev,H_APPEND,str); } +OUTPUT: + RETVAL -void +int el_history_add (he,str) HistEdit *he char *str @@ -393,122 +399,160 @@ PREINIT: HistEvent ev; CODE: { - history(he->hist,&ev,H_ADD,str); + RETVAL = history(he->hist,&ev,H_ADD,str); } +OUTPUT: + RETVAL -int +void el_history_get_size (he) HistEdit *he PREINIT: HistEvent ev; -CODE: +PPCODE: { - history(he->hist,&ev,H_GETSIZE); - RETVAL = ev.num; + dTARG; + int ret = history(he->hist,&ev,H_GETSIZE); + if (GIMME_V == G_ARRAY) { + mXPUSHi(ret); + } + mXPUSHi(ev.num); } -void +int el_history_clear (he) HistEdit *he PREINIT: HistEvent ev; CODE: { - history(he->hist,&ev,H_CLEAR); + RETVAL = history(he->hist,&ev,H_CLEAR); } +OUTPUT: + RETVAL -const char * +void el_history_get_first(he) HistEdit *he PREINIT: HistEvent ev; -CODE: +PPCODE: { - history(he->hist,&ev,H_FIRST); - RETVAL = ev.str; + dTARG; + int ret = history(he->hist,&ev,H_FIRST); + if (GIMME_V == G_ARRAY) { + mXPUSHi(ret); + } + mXPUSHp(ev.str, strlen(ev.str)); } -const char * +void el_history_get_last(he) HistEdit *he PREINIT: HistEvent ev; -CODE: +PPCODE: { - history(he->hist,&ev,H_LAST); - RETVAL = ev.str; + dTARG; + int ret = history(he->hist,&ev,H_LAST); + if (GIMME_V == G_ARRAY) { + mXPUSHi(ret); + } + mXPUSHp(ev.str, strlen(ev.str)); } -const char * +void el_history_get_prev(he) HistEdit *he PREINIT: HistEvent ev; -CODE: +PPCODE: { - history(he->hist,&ev,H_PREV); - RETVAL = ev.str; + dTARG; + int ret = history(he->hist,&ev,H_PREV); + if (GIMME_V == G_ARRAY) { + mXPUSHi(ret); + } + mXPUSHp(ev.str, strlen(ev.str)); } -const char * +void el_history_get_next(he) HistEdit *he PREINIT: HistEvent ev; -CODE: +PPCODE: { - history(he->hist,&ev,H_NEXT); - RETVAL = ev.str; + dTARG; + int ret = history(he->hist,&ev,H_NEXT); + if (GIMME_V == G_ARRAY) { + mXPUSHi(ret); + } + mXPUSHp(ev.str, strlen(ev.str)); } -const char * +void el_history_get_curr(he) HistEdit *he PREINIT: HistEvent ev; -CODE: +PPCODE: { - history(he->hist,&ev,H_CURR); - RETVAL = ev.str; + dTARG; + int ret = history(he->hist,&ev,H_CURR); + if (GIMME_V == G_ARRAY) { + mXPUSHi(ret); + } + mXPUSHp(ev.str, strlen(ev.str)); } -void +int el_history_set(he) HistEdit *he PREINIT: HistEvent ev; CODE: { - history(he->hist,&ev,H_SET); + RETVAL = history(he->hist,&ev,H_SET); } +OUTPUT: + RETVAL -const char * +void el_history_get_prev_str(he,str) HistEdit *he char *str PREINIT: HistEvent ev; -CODE: +PPCODE: { - history(he->hist,&ev,H_PREV_STR,str); - RETVAL = ev.str; + dTARG; + int ret = history(he->hist,&ev,H_PREV_STR,str); + if (GIMME_V == G_ARRAY) { + mXPUSHi(ret); + } + mXPUSHp(ev.str, strlen(ev.str)); } -const char * +void el_history_get_next_str(he,str) HistEdit *he char *str PREINIT: HistEvent ev; -CODE: +PPCODE: { - history(he->hist,&ev,H_NEXT_STR,str); - RETVAL = ev.str; + dTARG; + int ret = history(he->hist,&ev,H_NEXT_STR,str); + if (GIMME_V == G_ARRAY) { + mXPUSHi(ret); + } + mXPUSHp(ev.str, strlen(ev.str)); } -void +int el_history_load(he,str) HistEdit *he char *str @@ -516,10 +560,12 @@ PREINIT: HistEvent ev; CODE: { - history(he->hist,&ev,H_LOAD,str); + RETVAL = history(he->hist,&ev,H_LOAD,str); } +OUTPUT: + RETVAL -void +int el_history_save(he,str) HistEdit *he char *str @@ -527,8 +573,10 @@ PREINIT: HistEvent ev; CODE: { - history(he->hist,&ev,H_SAVE,str); + RETVAL = history(he->hist,&ev,H_SAVE,str); } +OUTPUT: + RETVAL int el_insertstr(he, str) diff --git a/Makefile.PL b/Makefile.PL index 3d6a5d8..85fe985 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -7,7 +7,9 @@ use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => 'Term::EditLine', 'VERSION_FROM' => 'EditLine.pm', # finds $VERSION - 'PREREQ_PM' => {}, # e.g., Module::Name => 1.1 + 'PREREQ_PM' => { + 'Test::More' => 0.96, + }, ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => 'EditLine.pod', # retrieve abstract from module AUTHOR => 'Ulrich Burgbacher <ulrich@burgbacher.net>') : ()), diff --git a/t/2.t b/t/2.t new file mode 100644 index 0000000..f2822d9 --- /dev/null +++ b/t/2.t @@ -0,0 +1,167 @@ +use strict; +use warnings; +use utf8; +use Test::More; +use Term::EditLine; + +my $el; + +sub context; + +$ENV{LANG} = 'C'; + +subtest 'history_get_size' => sub { + context 'scalar' => sub { + is(0+$el->history_get_size(), 0); + }; + context 'list' => sub { + my ($a, $b) = $el->history_get_size(); + is($a, 0); + is($b, 0); + }; + context 'scalar after enter' => sub { + is(0+$el->history_get_size(), 0); + $el->history_enter('hoge'); + is(0+$el->history_get_size(), 1); + }; +}; + +subtest 'history_clear' => sub { + context 'input and clear' => sub { + is(0+$el->history_get_size(), 0); + $el->history_enter('hoge'); + is(0+$el->history_get_size(), 1); + $el->history_clear(); + is(0+$el->history_get_size(), 0); + }; +}; + +subtest 'history_get_first' => sub { + context 'scalar in empty' => sub { + is(scalar($el->history_get_first()), 'first event not found'); + }; + context 'list in empty' => sub { + my ($a, $b) = $el->history_get_first(); + is($a, -1); + is($b, 'first event not found'); + }; + context 'scalar after enter' => sub { + $el->history_enter('hoge'); + $el->history_enter('fuga'); + is(scalar($el->history_get_first()), 'fuga'); + }; +}; + +subtest 'history_get_last' => sub { + context 'scalar in empty' => sub { + is(scalar($el->history_get_last()), 'last event not found'); + }; + context 'list in empty' => sub { + my ($a, $b) = $el->history_get_last(); + is($a, -1); + is($b, 'last event not found'); + }; + context 'scalar after enter' => sub { + $el->history_enter('hoge'); + $el->history_enter('fuga'); + is(scalar($el->history_get_last()), 'hoge'); + }; +}; + +subtest 'history_get_prev' => sub { + context 'scalar in empty' => sub { + is(scalar($el->history_get_prev()), 'empty list'); + }; + context 'list in empty' => sub { + my ($a, $b) = $el->history_get_prev(); + is($a, -1); + is($b, 'empty list'); + }; + context 'scalar after enter' => sub { + $el->history_enter('hoge'); + $el->history_enter('fuga'); + is(scalar($el->history_get_prev()), 'no previous event'); + is(scalar($el->history_get_first()), 'fuga'); + is(scalar($el->history_get_prev()), 'no previous event'); + }; +}; + +subtest 'history_get_next' => sub { + context 'scalar in empty' => sub { + is(scalar($el->history_get_next()), 'empty list'); + }; + context 'list in empty' => sub { + my ($a, $b) = $el->history_get_next(); + is($a, -1); + is($b, 'empty list'); + }; + context 'scalar after enter' => sub { + $el->history_enter('hoge'); + $el->history_enter('fuga'); + is(scalar($el->history_get_next()), 'hoge'); + is(scalar($el->history_get_next()), 'no next event'); + }; +}; + +subtest 'history_get_curr' => sub { + context 'scalar in empty' => sub { + is(scalar($el->history_get_curr()), 'empty list'); + }; + context 'list in empty' => sub { + my ($a, $b) = $el->history_get_curr(); + is($a, -1); + is($b, 'empty list'); + }; + context 'scalar after enter' => sub { + $el->history_enter('hoge'); + $el->history_enter('fuga'); + is(scalar($el->history_get_curr()), 'fuga'); + is(scalar($el->history_get_curr()), 'fuga'); + }; +}; + +subtest 'history_set' => sub { + context 'scalar in empty' => sub { + is(scalar($el->history_set()), -1); + }; +}; + +subtest 'history_get_prev_str' => sub { + context 'scalar after enter' => sub { + $el->history_enter('hoge'); + $el->history_enter('fuga'); + is(scalar($el->history_get_prev_str('h')), 'hoge'); + }; +}; + +subtest 'history_get_next_str' => sub { + context 'scalar after enter' => sub { + $el->history_enter('hoge'); + $el->history_enter('fuga'); + is(scalar($el->history_get_next_str('f')), 'fuga'); + }; +}; + +subtest 'history_save, history_load' => sub { + context 'save and load' => sub { + unlink 't/history.dat' if -f 't/history.dat'; + $el->history_enter('hoge'); + $el->history_enter('fuga'); + is($el->history_save('t/history.dat'), 2); + + my $el2 = Term::EditLine->new($0); + is($el2->history_get_size(), 0); + $el2->history_load('t/history.dat'); + is($el2->history_get_size(), 2); + + unlink 't/history.dat' if -f 't/history.dat'; + }; +}; + +done_testing; + +sub context { + my ($name, $code) = @_; + $el = Term::EditLine->new($0); + goto &Test::More::subtest; +}
This patch has been merged into 0.07 (actually 0.06, but that was a fork).