diff src/emacs.c @ 5763:ec298224882d

(init_cmdargs): Set Vinstallation_directory. (syms_of_emacs): staticpro it.
author Richard M. Stallman <rms@gnu.org>
date Thu, 03 Feb 1994 19:51:07 +0000
parents 1c084b38abc1
children 9d324422db4c
line wrap: on
line diff
--- a/src/emacs.c	Thu Feb 03 19:39:21 1994 +0000
+++ b/src/emacs.c	Thu Feb 03 19:51:07 1994 +0000
@@ -63,6 +63,10 @@
 /* The directory name from which Emacs was invoked.  */
 Lisp_Object Vinvocation_directory;
 
+/* The directory name in which to find subdirs such as lisp and etc.
+   nil means get them only from PATH_LOADSEARCH.  */
+Lisp_Object Vinstallation_directory;
+
 /* Hook run by `kill-emacs' before it does really anything.  */
 Lisp_Object Vkill_emacs_hook;
 
@@ -179,6 +183,7 @@
      int skip_args;
 {
   register int i;
+  Lisp_Object name, dir;
 
   Vinvocation_name = Ffile_name_nondirectory (build_string (argv[0]));
   Vinvocation_directory = Ffile_name_directory (build_string (argv[0]));
@@ -193,6 +198,81 @@
 	Vinvocation_directory = Ffile_name_directory (found);
     }
 
+  Vinstallation_directory = Qnil;
+
+  if (!NILP (Vinvocation_directory))
+    {
+      dir = Vinvocation_directory;
+      name = Fexpand_file_name (Vinvocation_name, dir);
+      while (1)
+	{
+	  Lisp_Object tem, lisp_exists, lib_src_exists;
+	  Lisp_Object etc_exists, info_exists;
+
+	  /* See if dir contains subdirs for use by Emacs.  */
+	  tem = Fexpand_file_name (build_string ("lisp"), dir);
+	  lisp_exists = Ffile_exists_p (tem);
+	  if (!NILP (lisp_exists))
+	    {
+	      tem = Fexpand_file_name (build_string ("lib-src"), dir);
+	      lib_src_exists = Ffile_exists_p (tem);
+	      if (!NILP (lib_src_exists))
+		{
+		  tem = Fexpand_file_name (build_string ("etc"), dir);
+		  etc_exists = Ffile_exists_p (tem);
+		  if (!NILP (etc_exists))
+		    {
+		      tem = Fexpand_file_name (build_string ("info"), dir);
+		      info_exists = Ffile_exists_p (tem);
+		      if (!NILP (info_exists))
+			{
+			  Vinstallation_directory
+			    = Ffile_name_as_directory (dir);
+			  break;
+			}
+		    }
+		}
+	    }
+
+	  /* See if dir's parent contains those subdirs.  */
+	  tem = Fexpand_file_name (build_string ("../lisp"), dir);
+	  lisp_exists = Ffile_exists_p (tem);
+	  if (!NILP (lisp_exists))
+	    {
+	      tem = Fexpand_file_name (build_string ("../lib-src"), dir);
+	      lib_src_exists = Ffile_exists_p (tem);
+	      if (!NILP (lib_src_exists))
+		{
+		  tem = Fexpand_file_name (build_string ("../etc"), dir);
+		  etc_exists = Ffile_exists_p (tem);
+		  if (!NILP (etc_exists))
+		    {
+		      tem = Fexpand_file_name (build_string ("../info"), dir);
+		      info_exists = Ffile_exists_p (tem);
+		      if (!NILP (info_exists))
+			{
+			  tem = Fexpand_file_name (build_string (".."), dir);
+			  Vinstallation_directory
+			    = Ffile_name_as_directory (tem);
+			  break;
+			}
+		    }
+		}
+	    }
+
+	  /* If the Emacs executable is actually a link,
+	     next try the dir that the link points into.  */
+	  tem = Ffile_symlink_p (name);
+	  if (!NILP (tem))
+	    {
+	      name = tem;
+	      dir = Ffile_name_directory (name);
+	    }
+	  else
+	    break;
+	}
+    }
+
   Vcommand_line_args = Qnil;
 
   for (i = argc - 1; i >= 0; i--)
@@ -962,6 +1042,8 @@
 it to change priority.  (Emacs sets its uid back to the real uid.)");
   emacs_priority = 0;
 
+  staticpro (&Vinstallation_directory);
+  Vinstallation_directory = Qnil;
   staticpro (&Vinvocation_name);
   Vinvocation_name = Qnil;
   staticpro (&Vinvocation_directory);