changeset 4484:c589c71324dd

(Vinvocation_directory): New var. (init_cmdargs): Set up its value. (Finvocation_directory): New function. (main): Call init_buffer, init_callproc and init_cmdargs before init_lread. (syms_of_emacs): Install the function, and protect the variable.
author Richard M. Stallman <rms@gnu.org>
date Sun, 08 Aug 1993 06:23:21 +0000
parents 6894dd27c9ec
children 6e6fd9ff650f
files src/emacs.c
diffstat 1 files changed, 29 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/emacs.c	Sun Aug 08 05:17:22 1993 +0000
+++ b/src/emacs.c	Sun Aug 08 06:23:21 1993 +0000
@@ -59,6 +59,9 @@
    names discarded.  */
 Lisp_Object Vinvocation_name;
 
+/* The directory name from which Emacs was invoked.  */
+Lisp_Object Vinvocation_directory;
+
 /* Hook run by `kill-emacs' before it does really anything.  */
 Lisp_Object Vkill_emacs_hook;
 
@@ -159,6 +162,17 @@
   register int i;
 
   Vinvocation_name = Ffile_name_nondirectory (build_string (argv[0]));
+  Vinvocation_directory = Ffile_name_directory (build_string (argv[0]));
+  /* If we got no directory in argv[0], search PATH to find where
+     Emacs actually came from.  */
+  if (NILP (Vinvocation_directory))
+    {
+      Lisp_Object found;
+      int yes = openp (Vexec_path, Vinvocation_name,
+		       "", &found, 1);
+      if (yes)
+	Vinvocation_directory = Ffile_name_directory (found);
+    }
 
   Vcommand_line_args = Qnil;
 
@@ -178,6 +192,14 @@
   return Fcopy_sequence (Vinvocation_name);
 }
 
+DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
+  0, 0, 0,
+  "Return the directory name in which the Emacs executable was located")
+  ()
+{
+  return Fcopy_sequence (Vinvocation_directory);
+}
+
 
 #ifdef VMS
 #ifdef LINK_CRTL_SHARE
@@ -469,10 +491,12 @@
      until calling init_callproc.  */
   set_process_environment ();
 
+  init_buffer ();	/* Init default directory of main buffer */
+
+  init_callproc ();	/* Must precede init_cmdargs and init_sys_modes.  */
+  init_cmdargs (argc, argv, skip_args);	/* Must precede init_lread.  */
   init_lread ();
 
-  init_cmdargs (argc, argv, skip_args);	/* Create list Vcommand_line_args */
-  init_buffer ();	/* Init default directory of main buffer */
   if (!noninteractive)
     {
 #ifdef VMS
@@ -481,7 +505,6 @@
       init_display ();	/* Determine terminal type.  init_sys_modes uses results */
     }
   init_keyboard ();	/* This too must precede init_sys_modes */
-  init_callproc ();	/* And this too. */
 #ifdef VMS
   init_vmsproc ();	/* And this too. */
 #endif /* VMS */
@@ -863,6 +886,7 @@
   defsubr (&Skill_emacs);
 
   defsubr (&Sinvocation_name);
+  defsubr (&Sinvocation_directory);
 
   DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
     "Args passed by shell to Emacs, as a list of strings.");
@@ -890,4 +914,6 @@
 
   staticpro (&Vinvocation_name);
   Vinvocation_name = Qnil;
+  staticpro (&Vinvocation_directory);
+  Vinvocation_directory = Qnil;
 }