diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-02-12 06:04:06 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-02-12 06:04:06 +0000 |
| commit | 648b44fd785f8d23e363886ff306e8ef70d148ba (patch) | |
| tree | edff6d790ab04e2c5221b34e2a6f65409614e491 /shell | |
| parent | a5f2cd30c9308b3cec359acdf79d60958d6d5834 (diff) | |
| download | busybox-w32-648b44fd785f8d23e363886ff306e8ef70d148ba.tar.gz busybox-w32-648b44fd785f8d23e363886ff306e8ef70d148ba.tar.bz2 busybox-w32-648b44fd785f8d23e363886ff306e8ef70d148ba.zip | |
msh: shrink, mainly by using smallints
function old new delta
synio 251 263 +12
filechar 310 315 +5
subgetc 781 785 +4
brkcontin 106 109 +3
...
yylex 981 976 -5
execute 2513 2508 -5
waitfor 321 315 -6
onintr 103 97 -6
doset 332 326 -6
doexec 186 180 -6
yyparse 65 57 -8
thenpart 135 126 -9
forkexec 1379 1370 -9
onecommand 457 433 -24
newtp 52 28 -24
command 1086 1061 -25
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 7/23 up/down: 27/-163) Total: -136 bytes
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/msh.c | 118 |
1 files changed, 57 insertions, 61 deletions
diff --git a/shell/msh.c b/shell/msh.c index f05028f26..99b03947e 100644 --- a/shell/msh.c +++ b/shell/msh.c | |||
| @@ -158,7 +158,7 @@ int mshdbg_rc = 0; | |||
| 158 | /* | 158 | /* |
| 159 | * library and system definitions | 159 | * library and system definitions |
| 160 | */ | 160 | */ |
| 161 | typedef void xint; /* base type of jmp_buf, for not broken compilers */ | 161 | typedef void xint; /* base type of jmp_buf, for not broken compilers */ |
| 162 | 162 | ||
| 163 | /* | 163 | /* |
| 164 | * shell components | 164 | * shell components |
| @@ -172,20 +172,20 @@ typedef void xint; /* base type of jmp_buf, for not broken compilers */ | |||
| 172 | * redirection | 172 | * redirection |
| 173 | */ | 173 | */ |
| 174 | struct ioword { | 174 | struct ioword { |
| 175 | short io_unit; /* unit affected */ | 175 | short io_unit; /* unit affected */ |
| 176 | short io_flag; /* action (below) */ | 176 | short io_flag; /* action (below) */ |
| 177 | char *io_name; /* file name */ | 177 | char *io_name; /* file name */ |
| 178 | }; | 178 | }; |
| 179 | 179 | ||
| 180 | #define IOREAD 1 /* < */ | 180 | #define IOREAD 1 /* < */ |
| 181 | #define IOHERE 2 /* << (here file) */ | 181 | #define IOHERE 2 /* << (here file) */ |
| 182 | #define IOWRITE 4 /* > */ | 182 | #define IOWRITE 4 /* > */ |
| 183 | #define IOCAT 8 /* >> */ | 183 | #define IOCAT 8 /* >> */ |
| 184 | #define IOXHERE 16 /* ${}, ` in << */ | 184 | #define IOXHERE 16 /* ${}, ` in << */ |
| 185 | #define IODUP 32 /* >&digit */ | 185 | #define IODUP 32 /* >&digit */ |
| 186 | #define IOCLOSE 64 /* >&- */ | 186 | #define IOCLOSE 64 /* >&- */ |
| 187 | 187 | ||
| 188 | #define IODEFAULT (-1) /* token for default IO unit */ | 188 | #define IODEFAULT (-1) /* token for default IO unit */ |
| 189 | 189 | ||
| 190 | 190 | ||
| 191 | /* | 191 | /* |
| @@ -193,12 +193,12 @@ struct ioword { | |||
| 193 | * Might eventually use a union. | 193 | * Might eventually use a union. |
| 194 | */ | 194 | */ |
| 195 | struct op { | 195 | struct op { |
| 196 | int type; /* operation type, see below */ | 196 | smallint type; /* operation type, see Txxxx below */ |
| 197 | char **words; /* arguments to a command */ | 197 | char **words; /* arguments to a command */ |
| 198 | struct ioword **ioact; /* IO actions (eg, < > >>) */ | 198 | struct ioword **ioact; /* IO actions (eg, < > >>) */ |
| 199 | struct op *left; | 199 | struct op *left; |
| 200 | struct op *right; | 200 | struct op *right; |
| 201 | char *str; /* identifier for case and for */ | 201 | char *str; /* identifier for case and for */ |
| 202 | }; | 202 | }; |
| 203 | 203 | ||
| 204 | #define TCOM 1 /* command */ | 204 | #define TCOM 1 /* command */ |
| @@ -269,9 +269,9 @@ struct brkcon { | |||
| 269 | }; | 269 | }; |
| 270 | 270 | ||
| 271 | 271 | ||
| 272 | static int trapset; /* trap pending */ | 272 | static smallint trapset; /* trap pending (signal number) */ |
| 273 | 273 | ||
| 274 | static int yynerrs; /* yacc */ | 274 | static smallint yynerrs; /* yacc (flag) */ |
| 275 | 275 | ||
| 276 | /* moved to G: static char line[LINELIM]; */ | 276 | /* moved to G: static char line[LINELIM]; */ |
| 277 | 277 | ||
| @@ -420,7 +420,7 @@ struct ioarg { | |||
| 420 | char **awordlist; | 420 | char **awordlist; |
| 421 | int afile; /* file descriptor */ | 421 | int afile; /* file descriptor */ |
| 422 | unsigned afid; /* buffer id */ | 422 | unsigned afid; /* buffer id */ |
| 423 | long afpos; /* file position */ | 423 | off_t afpos; /* file position */ |
| 424 | struct iobuf *afbuf; /* buffer for this file */ | 424 | struct iobuf *afbuf; /* buffer for this file */ |
| 425 | }; | 425 | }; |
| 426 | 426 | ||
| @@ -539,7 +539,7 @@ static int xxchar(struct ioarg *ap); | |||
| 539 | 539 | ||
| 540 | struct here { | 540 | struct here { |
| 541 | char *h_tag; | 541 | char *h_tag; |
| 542 | int h_dosub; | 542 | char h_dosub; |
| 543 | struct ioword *h_iop; | 543 | struct ioword *h_iop; |
| 544 | struct here *h_next; | 544 | struct here *h_next; |
| 545 | }; | 545 | }; |
| @@ -600,15 +600,15 @@ static struct op *dowholefile(int, int); | |||
| 600 | static char **dolv; | 600 | static char **dolv; |
| 601 | static int dolc; | 601 | static int dolc; |
| 602 | static int exstat; | 602 | static int exstat; |
| 603 | static char gflg; | 603 | static smallint gflg; /* (seems to be a parse error indicator) */ |
| 604 | static int interactive; /* Is this an interactive shell */ | 604 | static smallint interactive; /* Is this an interactive shell */ |
| 605 | static int execflg; | 605 | static smallint execflg; |
| 606 | static int multiline; /* \n changed to ; */ | 606 | static smallint isbreak; /* "break" statement was seen */ |
| 607 | static struct op *outtree; /* result from parser */ | 607 | static int multiline; /* '\n' changed to ';' (counter) */ |
| 608 | static struct op *outtree; /* result from parser */ | ||
| 608 | static xint *failpt; | 609 | static xint *failpt; |
| 609 | static xint *errpt; | 610 | static xint *errpt; |
| 610 | static struct brkcon *brklist; | 611 | static struct brkcon *brklist; |
| 611 | static int isbreak; | ||
| 612 | static struct wdblock *wdlist; | 612 | static struct wdblock *wdlist; |
| 613 | static struct wdblock *iolist; | 613 | static struct wdblock *iolist; |
| 614 | 614 | ||
| @@ -624,10 +624,10 @@ static struct var *shell; /* shell to interpret command files */ | |||
| 624 | static struct var *ifs; /* field separators */ | 624 | static struct var *ifs; /* field separators */ |
| 625 | 625 | ||
| 626 | static int areanum; /* current allocation area */ | 626 | static int areanum; /* current allocation area */ |
| 627 | static int intr; /* interrupt pending */ | 627 | static smallint intr; /* interrupt pending (bool) */ |
| 628 | static smallint heedint = 1; /* heed interrupt signals (bool) */ | ||
| 628 | static int inparse; | 629 | static int inparse; |
| 629 | static char *null = (char*)""; /* null value for variable */ | 630 | static char *null = (char*)""; /* null value for variable */ |
| 630 | static int heedint = 1; /* heed interrupt signals */ | ||
| 631 | static void (*qflag)(int) = SIG_IGN; | 631 | static void (*qflag)(int) = SIG_IGN; |
| 632 | static int startl; | 632 | static int startl; |
| 633 | static int peeksym; | 633 | static int peeksym; |
| @@ -1560,10 +1560,11 @@ static int gmatch(const char *s, const char *p) | |||
| 1560 | static void yyerror(const char *s) ATTRIBUTE_NORETURN; | 1560 | static void yyerror(const char *s) ATTRIBUTE_NORETURN; |
| 1561 | static void yyerror(const char *s) | 1561 | static void yyerror(const char *s) |
| 1562 | { | 1562 | { |
| 1563 | yynerrs++; | 1563 | yynerrs = 1; |
| 1564 | if (interactive && global_env.iop <= iostack) { | 1564 | if (interactive && global_env.iop <= iostack) { |
| 1565 | multiline = 0; | 1565 | multiline = 0; |
| 1566 | while (eofc() == 0 && yylex(0) != '\n'); | 1566 | while (eofc() == 0 && yylex(0) != '\n') |
| 1567 | continue; | ||
| 1567 | } | 1568 | } |
| 1568 | err(s); | 1569 | err(s); |
| 1569 | fail(); | 1570 | fail(); |
| @@ -1584,7 +1585,7 @@ int yyparse(void) | |||
| 1584 | yynerrs = 0; | 1585 | yynerrs = 0; |
| 1585 | outtree = c_list(); | 1586 | outtree = c_list(); |
| 1586 | musthave('\n', 0); | 1587 | musthave('\n', 0); |
| 1587 | return (yynerrs != 0); | 1588 | return yynerrs; /* 0/1 */ |
| 1588 | } | 1589 | } |
| 1589 | 1590 | ||
| 1590 | static struct op *pipeline(int cf) | 1591 | static struct op *pipeline(int cf) |
| @@ -1819,7 +1820,7 @@ static struct op *command(int cf) | |||
| 1819 | case UNTIL: | 1820 | case UNTIL: |
| 1820 | multiline++; | 1821 | multiline++; |
| 1821 | t = newtp(); | 1822 | t = newtp(); |
| 1822 | t->type = c == WHILE ? TWHILE : TUNTIL; | 1823 | t->type = (c == WHILE ? TWHILE : TUNTIL); |
| 1823 | t->left = c_list(); | 1824 | t->left = c_list(); |
| 1824 | t->right = dogroup(1); | 1825 | t->right = dogroup(1); |
| 1825 | t->words = NULL; | 1826 | t->words = NULL; |
| @@ -1916,7 +1917,7 @@ static struct op *thenpart(void) | |||
| 1916 | return NULL; | 1917 | return NULL; |
| 1917 | } | 1918 | } |
| 1918 | t = newtp(); | 1919 | t = newtp(); |
| 1919 | t->type = 0; | 1920 | /*t->type = 0; - newtp() did this */ |
| 1920 | t->left = c_list(); | 1921 | t->left = c_list(); |
| 1921 | if (t->left == NULL) | 1922 | if (t->left == NULL) |
| 1922 | zzerr(); | 1923 | zzerr(); |
| @@ -2044,8 +2045,7 @@ static struct op *block(int type, struct op *t1, struct op *t2, char **wp) | |||
| 2044 | t->right = t2; | 2045 | t->right = t2; |
| 2045 | t->words = wp; | 2046 | t->words = wp; |
| 2046 | 2047 | ||
| 2047 | DBGPRINTF7(("BLOCK: inserted %p between %p and %p\n", t, t1, | 2048 | DBGPRINTF7(("BLOCK: inserted %p between %p and %p\n", t, t1, t2)); |
| 2048 | t2)); | ||
| 2049 | 2049 | ||
| 2050 | return t; | 2050 | return t; |
| 2051 | } | 2051 | } |
| @@ -2099,12 +2099,7 @@ static struct op *newtp(void) | |||
| 2099 | struct op *t; | 2099 | struct op *t; |
| 2100 | 2100 | ||
| 2101 | t = (struct op *) tree(sizeof(*t)); | 2101 | t = (struct op *) tree(sizeof(*t)); |
| 2102 | t->type = 0; | 2102 | memset(t, 0, sizeof(*t)); |
| 2103 | t->words = NULL; | ||
| 2104 | t->ioact = NULL; | ||
| 2105 | t->left = NULL; | ||
| 2106 | t->right = NULL; | ||
| 2107 | t->str = NULL; | ||
| 2108 | 2103 | ||
| 2109 | DBGPRINTF3(("NEWTP: allocated %p\n", t)); | 2104 | DBGPRINTF3(("NEWTP: allocated %p\n", t)); |
| 2110 | 2105 | ||
| @@ -2481,7 +2476,8 @@ static int execute(struct op *t, int *pin, int *pout, int act) | |||
| 2481 | 2476 | ||
| 2482 | rv = 0; | 2477 | rv = 0; |
| 2483 | a = areanum++; | 2478 | a = areanum++; |
| 2484 | wp = (wp2 = t->words) != NULL | 2479 | wp2 = t->words; |
| 2480 | wp = (wp2 != NULL) | ||
| 2485 | ? eval(wp2, t->type == TCOM ? DOALL : DOALL & ~DOKEY) | 2481 | ? eval(wp2, t->type == TCOM ? DOALL : DOALL & ~DOKEY) |
| 2486 | : NULL; | 2482 | : NULL; |
| 2487 | 2483 | ||
| @@ -2533,7 +2529,7 @@ static int execute(struct op *t, int *pin, int *pout, int act) | |||
| 2533 | 2529 | ||
| 2534 | case TASYNC: | 2530 | case TASYNC: |
| 2535 | { | 2531 | { |
| 2536 | int hinteractive = interactive; | 2532 | smallint hinteractive = interactive; |
| 2537 | 2533 | ||
| 2538 | DBGPRINTF7(("EXECUTE: TASYNC clause, calling vfork()...\n")); | 2534 | DBGPRINTF7(("EXECUTE: TASYNC clause, calling vfork()...\n")); |
| 2539 | 2535 | ||
| @@ -2700,10 +2696,10 @@ static int forkexec(struct op *t, int *pin, int *pout, int act, char **wp) | |||
| 2700 | int *hpin = pin; | 2696 | int *hpin = pin; |
| 2701 | int *hpout = pout; | 2697 | int *hpout = pout; |
| 2702 | char *hwp; | 2698 | char *hwp; |
| 2703 | int hinteractive; | 2699 | smallint hinteractive; |
| 2704 | int hintr; | 2700 | smallint hintr; |
| 2701 | smallint hexecflg; | ||
| 2705 | struct brkcon *hbrklist; | 2702 | struct brkcon *hbrklist; |
| 2706 | int hexecflg; | ||
| 2707 | 2703 | ||
| 2708 | #if __GNUC__ | 2704 | #if __GNUC__ |
| 2709 | /* Avoid longjmp clobbering */ | 2705 | /* Avoid longjmp clobbering */ |
| @@ -2993,7 +2989,7 @@ static int waitfor(int lastpid, int canintr) | |||
| 2993 | { | 2989 | { |
| 2994 | int pid, rv; | 2990 | int pid, rv; |
| 2995 | int s; | 2991 | int s; |
| 2996 | int oheedint = heedint; | 2992 | smallint oheedint = heedint; |
| 2997 | 2993 | ||
| 2998 | heedint = 0; | 2994 | heedint = 0; |
| 2999 | rv = 0; | 2995 | rv = 0; |
| @@ -3521,7 +3517,7 @@ static int brkcontin(char *cp, int val) | |||
| 3521 | err("bad break/continue level"); | 3517 | err("bad break/continue level"); |
| 3522 | return 1; | 3518 | return 1; |
| 3523 | } | 3519 | } |
| 3524 | isbreak = val; | 3520 | isbreak = (val != 0); |
| 3525 | longjmp(bc->brkpt, 1); | 3521 | longjmp(bc->brkpt, 1); |
| 3526 | /* NOTREACHED */ | 3522 | /* NOTREACHED */ |
| 3527 | } | 3523 | } |
| @@ -3699,7 +3695,7 @@ static char **eval(char **ap, int f) | |||
| 3699 | expand(*wf, &wb, f & ~DOGLOB); | 3695 | expand(*wf, &wb, f & ~DOGLOB); |
| 3700 | } | 3696 | } |
| 3701 | } | 3697 | } |
| 3702 | for (wb = addword((char *) 0, wb); *ap; ap++) { | 3698 | for (wb = addword((char *) NULL, wb); *ap; ap++) { |
| 3703 | if (!FLAG['k'] || !isassign(*ap)) | 3699 | if (!FLAG['k'] || !isassign(*ap)) |
| 3704 | expand(*ap, &wb, f & ~DOKEY); | 3700 | expand(*ap, &wb, f & ~DOKEY); |
| 3705 | } | 3701 | } |
| @@ -3935,13 +3931,13 @@ static int dollar(int quoted) | |||
| 3935 | global_env.iop->task = otask; | 3931 | global_env.iop->task = otask; |
| 3936 | if (c != '}') { | 3932 | if (c != '}') { |
| 3937 | err("unclosed ${"); | 3933 | err("unclosed ${"); |
| 3938 | gflg++; | 3934 | gflg = 1; |
| 3939 | return c; | 3935 | return c; |
| 3940 | } | 3936 | } |
| 3941 | } | 3937 | } |
| 3942 | if (global_env.linep >= elinep) { | 3938 | if (global_env.linep >= elinep) { |
| 3943 | err("string in ${} too long"); | 3939 | err("string in ${} too long"); |
| 3944 | gflg++; | 3940 | gflg = 1; |
| 3945 | global_env.linep -= 10; | 3941 | global_env.linep -= 10; |
| 3946 | } | 3942 | } |
| 3947 | *global_env.linep = 0; | 3943 | *global_env.linep = 0; |
| @@ -3971,7 +3967,7 @@ static int dollar(int quoted) | |||
| 3971 | case '=': | 3967 | case '=': |
| 3972 | if (isdigit(*s)) { | 3968 | if (isdigit(*s)) { |
| 3973 | err("cannot use ${...=...} with $n"); | 3969 | err("cannot use ${...=...} with $n"); |
| 3974 | gflg++; | 3970 | gflg = 1; |
| 3975 | break; | 3971 | break; |
| 3976 | } | 3972 | } |
| 3977 | setval(vp, cp); | 3973 | setval(vp, cp); |
| @@ -3988,7 +3984,7 @@ static int dollar(int quoted) | |||
| 3988 | err(s); | 3984 | err(s); |
| 3989 | } else | 3985 | } else |
| 3990 | err(cp); | 3986 | err(cp); |
| 3991 | gflg++; | 3987 | gflg = 1; |
| 3992 | break; | 3988 | break; |
| 3993 | } | 3989 | } |
| 3994 | } else if (c == '+') | 3990 | } else if (c == '+') |
| @@ -3996,7 +3992,7 @@ static int dollar(int quoted) | |||
| 3996 | if (FLAG['u'] && dolp == null) { | 3992 | if (FLAG['u'] && dolp == null) { |
| 3997 | prs("unset variable: "); | 3993 | prs("unset variable: "); |
| 3998 | err(s); | 3994 | err(s); |
| 3999 | gflg++; | 3995 | gflg = 1; |
| 4000 | } | 3996 | } |
| 4001 | global_env.linep = s; | 3997 | global_env.linep = s; |
| 4002 | PUSHIO(aword, dolp, quoted ? qstrchar : strchar); | 3998 | PUSHIO(aword, dolp, quoted ? qstrchar : strchar); |
| @@ -4539,7 +4535,7 @@ static int my_getc(int ec) | |||
| 4539 | if (global_env.linep > elinep) { | 4535 | if (global_env.linep > elinep) { |
| 4540 | while ((c = readc()) != '\n' && c); | 4536 | while ((c = readc()) != '\n' && c); |
| 4541 | err("input line too long"); | 4537 | err("input line too long"); |
| 4542 | gflg++; | 4538 | gflg = 1; |
| 4543 | return c; | 4539 | return c; |
| 4544 | } | 4540 | } |
| 4545 | c = readc(); | 4541 | c = readc(); |
| @@ -4638,7 +4634,7 @@ static void pushio(struct ioarg *argp, int (*fn) (struct ioarg *)) | |||
| 4638 | if (++global_env.iop >= &iostack[NPUSH]) { | 4634 | if (++global_env.iop >= &iostack[NPUSH]) { |
| 4639 | global_env.iop--; | 4635 | global_env.iop--; |
| 4640 | err("Shell input nested too deeply"); | 4636 | err("Shell input nested too deeply"); |
| 4641 | gflg++; | 4637 | gflg = 1; |
| 4642 | return; | 4638 | return; |
| 4643 | } | 4639 | } |
| 4644 | 4640 | ||
| @@ -5012,7 +5008,7 @@ static void markhere(char *s, struct ioword *iop) | |||
| 5012 | *s &= ~QUOTE; | 5008 | *s &= ~QUOTE; |
| 5013 | } | 5009 | } |
| 5014 | } | 5010 | } |
| 5015 | h->h_dosub = iop->io_flag & IOXHERE; | 5011 | h->h_dosub = ((iop->io_flag & IOXHERE) ? '\0' : '\''); |
| 5016 | } | 5012 | } |
| 5017 | 5013 | ||
| 5018 | static void gethere(void) | 5014 | static void gethere(void) |
| @@ -5023,7 +5019,7 @@ static void gethere(void) | |||
| 5023 | 5019 | ||
| 5024 | /* Scan here files first leaving inhere list in place */ | 5020 | /* Scan here files first leaving inhere list in place */ |
| 5025 | for (hp = h = inhere; h != NULL; hp = h, h = h->h_next) | 5021 | for (hp = h = inhere; h != NULL; hp = h, h = h->h_next) |
| 5026 | readhere(&h->h_iop->io_name, h->h_tag, h->h_dosub ? 0 : '\''); | 5022 | readhere(&h->h_iop->io_name, h->h_tag, h->h_dosub /* NUL or ' */); |
| 5027 | 5023 | ||
| 5028 | /* Make inhere list active - keep list intact for scraphere */ | 5024 | /* Make inhere list active - keep list intact for scraphere */ |
| 5029 | if (hp != NULL) { | 5025 | if (hp != NULL) { |
| @@ -5288,7 +5284,7 @@ int msh_main(int argc, char **argv) | |||
| 5288 | break; | 5284 | break; |
| 5289 | 5285 | ||
| 5290 | case 'i': | 5286 | case 'i': |
| 5291 | interactive++; | 5287 | interactive = 1; |
| 5292 | default: | 5288 | default: |
| 5293 | if (*s >= 'a' && *s <= 'z') | 5289 | if (*s >= 'a' && *s <= 'z') |
| 5294 | FLAG[(int) *s]++; | 5290 | FLAG[(int) *s]++; |
| @@ -5324,7 +5320,7 @@ int msh_main(int argc, char **argv) | |||
| 5324 | if (global_env.iop < iostack) { | 5320 | if (global_env.iop < iostack) { |
| 5325 | PUSHIO(afile, 0, iof); | 5321 | PUSHIO(afile, 0, iof); |
| 5326 | if (isatty(0) && isatty(1) && !cflag) { | 5322 | if (isatty(0) && isatty(1) && !cflag) { |
| 5327 | interactive++; | 5323 | interactive = 1; |
| 5328 | #if !ENABLE_FEATURE_SH_EXTRA_QUIET | 5324 | #if !ENABLE_FEATURE_SH_EXTRA_QUIET |
| 5329 | #ifdef MSHDEBUG | 5325 | #ifdef MSHDEBUG |
| 5330 | printf("\n\n%s built-in shell (msh with debug)\n", bb_banner); | 5326 | printf("\n\n%s built-in shell (msh with debug)\n", bb_banner); |
| @@ -5338,7 +5334,7 @@ int msh_main(int argc, char **argv) | |||
| 5338 | 5334 | ||
| 5339 | signal(SIGQUIT, qflag); | 5335 | signal(SIGQUIT, qflag); |
| 5340 | if (name && name[0] == '-') { | 5336 | if (name && name[0] == '-') { |
| 5341 | interactive++; | 5337 | interactive = 1; |
| 5342 | f = open(".profile", O_RDONLY); | 5338 | f = open(".profile", O_RDONLY); |
| 5343 | if (f >= 0) | 5339 | if (f >= 0) |
| 5344 | next(remap(f)); | 5340 | next(remap(f)); |
