(sl_command_loop): try to handle user pressing C-c
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@9499 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
30
lib/sl/sl.c
30
lib/sl/sl.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1995 - 2000 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1995 - 2001 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -37,6 +37,7 @@ RCSID("$Id$");
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "sl_locl.h"
|
#include "sl_locl.h"
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
print_sl (FILE *stream, int mdoc, int longp, SL_cmd *c)
|
print_sl (FILE *stream, int mdoc, int longp, SL_cmd *c)
|
||||||
@@ -273,9 +274,28 @@ sl_make_argv(char *line, int *ret_argc, char ***ret_argv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static jmp_buf sl_jmp;
|
||||||
|
|
||||||
|
static void sl_sigint(int sig)
|
||||||
|
{
|
||||||
|
longjmp(sl_jmp, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *sl_readline(const char *prompt)
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
void (*old)(int);
|
||||||
|
old = signal(SIGINT, sl_sigint);
|
||||||
|
if(setjmp(sl_jmp))
|
||||||
|
printf("\n");
|
||||||
|
s = readline((char*)prompt);
|
||||||
|
signal(SIGINT, old);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
/* return values: 0 on success, -1 on fatal error, or return value of command */
|
/* return values: 0 on success, -1 on fatal error, or return value of command */
|
||||||
int
|
int
|
||||||
sl_command_loop(SL_cmd *cmds, char *prompt, void **data)
|
sl_command_loop(SL_cmd *cmds, const char *prompt, void **data)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
char *buf;
|
char *buf;
|
||||||
@@ -283,7 +303,7 @@ sl_command_loop(SL_cmd *cmds, char *prompt, void **data)
|
|||||||
char **argv;
|
char **argv;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
buf = readline(prompt);
|
buf = sl_readline(prompt);
|
||||||
if(buf == NULL)
|
if(buf == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@@ -308,7 +328,7 @@ sl_command_loop(SL_cmd *cmds, char *prompt, void **data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sl_loop(SL_cmd *cmds, char *prompt)
|
sl_loop(SL_cmd *cmds, const char *prompt)
|
||||||
{
|
{
|
||||||
void *data = NULL;
|
void *data = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -318,7 +338,7 @@ sl_loop(SL_cmd *cmds, char *prompt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sl_apropos (SL_cmd *cmd, char *topic)
|
sl_apropos (SL_cmd *cmd, const char *topic)
|
||||||
{
|
{
|
||||||
for (; cmd->name != NULL; ++cmd)
|
for (; cmd->name != NULL; ++cmd)
|
||||||
if (cmd->usage != NULL && strstr(cmd->usage, topic) != NULL)
|
if (cmd->usage != NULL && strstr(cmd->usage, topic) != NULL)
|
||||||
|
Reference in New Issue
Block a user