#include #include #include #include #include static char *line_read; static int read_eof; void rl_lthandler(char *str) { line_read = str; if (str == NULL) read_eof = 1; } static int my_rlgetc(FILE *fp) { char ch; int ret; ret = read(0, &ch, 1); if (ret < 0) { perror("read()"); abort(); } else if (ret == 0) return(EOF); return((int)ch); } int main(void) { fd_set rfds; int retval; setvbuf(stdout, NULL, _IONBF, 0); using_history(); rl_variable_bind("blink-matching-paren", "on"); rl_basic_quote_characters = "\""; rl_basic_word_break_characters = "[]()!:~\""; rl_already_prompted = 1; rl_callback_handler_install(">> ", rl_lthandler); line_read = NULL; printf(">> "); for (;;) { FD_ZERO(&rfds); FD_SET(0, &rfds); retval = select(1, &rfds, NULL, NULL, NULL); if (retval == -1) perror("select()"); else if (retval) rl_callback_read_char(); else continue; if (read_eof) break; if (line_read == NULL) continue; if (line_read && *line_read) { add_history(line_read); next_history(); printf("You said: '%s'\n", line_read); printf(">> "); rl_on_new_line_with_prompt(); } free(line_read); line_read = NULL; } rl_callback_handler_remove(); return(0); }