]> git.ipfire.org Git - thirdparty/bash.git/blobdiff - builtins/common.c
Imported from ../bash-2.01.tar.gz.
[thirdparty/bash.git] / builtins / common.c
index 2936b88a6a9b19e551fab3594e5f40923b10b8b3..1b8203269c8ba360aca63a6fe0c967a31282bb01 100644 (file)
@@ -23,7 +23,7 @@
 #endif
 
 #include <stdio.h>
-#include <sys/types.h>
+#include "../bashtypes.h"
 #include "../posixstat.h"
 #include <signal.h>
 
@@ -45,9 +45,9 @@
 #include "../input.h"
 #include "../execute_cmd.h"
 #include "../trap.h"
-#include "hashcom.h"
 #include "bashgetopt.h"
 #include "common.h"
+#include "builtext.h"
 #include <tilde/tilde.h>
 
 #if defined (HISTORY)
@@ -59,14 +59,16 @@ extern int indirection_level, startup_state, subshell_environment;
 extern int line_number;
 extern int last_command_exit_value;
 extern int running_trap;
-extern int hashing_enabled;
 extern int variable_context;
 extern int posixly_correct;
 extern char *this_command_name, *shell_name;
 extern COMMAND *global_command;
-extern HASH_TABLE *hashed_filenames;
 extern char *bash_getcwd_errstr;
 
+/* Used by some builtins and the mainline code. */
+Function *last_shell_builtin = (Function *)NULL;
+Function *this_shell_builtin = (Function *)NULL;
+
 /* **************************************************************** */
 /*                                                                 */
 /*          Error reporting, usage, and option processing          */
@@ -317,10 +319,13 @@ set_dollar_vars_changed ()
 /* Read a numeric arg for this_command_name, the name of the shell builtin
    that wants it.  LIST is the word list that the arg is to come from.
    Accept only the numeric argument; report an error if other arguments
-   follow. */
+   follow.  If FATAL is true, call throw_to_top_level, which exits the
+   shell; if not, call jump_to_top_level (DISCARD), which aborts the
+   current command. */
 int
-get_numeric_arg (list)
+get_numeric_arg (list, fatal)
      WORD_LIST *list;
+     int fatal;
 {
   long count = 1;
 
@@ -332,7 +337,10 @@ get_numeric_arg (list)
       if (!arg || (legal_number (arg, &count) == 0))
        {
          builtin_error ("bad non-numeric arg `%s'", list->word->word);
-         throw_to_top_level ();
+         if (fatal)
+           throw_to_top_level ();
+         else
+           jump_to_top_level (DISCARD);
        }
       no_args (list->next);
     }
@@ -360,80 +368,6 @@ read_octal (string)
   return (result);
 }
 
-/* **************************************************************** */
-/*                                                                 */
-/*                     Command name hashing                        */
-/*                                                                 */
-/* **************************************************************** */
-
-/* Return the full pathname that FILENAME hashes to.  If FILENAME
-   is hashed, but (data->flags & HASH_CHKDOT) is non-zero, check
-   ./FILENAME and return that if it is executable. */
-char *
-find_hashed_filename (filename)
-     char *filename;
-{
-  register BUCKET_CONTENTS *item;
-  char *path, *dotted_filename, *tail;
-  int same;
-
-  if (hashing_enabled == 0)
-    return ((char *)NULL);
-
-  item = find_hash_item (filename, hashed_filenames);
-
-  if (item == NULL)
-    return ((char *)NULL);
-
-  /* If this filename is hashed, but `.' comes before it in the path,
-     see if ./filename is executable.  If the hashed value is not an
-     absolute pathname, see if ./`hashed-value' exists. */
-  path = pathdata(item)->path;
-  if (pathdata(item)->flags & (HASH_CHKDOT|HASH_RELPATH))
-    {
-      tail = (pathdata(item)->flags & HASH_RELPATH) ? path : filename;
-      dotted_filename = xmalloc (3 + strlen (tail));
-      dotted_filename[0] = '.'; dotted_filename[1] = '/';
-      strcpy (dotted_filename + 2, tail);
-
-      if (executable_file (dotted_filename))
-       return (dotted_filename);
-
-      free (dotted_filename);
-
-#if 0
-      if (pathdata(item)->flags & HASH_RELPATH)
-       return ((char *)NULL);
-#endif
-
-      /* Watch out.  If this file was hashed to "./filename", and
-        "./filename" is not executable, then return NULL. */
-
-      /* Since we already know "./filename" is not executable, what
-        we're really interested in is whether or not the `path'
-        portion of the hashed filename is equivalent to the current
-        directory, but only if it starts with a `.'.  (This catches
-        ./. and so on.)  same_file () tests general Unix file
-        equivalence -- same device and inode. */
-      if (*path == '.')
-       {
-         same = 0;
-         tail = (char *)strrchr (path, '/');
-
-         if (tail)
-           {
-             *tail = '\0';
-             same = same_file (".", path, (struct stat *)NULL, (struct stat *)NULL);
-             *tail = '/';
-           }
-
-         return same ? (char *)NULL : path;
-       }
-    }
-
-  return (path);
-}
-
 /* **************************************************************** */
 /*                                                                 */
 /*          Manipulating the current working directory             */
@@ -635,7 +569,13 @@ display_signal_list (list, forcecols)
              list = list->next;
              continue;
            }
+#if defined (JOB_CONTROL)
+         /* POSIX.2 says that `kill -l signum' prints the signal name without
+            the `SIG' prefix. */
+         printf ("%s\n", (this_shell_builtin == kill_builtin) ? name + 3 : name);
+#else
          printf ("%s\n", name);
+#endif
        }
       else
        {
@@ -852,6 +792,9 @@ backslash_quote (string)
          *r++ = c;
          break;
        case '#':                               /* comment char */
+#if 0
+       case '~':                               /* tilde expansion */
+#endif
          if (s == string)
            *r++ = '\\';
          /* FALLTHROUGH */