aboutsummaryrefslogtreecommitdiff
path: root/shell/msh.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-01-22 07:21:38 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-01-22 07:21:38 +0000
commit8e1c71529c2bf38a04d4a117e625e59044a0785a (patch)
tree2f115293c25e7ee9307f268ec198e2cf486ff070 /shell/msh.c
parent00cdbd8fc20a4e2e2208f90a2691a3806c931b06 (diff)
downloadbusybox-w32-8e1c71529c2bf38a04d4a117e625e59044a0785a.tar.gz
busybox-w32-8e1c71529c2bf38a04d4a117e625e59044a0785a.tar.bz2
busybox-w32-8e1c71529c2bf38a04d4a117e625e59044a0785a.zip
Convert cmdedit into more generic line input facility
(make history and completion optional at runtime). Use it for fdisk, as an example. Some unrelated fixes in fdisk are also here.
Diffstat (limited to 'shell/msh.c')
-rw-r--r--shell/msh.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/shell/msh.c b/shell/msh.c
index c88308f8f..8746e42bc 100644
--- a/shell/msh.c
+++ b/shell/msh.c
@@ -17,7 +17,6 @@
17#include <setjmp.h> 17#include <setjmp.h>
18#include <sys/times.h> 18#include <sys/times.h>
19 19
20#include "cmdedit.h"
21 20
22/*#define MSHDEBUG 1*/ 21/*#define MSHDEBUG 1*/
23 22
@@ -777,7 +776,7 @@ void print_tree(struct op *head)
777#endif /* MSHDEBUG */ 776#endif /* MSHDEBUG */
778 777
779 778
780#ifdef CONFIG_FEATURE_COMMAND_EDITING 779#if ENABLE_FEATURE_COMMAND_EDITING
781static char *current_prompt; 780static char *current_prompt;
782#endif 781#endif
783 782
@@ -787,6 +786,10 @@ static char *current_prompt;
787 */ 786 */
788 787
789 788
789#if ENABLE_FEATURE_COMMAND_EDITING
790static line_input_t *line_input_state;
791#endif
792
790int msh_main(int argc, char **argv) 793int msh_main(int argc, char **argv)
791{ 794{
792 int f; 795 int f;
@@ -795,6 +798,10 @@ int msh_main(int argc, char **argv)
795 char *name, **ap; 798 char *name, **ap;
796 int (*iof) (struct ioarg *); 799 int (*iof) (struct ioarg *);
797 800
801#if ENABLE_FEATURE_COMMAND_EDITING
802 line_input_state = new_line_input_t(FOR_SHELL);
803#endif
804
798 DBGPRINTF(("MSH_MAIN: argc %d, environ %p\n", argc, environ)); 805 DBGPRINTF(("MSH_MAIN: argc %d, environ %p\n", argc, environ));
799 806
800 initarea(); 807 initarea();
@@ -964,7 +971,7 @@ int msh_main(int argc, char **argv)
964 971
965 for (;;) { 972 for (;;) {
966 if (interactive && e.iop <= iostack) { 973 if (interactive && e.iop <= iostack) {
967#ifdef CONFIG_FEATURE_COMMAND_EDITING 974#if ENABLE_FEATURE_COMMAND_EDITING
968 current_prompt = prompt->value; 975 current_prompt = prompt->value;
969#else 976#else
970 prs(prompt->value); 977 prs(prompt->value);
@@ -2371,7 +2378,7 @@ static int yylex(int cf)
2371 startl = 1; 2378 startl = 1;
2372 if (multiline || cf & CONTIN) { 2379 if (multiline || cf & CONTIN) {
2373 if (interactive && e.iop <= iostack) { 2380 if (interactive && e.iop <= iostack) {
2374#ifdef CONFIG_FEATURE_COMMAND_EDITING 2381#if ENABLE_FEATURE_COMMAND_EDITING
2375 current_prompt = cprompt->value; 2382 current_prompt = cprompt->value;
2376#else 2383#else
2377 prs(cprompt->value); 2384 prs(cprompt->value);
@@ -2432,7 +2439,7 @@ static int collect(int c, int c1)
2432 return YYERRCODE; 2439 return YYERRCODE;
2433 } 2440 }
2434 if (interactive && c == '\n' && e.iop <= iostack) { 2441 if (interactive && c == '\n' && e.iop <= iostack) {
2435#ifdef CONFIG_FEATURE_COMMAND_EDITING 2442#if ENABLE_FEATURE_COMMAND_EDITING
2436 current_prompt = cprompt->value; 2443 current_prompt = cprompt->value;
2437#else 2444#else
2438 prs(cprompt->value); 2445 prs(cprompt->value);
@@ -4666,7 +4673,7 @@ static int readc(void)
4666 return e.iop->prev = 0; 4673 return e.iop->prev = 0;
4667 } 4674 }
4668 if (interactive && e.iop == iostack + 1) { 4675 if (interactive && e.iop == iostack + 1) {
4669#ifdef CONFIG_FEATURE_COMMAND_EDITING 4676#if ENABLE_FEATURE_COMMAND_EDITING
4670 current_prompt = prompt->value; 4677 current_prompt = prompt->value;
4671#else 4678#else
4672 prs(prompt->value); 4679 prs(prompt->value);
@@ -4898,13 +4905,13 @@ static int filechar(struct ioarg *ap)
4898 ap->afpos++; 4905 ap->afpos++;
4899 return *bp->bufp++ & 0177; 4906 return *bp->bufp++ & 0177;
4900 } 4907 }
4901#ifdef CONFIG_FEATURE_COMMAND_EDITING 4908#if ENABLE_FEATURE_COMMAND_EDITING
4902 if (interactive && isatty(ap->afile)) { 4909 if (interactive && isatty(ap->afile)) {
4903 static char mycommand[BUFSIZ]; 4910 static char mycommand[BUFSIZ];
4904 static int position = 0, size = 0; 4911 static int position = 0, size = 0;
4905 4912
4906 while (size == 0 || position >= size) { 4913 while (size == 0 || position >= size) {
4907 cmdedit_read_input(current_prompt, mycommand); 4914 read_line_input(current_prompt, mycommand, BUFSIZ, line_input_state);
4908 size = strlen(mycommand); 4915 size = strlen(mycommand);
4909 position = 0; 4916 position = 0;
4910 } 4917 }
@@ -4913,7 +4920,6 @@ static int filechar(struct ioarg *ap)
4913 return c; 4920 return c;
4914 } else 4921 } else
4915#endif 4922#endif
4916
4917 { 4923 {
4918 i = safe_read(ap->afile, &c, sizeof(c)); 4924 i = safe_read(ap->afile, &c, sizeof(c));
4919 return i == sizeof(c) ? (c & 0x7f) : (closef(ap->afile), 0); 4925 return i == sizeof(c) ? (c & 0x7f) : (closef(ap->afile), 0);
@@ -5150,7 +5156,7 @@ static void readhere(char **name, char *s, int ec)
5150 e.iobase = e.iop; 5156 e.iobase = e.iop;
5151 for (;;) { 5157 for (;;) {
5152 if (interactive && e.iop <= iostack) { 5158 if (interactive && e.iop <= iostack) {
5153#ifdef CONFIG_FEATURE_COMMAND_EDITING 5159#if ENABLE_FEATURE_COMMAND_EDITING
5154 current_prompt = cprompt->value; 5160 current_prompt = cprompt->value;
5155#else 5161#else
5156 prs(cprompt->value); 5162 prs(cprompt->value);