cmdedit: small optimizations
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 21 Jan 2007 19:18:59 +0000 (19:18 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 21 Jan 2007 19:18:59 +0000 (19:18 -0000)
shell/cmdedit.c

index 617f3a29a17690edc3bfeeffdbe04799c59a4536..1143ded77e59ce28bd186b65a1f63edd7ca878df 100644 (file)
    - not true viewing if length prompt less terminal width
  */
 
+/*
+CONFIG_FEATURE_COMMAND_EDITING=y
+# CONFIG_FEATURE_COMMAND_EDITING_VI is not set
+CONFIG_FEATURE_COMMAND_HISTORY=15
+# CONFIG_FEATURE_COMMAND_SAVEHISTORY is not set
+# CONFIG_FEATURE_COMMAND_TAB_COMPLETION is not set
+# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set
+# CONFIG_FEATURE_SH_FANCY_PROMPT is not set
+Sizes with the above:
+# size cmdedit.o
+   text    data     bss     dec     hex filename
+   2374       4     228    2606     a2e cmdedit.o
+# nm --size-sort cmdedit.o
+00000004 b cmdedit_prmt_len
+00000004 b cmdedit_prompt
+00000004 d cmdedit_termw
+00000004 b cmdedit_x
+00000004 b cmdedit_y
+00000004 b command_ps
+00000004 b cur_history
+00000004 b cursor
+00000004 b handlers_sets
+00000004 b len
+00000004 b n_history
+00000004 b previous_SIGWINCH_handler
+00000009 t beep
+00000017 t goto_new_line
+0000001a t input_end
+0000001b t input_backspace
+0000001e t input_forward
+00000027 t get_next_history
+00000036 t put_prompt
+00000039 t redraw
+0000003c b initial_settings
+0000003c b new_settings
+00000040 b history
+00000047 t input_delete
+0000004d t get_previous_history
+00000059 t cmdedit_reset_term
+0000006c t cmdedit_set_out_char
+00000087 t input_backward
+000000a1 t win_changed
+0000053c T cmdedit_read_input
+*/
+
 #include <sys/ioctl.h>
 #include "busybox.h"
 #include "cmdedit.h"
@@ -86,7 +131,7 @@ enum {
 
 static int cmdedit_x;           /* real x terminal position */
 static int cmdedit_y;           /* pseudoreal y terminal position */
-static int cmdedit_prmt_len;    /* length of prompt without colores string */
+static int cmdedit_prmt_len;    /* length of prompt (without colors etc) */
 
 static int cursor;
 static int len;
@@ -179,40 +224,34 @@ static void beep(void)
 }
 
 /* Move back one character */
-/* special for slow terminal */
-static void input_backward(int num)
+/* (optimized for slow terminals) */
+static void input_backward(unsigned num)
 {
+       int count_y;
+
        if (num > cursor)
                num = cursor;
-       cursor -= num;          /* new cursor (in command, not terminal) */
+       if (!num)
+               return;
+       cursor -= num;
 
        if (cmdedit_x >= num) {
                cmdedit_x -= num;
-               if (num <= 4)
-                       while (num > 0) {
-                               putchar('\b');
-                               num--;
-                       }
-               else
-                       printf("\033[%dD", num);
-       } else {
-               /* Need to go one or more lines up */
-               int count_y;
-
-               //if (cmdedit_x) {
-               //      /* back to first column */
-               //      putchar('\r');          
-               //      num -= cmdedit_x;
-               //}
-               num -= cmdedit_x;//
-               count_y = 1 + num / cmdedit_termw;
-               //printf("\033[%dA", count_y);
-               cmdedit_y -= count_y;
-               cmdedit_x = cmdedit_termw * count_y - num;
-               //printf("\033[%dC", cmdedit_x);
-               /* go to 1st col; go up; go to correct column */
-               printf("\r" "\033[%dA" "\033[%dC", count_y, cmdedit_x);//
+               if (num <= 4) {
+                       do putchar('\b'); while (--num);
+                       return;
+               }
+               printf("\033[%uD", num);
+               return;
        }
+
+       /* Need to go one or more lines up */
+       num -= cmdedit_x;
+       count_y = 1 + (num / cmdedit_termw);
+       cmdedit_y -= count_y;
+       cmdedit_x = cmdedit_termw * count_y - num;
+       /* go to 1st col; go up; go to correct column */
+       printf("\r" "\033[%dA" "\033[%dC", count_y, cmdedit_x);
 }
 
 static void put_prompt(void)
@@ -220,6 +259,7 @@ static void put_prompt(void)
        out1str(cmdedit_prompt);
        cmdedit_x = cmdedit_prmt_len;   /* count real x terminal position */
        cursor = 0;
+// Huh? what if cmdedit_prmt_len >= width?
        cmdedit_y = 0;                  /* new quasireal y */
 }
 
