The S-Lang library includes simple but capable readline
functionality in its SLrline layer. The SLrline
routines provide a simple mechanism for an application to get
prompted input from a user with command line editing, completions,
and history recall.
The use of the SLrline routines will be illustrated with a
few simple examples. All of the examples given in this section may
be found in the file demo/rline.c in the S-Lang source code
distribution. For clarity, the code shown below omits most error
checking.
The first example simply reads input from the user until the user
enters quit:
SLrline_Type *rl;
SLang_init_tty (-1, 0, 1);
rl = SLrline_open (80, 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 ();
In this example, the SLtt interface functions
SLang_init_tty and SLang_reset_tty functions have been
used to open and close the terminal for reading input. By default,
the SLrline functions use the SLang_getkey function to
read characters and assume that the terminal has been properly
initialized before use.
The SLrline_open function was used to create an instance of
an SLrline_Type object. The function takes two arguments:
and edit window display width (80 above), and a set of flags. In
this case, the SL_RLINE_BLINK_MATCH flags has been used to
turn on parenthesis blinking. Once finished, the
SLrline_Type object must be freed using the
SLrline_close function.
The actual reading of the line occurs in the
SLrline_read_line function, which takes an
SLrline_Type instance and a string representing the prompt to
be used. The line itself is returned as a malloced char *
and must be freed using the SLfree function after used. The
length (in bytes) of the line is returned via the parameter list.
If an end-of-file character (^D on Unix) was entered at the
beginning of a line, the SLrline_read_line function will
return NULL. However, it also return NULL if an error of
some sort was encountered. The only way to tell the difference
between these two conditions is to call SLang_get_error.
The above code fragment did not provide for any sort of
SIGINT handling. Without such a provision, pressing
^C at the prompt could be enough to kill the application.
This is especially undesirable if one wants to press ^C to
abort the call to SLrline_read_line. The function
example_2 in demo/rline.c shows code to handle this
situation as well as distinguish between EOF and other errors.
SLrline features such as command-line completion,
vi-emulation, and so on are implemented through callbacks or hooks from
the SLrline functions to the S-Lang interpreter. Hence, this
functionality is only available to applications that make use of the
interpreter.
TBD...