lineedit: code shrink

function                                             old     new   delta
collapse_pos                                           -      77     +77
read_line_input                                     4755    4757      +2
add_quote_for_spec_chars                              75      71      -4
find_match                                          1283     892    -391

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-07-16 02:19:39 +02:00
parent 9038d6f8f5
commit 53fd1bf223

View File

@ -685,29 +685,34 @@ static void exe_n_cwd_tab_completion(char *command, int type)
#undef dirbuf #undef dirbuf
} }
//FIXME: HUH??? How about Unicode? /* QUOT is used on elements of int_buf[], which are bytes,
* not Unicode chars. Therefore it works correctly even in Unicode mode.
*/
#define QUOT (UCHAR_MAX+1) #define QUOT (UCHAR_MAX+1)
#define collapse_pos(is, in) do { \ #define int_buf (S.find_match__int_buf)
memmove(int_buf+(is), int_buf+(in), (MAX_LINELEN+1-(is)-(in)) * sizeof(pos_buf[0])); \ #define pos_buf (S.find_match__pos_buf)
memmove(pos_buf+(is), pos_buf+(in), (MAX_LINELEN+1-(is)-(in)) * sizeof(pos_buf[0])); \
} while (0) static void collapse_pos(int is, int in)
{
memmove(int_buf+is, int_buf+in, (MAX_LINELEN+1 - is - in) * sizeof(int_buf[0]));
memmove(pos_buf+is, pos_buf+in, (MAX_LINELEN+1 - is - in) * sizeof(pos_buf[0]));
}
static NOINLINE int find_match(char *matchBuf, int *len_with_quotes) static NOINLINE int find_match(char *matchBuf, int *len_with_quotes)
{ {
int i, j; int i, j;
int command_mode; int command_mode;
int c, c2; int c, c2;
/* Were local, but it uses too much stack */
/* int16_t int_buf[MAX_LINELEN + 1]; */ /* int16_t int_buf[MAX_LINELEN + 1]; */
/* int16_t pos_buf[MAX_LINELEN + 1]; */ /* int16_t pos_buf[MAX_LINELEN + 1]; */
#define int_buf (S.find_match__int_buf)
#define pos_buf (S.find_match__pos_buf)
/* set to integer dimension characters and own positions */ /* set to integer dimension characters and own positions */
for (i = 0;; i++) { for (i = 0;; i++) {
int_buf[i] = (unsigned char)matchBuf[i]; int_buf[i] = (unsigned char)matchBuf[i];
if (int_buf[i] == 0) { if (int_buf[i] == 0) {
pos_buf[i] = -1; /* indicator end line */ pos_buf[i] = -1; /* end-fo-line indicator */
break; break;
} }
pos_buf[i] = i; pos_buf[i] = i;
@ -720,7 +725,7 @@ static NOINLINE int find_match(char *matchBuf, int *len_with_quotes)
int_buf[j] |= QUOT; int_buf[j] |= QUOT;
i++; i++;
#if ENABLE_FEATURE_NONPRINTABLE_INVERSE_PUT #if ENABLE_FEATURE_NONPRINTABLE_INVERSE_PUT
if (matchBuf[i] == '\t') /* algorithm equivalent */ if (matchBuf[i] == '\t') /* algorithm equivalent */
int_buf[j] = ' ' | QUOT; int_buf[j] = ' ' | QUOT;
#endif #endif
} }
@ -763,11 +768,11 @@ static NOINLINE int find_match(char *matchBuf, int *len_with_quotes)
} }
if (command_mode) { if (command_mode) {
collapse_pos(0, i + command_mode); collapse_pos(0, i + command_mode);
i = -1; /* hack incremet */ i = -1; /* hack incremet */
} }
} }
/* collapse `command...` */ /* collapse `command...` */
for (i = 0; int_buf[i]; i++) for (i = 0; int_buf[i]; i++) {
if (int_buf[i] == '`') { if (int_buf[i] == '`') {
for (j = i + 1; int_buf[j]; j++) for (j = i + 1; int_buf[j]; j++)
if (int_buf[j] == '`') { if (int_buf[j] == '`') {
@ -776,34 +781,37 @@ static NOINLINE int find_match(char *matchBuf, int *len_with_quotes)
break; break;
} }
if (j) { if (j) {
/* not found close ` - command mode, collapse all previous */ /* not found closing ` - command mode, collapse all previous */
collapse_pos(0, i + 1); collapse_pos(0, i + 1);
break; break;
} else } else
i--; /* hack incremet */ i--; /* hack incremet */
} }
}
/* collapse (command...(command...)...) or {command...{command...}...} */ /* collapse (command...(command...)...) or {command...{command...}...} */
c = 0; /* "recursive" level */ c = 0; /* "recursive" level */
c2 = 0; c2 = 0;
for (i = 0; int_buf[i]; i++) for (i = 0; int_buf[i]; i++) {
if (int_buf[i] == '(' || int_buf[i] == '{') { if (int_buf[i] == '(' || int_buf[i] == '{') {
if (int_buf[i] == '(') if (int_buf[i] == '(')
c++; c++;
else else
c2++; c2++;
collapse_pos(0, i + 1); collapse_pos(0, i + 1);
i = -1; /* hack incremet */ i = -1; /* hack incremet */
} }
for (i = 0; pos_buf[i] >= 0 && (c > 0 || c2 > 0); i++) }
for (i = 0; pos_buf[i] >= 0 && (c > 0 || c2 > 0); i++) {
if ((int_buf[i] == ')' && c > 0) || (int_buf[i] == '}' && c2 > 0)) { if ((int_buf[i] == ')' && c > 0) || (int_buf[i] == '}' && c2 > 0)) {
if (int_buf[i] == ')') if (int_buf[i] == ')')
c--; c--;
else else
c2--; c2--;
collapse_pos(0, i + 1); collapse_pos(0, i + 1);
i = -1; /* hack incremet */ i = -1; /* hack incremet */
} }
}
/* skip first not quote space */ /* skip first not quote space */
for (i = 0; int_buf[i]; i++) for (i = 0; int_buf[i]; i++)
@ -814,7 +822,7 @@ static NOINLINE int find_match(char *matchBuf, int *len_with_quotes)
/* set find mode for completion */ /* set find mode for completion */
command_mode = FIND_EXE_ONLY; command_mode = FIND_EXE_ONLY;
for (i = 0; int_buf[i]; i++) for (i = 0; int_buf[i]; i++) {
if (int_buf[i] == ' ' || int_buf[i] == '<' || int_buf[i] == '>') { if (int_buf[i] == ' ' || int_buf[i] == '<' || int_buf[i] == '>') {
if (int_buf[i] == ' ' && command_mode == FIND_EXE_ONLY if (int_buf[i] == ' ' && command_mode == FIND_EXE_ONLY
&& matchBuf[pos_buf[0]] == 'c' && matchBuf[pos_buf[0]] == 'c'
@ -826,6 +834,7 @@ static NOINLINE int find_match(char *matchBuf, int *len_with_quotes)
break; break;
} }
} }
}
for (i = 0; int_buf[i]; i++) for (i = 0; int_buf[i]; i++)
/* "strlen" */; /* "strlen" */;
/* find last word */ /* find last word */
@ -873,9 +882,9 @@ static void showfiles(void)
int nrows = nfiles; int nrows = nfiles;
int l; int l;
/* find the longest file name- use that as the column width */ /* find the longest file name - use that as the column width */
for (row = 0; row < nrows; row++) { for (row = 0; row < nrows; row++) {
l = strlen(matches[row]); l = bb_mbstrlen(matches[row]);
if (column_width < l) if (column_width < l)
column_width = l; column_width = l;
} }
@ -895,7 +904,8 @@ static void showfiles(void)
for (nc = 1; nc < ncols && n+nrows < nfiles; n += nrows, nc++) { for (nc = 1; nc < ncols && n+nrows < nfiles; n += nrows, nc++) {
printf("%s%-*s", matches[n], printf("%s%-*s", matches[n],
(int)(column_width - strlen(matches[n])), ""); (int)(column_width - bb_mbstrlen(matches[n])), ""
);
} }
puts(matches[n]); puts(matches[n]);
} }
@ -904,14 +914,14 @@ static void showfiles(void)
static char *add_quote_for_spec_chars(char *found) static char *add_quote_for_spec_chars(char *found)
{ {
int l = 0; int l = 0;
char *s = xmalloc((strlen(found) + 1) * 2); char *s = xzalloc((strlen(found) + 1) * 2);
while (*found) { while (*found) {
if (strchr(" `\"#$%^&*()=+{}[]:;\'|\\<>", *found)) if (strchr(" `\"#$%^&*()=+{}[]:;\'|\\<>", *found))
s[l++] = '\\'; s[l++] = '\\';
s[l++] = *found++; s[l++] = *found++;
} }
s[l] = 0; /* s[l] = '\0'; - already is */
return s; return s;
} }