Annotation of embedaddon/readline/examples/rl-callbacktest.c, revision 1.1.1.2
1.1 misho 1: /* Standard include files. stdio.h is required. */
2: #include <stdlib.h>
3: #include <unistd.h>
4: #include <string.h>
1.1.1.2 ! misho 5: #include <locale.h>
1.1 misho 6:
7: /* Used for select(2) */
8: #include <sys/types.h>
9: #include <sys/select.h>
10:
1.1.1.2 ! misho 11: #include <signal.h>
! 12:
! 13: #include <errno.h>
1.1 misho 14: #include <stdio.h>
15:
16: /* Standard readline include files. */
17: #if defined (READLINE_LIBRARY)
18: # include "readline.h"
19: # include "history.h"
20: #else
21: # include <readline/readline.h>
22: # include <readline/history.h>
23: #endif
24:
1.1.1.2 ! misho 25: extern int errno;
! 26:
1.1 misho 27: static void cb_linehandler (char *);
1.1.1.2 ! misho 28: static void signandler (int);
1.1 misho 29:
1.1.1.2 ! misho 30: int running, sigwinch_received;
1.1 misho 31: const char *prompt = "rltest$ ";
32:
1.1.1.2 ! misho 33: /* Handle SIGWINCH and window size changes when readline is not active and
! 34: reading a character. */
! 35: static void
! 36: sighandler (int sig)
! 37: {
! 38: sigwinch_received = 1;
! 39: }
! 40:
1.1 misho 41: /* Callback function called for each line when accept-line executed, EOF
42: seen, or EOF character read. This sets a flag and returns; it could
43: also call exit(3). */
44: static void
45: cb_linehandler (char *line)
46: {
47: /* Can use ^D (stty eof) or `exit' to exit. */
48: if (line == NULL || strcmp (line, "exit") == 0)
49: {
50: if (line == 0)
51: printf ("\n");
52: printf ("exit\n");
53: /* This function needs to be called to reset the terminal settings,
54: and calling it from the line handler keeps one extra prompt from
55: being displayed. */
56: rl_callback_handler_remove ();
57:
58: running = 0;
59: }
60: else
61: {
62: if (*line)
63: add_history (line);
64: printf ("input line: %s\n", line);
65: free (line);
66: }
67: }
68:
69: int
70: main (int c, char **v)
71: {
72: fd_set fds;
73: int r;
74:
1.1.1.2 ! misho 75:
! 76: setlocale (LC_ALL, "");
! 77:
! 78: /* Handle SIGWINCH */
! 79: signal (SIGWINCH, sighandler);
! 80:
1.1 misho 81: /* Install the line handler. */
82: rl_callback_handler_install (prompt, cb_linehandler);
83:
84: /* Enter a simple event loop. This waits until something is available
85: to read on readline's input stream (defaults to standard input) and
86: calls the builtin character read callback to read it. It does not
87: have to modify the user's terminal settings. */
88: running = 1;
89: while (running)
90: {
91: FD_ZERO (&fds);
92: FD_SET (fileno (rl_instream), &fds);
93:
94: r = select (FD_SETSIZE, &fds, NULL, NULL, NULL);
1.1.1.2 ! misho 95: if (r < 0 && errno != EINTR)
1.1 misho 96: {
97: perror ("rltest: select");
98: rl_callback_handler_remove ();
99: break;
100: }
1.1.1.2 ! misho 101: if (sigwinch_received)
! 102: {
! 103: rl_resize_terminal ();
! 104: sigwinch_received = 0;
! 105: }
! 106: if (r < 0)
! 107: continue;
1.1 misho 108:
109: if (FD_ISSET (fileno (rl_instream), &fds))
110: rl_callback_read_char ();
111: }
112:
113: printf ("rltest: Event loop has exited\n");
114: return 0;
115: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>