diff options
author | Glenn L McGrath | 2001-06-26 02:06:08 +0000 |
---|---|---|
committer | Glenn L McGrath | 2001-06-26 02:06:08 +0000 |
commit | 78b0e379d7c2db84eec34ccd89cf9afb67b94901 (patch) | |
tree | ae5bb34caa3b88968102e93193a01e4d90109b92 /cmdedit.c | |
parent | addabd6f16aece578d94d810d3a9e9dc88f2cdb7 (diff) | |
download | busybox-78b0e379d7c2db84eec34ccd89cf9afb67b94901.zip busybox-78b0e379d7c2db84eec34ccd89cf9afb67b94901.tar.gz |
Vladimir's last_patch_15
Diffstat (limited to 'cmdedit.c')
-rw-r--r-- | cmdedit.c | 92 |
1 files changed, 51 insertions, 41 deletions
@@ -81,11 +81,11 @@ #endif #ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR -#ifndef TEST -#include "pwd_grp/pwd.h" -#else -#include <pwd.h> -#endif /* TEST */ +# ifndef TEST +# include "pwd_grp/pwd.h" +# else +# include <pwd.h> +# endif /* TEST */ #endif /* advanced FEATURES */ @@ -106,28 +106,14 @@ static struct history *his_front = NULL; static struct history *his_end = NULL; -/* ED: sparc termios is broken: revert back to old termio handling. */ - -#if #cpu(sparc) -# include <termio.h> -# define termios termio -# define setTermSettings(fd,argp) ioctl(fd,TCSETAF,argp) -# define getTermSettings(fd,argp) ioctl(fd,TCGETA,argp) -#else -# include <termios.h> -# define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp) -# define getTermSettings(fd,argp) tcgetattr(fd, argp); -#endif +#include <termios.h> +#define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp) +#define getTermSettings(fd,argp) tcgetattr(fd, argp); /* Current termio and the previous termio before starting sh */ static struct termios initial_settings, new_settings; -#ifndef _POSIX_VDISABLE -#define _POSIX_VDISABLE '\0' -#endif - - static volatile int cmdedit_termw = 80; /* actual terminal width */ static int history_counter = 0; /* Number of commands in history list */ @@ -356,7 +342,7 @@ static void parse_prompt(const char *prmt_ptr) char *pbuf; if (!pwd_buf) { - pwd_buf=unknown; + pwd_buf=(char *)unknown; } while (*prmt_ptr) { @@ -1041,9 +1027,30 @@ static void input_tab(int *lastWasTab) * in the current working directory that matches. */ if (!matches) matches = - exe_n_cwd_tab_completion(matchBuf, &num_matches, - find_type); - + exe_n_cwd_tab_completion(matchBuf, + &num_matches, find_type); + /* Remove duplicate found */ + if(matches) { + int i, j; + /* bubble */ + for(i=0; i<(num_matches-1); i++) + for(j=i+1; j<num_matches; j++) + if(matches[i]!=0 && matches[j]!=0 && + strcmp(matches[i], matches[j])==0) { + free(matches[j]); + matches[j]=0; + } + j=num_matches; + num_matches = 0; + for(i=0; i<j; i++) + if(matches[i]) { + if(!strcmp(matches[i], "./")) + matches[i][1]=0; + else if(!strcmp(matches[i], "../")) + matches[i][2]=0; + matches[num_matches++]=matches[i]; + } + } /* Did we find exactly one match? */ if (!matches || num_matches > 1) { char *tmp1; @@ -1169,8 +1176,6 @@ enum { extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) { - int inputFd = fileno(stdin); - int break_out = 0; int lastWasTab = FALSE; unsigned char c = 0; @@ -1181,23 +1186,28 @@ extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) len = 0; command_ps = command; - if (new_settings.c_cc[VMIN] == 0) { /* first call */ + if (new_settings.c_cc[VERASE] == 0) { /* first call */ - getTermSettings(inputFd, (void *) &initial_settings); + getTermSettings(0, (void *) &initial_settings); memcpy(&new_settings, &initial_settings, sizeof(struct termios)); - + new_settings.c_lflag &= ~ICANON; /* unbuffered input */ + /* Turn off echoing and CTRL-C, so we can trap it */ + new_settings.c_lflag &= ~(ECHO | ECHONL | ISIG); +#ifndef linux + /* Hmm, in linux c_cc[] not parsed if set ~ICANON */ new_settings.c_cc[VMIN] = 1; new_settings.c_cc[VTIME] = 0; /* Turn off CTRL-C, so we can trap it */ +# ifndef _POSIX_VDISABLE +# define _POSIX_VDISABLE '\0' +# endif new_settings.c_cc[VINTR] = _POSIX_VDISABLE; - new_settings.c_lflag &= ~ICANON; /* unbuffered input */ - /* Turn off echoing */ - new_settings.c_lflag &= ~(ECHO | ECHOCTL | ECHONL); +#endif } command[0] = 0; - setTermSettings(inputFd, (void *) &new_settings); + setTermSettings(0, (void *) &new_settings); handlers_sets |= SET_RESET_TERM; /* Now initialize things */ @@ -1209,7 +1219,7 @@ extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) fflush(stdout); /* buffered out to fast */ - if (read(inputFd, &c, 1) < 1) + if (read(0, &c, 1) < 1) /* if we can't read input then exit */ goto prepare_to_die; @@ -1296,11 +1306,11 @@ prepare_to_die: case ESC:{ /* escape sequence follows */ - if (read(inputFd, &c, 1) < 1) + if (read(0, &c, 1) < 1) return; /* different vt100 emulations */ if (c == '[' || c == 'O') { - if (read(inputFd, &c, 1) < 1) + if (read(0, &c, 1) < 1) return; } switch (c) { @@ -1365,7 +1375,7 @@ prepare_to_die: } if (c >= '1' && c <= '9') do - if (read(inputFd, &c, 1) < 1) + if (read(0, &c, 1) < 1) return; while (c != '~'); break; @@ -1375,7 +1385,7 @@ prepare_to_die: #ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT /* Control-V -- Add non-printable symbol */ if (c == 22) { - if (read(inputFd, &c, 1) < 1) + if (read(0, &c, 1) < 1) return; if (c == 0) { beep(); @@ -1416,7 +1426,7 @@ prepare_to_die: lastWasTab = FALSE; } - setTermSettings(inputFd, (void *) &initial_settings); + setTermSettings(0, (void *) &initial_settings); handlers_sets &= ~SET_RESET_TERM; /* Handle command history log */ |