xaizek / pinfo (License: GPLv2 only) (since 2018-12-07)
Console-based info and manual pages reader, which adds interactive navigation to man pages.
Commit 4ad9fd686b8d0138a64a014a352f903c2b2bfe0a

Fixed the readline code - search and check for libreadline version 5 - enabled use of libreadline by default - fixed cooperation between ncurses and libreadline by specifying a custom output routine - fixed the history behaviour of the non-libreadline input code: the last history entry is shown by default, but it is deleted automatically on input of a non-edit key (this fixes Debian bug #222651)
git-svn-id: svn://svn.debian.org/svn/pinfo/pinfo/trunk@22 ea4b0d59-4df7-0310-a9f9-bf8cbe41ce66
Author: bas
Author date (UTC): 2005-07-25 20:14
Committer name: bas
Committer date (UTC): 2005-07-25 20:14
Parent(s): 40f9aa55af9889b90089e09d8c5dad4d180d63cb
Signing key:
Tree: 56fe84386f360f0a5cd736a618129ef4d50f1c05
File Lines added Lines deleted
macros/readline.m4 34 3
src/readlinewrapper.c 24 4
src/utils.c 31 27
File macros/readline.m4 changed (mode: 100644) (index 872fe0a..457d62b)
... ... AH_TEMPLATE([HAS_READLINE],
44 44 [ Defined if found readline ]) [ Defined if found readline ])
45 45
46 46 AC_DEFUN([AC_CHECK_READLINE],[ AC_DEFUN([AC_CHECK_READLINE],[
47 search_readline=false
47 search_readline=true
48 48 has_readline=false has_readline=false
49 49
50 50 dnl CFLAGS=${CFLAGS--O} dnl CFLAGS=${CFLAGS--O}
 
... ... dnl CFLAGS=${CFLAGS--O}
72 72 AC_SEARCH_READLINE() AC_SEARCH_READLINE()
73 73 fi fi
74 74
75 if $has_readline
76 then
77 AC_READLINE_VERSION()
78 if test $readline_version -ge 5
79 then
80 AC_DEFINE(HAS_READLINE)
81 else
82 AC_MSG_RESULT(Readline version $readline_version is too old; needs at least version 5)
83 fi
84 fi
85
86
75 87
76 88 ]) ])
77 89
 
