istewart@datlog.co.uk (Ian Stewartson) (01/17/91)
Submitted-by: istewart@datlog.co.uk (Ian Stewartson) Posting-number: Volume 16, Issue 79 Archive-name: ms_sh-1.6/patch02 Patch-To: ms_sh-1.6: Volume 12, Issue 19-26 # this is SH.02 (part 2 of a multipart archive) # do not concatenate these parts, unpack them in order with /bin/sh # file Patch1.6.4 continued # if test ! -r _shar_seq_.tmp; then echo 'Please unpack part 1 first!' exit 1 fi (read Scheck if test "$Scheck" != 2; then echo Please unpack part "$Scheck" next! exit 1 else exit 0 fi ) < _shar_seq_.tmp || exit 1 if test ! -f _shar_wnt_.tmp; then echo 'x - still skipping Patch1.6.4' else echo 'x - continuing file Patch1.6.4' sed 's/^X//' << 'SHAR_EOF' >> 'Patch1.6.4' && X { ! if ((cp = evalstr (*(wp++), DOSUB)) && gmatch (w, cp, FALSE)) X return &t1->left; X } X --- 861,868 ---- X X for (wp = t1->words; *wp != (char *)NULL;) X { ! if ((cp = evalstr (*(wp++), DOSUB)) && ! gmatch (w, cp, FALSE, (char **)NULL, GM_ALL)) X return &t1->left; X } X *************** *** 922,928 **** X { X X /* No entry for the file - if the file exists, execute it as a shell ! * script X */ X case ENOENT: X if ((res = O_for_execute (p_name, ¶ms, &nargc)) >= 0) --- 949,955 ---- X { X X /* No entry for the file - if the file exists, execute it as a shell ! * script. If we never find the file, return the error X */ X case ENOENT: X if ((res = O_for_execute (p_name, ¶ms, &nargc)) >= 0) *************** *** 933,939 **** X X else if (!Check_for_bat_file (p_name)) X { ! em = "not found"; X eloop = FALSE; X break; X } --- 960,966 ---- X X else if (!Check_for_bat_file (p_name)) X { ! errno = ENOENT; X eloop = FALSE; X break; X } *************** *** 953,958 **** --- 980,986 ---- X == (char **)NULL) X { X em = strerror (ENOMEM); + errno = ENOMEM; X break; X } X *************** *** 1017,1022 **** --- 1045,1051 ---- X X em = "no Shell"; X eloop = FALSE; + errno = ENOEXEC; X break; X X case ENOEXEC: *************** *** 1039,1048 **** X } while ((sp != (char *)NULL) && !eloop); X } X ! print_warn ("%s: %s\n", c, em); X ! if (!d_flag) ! exit (-1); X X return -1; X } --- 1068,1082 ---- X } while ((sp != (char *)NULL) && !eloop); X } X ! /* If we found the program - report the error */ X ! if (errno != ENOENT) ! { ! print_warn (EF_msg, c, em); ! ! if (!d_flag) ! exit (-1); ! } X X return -1; X } Index: shell/sh4.c Prereq: 1.9 *** ../sh16.3/shell/sh4.c Fri Aug 17 21:34:51 1990 --- shell/sh4.c Tue Nov 6 19:22:00 1990 *************** *** 13,21 **** X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh4.c 1.9 90/08/16 10:29:27 Ian_Stewartson Exp $ X * X * $Log: sh4.c $ X * Revision 1.9 90/08/16 10:29:27 Ian_Stewartson X * Add support from String length option in ${}. X * Restore the memcpys --- 13,27 ---- X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh4.c 1.11 90/09/11 20:01:23 Ian_Stewartson Exp $ X * X * $Log: sh4.c $ + * Revision 1.11 90/09/11 20:01:23 Ian_Stewartson + * Fix ${#*} functionality to match POSIX + * + * Revision 1.10 90/08/24 21:56:18 Ian_Stewartson + * Add support for POSIX macro commands {x#y} and {x%y} + * X * Revision 1.9 90/08/16 10:29:27 Ian_Stewartson X * Add support from String length option in ${}. X * Restore the memcpys *************** *** 505,511 **** X X *e.linep = 0; X ! /* Scan for =-+? in string */ X X if (*s) X { --- 511,517 ---- X X *e.linep = 0; X ! /* Scan for =-+?%# in string */ X X if (*s) X { *************** *** 514,526 **** X X /* Check for end character other than null (=-+?) */ X ! if (any (*cp, "=-+?")) X { X c = *cp; X ! /* Check for case of :[=-+?]. If found - set flag */ ! ! if (*(cp - 1) == ':') X { X colon_f = TRUE; X *(cp - 1) = 0; --- 520,533 ---- X X /* Check for end character other than null (=-+?) */ X ! if (any (*cp, "=-+?%#")) X { X c = *cp; X ! /* Skip next section in case of % or #. Check for case of :[=-+?]. ! * If found - set flag ! */ ! if ((c != '%') && (c != '#') && (*(cp - 1) == ':')) X { X colon_f = TRUE; X *(cp - 1) = 0; *************** *** 553,564 **** X X if (hash_f) X { ! int slen, n; ! ! for (n = 1, slen = 0; dolv[n] != (char *)NULL; ! slen += (strlen (dolv[n++]) + 1)); ! ! dolp = strsave (putn (slen - 1), areanum); X PUSHIO (aword, dolp, quoted ? qstrchar : strchar); X } X --- 560,566 ---- X X if (hash_f) X { ! dolp = strsave (putn (dolc - 1), areanum); X PUSHIO (aword, dolp, quoted ? qstrchar : strchar); X } X *************** *** 628,638 **** X } X } X ! else if (c == '+') ! dolp = strsave (cp, areanum); X ! /* Check for unset values */ X X if (FL_TEST ('u') && dolp == null) X { X print_error ("sh: unset variable %s\n", s); --- 630,678 ---- X } X } X ! /* String exists - other processing */ X ! else ! { ! char *pos; /* Position for substitute */ ! char *tsp; ! int mode; /* Mode for substitute */ X + switch (c) + { + case '+': + dolp = strsave (cp, areanum); + break; + + case '#': /* Remove prefix */ + case '%': /* Remove suffix */ + mode = GM_SHORTEST; + + if (*cp == c) + { + mode = GM_LONGEST; + ++cp; + } + + if (c == '#') + { + if (gmatch (dolp, cp, FALSE, &pos, mode)) + dolp = strsave (pos, areanum); + } + + else if (gmatch_suffix (dolp, cp, FALSE, &pos, mode)) + { + tsp = strsave (dolp, areanum); + tsp[pos - dolp] = 0; + dolp = tsp; + } + + break; + } + } + + /* Check for unset values */ + X if (FL_TEST ('u') && dolp == null) X { X print_error ("sh: unset variable %s\n", s); *************** *** 964,970 **** X X /* Check for a match */ X ! if (gmatch (dname, gp, TRUE)) X { X X /* If there are no special characters in the new full name, the file must --- 1004,1010 ---- X X /* Check for a match */ X ! if (gmatch (dname, gp, TRUE, (char **)NULL, GM_ALL)) X { X X /* If there are no special characters in the new full name, the file must *************** *** 1191,1197 **** X X *t_drive = (char)(s_drive + 'a' - 1); X ! if ((y_drive == s_drive) && gmatch (t_drive, pattern, TRUE)) X { X *new_pattern = *t_drive; X globname (new_pattern, &new_pattern[2]); --- 1231,1238 ---- X X *t_drive = (char)(s_drive + 'a' - 1); X ! if ((y_drive == s_drive) && ! gmatch (t_drive, pattern, TRUE, (char **)NULL, GM_ALL)) X { X *new_pattern = *t_drive; X globname (new_pattern, &new_pattern[2]); Index: shell/sh8.c Prereq: 1.12 *** ../sh16.3/shell/sh8.c Fri Aug 17 21:35:41 1990 --- shell/sh8.c Tue Nov 6 19:22:21 1990 *************** *** 12,18 **** X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh8.c 1.12 90/08/14 23:31:08 Ian_Stewartson Exp $ X * X * $Log: sh8.c $ X * Revision 1.12 90/08/14 23:31:08 Ian_Stewartson --- 12,18 ---- X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh8.c 1.12 90/08/14 23:31:08 Ian_Stewartson Exp Locker: Ian_Stewartson $ X * X * $Log: sh8.c $ X * Revision 1.12 90/08/14 23:31:08 Ian_Stewartson Index: shell/sh6.c Prereq: 1.14 *** ../sh16.3/shell/sh6.c Fri Aug 17 21:35:10 1990 --- shell/sh6.c Tue Nov 6 19:22:29 1990 *************** *** 13,21 **** X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh6.c 1.14 90/08/14 23:34:49 MS_user Exp $ X * X * $Log: sh6.c $ X * Revision 1.14 90/08/14 23:34:49 MS_user X * Changed for release 1.6.3 X * --- 13,24 ---- X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: D:/SRC/SHELL/RCS/sh6.c 1.15 90/09/11 19:42:15 Ian_Stewartson Exp $ X * X * $Log: sh6.c $ + * Revision 1.15 90/09/11 19:42:15 Ian_Stewartson + * Version 1.6.4 + * X * Revision 1.14 90/08/14 23:34:49 MS_user X * Changed for release 1.6.3 X * *************** *** 73,79 **** X #include <string.h> X #include "sh.h" X ! static char *Copy_Right1 = "MS-DOS SH Version 1.6.3 - %s (DOS %d.%d)\n"; X static char *Copy_Right2 = "Copyright (c) Data Logic Ltd and Charles Forsyth 1990\n"; X char **dolv; /* Parameter array */ X int dolc; /* Number of entries in parameter array */ --- 76,82 ---- X #include <string.h> X #include "sh.h" X ! static char *Copy_Right1 = "MS-DOS SH Version 1.6.4 - %s (DOS %d.%d)\n"; X static char *Copy_Right2 = "Copyright (c) Data Logic Ltd and Charles Forsyth 1990\n"; X char **dolv; /* Parameter array */ X int dolc; /* Number of entries in parameter array */ Index: shell/sh2.c Prereq: 1.6 *** ../sh16.3/shell/sh2.c Fri Aug 17 21:34:11 1990 --- shell/sh2.c Tue Nov 6 19:22:53 1990 *************** *** 13,21 **** X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh2.c 1.6 90/08/14 23:30:26 Ian_Stewartson Exp $ X * X * $Log: sh2.c $ X * Revision 1.6 90/08/14 23:30:26 Ian_Stewartson X * Add support for read/write IO X * --- 13,24 ---- X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh2.c 1.7 90/09/11 20:00:01 Ian_Stewartson Exp $ X * X * $Log: sh2.c $ + * Revision 1.7 90/09/11 20:00:01 Ian_Stewartson + * Add support for $() POSIX functionality + * X * Revision 1.6 90/08/14 23:30:26 Ian_Stewartson X * Add support for read/write IO X * *************** *** 733,744 **** X case 0: X return c; X X case '$': X *e.linep++ = (char)c; X ! if ((c = Getc(0)) == '{') X { ! if ((c = collect (c, '}')) != '\0') X return (c); X X goto pack; --- 736,749 ---- X case 0: X return c; X + /* Allow $name, ${name}, $(command) and support $[arthmetic functions] */ + X case '$': X *e.linep++ = (char)c; X ! if (((c = Getc(0)) == '{') || (c == '(')) X { ! if ((c = collect (c, (c == '{') ? '}' : ')')) != '\0') X return (c); X X goto pack; *************** *** 823,829 **** X return c; X } X ! yylval.cp = strsave (e.cline, areanum); X return WORD; X } X --- 828,857 ---- X return c; X } X ! /* Special processing for $(command) to convert it to `command` */ ! ! if (strncmp (e.cline, "$(", 2) == 0) ! { ! yylval.cp = strsave (e.cline + 1, areanum); ! *yylval.cp = '`'; ! yylval.cp[strlen (yylval.cp) - 1] = '`'; ! } ! ! /* Otherwise, handle words beginning with a ~ */ ! ! else if (*e.cline == '~') ! { ! char *dir = lookup (home, FALSE)->value; ! ! yylval.cp = tree (strlen (e.cline) + strlen (dir)); ! strcat (strcpy (yylval.cp, dir), e.cline + 1); ! } ! ! /* Otherwise, just save it */ ! ! else ! yylval.cp = strsave (e.cline, areanum); ! X return WORD; X } X Index: shell/sh7.c Prereq: 1.18 *** ../sh16.3/shell/sh7.c Fri Aug 17 21:35:57 1990 --- shell/sh7.c Tue Nov 6 19:24:17 1990 *************** *** 15,81 **** X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh7.c 1.18 90/08/14 23:34:55 MS_user Exp $ X * X * $Log: sh7.c $ X * Revision 1.18 90/08/14 23:34:55 MS_user X * Fix directory display on change directory X * Fix spelling mistake. ! * X * Revision 1.17 90/05/31 09:50:05 MS_user X * Implement partial write when swapping to disk ! * X * Revision 1.16 90/04/30 19:50:44 MS_user X * Stop search path if second character of name is colon ! * X * Revision 1.15 90/04/25 22:35:53 MS_user X * Fix bug in doread to stop multi-line reads ! * X * Revision 1.14 90/04/25 09:21:11 MS_user X * Change version message processing ! * X * Revision 1.13 90/04/03 17:59:43 MS_user X * type didnot check for functions before searching PATH ! * X * Revision 1.12 90/03/27 20:33:58 MS_user X * Clear extended file name on interrupt ! * X * Revision 1.11 90/03/26 20:57:38 MS_user X * Change I/O restore so that "exec >filename" works ! * X * Revision 1.10 90/03/14 19:32:05 MS_user X * Change buffered output to be re-entrant and add it to getopt ! * X * Revision 1.9 90/03/14 16:45:52 MS_user X * New Open_buffer parameter ! * X * Revision 1.8 90/03/13 21:19:50 MS_user X * Use the new Buffered Output routines in doecho ! * X * Revision 1.7 90/03/12 20:43:52 MS_user X * Change bell test to check initialisation file ! * X * Revision 1.6 90/03/12 17:09:38 MS_user X * Add a missing cast ! * X * Revision 1.5 90/03/09 16:06:41 MS_user X * Add SH_BELL processing ! * X * Revision 1.4 90/03/06 16:50:10 MS_user X * Add disable history option ! * X * Revision 1.3 90/03/05 13:52:49 MS_user X * Changes to eval and dot functionality X * Fix bug in escape processing in doecho X * Add some array size checks ! * X * Revision 1.2 90/01/30 14:43:34 MS_user X * Add missing author note ! * X * Revision 1.1 90/01/29 17:46:25 MS_user X * Initial revision ! * ! * X */ X X #include <sys/types.h> --- 15,87 ---- X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh7.c 1.20 90/09/19 15:33:07 Ian_Stewartson Exp $ X * X * $Log: sh7.c $ + * Revision 1.20 90/09/19 15:33:07 Ian_Stewartson + * Allow builtin commands to selected/de-selected + * + * Revision 1.19 90/09/11 19:42:59 Ian_Stewartson + * Implement builtin command + * X * Revision 1.18 90/08/14 23:34:55 MS_user X * Fix directory display on change directory X * Fix spelling mistake. ! * X * Revision 1.17 90/05/31 09:50:05 MS_user X * Implement partial write when swapping to disk ! * X * Revision 1.16 90/04/30 19:50:44 MS_user X * Stop search path if second character of name is colon ! * X * Revision 1.15 90/04/25 22:35:53 MS_user X * Fix bug in doread to stop multi-line reads ! * X * Revision 1.14 90/04/25 09:21:11 MS_user X * Change version message processing ! * X * Revision 1.13 90/04/03 17:59:43 MS_user X * type didnot check for functions before searching PATH ! * X * Revision 1.12 90/03/27 20:33:58 MS_user X * Clear extended file name on interrupt ! * X * Revision 1.11 90/03/26 20:57:38 MS_user X * Change I/O restore so that "exec >filename" works ! * X * Revision 1.10 90/03/14 19:32:05 MS_user X * Change buffered output to be re-entrant and add it to getopt ! * X * Revision 1.9 90/03/14 16:45:52 MS_user X * New Open_buffer parameter ! * X * Revision 1.8 90/03/13 21:19:50 MS_user X * Use the new Buffered Output routines in doecho ! * X * Revision 1.7 90/03/12 20:43:52 MS_user X * Change bell test to check initialisation file ! * X * Revision 1.6 90/03/12 17:09:38 MS_user X * Add a missing cast ! * X * Revision 1.5 90/03/09 16:06:41 MS_user X * Add SH_BELL processing ! * X * Revision 1.4 90/03/06 16:50:10 MS_user X * Add disable history option ! * X * Revision 1.3 90/03/05 13:52:49 MS_user X * Changes to eval and dot functionality X * Fix bug in escape processing in doecho X * Add some array size checks ! * X * Revision 1.2 90/01/30 14:43:34 MS_user X * Add missing author note ! * X * Revision 1.1 90/01/29 17:46:25 MS_user X * Initial revision ! * ! * X */ X X #include <sys/types.h> *************** *** 210,215 **** --- 216,222 ---- X static int doread (C_Op *); X static int doeval (C_Op *); X static int dotrap (C_Op *); + static int dobuiltin (C_Op *); X static int getsig (char *); X static int dobreak (C_Op *); X static int docontinue (C_Op *); *************** *** 225,230 **** --- 232,238 ---- X static void setsig (int, int (*)()); X static int rdexp (char **, int, char *); X + static char *not_builtin = "%s: not a builtin\n"; X static char **test_alist; X static struct test_op *test_op; X static jmp_buf test_jmp; *************** *** 1777,1784 **** X char *xp; /* In file name pointers */ X char *xp1; X int n = 1; /* Argument count */ ! int i, fp; X bool found; /* Found flag */ X char *l_path; X Fun_Ops *fops; X --- 1785,1793 ---- X char *xp; /* In file name pointers */ X char *xp1; X int n = 1; /* Argument count */ ! int i, fp; X bool found; /* Found flag */ + bool inb; /* Inbuilt function */ X char *l_path; X Fun_Ops *fops; X *************** *** 1794,1800 **** X X while ((cp = t->words[n++]) != (char *)NULL) X { ! if (inbuilt (cp)) X { X v1_puts (cp); X v1a_puts (" is a shell internal command"); --- 1803,1812 ---- X X while ((cp = t->words[n++]) != (char *)NULL) X { ! ! /* Check for currently use inbuilt version */ ! ! if (inbuilt (cp, &inb) && inb) X { X v1_puts (cp); X v1a_puts (" is a shell internal command"); *************** *** 1825,1831 **** X X if ((xp1 = strrchr (l_path, '/')) == (char *)NULL) X xp1 = l_path; ! X else X ++xp1; X --- 1837,1843 ---- X X if ((xp1 = strrchr (l_path, '/')) == (char *)NULL) X xp1 = l_path; ! X else X ++xp1; X *************** *** 1862,1925 **** X } X } while ((sp != (char *)NULL) && !found); X ! if (!found) ! print_error ("%s not found\n", cp); ! } X X return 0; X } X X /* Table of internal commands */ X X static struct builtin builtin[] = { ! ".", dodot, ! ":", dolabel, ! "[", dotest, ! "break", dobreak, ! "cd", dochdir, ! "continue", docontinue, ! "echo", doecho, ! "eval", doeval, ! "exec", doexec, ! "exit", doexit, ! "export", doexport, ! "getopt", dogetopt, X #ifndef NO_HISTORY ! "history", dohistory, X #endif ! "msdos", domsdos, ! "pwd", dopwd, ! "read", doread, ! "readonly", doreadonly, ! "return", doreturn, ! "set", doset, ! "shift", doshift, ! "swap", doswap, ! "test", dotest, ! "trap", dotrap, ! "type", dotype, ! "umask", doumask, ! "unset", dounset, ! "ver", dover, ! (char *)NULL, X }; X X /* X * Look up a built in command X */ X ! int (*inbuilt (s))() X register char *s; X { X register struct builtin *bp; X X if ((strlen (s) == 2) && isalpha (*s) && (*s != '_') && (*(s + 1) == ':')) X return dodrive; X X for (bp = builtin; bp->command != (char *)NULL; bp++) X { X if (stricmp (bp->command, s) == 0) X return bp->fn; X } X X return (int (*)())NULL; --- 1874,1959 ---- X } X } while ((sp != (char *)NULL) && !found); X ! /* If not found, check for inbuilt version */ X + if (!found) + { + if (inbuilt (cp, &inb)) + { + v1_puts (cp); + v1a_puts (" is a shell internal command"); + } + + else + print_error ("%s not found\n", cp); + } + } + X return 0; X } X X /* Table of internal commands */ X X static struct builtin builtin[] = { ! ".", dodot, (BLT_ALWAYS | BLT_CURRENT), ! ":", dolabel, (BLT_ALWAYS | BLT_CURRENT), ! "[", dotest, BLT_CURRENT, ! "break", dobreak, BLT_CURRENT, ! "builtin", dobuiltin, (BLT_ALWAYS | BLT_CURRENT), ! "cd", dochdir, BLT_CURRENT, ! "continue", docontinue, BLT_CURRENT, ! "echo", doecho, BLT_CURRENT, ! "eval", doeval, BLT_CURRENT, ! "exec", doexec, BLT_CURRENT, ! "exit", doexit, BLT_CURRENT, ! "export", doexport, BLT_CURRENT, ! "getopt", dogetopt, BLT_CURRENT, X #ifndef NO_HISTORY ! "history", dohistory, BLT_CURRENT, X #endif ! "msdos", domsdos, BLT_CURRENT, ! "pwd", dopwd, BLT_CURRENT, ! "read", doread, BLT_CURRENT, ! "readonly", doreadonly, BLT_CURRENT, ! "return", doreturn, BLT_CURRENT, ! "set", doset, BLT_CURRENT, ! "shift", doshift, BLT_CURRENT, ! "swap", doswap, BLT_CURRENT, ! "test", dotest, BLT_CURRENT, ! "trap", dotrap, BLT_CURRENT, ! "type", dotype, BLT_CURRENT, ! "umask", doumask, BLT_CURRENT, ! "unset", dounset, BLT_CURRENT, ! "ver", dover, BLT_CURRENT, ! (char *)NULL, (int (*)())NULL, 0 X }; X X /* X * Look up a built in command X */ X ! int (*inbuilt (s, b))() X register char *s; + bool *b; X { X register struct builtin *bp; X + /* Check for change drive */ + + *b = TRUE; X if ((strlen (s) == 2) && isalpha (*s) && (*s != '_') && (*(s + 1) == ':')) X return dodrive; X + /* Search for command */ + + *b = FALSE; X for (bp = builtin; bp->command != (char *)NULL; bp++) X { X if (stricmp (bp->command, s) == 0) + { + *b = (bp->mode & BLT_CURRENT) ? TRUE : FALSE; X return bp->fn; + } X } X X return (int (*)())NULL; *************** *** 1975,1978 **** --- 2009,2114 ---- X { X if ((c != 0x07) || Ring_Bell ()) X write (STDOUT_FILENO, &c, 1); + } + + /* + * Builtin - either list builtins or execute it + */ + + static int dobuiltin (t) + register C_Op *t; + { + register struct builtin *bp; + int (*shcom)(C_Op *) = (int (*)())NULL; + int rv = 0; + bool mode; + int action; + int i; + + if (t->words[1] == (char *)NULL) + { + for (bp = builtin; bp->command != (char *)NULL; bp++) + v1printf ("builtin %s%s", bp->command, + (bp->mode & BLT_CURRENT) ? " - preferred\n" : "\n"); + } + + /* Check for changing options */ + + else if (*t->words[1] == '-') + { + if (!strcmp (t->words[1], "-s")) + action = 0; + + else if (!strcmp (t->words[1], "-a")) + action = 1; + + else if (!strcmp (t->words[1], "-d")) + action = 2; + + else + { + print_warn ("builtin: invalid flag %s\n", t->words[1]); + return 1; + } + + /* Process the commands */ + + for (i = 2; t->words[i] != (char *)NULL; ++i) + { + for (bp = builtin; bp->command != (char *)NULL; bp++) + { + if (stricmp (bp->command, t->words[i]) == 0) + { + switch (action) + { + case 0: + print_warn ("%s: %s\n", t->words[i], + (bp->mode |= BLT_CURRENT) + ? "builtin" : "external"); + break; + + case 1: + bp->mode |= BLT_CURRENT; + break; + + case 2: + if (bp->mode & BLT_ALWAYS) + print_warn ("%s: always builtin\n", + t->words[i]); + else + bp->mode &= ~BLT_CURRENT; + + break; + } + + break; + } + } + + if (bp->command == (char *)NULL) + { + print_warn (not_builtin, t->words[i]); + rv = 1; + } + } + } + + /* Check to see if we know about the builtin version */ + + else if ((shcom = inbuilt (t->words[1], &mode)) == (int (*)())NULL) + { + print_warn (not_builtin, t->words[i]); + rv = 1; + } + + /* Set up the word list correctly */ + + else + { + t->words++; + rv = (*shcom)(t); + t->words--; + } + + return rv; X } Index: shell/sh10.c Prereq: 1.4 *** ../sh16.3/shell/sh10.c Fri Aug 17 21:32:51 1990 --- shell/sh10.c Tue Nov 6 19:25:21 1990 *************** *** 12,20 **** X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh10.c 1.4 90/08/14 23:33:32 MS_user Exp $ X * X * $Log: sh10.c $ X * Revision 1.4 90/08/14 23:33:32 MS_user X * Fix memory bugs - Add Copy function code to code a function tree X * before it is executed. --- 12,23 ---- X * 2. The sources (or parts thereof) or objects generated from the sources X * (or parts of sources) cannot be sold under any circumstances. X * ! * $Header: C:/SRC/SHELL/RCS/sh10.c 1.5 90/09/11 19:40:46 Ian_Stewartson Exp $ X * X * $Log: sh10.c $ + * Revision 1.5 90/09/11 19:40:46 Ian_Stewartson + * Fix bug in case printing/deletion in functions + * X * Revision 1.4 90/08/14 23:33:32 MS_user X * Fix memory bugs - Add Copy function code to code a function tree X * before it is executed. *************** *** 186,192 **** X case TCASE: /* CASE function */ X Print_IString ("case ", 1); X v1_puts (t->str); ! v1a_puts (" do"); X Print_Case (t->left); X Print_IString (" esac\n", -1); X return; --- 189,195 ---- X case TCASE: /* CASE function */ X Print_IString ("case ", 1); X v1_puts (t->str); ! v1a_puts (" in"); X Print_Case (t->left); X Print_IString (" esac\n", -1); X return; *************** *** 624,629 **** --- 627,633 ---- X if (t->type == TLIST) X { X Set_Free_Case (t->left, func); + (*func)((char *)t->left); X t1 = t->right; X } X *************** *** 638,643 **** --- 642,650 ---- X (*func)((char *)t1->words); X X Set_Free_ExTree (t1->left, func); + + if (t1 == t->right) + (*func)((char *)t->right); X } X X /* SHAR_EOF echo 'File Patch1.6.4 is complete' && chmod 0644 Patch1.6.4 || echo 'restore of Patch1.6.4 failed' Wc_c="`wc -c < 'Patch1.6.4'`" test 63614 -eq "$Wc_c" || echo 'Patch1.6.4: original size 63614, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi rm -f _shar_seq_.tmp echo You have unpacked the last part exit 0 exit 0 # Just in case... -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net.