SLrline_Type *SLrline_open2 (SLFUTURE_CONST char *name, unsigned int width, unsigned int flags) { SLrline_Type *rli; SLrline_Type *arli; char hookname [1024]; if (NULL == (rli = SLrline_open (width, flags))) return NULL; if (NULL != rli->name) SLang_free_slstring (rli->name); if (NULL == (rli->name = SLang_create_slstring (name))) { SLrline_close (rli); return NULL; } arli = Active_Rline_Info; Active_Rline_Info = rli; SLsnprintf (hookname, sizeof(hookname), "%s_rline_open_hook", name); if (0 == SLang_run_hooks (hookname, 0)) (void) SLang_run_hooks ("rline_open_hook", 1, name); Active_Rline_Info = arli; return rli; }
static int example_1 (void) { SLrline_Type *rl; unsigned int width = 80; issue_instructions (); SLang_init_tty (-1, 0, 1); rl = SLrline_open (width, SL_RLINE_BLINK_MATCH); while (1) { char *line; unsigned int len; line = SLrline_read_line (rl, "prompt>", &len); if (line == NULL) break; if (0 == strcmp (line, "quit")) { SLfree (line); break; } (void) fprintf (stdout, "\nRead %d bytes: %s\n", strlen(line), line); SLfree (line); } SLrline_close (rl); SLang_reset_tty (); return 0; }
static int readline_intrinsic_internal (SLang_RLine_Info_Type *rli, char *prompt, int noecho) { char *line; if (rli == NULL) rli = Intrinsic_Rline_Info; #if USE_SLANG_READLINE if ((rli == NULL) && Use_Readline) { Intrinsic_Rline_Info = SLrline_open (SLtt_Screen_Cols, SL_RLINE_BLINK_MATCH); if (Intrinsic_Rline_Info == NULL) return -1; (void) SLang_add_cleanup_function (close_intrinsic_readline); rli = Intrinsic_Rline_Info; } #endif enable_keyboard_interrupt (); line = read_input_line (rli, prompt, noecho); if (noecho == 0) (void) save_input_line (rli, line); (void) SLang_push_malloced_string (line); return 0; }
static int example_2 (void) { SLrline_Type *rl; unsigned int width = 80; issue_instructions (); SLang_init_tty (-1, 0, 1); SLang_set_abort_signal (NULL); rl = SLrline_open (width, SL_RLINE_BLINK_MATCH); if (rl == NULL) return -1; while (1) { char *line; unsigned int len; line = SLrline_read_line (rl, "prompt>", &len); if (line == NULL) { int err = SLang_get_error (); if (err == SL_UserBreak_Error) { (void) fprintf (stderr, "*Interrupted*\n"); SLang_set_error (0); SLKeyBoard_Quit = 0; continue; } if (err == 0) break; /* EOF */ fprintf (stderr, "Error Occurred: %s\n", SLerr_strerror (err)); break; } if (0 == strcmp (line, "quit")) { SLfree (line); break; } (void) fprintf (stdout, "\nRead %d bytes: %s\n", strlen(line), line); SLfree (line); } SLrline_close (rl); SLang_reset_tty (); return 0; }
static Slsh_Readline_Type *open_slsh_readline (SLFUTURE_CONST char *name, unsigned int flags) { Slsh_Readline_Type *sri; if (NULL == (sri = (Slsh_Readline_Type *)SLmalloc (sizeof (Slsh_Readline_Type)))) return NULL; memset ((char *)sri, 0, sizeof (Slsh_Readline_Type)); #if USE_SLANG_READLINE if (name == NULL) sri->rli = SLrline_open (SLtt_Screen_Cols, flags); else sri->rli = SLrline_open2 (name, SLtt_Screen_Cols, flags); if (sri->rli == NULL) { SLfree ((char *)sri); return NULL; } sri->output_newline = 1; #endif return sri; }
/* make sure to call free on the returned string once no longer needed */ char *get_input_line(char *title, char *prefill) { #if (SLANG_VERSION >= 20000) /* libslang2 */ char *s = NULL; char *buf; unsigned int len = 0; SLrline_Type *rli; rli = SLrline_open(SLtt_Screen_Cols, SL_RLINE_BLINK_MATCH); if( rli ) { SLtt_set_cursor_visibility(1); SLsmg_normal_video(); len = 255; rline_update(NULL, len, strlen(title)); buf = SLrline_read_line(rli, title, &len); if( buf ) { s = strdup(buf); add_history(s); } SLfree(buf); SLtt_set_cursor_visibility(0); } #else /* libslang1 */ char *s; SLang_RLine_Info_Type *rli; s = malloc(256 * sizeof(char)); if( s ) { rli = (SLang_RLine_Info_Type *)malloc(sizeof(SLang_RLine_Info_Type)); if( rli ) { memset(rli, 0, sizeof(SLang_RLine_Info_Type)); rli->buf = (unsigned char *)s; /* buf is unsigned */ rli->buf_len = 255; rli->tab = 8; rli->dhscroll = 5; rli->getkey = SLang_getkey; rli->tt_goto_column = NULL; rli->update_hook = rline_update; rli->flags |= SL_RLINE_BLINK_MATCH; rli->input_pending = SLang_input_pending; SLang_init_readline(rli); rli->edit_width = SLtt_Screen_Cols - 1; rli->prompt = title; /* now prefill if necessary */ if( *prefill ) { strncpy(s, prefill, 255); rli->buf[255] = '\0'; rli->point = strlen((char *)rli->buf); } else { *rli->buf = 0; rli->point = 0; } SLtt_set_cursor_visibility(1); SLsmg_normal_video(); SLang_read_line(rli); add_history(s); /* buf is unsigned */ SLtt_set_cursor_visibility(0); free(rli); } } #endif return s; }