... ... AC_DEFUN([AC_READLINE], [
87 99 READLINE_LIBS="$3" READLINE_LIBS="$3"
88 100 READLINE_INCLUDES="$4" READLINE_INCLUDES="$4"
89 101 search_readline=false search_readline=false
90 AC_DEFINE(HAS_READLINE)
91 102 has_readline=true has_readline=true
92 103 fi fi
93 104 fi fi
94 105 ]) ])
95 106
96 107 AC_DEFUN([AC_SEARCH_READLINE], [ AC_DEFUN([AC_SEARCH_READLINE], [
97 AC_CHECKING("location of readline.h file")
108 AC_CHECKING(location of readline.h file)
98 109
99 110 AC_READLINE(/usr/include, readline.h, -lreadline,, "readline on /usr/include") AC_READLINE(/usr/include, readline.h, -lreadline,, "readline on /usr/include")
100 111 AC_READLINE(/usr/include/readline, readline.h, -lreadline, -I/usr/include/readline, "readline on /usr/include/readline") AC_READLINE(/usr/include/readline, readline.h, -lreadline, -I/usr/include/readline, "readline on /usr/include/readline")
101 112 AC_READLINE(/usr/local/include, readline.h, -L/usr/local/lib -lreadline, -I/usr/local/include, "readline on /usr/local") AC_READLINE(/usr/local/include, readline.h, -L/usr/local/lib -lreadline, -I/usr/local/include, "readline on /usr/local")
102 113 AC_READLINE(/usr/local/include/readline, readline.h, -L/usr/local/lib -L/usr/local/lib/readline -lreadline, -I/usr/local/include/readline, "readline on /usr/local/include/readline") AC_READLINE(/usr/local/include/readline, readline.h, -L/usr/local/lib -L/usr/local/lib/readline -lreadline, -I/usr/local/include/readline, "readline on /usr/local/include/readline")
103 114 ] ) ] )
115
116 AC_DEFUN([AC_READLINE_VERSION], [
117 AC_CHECKING(for readline version)
118 readline_version=unknown
119 cat > conftest.$ac_ext <<EOF
120 [#]line __oline__ "configure"
121 #include "confdefs.h"
122 #include <readline.h>
123 #undef VERSION
124 VERSION:RL_VERSION_MAJOR.RL_VERSION_MINOR
125 EOF
126 if (eval "$ac_cpp $READLINE_INCLUDES conftest.$ac_ext") 2>&AC_FD_CC |
127 egrep "VERSION:" >conftest.out 2>&1; then
128 changequote(,)dnl
129 readline_version=`cat conftest.out|sed -e 's/ //g' -e 's/^VERSION://' -e 's/\..*$//'`
130 changequote([,])dnl
131 fi
132 rm -rf conftest*
133 AC_MSG_RESULT($readline_version)
134 ] )
File src/readlinewrapper.c changed (mode: 100644) (index ca82f48..53c9051)
... ... int rlhistorypos = 0;
11 11 char * char *
12 12 readlinewrapper(char *prompt) readlinewrapper(char *prompt)
13 13 { {
14 /* number of keys pressed */
15 int numkeys = 0;
14 16 /* initial buffer for the read line */ /* initial buffer for the read line */
15 17 char *buf = xmalloc(1024); char *buf = xmalloc(1024);
16 18 /* start coords of input line */ /* start coords of input line */
 
... ... readlinewrapper(char *prompt)
44 46 strcpy(rlhistory[rlhistorylen - 1], buf); strcpy(rlhistory[rlhistorylen - 1], buf);
45 47 /* call history to be present */ /* call history to be present */
46 48 if (CallReadlineHistory) if (CallReadlineHistory)
49 {
47 50 ungetch(KEY_UP); ungetch(KEY_UP);
51 numkeys = -1;
52 }
48 53
49 54 while (key != '\n') while (key != '\n')
50 55 { {
 
... ... readlinewrapper(char *prompt)
101 106 /* recall value from history to input buf */ /* recall value from history to input buf */
102 107 strcpy(buf, rlhistory[rlhistorypos - 1]); strcpy(buf, rlhistory[rlhistorypos - 1]);
103 108 } }
104 if (cursor > strlen(buf))
105 cursor = strlen(buf);
109 cursor = strlen(buf);
110 numkeys = -1;
106 111 break; break;
107 112 /* forwards-history call */ /* forwards-history call */
108 113 case KEY_DOWN: case KEY_DOWN:
 
... ... readlinewrapper(char *prompt)
112 117 rlhistorypos++; rlhistorypos++;
113 118 strcpy(buf, rlhistory[rlhistorypos - 1]); strcpy(buf, rlhistory[rlhistorypos - 1]);
114 119 } }
115 if (cursor > strlen(buf))
116 cursor = strlen(buf);
120 cursor = strlen(buf);
121 numkeys = -1;
117 122 break; break;
118 123 /* eliminate nonprintable chars */ /* eliminate nonprintable chars */
119 124 case '\n': case '\n':
 
... ... readlinewrapper(char *prompt)
133 138 default: default:
134 139 if (key >= 32) if (key >= 32)
135 140 { {
141 /* if this is the first key, delete the buffer */
142 if (numkeys==0 && cursor!=0)
143 {
144 for (i=0; buf[i]!=0; i++)
145 buf[i] = 0;
146 cursor = 0;
147 /* and empty the line */
148 move(origy, origx);
149 for (i = origx; i < maxx; i++)
150 addch(' ');
151 move(origy, origx + cursor);
152 }
153
136 154 /* if the cursor is not at the last pos */ /* if the cursor is not at the last pos */
137 155 if (strlen(buf + cursor)) if (strlen(buf + cursor))
138 156 { {
 
... ... readlinewrapper(char *prompt)
160 178 addstr(buf); addstr(buf);
161 179 move(origy, origx + cursor); move(origy, origx + cursor);
162 180
181 numkeys++;
182
163 183 } }
164 184 strcpy(rlhistory[rlhistorylen - 1], buf); strcpy(rlhistory[rlhistorylen - 1], buf);
165 185 if (strlen(buf)) if (strlen(buf))
File src/utils.c changed (mode: 100644) (index 59bd05d..3632b9e)
... ... char *pinfo_re_pattern = 0;
21 21 int pinfo_re_offset = -1; int pinfo_re_offset = -1;
22 22 #endif #endif
23 23
24 /*
25 * Readline does not work well here. VT100 screen is ruined then.
26 *
27 * But if you want enable readline at compile time
28 * [ ./configure --with-readline ]
29 *
30 */
31
32 24 #ifdef HAS_READLINE #ifdef HAS_READLINE
33 25 #include <readline/readline.h> #include <readline/readline.h>
34 26 #include <readline/history.h> #include <readline/history.h>
 
... ... checkfilename(char *filename)
216 208 } }
217 209 } }
218 210
211 #ifdef HAS_READLINE
212 /* custom function that readline will use to display text */
213 void
214 my_rl_display()
215 {
216 /* go to the bottom line, empty it, and print the prompt and buffer */
217 attrset(bottomline);
218 mymvhline(maxy - 1, 0, ' ', maxx);
219 move(maxy-1,0);
220 printw("%s%s", rl_prompt, rl_line_buffer);
221 refresh();
222 }
223 #endif
224
219 225 char * char *
220 226 getstring(char *prompt) getstring(char *prompt)
221 227 { {
222 /*
223 * As above -- readline is dangerous ;)
224 * But if you want enable readline at compile time
225 * [ ./configure --with-readline ]
226 *
227 */
228
229 #ifndef HAS_READLINE
230
231 move(maxy - 1, 0);
232 return readlinewrapper(prompt);
228 char *buf;
233 229
234 #else
230 #ifdef HAS_READLINE
235 231
236 char *buf;
237 TERMINAL *term = cur_term;
238 232 curs_set(1); curs_set(1);
239 233 move(maxy - 1, 0); move(maxy - 1, 0);
240 234 refresh(); refresh();
241 sigblock(sigmask(SIGINT) | sigmask(SIGPIPE));
235
236 rl_readline_name = PACKAGE;
237
238 /* set display function for readline to my_rl_display and call readline */
239 rl_redisplay_function = my_rl_display;
242 240 buf = readline(prompt); buf = readline(prompt);
243 cur_term = term;
244 sigblock(sigmask(SIGPIPE));
245 add_history(buf);
241 if (buf && *buf)
242 add_history(buf);
243
246 244 curs_set(0); curs_set(0);
247 return buf;
245
246 #else
247
248 move(maxy - 1, 0);
249 buf = readlinewrapper(prompt);
250
248 251 #endif #endif
249 252
253 return buf;
250 254 } }
251 255
252 256 void void
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/pinfo

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/pinfo

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master