diff options
Diffstat (limited to '')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/hetio.c | 397 | ||||
-rw-r--r-- | src/hetio.h | 22 | ||||
-rw-r--r-- | src/input.c | 9 | ||||
-rw-r--r-- | src/main.c | 8 | ||||
-rw-r--r-- | src/trap.c | 7 |
6 files changed, 1 insertions, 444 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 2a37381..120ffa2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -26,7 +26,7 @@ dash_CFILES = \ dash_SOURCES = \ $(dash_CFILES) \ alias.h arith_yacc.h bltin/bltin.h cd.h error.h eval.h exec.h \ - expand.h hetio.h \ + expand.h \ init.h input.h jobs.h machdep.h mail.h main.h memalloc.h miscbltin.h \ myhistedit.h mystring.h options.h output.h parser.h redir.h shell.h \ show.h system.h trap.h var.h diff --git a/src/hetio.c b/src/hetio.c deleted file mode 100644 index f7d175f..0000000 --- a/src/hetio.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * Termios command line History and Editting for NetBSD sh (ash) - * Copyright (c) 1999 - * Main code: Adam Rogoyski <rogoyski@cs.utexas.edu> - * Etc: Dave Cinege <dcinege@psychosis.com> - * - * You may use this code as you wish, so long as the original author(s) - * are attributed in any redistributions of the source code. - * This code is 'as is' with no warranty. - * This code may safely be consumed by a BSD or GPL license. - * - * v 0.5 19990328 Initial release - * - * Future plans: Simple file and path name completion. (like BASH) - * - */ - -/* -Usage and Known bugs: - Terminal key codes are not extensive, and more will probably - need to be added. This version was created on Debian GNU/Linux 2.x. - Delete, Backspace, Home, End, and the arrow keys were tested - to work in an Xterm and console. Ctrl-A also works as Home. - Ctrl-E also works as End. Ctrl-D and Ctrl-U perform their respective - functions. The binary size increase is <3K. - - Editting will not display correctly for lines greater then the - terminal width. (more then one line.) However, history will. -*/ - -#include <stdio.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <termios.h> -#include <ctype.h> -#include <sys/ioctl.h> - -#include "input.h" -#include "output.h" - -#include "hetio.h" - - -#define MAX_HISTORY 15 /* Maximum length of the linked list for the command line history */ - -#define ESC 27 -#define DEL 127 - -static struct history *his_front = NULL; /* First element in command line list */ -static struct history *his_end = NULL; /* Last element in command line list */ -static struct termios old_term, new_term; /* Current termio and the previous termio before starting ash */ - -static int history_counter = 0; /* Number of commands in history list */ -static int reset_term = 0; /* Set to true if the terminal needs to be reset upon exit */ -static int hetio_inter = 0; - -struct history -{ - char *s; - struct history *p; - struct history *n; -}; - - -void input_delete (int); -void input_home (int *); -void input_end (int *, int); -void input_backspace (int *, int *); - - - -void hetio_init(void) -{ - hetio_inter = 1; -} - - -void hetio_reset_term(void) -{ - if (reset_term) - tcsetattr(1, TCSANOW, &old_term); -} - - -void setIO(struct termios *new, struct termios *old) /* Set terminal IO to canonical mode, and save old term settings. */ -{ - tcgetattr(0, old); - memcpy(new, old, sizeof(*new)); - new->c_cc[VMIN] = 1; - new->c_cc[VTIME] = 0; - new->c_lflag &= ~ICANON; /* unbuffered input */ - new->c_lflag &= ~ECHO; - tcsetattr(0, TCSANOW, new); -} - -void input_home(int *cursor) /* Command line input routines */ -{ - while (*cursor > 0) { - out1c('\b'); - --*cursor; - } - flushout(out1); -} - - -void input_delete(int cursor) -{ - int j = 0; - - memmove(parsenextc + cursor, parsenextc + cursor + 1, - BUFSIZ - cursor - 1); - for (j = cursor; j < (BUFSIZ - 1); j++) { - if (!*(parsenextc + j)) - break; - else - out1c(*(parsenextc + j)); - } - - out1str(" \b"); - - while (j-- > cursor) - out1c('\b'); - flushout(out1); -} - - -void input_end(int *cursor, int len) -{ - while (*cursor < len) { - out1str("\033[C"); - ++*cursor; - } - flushout(out1); -} - - -void -input_backspace(int *cursor, int *len) -{ - int j = 0; - - if (*cursor > 0) { - out1str("\b \b"); - --*cursor; - memmove(parsenextc + *cursor, parsenextc + *cursor + 1, - BUFSIZ - *cursor + 1); - - for (j = *cursor; j < (BUFSIZ - 1); j++) { - if (!*(parsenextc + j)) - break; - else - out1c(*(parsenextc + j)); - } - - out1str(" \b"); - - while (j-- > *cursor) - out1c('\b'); - - --*len; - flushout(out1); - } -} - -int hetio_read_input(int fd) -{ - int nr = 0; - - /* Are we an interactive shell? */ - if (!hetio_inter || fd) { - return -255; - } else { - int len = 0; - int j = 0; - int cursor = 0; - int break_out = 0; - int ret = 0; - char c = 0; - struct history *hp = his_end; - - if (!reset_term) { - setIO(&new_term, &old_term); - reset_term = 1; - } else { - tcsetattr(0, TCSANOW, &new_term); - } - - memset(parsenextc, 0, BUFSIZ); - - while (1) { - if ((ret = read(fd, &c, 1)) < 1) - return ret; - - switch (c) { - case 1: /* Control-A Beginning of line */ - input_home(&cursor); - break; - case 5: /* Control-E EOL */ - input_end(&cursor, len); - break; - case 4: /* Control-D */ - if (!len) - exitshell(0); - break; - case 21: /* Control-U */ - /* Return to begining of line. */ - for (; cursor > 0; cursor--) - out1c('\b'); - /* Erase old command. */ - for (j = 0; j < len; j++) { - /* - * Clear buffer while we're at - * it. - */ - parsenextc[j] = 0; - out1c(' '); - } - /* return to begining of line */ - for (; len > 0; len--) - out1c('\b'); - flushout(out1); - break; - case '\b': /* Backspace */ - case DEL: - input_backspace(&cursor, &len); - break; - case '\n': /* Enter */ - *(parsenextc + len++ + 1) = c; - out1c(c); - flushout(out1); - break_out = 1; - break; - case ESC: /* escape sequence follows */ - if ((ret = read(fd, &c, 1)) < 1) - return ret; - - if (c == '[' ) { /* 91 */ - if ((ret = read(fd, &c, 1)) < 1) - return ret; - - switch (c) { - case 'A': - if (hp && hp->p) { /* Up */ - hp = hp->p; - goto hop; - } - break; - case 'B': - if (hp && hp->n && hp->n->s) { /* Down */ - hp = hp->n; - goto hop; - } - break; - -hop: /* hop */ - len = strlen(parsenextc); - - for (; cursor > 0; cursor--) /* return to begining of line */ - out1c('\b'); - - for (j = 0; j < len; j++) /* erase old command */ - out1c(' '); - - for (; j > 0; j--) /* return to begining of line */ - out1c('\b'); - - strcpy (parsenextc, hp->s); /* write new command */ - len = strlen (hp->s); - out1str(parsenextc); - flushout(out1); - cursor = len; - break; - case 'C': /* Right */ - if (cursor < len) { - out1str("\033[C"); - cursor++; - flushout(out1); - } - break; - case 'D': /* Left */ - if (cursor > 0) { - out1str("\033[D"); - cursor--; - flushout(out1); - } - break; - case '3': /* Delete */ - if (cursor != len) { - input_delete(cursor); - len--; - } - break; - case '1': /* Home (Ctrl-A) */ - input_home(&cursor); - break; - case '4': /* End (Ctrl-E) */ - input_end(&cursor, len); - break; - } - if (c == '1' || c == '3' || c == '4') - if ((ret = read(fd, &c, 1)) < 1) - return ret; /* read 126 (~) */ - } - - if (c == 'O') { /* 79 */ - if ((ret = read(fd, &c, 1)) < 1) - return ret; - switch (c) { - case 'H': /* Home (xterm) */ - input_home(&cursor); - break; - case 'F': /* End (xterm_ */ - input_end(&cursor, len); - break; - } - } - - c = 0; - break; - - default: /* If it's regular input, do the normal thing */ - if (!isprint(c)) /* Skip non-printable characters */ - break; - - if (len >= (BUFSIZ - 2)) /* Need to leave space for enter */ - break; - - len++; - - if (cursor == (len - 1)) { /* Append if at the end of the line */ - *(parsenextc + cursor) = c; - } else { /* Insert otherwise */ - memmove(parsenextc + cursor + 1, parsenextc + cursor, - len - cursor - 1); - - *(parsenextc + cursor) = c; - - for (j = cursor; j < len; j++) - out1c(*(parsenextc + j)); - for (; j > cursor; j--) - out1str("\033[D"); - } - - cursor++; - out1c(c); - flushout(out1); - break; - } - - if (break_out) /* Enter is the command terminator, no more input. */ - break; - } - - nr = len + 1; - tcsetattr(0, TCSANOW, &old_term); - - if (*(parsenextc)) { /* Handle command history log */ - struct history *h = his_end; - - if (!h) { /* No previous history */ - h = his_front = malloc(sizeof (struct history)); - h->n = malloc(sizeof (struct history)); - h->p = NULL; - h->s = strdup(parsenextc); - - h->n->p = h; - h->n->n = NULL; - h->n->s = NULL; - his_end = h->n; - history_counter++; - } else { /* Add a new history command */ - - h->n = malloc(sizeof (struct history)); - - h->n->p = h; - h->n->n = NULL; - h->n->s = NULL; - h->s = strdup(parsenextc); - his_end = h->n; - - if (history_counter >= MAX_HISTORY) { /* After max history, remove the last known command */ - struct history *p = his_front->n; - - p->p = NULL; - free(his_front->s); - free(his_front); - his_front = p; - } else { - history_counter++; - } - } - } - } - - return nr; -} diff --git a/src/hetio.h b/src/hetio.h deleted file mode 100644 index c3e915c..0000000 --- a/src/hetio.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Termios command line History and Editting for NetBSD sh (ash) - * Copyright (c) 1999 - * Main code: Adam Rogoyski <rogoyski@cs.utexas.edu> - * Etc: Dave Cinege <dcinege@psychosis.com> - * - * You may use this code as you wish, so long as the original author(s) - * are attributed in any redistributions of the source code. - * This code is 'as is' with no warranty. - * This code may safely be consumed by a BSD or GPL license. - * - * v 0.5 19990328 Initial release - * - * Future plans: Simple file and path name completion. (like BASH) - * - */ - -void hetio_init(void); -int hetio_read_input(int fd); -void hetio_reset_term(void); - -extern int hetio_inter; diff --git a/src/input.c b/src/input.c index aa5dcfc..232bb9c 100644 --- a/src/input.c +++ b/src/input.c @@ -58,10 +58,6 @@ #include "myhistedit.h" #endif -#ifdef HETIO -#include "hetio.h" -#endif - #define EOF_NLEFT -99 /* value of parsenleft when EOF pushed back */ #define IBUFSIZ (BUFSIZ + 1) @@ -188,11 +184,6 @@ retry: } else #endif - -#ifdef HETIO - nr = hetio_read_input(parsefile->fd); - if (nr == -255) -#endif nr = read(parsefile->fd, buf, IBUFSIZ - 1); diff --git a/src/main.c b/src/main.c index 985e8c4..bedb663 100644 --- a/src/main.c +++ b/src/main.c @@ -60,10 +60,6 @@ #include "exec.h" #include "cd.h" -#ifdef HETIO -#include "hetio.h" -#endif - #define PROFILE 0 int rootpid; @@ -206,10 +202,6 @@ cmdloop(int top) int numeof = 0; TRACE(("cmdloop(%d) called\n", top)); -#ifdef HETIO - if(iflag && top) - hetio_init(); -#endif for (;;) { int skip; diff --git a/src/trap.c b/src/trap.c index b924661..82d4263 100644 --- a/src/trap.c +++ b/src/trap.c @@ -51,10 +51,6 @@ #include "trap.h" #include "mystring.h" -#ifdef HETIO -#include "hetio.h" -#endif - /* * Sigmode records the current value of the signal handlers for the various * modes. A value of zero means that the current handler is not known. @@ -382,9 +378,6 @@ exitshell(void) struct jmploc loc; char *p; -#ifdef HETIO - hetio_reset_term(); -#endif savestatus = exitstatus; TRACE(("pid %d, exitshell(%d)\n", getpid(), savestatus)); if (setjmp(loc.loc)) |