@@ -1105,23 +1145,15 @@ static void cmdedit_reset_term(void)
        fflush(stdout);
 }
 
-static void cmdedit_setwidth(int w, int redraw_flg)
+static void cmdedit_setwidth(unsigned w, int redraw_flg)
 {
-       cmdedit_termw = cmdedit_prmt_len + 2;
-       if (w <= cmdedit_termw) {
-               cmdedit_termw = cmdedit_termw % w;
-       }
-       if (w > cmdedit_termw) {
-               cmdedit_termw = w;
-
-               if (redraw_flg) {
-                       /* new y for current cursor */
-                       int new_y = (cursor + cmdedit_prmt_len) / w;
-
-                       /* redraw */
-                       redraw((new_y >= cmdedit_y ? new_y : cmdedit_y), len - cursor);
-                       fflush(stdout);
-               }
+       cmdedit_termw = w;
+       if (redraw_flg) {
+               /* new y for current cursor */
+               int new_y = (cursor + cmdedit_prmt_len) / w;
+               /* redraw */
+               redraw((new_y >= cmdedit_y ? new_y : cmdedit_y), len - cursor);
+               fflush(stdout);
        }
 }
 
@@ -1310,7 +1342,7 @@ static void parse_prompt(const char *prmt_ptr)
 
 /* leave out the "vi-mode"-only case labels if vi editing isn't
  * configured. */
-#define vi_case(caselabel) USE_FEATURE_COMMAND_EDITING(caselabel)
+#define vi_case(caselabel) USE_FEATURE_COMMAND_EDITING(case caselabel)
 
 /* convert uppercase ascii to equivalent control char, for readability */
 #undef CTRL
@@ -1328,9 +1360,10 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
        smalluint prevc;
 #endif
        /* prepare before init handlers */
-       cmdedit_y = 0;  /* quasireal y, not true work if line > xt*yt */
+       cmdedit_y = 0;  /* quasireal y, not true if line > xt*yt */
        len = 0;
        command_ps = command;
+       command[0] = '\0';
 
        getTermSettings(0, (void *) &initial_settings);
        memcpy(&new_settings, &initial_settings, sizeof(struct termios));
@@ -1341,12 +1374,10 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
        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
+#ifndef _POSIX_VDISABLE
+#define _POSIX_VDISABLE '\0'
+#endif
        new_settings.c_cc[VINTR] = _POSIX_VDISABLE;
-       command[0] = 0;
-
        setTermSettings(0, (void *) &new_settings);
        handlers_sets |= SET_RESET_TERM;
 
@@ -1372,30 +1403,30 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
                switch (ic) {
                case '\n':
                case '\r':
-               vi_case( case '\n'|vbit: )
-               vi_case( case '\r'|vbit: )
+               vi_case('\n'|vbit:)
+               vi_case('\r'|vbit:)
                        /* Enter */
                        goto_new_line();
                        break_out = 1;
                        break;
                case CTRL('A'):
-               vi_case( case '0'|vbit: )
+               vi_case('0'|vbit:)
                        /* Control-a -- Beginning of line */
                        input_backward(cursor);
                        break;
                case CTRL('B'):
-               vi_case( case 'h'|vbit: )
-               vi_case( case '\b'|vbit: )
-               vi_case( case '\x7f'|vbit: ) /* DEL */
+               vi_case('h'|vbit:)
+               vi_case('\b'|vbit:)
+               vi_case('\x7f'|vbit:) /* DEL */
                        /* Control-b -- Move back one character */
                        input_backward(1);
                        break;
                case CTRL('C'):
-               vi_case( case CTRL('C')|vbit: )
+               vi_case(CTRL('C')|vbit:)
                        /* Control-c -- stop gathering input */
                        goto_new_line();
 #if !ENABLE_ASH
-                       command[0] = 0;
+                       command[0] = '\0';
                        len = 0;
                        lastWasTab = FALSE;
                        put_prompt();
@@ -1427,13 +1458,13 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
                        }
                        break;
                case CTRL('E'):
-               vi_case( case '$'|vbit: )
+               vi_case('$'|vbit:)
                        /* Control-e -- End of line */
                        input_end();
                        break;
                case CTRL('F'):
-               vi_case( case 'l'|vbit: )
-               vi_case( case ' '|vbit: )
+               vi_case('l'|vbit:)
+               vi_case(' '|vbit:)
                        /* Control-f -- Move forward one character */
                        input_forward();
                        break;
@@ -1454,22 +1485,22 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
                        printf("\033[J");
                        break;
                case CTRL('L'):
-               vi_case( case CTRL('L')|vbit: )
+               vi_case(CTRL('L')|vbit:)
                        /* Control-l -- clear screen */
                        printf("\033[H");
                        redraw(0, len - cursor);
                        break;
 #if MAX_HISTORY > 0
                case CTRL('N'):
-               vi_case( case CTRL('N')|vbit: )
-               vi_case( case 'j'|vbit: )
+               vi_case(CTRL('N')|vbit:)
+               vi_case('j'|vbit:)
                        /* Control-n -- Get next command in history */
                        if (get_next_history())
                                goto rewrite_line;
                        break;
                case CTRL('P'):
-               vi_case( case CTRL('P')|vbit: )
-               vi_case( case 'k'|vbit: )
+               vi_case(CTRL('P')|vbit:)
+               vi_case('k'|vbit:)
                        /* Control-p -- Get previous command from history */
                        if (cur_history > 0) {
                                get_previous_history();
@@ -1480,7 +1511,7 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
                        break;
 #endif
                case CTRL('U'):
-               vi_case( case CTRL('U')|vbit: )
+               vi_case(CTRL('U')|vbit:)
                        /* Control-U -- Clear line before cursor */
                        if (cursor) {
                                strcpy(command, command + cursor);
@@ -1488,7 +1519,7 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
                        }
                        break;
                case CTRL('W'):
-               vi_case( case CTRL('W')|vbit: )
+               vi_case(CTRL('W')|vbit:)
                        /* Control-W -- Remove the last word */
                        while (cursor > 0 && isspace(command[cursor-1]))
                                input_backspace();
@@ -1639,8 +1670,8 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
                                goto prepare_to_die;
                        /* different vt100 emulations */
                        if (c == '[' || c == 'O') {
-               vi_case( case '['|vbit: )
-               vi_case( case 'O'|vbit: )
+               vi_case('['|vbit:)
+               vi_case('O'|vbit:)
                                if (safe_read(0, &c, 1) < 1)
                                        goto prepare_to_die;
                        }
@@ -1650,7 +1681,7 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
                                if (safe_read(0, &dummy, 1) < 1)
                                        goto prepare_to_die;
                                if (dummy != '~')
-                                       c = 0;
+                                       c = '\0';
                        }
                        switch (c) {
 #if ENABLE_FEATURE_COMMAND_TAB_COMPLETION
@@ -1671,8 +1702,8 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
                                /* Down Arrow -- Get next command in history */
                                if (!get_next_history())
                                        break;
-                               /* Rewrite the line with the selected history item */
  rewrite_line:
+                               /* Rewrite the line with the selected history item */
                                /* change command */
                                len = strlen(strcpy(command, history[cur_history]));
                                /* redraw and go to eol (bol, in vi */