diff options
| author | Glenn L McGrath <bug1@ihug.co.nz> | 2002-11-27 09:29:49 +0000 |
|---|---|---|
| committer | Glenn L McGrath <bug1@ihug.co.nz> | 2002-11-27 09:29:49 +0000 |
| commit | 062c74f71035091fcef0b20ff4e8cb77d18124cc (patch) | |
| tree | 1bed61e79f91852c991adac367156ed21aa9d136 | |
| parent | ec87d37305e2fef720503fce62f32ec837428780 (diff) | |
| download | busybox-w32-062c74f71035091fcef0b20ff4e8cb77d18124cc.tar.gz busybox-w32-062c74f71035091fcef0b20ff4e8cb77d18124cc.tar.bz2 busybox-w32-062c74f71035091fcef0b20ff4e8cb77d18124cc.zip | |
last_patch_68 from Vladimir N. Oleynik
| -rw-r--r-- | README | 5 | ||||
| -rw-r--r-- | include/usage.h | 2 | ||||
| -rw-r--r-- | shell/cmdedit.c | 162 | ||||
| -rw-r--r-- | util-linux/config.in | 2 |
4 files changed, 66 insertions, 105 deletions
| @@ -18,9 +18,8 @@ it also makes an excellent environment for any small or embedded system. | |||
| 18 | 18 | ||
| 19 | As of version 0.20 there is now a version number. : ) Also as of version 0.20, | 19 | As of version 0.20 there is now a version number. : ) Also as of version 0.20, |
| 20 | BusyBox is now modularized to easily allow you to build only the components you | 20 | BusyBox is now modularized to easily allow you to build only the components you |
| 21 | need, thereby reducing binary size. To turn off unwanted BusyBox components, | 21 | need, thereby reducing binary size. Run 'make config' or 'make menuconfig' |
| 22 | simply edit the file "Config.h" and comment out the components you do not need | 22 | for select the functionality that you wish to enable. |
| 23 | using C++ style (//) comments. | ||
| 24 | 23 | ||
| 25 | After the build is complete, a busybox.links file is generated. This is | 24 | After the build is complete, a busybox.links file is generated. This is |
| 26 | used by 'make install' to create symlinks to the busybox binary for all | 25 | used by 'make install' to create symlinks to the busybox binary for all |
diff --git a/include/usage.h b/include/usage.h index 568899b6d..c676754e3 100644 --- a/include/usage.h +++ b/include/usage.h | |||
| @@ -530,7 +530,7 @@ | |||
| 530 | "-u Give Start and End in sector (instead of cylinder) units\n" \ | 530 | "-u Give Start and End in sector (instead of cylinder) units\n" \ |
| 531 | "-s PARTITION Give partition size(s) in blocks\n" \ | 531 | "-s PARTITION Give partition size(s) in blocks\n" \ |
| 532 | "-b 2048: (for certain MO disks) use 2048-byte sectors\n" \ | 532 | "-b 2048: (for certain MO disks) use 2048-byte sectors\n" \ |
| 533 | "-v Give fdisk version\n" | 533 | "-v Give fdisk version" |
| 534 | 534 | ||
| 535 | #ifdef CONFIG_FEATURE_FIND_TYPE | 535 | #ifdef CONFIG_FEATURE_FIND_TYPE |
| 536 | #define USAGE_FIND_TYPE(a) a | 536 | #define USAGE_FIND_TYPE(a) a |
diff --git a/shell/cmdedit.c b/shell/cmdedit.c index eee32131a..b6e743eb4 100644 --- a/shell/cmdedit.c +++ b/shell/cmdedit.c | |||
| @@ -89,22 +89,17 @@ | |||
| 89 | #endif /* advanced FEATURES */ | 89 | #endif /* advanced FEATURES */ |
| 90 | 90 | ||
| 91 | 91 | ||
| 92 | |||
| 93 | struct history { | ||
| 94 | char *s; | ||
| 95 | struct history *p; | ||
| 96 | struct history *n; | ||
| 97 | }; | ||
| 98 | |||
| 99 | /* Maximum length of the linked list for the command line history */ | 92 | /* Maximum length of the linked list for the command line history */ |
| 100 | static const int MAX_HISTORY = 15; | 93 | #define MAX_HISTORY 15 |
| 101 | 94 | #if MAX_HISTORY < 1 | |
| 102 | /* First element in command line list */ | 95 | #warning cmdedit: You set MAX_HISTORY < 1. The history algorithm switched off. |
| 103 | static struct history *his_front = NULL; | 96 | #else |
| 104 | 97 | static char *history[MAX_HISTORY+1]; /* history + current */ | |
| 105 | /* Last element in command line list */ | 98 | /* saved history lines */ |
| 106 | static struct history *his_end = NULL; | 99 | static int n_history; |
| 107 | 100 | /* current pointer to history line */ | |
| 101 | static int cur_history; | ||
| 102 | #endif | ||
| 108 | 103 | ||
| 109 | #include <termios.h> | 104 | #include <termios.h> |
| 110 | #define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp) | 105 | #define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp) |
| @@ -116,7 +111,6 @@ static struct termios initial_settings, new_settings; | |||
| 116 | 111 | ||
| 117 | static | 112 | static |
| 118 | volatile int cmdedit_termw = 80; /* actual terminal width */ | 113 | volatile int cmdedit_termw = 80; /* actual terminal width */ |
| 119 | static int history_counter = 0; /* Number of commands in history list */ | ||
| 120 | static | 114 | static |
| 121 | volatile int handlers_sets = 0; /* Set next bites: */ | 115 | volatile int handlers_sets = 0; /* Set next bites: */ |
| 122 | 116 | ||
| @@ -148,7 +142,7 @@ static int my_euid; | |||
| 148 | #endif | 142 | #endif |
| 149 | 143 | ||
| 150 | #ifdef CONFIG_FEATURE_SH_FANCY_PROMPT | 144 | #ifdef CONFIG_FEATURE_SH_FANCY_PROMPT |
| 151 | static char *hostname_buf = ""; | 145 | static char *hostname_buf; |
| 152 | static int num_ok_lines = 1; | 146 | static int num_ok_lines = 1; |
| 153 | #endif | 147 | #endif |
| 154 | 148 | ||
| @@ -207,19 +201,6 @@ static void cmdedit_reset_term(void) | |||
| 207 | handlers_sets &= ~SET_WCHG_HANDLERS; | 201 | handlers_sets &= ~SET_WCHG_HANDLERS; |
| 208 | } | 202 | } |
| 209 | fflush(stdout); | 203 | fflush(stdout); |
| 210 | #if 0 | ||
| 211 | //#ifdef CONFIG_FEATURE_CLEAN_UP | ||
| 212 | if (his_front) { | ||
| 213 | struct history *n; | ||
| 214 | |||
| 215 | while (his_front != his_end) { | ||
| 216 | n = his_front->n; | ||
| 217 | free(his_front->s); | ||
| 218 | free(his_front); | ||
| 219 | his_front = n; | ||
| 220 | } | ||
| 221 | } | ||
| 222 | #endif | ||
| 223 | } | 204 | } |
| 224 | 205 | ||
| 225 | 206 | ||
| @@ -368,7 +349,7 @@ static void parse_prompt(const char *prmt_ptr) | |||
| 368 | #endif | 349 | #endif |
| 369 | case 'h': | 350 | case 'h': |
| 370 | pbuf = hostname_buf; | 351 | pbuf = hostname_buf; |
| 371 | if (*pbuf == 0) { | 352 | if (pbuf == 0) { |
| 372 | pbuf = xcalloc(256, 1); | 353 | pbuf = xcalloc(256, 1); |
| 373 | if (gethostname(pbuf, 255) < 0) { | 354 | if (gethostname(pbuf, 255) < 0) { |
| 374 | strcpy(pbuf, "?"); | 355 | strcpy(pbuf, "?"); |
| @@ -1122,18 +1103,29 @@ static void input_tab(int *lastWasTab) | |||
| 1122 | } | 1103 | } |
| 1123 | #endif /* CONFIG_FEATURE_COMMAND_TAB_COMPLETION */ | 1104 | #endif /* CONFIG_FEATURE_COMMAND_TAB_COMPLETION */ |
| 1124 | 1105 | ||
| 1125 | static void get_previous_history(struct history **hp, struct history *p) | 1106 | #if MAX_HISTORY >= 1 |
| 1107 | static void get_previous_history(void) | ||
| 1126 | { | 1108 | { |
| 1127 | if ((*hp)->s) | 1109 | if(command_ps[0] != 0 || history[cur_history] == 0) { |
| 1128 | free((*hp)->s); | 1110 | free(history[cur_history]); |
| 1129 | (*hp)->s = xstrdup(command_ps); | 1111 | history[cur_history] = xstrdup(command_ps); |
| 1130 | *hp = p; | 1112 | } |
| 1113 | cur_history--; | ||
| 1131 | } | 1114 | } |
| 1132 | 1115 | ||
| 1133 | static inline void get_next_history(struct history **hp) | 1116 | static int get_next_history(void) |
| 1134 | { | 1117 | { |
| 1135 | get_previous_history(hp, (*hp)->n); | 1118 | int ch = cur_history; |
| 1119 | |||
| 1120 | if (ch < n_history) { | ||
| 1121 | get_previous_history(); /* save the current history line */ | ||
| 1122 | return (cur_history = ch+1); | ||
| 1123 | } else { | ||
| 1124 | beep(); | ||
| 1125 | return 0; | ||
| 1126 | } | ||
| 1136 | } | 1127 | } |
| 1128 | #endif | ||
| 1137 | 1129 | ||
| 1138 | enum { | 1130 | enum { |
| 1139 | ESC = 27, | 1131 | ESC = 27, |
| @@ -1165,7 +1157,6 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ]) | |||
| 1165 | int break_out = 0; | 1157 | int break_out = 0; |
| 1166 | int lastWasTab = FALSE; | 1158 | int lastWasTab = FALSE; |
| 1167 | unsigned char c = 0; | 1159 | unsigned char c = 0; |
| 1168 | struct history *hp = his_end; | ||
| 1169 | 1160 | ||
| 1170 | /* prepare before init handlers */ | 1161 | /* prepare before init handlers */ |
| 1171 | cmdedit_y = 0; /* quasireal y, not true work if line > xt*yt */ | 1162 | cmdedit_y = 0; /* quasireal y, not true work if line > xt*yt */ |
| @@ -1271,31 +1262,26 @@ prepare_to_die: | |||
| 1271 | printf("\033[J"); | 1262 | printf("\033[J"); |
| 1272 | break; | 1263 | break; |
| 1273 | case 12: | 1264 | case 12: |
| 1274 | { | ||
| 1275 | /* Control-l -- clear screen */ | 1265 | /* Control-l -- clear screen */ |
| 1276 | int old_cursor = cursor; | ||
| 1277 | printf("\033[H"); | 1266 | printf("\033[H"); |
| 1278 | redraw(0, len-old_cursor); | 1267 | redraw(0, len-cursor); |
| 1279 | } | ||
| 1280 | break; | 1268 | break; |
| 1269 | #if MAX_HISTORY >= 1 | ||
| 1281 | case 14: | 1270 | case 14: |
| 1282 | /* Control-n -- Get next command in history */ | 1271 | /* Control-n -- Get next command in history */ |
| 1283 | if (hp && hp->n && hp->n->s) { | 1272 | if (get_next_history()) |
| 1284 | get_next_history(&hp); | ||
| 1285 | goto rewrite_line; | 1273 | goto rewrite_line; |
| 1286 | } else { | ||
| 1287 | beep(); | ||
| 1288 | } | ||
| 1289 | break; | 1274 | break; |
| 1290 | case 16: | 1275 | case 16: |
| 1291 | /* Control-p -- Get previous command from history */ | 1276 | /* Control-p -- Get previous command from history */ |
| 1292 | if (hp && hp->p) { | 1277 | if (cur_history > 0) { |
| 1293 | get_previous_history(&hp, hp->p); | 1278 | get_previous_history(); |
| 1294 | goto rewrite_line; | 1279 | goto rewrite_line; |
| 1295 | } else { | 1280 | } else { |
| 1296 | beep(); | 1281 | beep(); |
| 1297 | } | 1282 | } |
| 1298 | break; | 1283 | break; |
| 1284 | #endif | ||
| 1299 | case 21: | 1285 | case 21: |
| 1300 | /* Control-U -- Clear line before cursor */ | 1286 | /* Control-U -- Clear line before cursor */ |
| 1301 | if (cursor) { | 1287 | if (cursor) { |
| @@ -1319,10 +1305,11 @@ prepare_to_die: | |||
| 1319 | input_tab(&lastWasTab); | 1305 | input_tab(&lastWasTab); |
| 1320 | break; | 1306 | break; |
| 1321 | #endif | 1307 | #endif |
| 1308 | #if MAX_HISTORY >= 1 | ||
| 1322 | case 'A': | 1309 | case 'A': |
| 1323 | /* Up Arrow -- Get previous command from history */ | 1310 | /* Up Arrow -- Get previous command from history */ |
| 1324 | if (hp && hp->p) { | 1311 | if (cur_history > 0) { |
| 1325 | get_previous_history(&hp, hp->p); | 1312 | get_previous_history(); |
| 1326 | goto rewrite_line; | 1313 | goto rewrite_line; |
| 1327 | } else { | 1314 | } else { |
| 1328 | beep(); | 1315 | beep(); |
| @@ -1330,21 +1317,16 @@ prepare_to_die: | |||
| 1330 | break; | 1317 | break; |
| 1331 | case 'B': | 1318 | case 'B': |
| 1332 | /* Down Arrow -- Get next command in history */ | 1319 | /* Down Arrow -- Get next command in history */ |
| 1333 | if (hp && hp->n && hp->n->s) { | 1320 | if (!get_next_history()) |
| 1334 | get_next_history(&hp); | ||
| 1335 | goto rewrite_line; | ||
| 1336 | } else { | ||
| 1337 | beep(); | ||
| 1338 | } | ||
| 1339 | break; | 1321 | break; |
| 1340 | |||
| 1341 | /* Rewrite the line with the selected history item */ | 1322 | /* Rewrite the line with the selected history item */ |
| 1342 | rewrite_line: | 1323 | rewrite_line: |
| 1343 | /* change command */ | 1324 | /* change command */ |
| 1344 | len = strlen(strcpy(command, hp->s)); | 1325 | len = strlen(strcpy(command, history[cur_history])); |
| 1345 | /* redraw and go to end line */ | 1326 | /* redraw and go to end line */ |
| 1346 | redraw(cmdedit_y, 0); | 1327 | redraw(cmdedit_y, 0); |
| 1347 | break; | 1328 | break; |
| 1329 | #endif | ||
| 1348 | case 'C': | 1330 | case 'C': |
| 1349 | /* Right Arrow -- Move forward one character */ | 1331 | /* Right Arrow -- Move forward one character */ |
| 1350 | input_forward(); | 1332 | input_forward(); |
| @@ -1428,53 +1410,33 @@ prepare_to_die: | |||
| 1428 | setTermSettings(0, (void *) &initial_settings); | 1410 | setTermSettings(0, (void *) &initial_settings); |
| 1429 | handlers_sets &= ~SET_RESET_TERM; | 1411 | handlers_sets &= ~SET_RESET_TERM; |
| 1430 | 1412 | ||
| 1413 | #if MAX_HISTORY >= 1 | ||
| 1431 | /* Handle command history log */ | 1414 | /* Handle command history log */ |
| 1415 | /* cleanup may be saved current command line */ | ||
| 1416 | free(history[MAX_HISTORY]); | ||
| 1417 | history[MAX_HISTORY] = 0; | ||
| 1432 | if (len) { /* no put empty line */ | 1418 | if (len) { /* no put empty line */ |
| 1433 | 1419 | int i = n_history; | |
| 1434 | struct history *h = his_end; | ||
| 1435 | char *ss; | ||
| 1436 | |||
| 1437 | ss = xstrdup(command); /* duplicate */ | ||
| 1438 | |||
| 1439 | if (h == 0) { | ||
| 1440 | /* No previous history -- this memory is never freed */ | ||
| 1441 | h = his_front = xmalloc(sizeof(struct history)); | ||
| 1442 | h->n = xmalloc(sizeof(struct history)); | ||
| 1443 | |||
| 1444 | h->p = NULL; | ||
| 1445 | h->s = ss; | ||
| 1446 | h->n->p = h; | ||
| 1447 | h->n->n = NULL; | ||
| 1448 | h->n->s = NULL; | ||
| 1449 | his_end = h->n; | ||
| 1450 | history_counter++; | ||
| 1451 | } else { | ||
| 1452 | /* Add a new history command -- this memory is never freed */ | ||
| 1453 | h->n = xmalloc(sizeof(struct history)); | ||
| 1454 | |||
| 1455 | h->n->p = h; | ||
| 1456 | h->n->n = NULL; | ||
| 1457 | h->n->s = NULL; | ||
| 1458 | h->s = ss; | ||
| 1459 | his_end = h->n; | ||
| 1460 | |||
| 1461 | /* After max history, remove the oldest command */ | 1420 | /* After max history, remove the oldest command */ |
| 1462 | if (history_counter >= MAX_HISTORY) { | 1421 | if (i >= MAX_HISTORY) { |
| 1463 | 1422 | free(history[0]); | |
| 1464 | struct history *p = his_front->n; | 1423 | for(i = 0; i < (MAX_HISTORY-1); i++) |
| 1465 | 1424 | history[i] = history[i+1]; | |
| 1466 | p->p = NULL; | ||
| 1467 | free(his_front->s); | ||
| 1468 | free(his_front); | ||
| 1469 | his_front = p; | ||
| 1470 | } else { | ||
| 1471 | history_counter++; | ||
| 1472 | } | ||
| 1473 | } | 1425 | } |
| 1426 | history[i++] = xstrdup(command); | ||
| 1427 | cur_history = i; | ||
| 1428 | n_history = i; | ||
| 1474 | #if defined(CONFIG_FEATURE_SH_FANCY_PROMPT) | 1429 | #if defined(CONFIG_FEATURE_SH_FANCY_PROMPT) |
| 1475 | num_ok_lines++; | 1430 | num_ok_lines++; |
| 1476 | #endif | 1431 | #endif |
| 1477 | } | 1432 | } |
| 1433 | #else /* MAX_HISTORY < 1 */ | ||
| 1434 | #if defined(CONFIG_FEATURE_SH_FANCY_PROMPT) | ||
| 1435 | if (len) { /* no put empty line */ | ||
| 1436 | num_ok_lines++; | ||
| 1437 | } | ||
| 1438 | #endif | ||
| 1439 | #endif /* MAX_HISTORY >= 1 */ | ||
| 1478 | if(break_out>0) { | 1440 | if(break_out>0) { |
| 1479 | command[len++] = '\n'; /* set '\n' */ | 1441 | command[len++] = '\n'; /* set '\n' */ |
| 1480 | command[len] = 0; | 1442 | command[len] = 0; |
diff --git a/util-linux/config.in b/util-linux/config.in index e6d46639c..eee050a05 100644 --- a/util-linux/config.in +++ b/util-linux/config.in | |||
| @@ -20,7 +20,7 @@ if [ "$CONFIG_FDISK" = "y" ]; then | |||
| 20 | bool ' Support SGI disklabels' CONFIG_FEATURE_SGI_LABEL | 20 | bool ' Support SGI disklabels' CONFIG_FEATURE_SGI_LABEL |
| 21 | bool ' Support SUN disklabels' CONFIG_FEATURE_SUN_LABEL | 21 | bool ' Support SUN disklabels' CONFIG_FEATURE_SUN_LABEL |
| 22 | bool ' Support BSD disklabels' CONFIG_FEATURE_OSF_LABEL | 22 | bool ' Support BSD disklabels' CONFIG_FEATURE_OSF_LABEL |
| 23 | bool ' Support expext mode' CONFIG_FEATURE_FDISK_ADVANCED | 23 | bool ' Support expert mode' CONFIG_FEATURE_FDISK_ADVANCED |
| 24 | fi | 24 | fi |
| 25 | bool 'freeramdisk' CONFIG_FREERAMDISK | 25 | bool 'freeramdisk' CONFIG_FREERAMDISK |
| 26 | bool 'fsck_minix' CONFIG_FSCK_MINIX | 26 | bool 'fsck_minix' CONFIG_FSCK_MINIX |
