X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=shell%2Fcmdedit.c;h=4f124d6475989e4e0bc804e35c8669000455ae6f;hb=ab6526c8b3d0d38bec62b181276380c0533a151d;hp=cc39e562ae611583184c9f3ccf80e3880ffa9e85;hpb=bfae2529b8aa7b12b19da2ec7ad00ba717941074;p=oweals%2Fbusybox.git diff --git a/shell/cmdedit.c b/shell/cmdedit.c index cc39e562a..4f124d647 100644 --- a/shell/cmdedit.c +++ b/shell/cmdedit.c @@ -76,16 +76,16 @@ #undef BB_FEATURE_COMMAND_USERNAME_COMPLETION #endif -#if defined(BB_FEATURE_COMMAND_USERNAME_COMPLETION) || !defined(BB_FEATURE_SH_SIMPLE_PROMPT) +#if defined(BB_FEATURE_COMMAND_USERNAME_COMPLETION) || defined(BB_FEATURE_SH_FANCY_PROMPT) #define BB_FEATURE_GETUSERNAME_AND_HOMEDIR #endif #ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR -#ifndef TEST -#include "pwd_grp/pwd.h" -#else -#include -#endif /* TEST */ +# ifndef TEST +# include "pwd_grp/pwd.h" +# else +# include +# 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 -# define termios termio -# define setTermSettings(fd,argp) ioctl(fd,TCSETAF,argp) -# define getTermSettings(fd,argp) ioctl(fd,TCGETA,argp) -#else -# include -# define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp) -# define getTermSettings(fd,argp) tcgetattr(fd, argp); -#endif +#include +#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 */ @@ -151,7 +137,7 @@ static int cursor; /* required global for signal handler */ static int len; /* --- "" - - "" - -"- --""-- --""--- */ static char *command_ps; /* --- "" - - "" - -"- --""-- --""--- */ static -#ifdef BB_FEATURE_SH_SIMPLE_PROMPT +#ifndef BB_FEATURE_SH_FANCY_PROMPT const #endif char *cmdedit_prompt; /* --- "" - - "" - -"- --""-- --""--- */ @@ -166,7 +152,7 @@ static char *home_pwd_buf = ""; static int my_euid; #endif -#ifndef BB_FEATURE_SH_SIMPLE_PROMPT +#ifdef BB_FEATURE_SH_FANCY_PROMPT static char *hostname_buf = ""; static int num_ok_lines = 1; #endif @@ -335,7 +321,7 @@ static void put_prompt(void) cursor = 0; } -#ifdef BB_FEATURE_SH_SIMPLE_PROMPT +#ifndef BB_FEATURE_SH_FANCY_PROMPT static void parse_prompt(const char *prmt_ptr) { cmdedit_prompt = prmt_ptr; @@ -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) { @@ -456,7 +442,8 @@ static void parse_prompt(const char *prmt_ptr) if (flg_not_length == ']') sub_len++; } - free(pwd_buf); + if(pwd_buf!=(char *)unknown) + free(pwd_buf); cmdedit_prompt = prmt_mem_ptr; cmdedit_prmt_len = prmt_len - sub_len; put_prompt(); @@ -571,7 +558,6 @@ extern void cmdedit_init(void) atexit(cmdedit_reset_term); /* be sure to do this only once */ } -#if 0 if ((handlers_sets & SET_TERM_HANDLERS) == 0) { signal(SIGKILL, clean_up_and_die); signal(SIGINT, clean_up_and_die); @@ -579,8 +565,6 @@ extern void cmdedit_init(void) signal(SIGTERM, clean_up_and_die); handlers_sets |= SET_TERM_HANDLERS; } -#endif - } #ifdef BB_FEATURE_COMMAND_TAB_COMPLETION @@ -983,17 +967,14 @@ static int find_match(char *matchBuf, int *len_with_quotes) || (int_buf[i + 1] & ~QUOT) == '~')) { i++; } - if (i) { - collapse_pos(0, i); - } /* set only match and destroy quotes */ j = 0; - for (i = 0; pos_buf[i] >= 0; i++) { - matchBuf[i] = matchBuf[pos_buf[i]]; + for (c = 0; pos_buf[i] >= 0; i++) { + matchBuf[c++] = matchBuf[pos_buf[i]]; j = pos_buf[i] + 1; } - matchBuf[i] = 0; + matchBuf[c] = 0; /* old lenght matchBuf with quotes symbols */ *len_with_quotes = j ? j - pos_buf[0] : 0; @@ -1047,9 +1028,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 1) { char *tmp1; @@ -1097,8 +1099,7 @@ static void input_tab(int *lastWasTab) /* new len */ len = strlen(command_ps); /* write out the matched command */ - input_end(); - input_backward(cursor - recalc_pos); + redraw(cmdedit_y, len - recalc_pos); } if (tmp != matches[0]) free(tmp); @@ -1176,8 +1177,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; @@ -1188,23 +1187,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 */ @@ -1216,7 +1220,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; @@ -1303,11 +1307,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) { @@ -1372,7 +1376,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; @@ -1382,7 +1386,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(); @@ -1423,7 +1427,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 */ @@ -1469,7 +1473,7 @@ prepare_to_die: history_counter++; } } -#if !defined(BB_FEATURE_SH_SIMPLE_PROMPT) +#if defined(BB_FEATURE_SH_FANCY_PROMPT) num_ok_lines++; #endif } @@ -1478,7 +1482,7 @@ prepare_to_die: #if defined(BB_FEATURE_CLEAN_UP) && defined(BB_FEATURE_COMMAND_TAB_COMPLETION) input_tab(0); /* strong free */ #endif -#if !defined(BB_FEATURE_SH_SIMPLE_PROMPT) +#if defined(BB_FEATURE_SH_FANCY_PROMPT) free(cmdedit_prompt); #endif return; @@ -1489,7 +1493,6 @@ prepare_to_die: extern void cmdedit_terminate(void) { cmdedit_reset_term(); -#if 0 if ((handlers_sets & SET_TERM_HANDLERS) != 0) { signal(SIGKILL, SIG_DFL); signal(SIGINT, SIG_DFL); @@ -1498,7 +1501,6 @@ extern void cmdedit_terminate(void) signal(SIGWINCH, SIG_DFL); handlers_sets &= ~SET_TERM_HANDLERS; } -#endif } #endif /* BB_FEATURE_COMMAND_EDITING */ @@ -1519,7 +1521,7 @@ int main(int argc, char **argv) { char buff[BUFSIZ]; char *prompt = -#if !defined(BB_FEATURE_SH_SIMPLE_PROMPT) +#if defined(BB_FEATURE_SH_FANCY_PROMPT) "\\[\\033[32;1m\\]\\u@\\[\\x1b[33;1m\\]\\h:\ \\[\\033[34;1m\\]\\w\\[\\033[35;1m\\] \ \\!\\[\\e[36;1m\\]\\$ \\[\\E[0m\\]";