aboutsummaryrefslogtreecommitdiff
path: root/libbb/lineedit.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-06-10 15:08:44 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-06-10 15:08:44 +0000
commite8a0788b249cbac5bf5b2aa2d81bb8f6b29a7a4b (patch)
treefcdf3d51b6d60986b634c693d71355867bca82ff /libbb/lineedit.c
parentd4fea900bdb92d7bba71348a40cb00b6748a8ecc (diff)
downloadbusybox-w32-e8a0788b249cbac5bf5b2aa2d81bb8f6b29a7a4b.tar.gz
busybox-w32-e8a0788b249cbac5bf5b2aa2d81bb8f6b29a7a4b.tar.bz2
busybox-w32-e8a0788b249cbac5bf5b2aa2d81bb8f6b29a7a4b.zip
moved biggest stack buffers to malloc space, or made their size configurable
(8k of shell line edit buffer is an overkill) # make ARCH=i386 bloatcheck function old new delta read_line_input 3933 3967 +34 ifaddrlist 348 345 -3 do_loadfont 208 191 -17 edit_file 840 819 -21 .rodata 129112 129080 -32 uncompress 1305 1268 -37 loadfont_main 566 495 -71 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/6 up/down: 34/-181) Total: -147 bytes
Diffstat (limited to 'libbb/lineedit.c')
-rw-r--r--libbb/lineedit.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index b950d7f26..1f2e6a54e 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -28,7 +28,6 @@
28 - not true viewing if length prompt less terminal width 28 - not true viewing if length prompt less terminal width
29 */ 29 */
30 30
31//#include <sys/ioctl.h>
32#include "libbb.h" 31#include "libbb.h"
33 32
34 33
@@ -59,6 +58,7 @@
59#define ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR \ 58#define ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR \
60(ENABLE_FEATURE_USERNAME_COMPLETION || ENABLE_FEATURE_EDITING_FANCY_PROMPT) 59(ENABLE_FEATURE_USERNAME_COMPLETION || ENABLE_FEATURE_EDITING_FANCY_PROMPT)
61 60
61enum { MAX_LINELEN = CONFIG_FEATURE_EDITING_MAX_LEN };
62 62
63static line_input_t *state; 63static line_input_t *state;
64 64
@@ -327,8 +327,8 @@ static void username_tab_completion(char *ud, char *with_shash_flg)
327 home = entry->pw_dir; 327 home = entry->pw_dir;
328 } 328 }
329 if (home) { 329 if (home) {
330 if ((userlen + strlen(home) + 1) < BUFSIZ) { 330 if ((userlen + strlen(home) + 1) < MAX_LINELEN) {
331 char temp2[BUFSIZ]; /* argument size */ 331 char temp2[MAX_LINELEN]; /* argument size */
332 332
333 /* /home/user/... */ 333 /* /home/user/... */
334 sprintf(temp2, "%s%s", home, ud); 334 sprintf(temp2, "%s%s", home, ud);
@@ -410,7 +410,7 @@ static void exe_n_cwd_tab_completion(char *command, int type)
410{ 410{
411 DIR *dir; 411 DIR *dir;
412 struct dirent *next; 412 struct dirent *next;
413 char dirbuf[BUFSIZ]; 413 char dirbuf[MAX_LINELEN];
414 struct stat st; 414 struct stat st;
415 char *path1[1]; 415 char *path1[1];
416 char **paths = path1; 416 char **paths = path1;
@@ -496,16 +496,16 @@ static void exe_n_cwd_tab_completion(char *command, int type)
496#define QUOT (UCHAR_MAX+1) 496#define QUOT (UCHAR_MAX+1)
497 497
498#define collapse_pos(is, in) { \ 498#define collapse_pos(is, in) { \
499 memmove(int_buf+(is), int_buf+(in), (BUFSIZ+1-(is)-(in))*sizeof(int)); \ 499 memmove(int_buf+(is), int_buf+(in), (MAX_LINELEN+1-(is)-(in))*sizeof(int)); \
500 memmove(pos_buf+(is), pos_buf+(in), (BUFSIZ+1-(is)-(in))*sizeof(int)); } 500 memmove(pos_buf+(is), pos_buf+(in), (MAX_LINELEN+1-(is)-(in))*sizeof(int)); }
501 501
502static int find_match(char *matchBuf, int *len_with_quotes) 502static int find_match(char *matchBuf, int *len_with_quotes)
503{ 503{
504 int i, j; 504 int i, j;
505 int command_mode; 505 int command_mode;
506 int c, c2; 506 int c, c2;
507 int int_buf[BUFSIZ + 1]; 507 int int_buf[MAX_LINELEN + 1];
508 int pos_buf[BUFSIZ + 1]; 508 int pos_buf[MAX_LINELEN + 1];
509 509
510 /* set to integer dimension characters and own positions */ 510 /* set to integer dimension characters and own positions */
511 for (i = 0;; i++) { 511 for (i = 0;; i++) {
@@ -731,7 +731,7 @@ static void input_tab(int *lastWasTab)
731 if (!*lastWasTab) { 731 if (!*lastWasTab) {
732 char *tmp, *tmp1; 732 char *tmp, *tmp1;
733 int len_found; 733 int len_found;
734 char matchBuf[BUFSIZ]; 734 char matchBuf[MAX_LINELEN];
735 int find_type; 735 int find_type;
736 int recalc_pos; 736 int recalc_pos;
737 737
@@ -781,6 +781,7 @@ static void input_tab(int *lastWasTab)
781 if (!matches) 781 if (!matches)
782 return; /* not found */ 782 return; /* not found */
783 /* find minimal match */ 783 /* find minimal match */
784 // ash: yet another failure in trying to achieve "we don't die on OOM"
784 tmp1 = xstrdup(matches[0]); 785 tmp1 = xstrdup(matches[0]);
785 for (tmp = tmp1; *tmp; tmp++) 786 for (tmp = tmp1; *tmp; tmp++)
786 for (len_found = 1; len_found < num_matches; len_found++) 787 for (len_found = 1; len_found < num_matches; len_found++)
@@ -807,7 +808,7 @@ static void input_tab(int *lastWasTab)
807 } 808 }
808 len_found = strlen(tmp); 809 len_found = strlen(tmp);
809 /* have space to placed match? */ 810 /* have space to placed match? */
810 if ((len_found - strlen(matchBuf) + command_len) < BUFSIZ) { 811 if ((len_found - strlen(matchBuf) + command_len) < MAX_LINELEN) {
811 /* before word for match */ 812 /* before word for match */
812 command_ps[cursor - recalc_pos] = 0; 813 command_ps[cursor - recalc_pos] = 0;
813 /* save tail line */ 814 /* save tail line */
@@ -888,14 +889,14 @@ static void load_history(const char *fromfile)
888 fp = fopen(fromfile, "r"); 889 fp = fopen(fromfile, "r");
889 if (fp) { 890 if (fp) {
890 for (hi = 0; hi < MAX_HISTORY;) { 891 for (hi = 0; hi < MAX_HISTORY;) {
891 char * hl = xmalloc_getline(fp); 892 char *hl = xmalloc_getline(fp);
892 int l; 893 int l;
893 894
894 if (!hl) 895 if (!hl)
895 break; 896 break;
896 l = strlen(hl); 897 l = strlen(hl);
897 if (l >= BUFSIZ) 898 if (l >= MAX_LINELEN)
898 hl[BUFSIZ-1] = 0; 899 hl[MAX_LINELEN-1] = '\0';
899 if (l == 0 || hl[0] == ' ') { 900 if (l == 0 || hl[0] == ' ') {
900 free(hl); 901 free(hl);
901 continue; 902 continue;
@@ -1264,8 +1265,8 @@ int read_line_input(const char* prompt, char* command, int maxsize, line_input_t
1264#endif 1265#endif
1265 1266
1266// FIXME: audit & improve this 1267// FIXME: audit & improve this
1267 if (maxsize > BUFSIZ) 1268 if (maxsize > MAX_LINELEN)
1268 maxsize = BUFSIZ; 1269 maxsize = MAX_LINELEN;
1269 1270
1270 /* With null flags, no other fields are ever used */ 1271 /* With null flags, no other fields are ever used */
1271 state = st ? st : (line_input_t*) &const_int_0; 1272 state = st ? st : (line_input_t*) &const_int_0;
@@ -1646,14 +1647,14 @@ int read_line_input(const char* prompt, char* command, int maxsize, line_input_t
1646 /* Delete */ 1647 /* Delete */
1647 input_delete(0); 1648 input_delete(0);
1648 break; 1649 break;
1649 case '1': 1650 case '1': // vt100? linux vt? or what?
1650 case 'H': 1651 case '7': // vt100? linux vt? or what?
1651 /* <Home> */ 1652 case 'H': /* xterm's <Home> */
1652 input_backward(cursor); 1653 input_backward(cursor);
1653 break; 1654 break;
1654 case '4': 1655 case '4': // vt100? linux vt? or what?
1655 case 'F': 1656 case '8': // vt100? linux vt? or what?
1656 /* <End> */ 1657 case 'F': /* xterm's <End> */
1657 input_end(); 1658 input_end();
1658 break; 1659 break;
1659 default: 1660 default:
@@ -1766,7 +1767,7 @@ const char *applet_name = "debug stuff usage";
1766 1767
1767int main(int argc, char **argv) 1768int main(int argc, char **argv)
1768{ 1769{
1769 char buff[BUFSIZ]; 1770 char buff[MAX_LINELEN];
1770 char *prompt = 1771 char *prompt =
1771#if ENABLE_FEATURE_EDITING_FANCY_PROMPT 1772#if ENABLE_FEATURE_EDITING_FANCY_PROMPT
1772 "\\[\\033[32;1m\\]\\u@\\[\\x1b[33;1m\\]\\h:" 1773 "\\[\\033[32;1m\\]\\u@\\[\\x1b[33;1m\\]\\h:"