Initial check-in: changes for building Emacs under Mac OS.
[bpt/emacs.git] / src / emacs.c
index 162fa8d..92f7020 100644 (file)
@@ -64,9 +64,18 @@ Boston, MA 02111-1307, USA.  */
 #define O_RDWR 2
 #endif
 
-extern void malloc_warning ();
-extern void set_time_zone_rule ();
-extern char *index ();
+#ifdef HAVE_SETPGID
+#if !defined (USG) || defined (BSD_PGRPS)
+#undef setpgrp
+#define setpgrp setpgid
+#endif
+#endif
+
+extern void malloc_warning P_ ((char *));
+extern void set_time_zone_rule P_ ((char *));
+#ifdef HAVE_INDEX
+extern char *index P_ ((const char *, int));
+#endif
 
 /* Make these values available in GDB, which doesn't see macros.  */
 
@@ -200,6 +209,79 @@ int initial_argc;
 
 static void sort_args ();
 void syms_of_emacs ();
+
+#define USAGE1 "\
+Usage: %s [OPTION-OR-FILENAME]...\n\
+\n\
+Run Emacs, the extensible, customizable, self-documenting real-time\n\
+display editor.  The recommended way to start Emacs for normal editing\n\
+is with no options at all.\n\
+\n\
+Run M-x info RET m emacs RET m command arguments RET inside Emacs to\n\
+read the main documentation for these command-line arguments.\n\
+\n\
+Initialization options:\n\
+\n\
+--batch                        do not do interactive display; implies -q\n\
+--debug-init           enable Emacs Lisp debugger during init file\n\
+--help                 display this help message and exit\n\
+--multibyte, --no-unibyte   run Emacs in multibyte mode\n\
+--no-init-file, -q         load neither ~/.emacs nor default.el\n\
+--no-shared-memory, -nl            do not use shared memory\n\
+--no-site-file             do not load site-start.el\n\
+--no-windows, -nw          don't communicate with X, ignoring $DISPLAY\n\
+--terminal, -t DEVICE      use DEVICE for terminal I/O\n\
+--unibyte, --no-multibyte   run Emacs in unibyte mode\n\
+--user, -u USER                load ~USER/.emacs instead of your own\n\
+--version              display version information and exit\n\
+\n\
+Action options:\n\
+\n\
+FILE                   visit FILE using find-file\n\
++LINENUM FILE          visit FILE using find-file, then go to line LINENUM\n\
+--directory, -L DIR    add DIR to variable load-path\n\
+--eval EXPR            evaluate Emacs Lisp expression EXPR\n\
+--execute EXPR         evaluate Emacs Lisp expression EXPR\n\
+--find-file FILE       visit FILE\n\
+--funcall, -f FUNC     call Emacs function FUNC with no arguments\n\
+--insert FILE          insert contents of FILE into current buffer\n\
+--kill                 exit without asking for confirmation\n\
+--load, -l FILE                load FILE of Emacs Lisp code using the load function\n\
+--visit FILE           visit FILE\n\
+\n"
+
+#define USAGE2 "\
+Display options:\n\
+\n\
+--background-color, -bg COLOR  window background color\n\
+--border-color, -bd COLOR      main border color\n\
+--border-width, -bw WIDTH      width of main border\n\
+--cursor-color, -cr COLOR      color of the Emacs cursor indicating point\n\
+--display, -d DISPLAY          use X server DISPLAY\n\
+--font, -fn FONT               default font; must be fixed-widthp\n\
+--foreground-color, -fg COLOR  window foreground color\n\
+--geometry, -g GEOMETRY                window geometry\n\
+--iconic                       start Emacs in iconified state\n\
+--icon-type, -i                        use picture of gnu for Emacs icon\n\
+--internal-border, -ib WIDTH   width between text and main border\n\
+--line-spacing, -lsp PIXELS    additional space to put between lines\n\
+--mouse-color, -ms COLOR       mouse cursor color in Emacs window\n\
+--name NAME                    title of main Emacs window\n\
+--reverse-video, -r, -rv       switch foreground and background\n\
+--title, -T, -wn, TITLE                title for Emacs windows\n\
+--vertical-scroll-bars, -vb    enable vertical scroll bars\n\
+--xrm XRESOURCES               set additional X resources\n\
+\n\
+You can generally also specify long option names with a single -; for\n\
+example, -batch as well as --batch.  You can use any unambiguous\n\
+abbreviation for a --option.\n\
+\n\
+Various environment variables and window system resources also affect\n\
+Emacs' operation.  See the main documentation.\n\
+\n\
+Report bugs to bug-gnu-emacs@gnu.org.  First, please see the Bugs\n\
+section of the Emacs manual or the file BUGS.\n"
+
 \f
 /* Signal code for the fatal signal that was received */
 int fatal_error_code;
@@ -214,11 +296,9 @@ handle_USR1_signal (sig)
 {
   struct input_event buf;
 
-  buf.kind = user_signal;
-  buf.code = 0;
+  bzero (&buf, sizeof buf);
+  buf.kind = USER_SIGNAL_EVENT;
   buf.frame_or_window = selected_frame;
-  buf.modifiers = 0;
-  buf.timestamp = 0;
 
   kbd_buffer_store_event (&buf);
 }
@@ -231,17 +311,16 @@ handle_USR2_signal (sig)
 {
   struct input_event buf;
 
-  buf.kind = user_signal;
+  bzero (&buf, sizeof buf);
+  buf.kind = USER_SIGNAL_EVENT;
   buf.code = 1;
   buf.frame_or_window = selected_frame;
-  buf.modifiers = 0;
-  buf.timestamp = 0;
 
   kbd_buffer_store_event (&buf);
 }
 #endif /* SIGUSR2 */
 
-/* Handle bus errors, illegal instruction, etc. */
+/* Handle bus errors, invalid instruction, etc. */
 SIGTYPE
 fatal_error_signal (sig)
      int sig;
@@ -525,7 +604,7 @@ argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr)
      char **valptr;
      int *skipptr;
 {
-  char *p;
+  char *p = NULL;
   int arglen;
   char *arg;
 
@@ -583,7 +662,9 @@ argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr)
 static void
 malloc_initialize_hook ()
 {
+#ifndef USE_CRT_DLL
   extern char **environ;
+#endif
 
   if (initialized)
     {
@@ -622,16 +703,26 @@ main (argc, argv, envp)
      char **argv;
      char **envp;
 {
+#if GC_MARK_STACK
+  Lisp_Object dummy;
+#endif
   char stack_bottom_variable;
   int do_initial_setlocale;
   int skip_args = 0;
+#ifndef USE_CRT_DLL
   extern int errno;
   extern int sys_nerr;
+#endif
 #ifdef HAVE_SETRLIMIT
   struct rlimit rlim;
 #endif
   int no_loadup = 0;
 
+#if GC_MARK_STACK
+  extern Lisp_Object *stack_base;
+  stack_base = &dummy;
+#endif
+
 #ifdef LINUX_SBRK_BUG
   __sbrk (1);
 #endif
@@ -869,16 +960,8 @@ main (argc, argv, envp)
   /* Handle the --help option, which gives a usage message..  */
   if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
     {
-      printf ("\
-Usage: %s [--batch]  [-t term] [--terminal term]\n\
-      [-d display] [--display display]  [-nw] [--no-windows]\n\
-      [-q] [--no-init-file]  [-u user] [--user user]  [--debug-init]\n\
-      [--unibyte] [--multibyte] [--version] [--no-site-file]\n\
-      [-f func] [--funcall func]  [-l file] [--load file]  [--eval expr]\n\
-      [--execute expr] [--visit file] [--file file] [--insert file]\n\
-      [+linenum] file-to-visit  [--kill]\n\
-Report bugs to bug-gnu-emacs@gnu.org.  First, please see\n\
-the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
+      printf (USAGE1, argv[0]);
+      printf (USAGE2);
       exit (0);
     }
 
@@ -1020,8 +1103,30 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
         function creates Vterminal_frame.  Termcap frames now use
         faces, and the face implementation uses some symbols as
         face names.  */
-#ifndef HAVE_NTGUI
       syms_of_xfaces ();
+      /* Call syms_of_keyboard before init_window_once because
+        keyboard sets up symbols that include some face names that
+        the X support will want to use.  This can happen when
+        CANNOT_DUMP is defined.  */
+      syms_of_keyboard ();
+
+#ifdef macintosh
+      /* init_window_once calls make_terminal_frame which on Mac OS creates
+         a full-fledge output_mac type frame.  This does not work correctly
+         before syms_of_textprop, syms_of_macfns, syms_of_ccl,
+         syms_of_fontset, syms_of_xterm, syms_of_search, x_term_init, and
+         init_keyboard have already been called.  */
+      syms_of_textprop ();
+      syms_of_macfns ();
+      syms_of_ccl ();
+      syms_of_fontset ();
+      syms_of_macterm ();
+      syms_of_macmenu ();
+      syms_of_data ();
+      syms_of_search ();
+      
+      x_term_init ();
+      init_keyboard ();
 #endif
 
       init_window_once ();     /* Init the window system */
@@ -1038,7 +1143,6 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
     }
 
   init_eval ();
-  init_coding ();
   init_data ();
 #ifdef CLASH_DETECTION
   init_filelock ();;
@@ -1109,7 +1213,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
     }
 
   no_loadup
-    = !argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
+    = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
 
 
 #ifdef HAVE_X_WINDOWS
@@ -1221,7 +1325,10 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
       /* The basic levels of Lisp must come first */
       /* And data must come first of all
         for the sake of symbols like error-message */
+#ifndef macintosh
+      /* Called before init_window_once for Mac OS.  */
       syms_of_data ();
+#endif
       syms_of_alloc ();
       syms_of_lread ();
       syms_of_print ();
@@ -1237,7 +1344,10 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
       syms_of_casetab ();
       syms_of_callproc ();
       syms_of_category ();
+#ifndef macintosh
+      /* Called before init_window_once for Mac OS.  */
       syms_of_ccl ();
+#endif
       syms_of_charset ();
       syms_of_cmds ();
 #ifndef NO_DIR_LIBRARY
@@ -1254,14 +1364,16 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 #endif /* CLASH_DETECTION */
       syms_of_indent ();
       syms_of_insdel ();
-      syms_of_keyboard ();
       syms_of_keymap ();
       syms_of_macros ();
       syms_of_marker ();
       syms_of_minibuf ();
       syms_of_mocklisp ();
       syms_of_process ();
+#ifndef macintosh
+      /* Called before init_window_once for Mac OS.  */
       syms_of_search ();
+#endif
       syms_of_frame ();
       syms_of_syntax ();
       syms_of_term ();
@@ -1269,8 +1381,10 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 #ifdef HAVE_SOUND
       syms_of_sound ();
 #endif
-
+#ifndef macintosh
+      /* Called before init_window_once for Mac OS.  */
       syms_of_textprop ();
+#endif
       syms_of_composite ();
 #ifdef VMS
       syms_of_vmsproc ();
@@ -1290,13 +1404,14 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 #endif /* HAVE_X_WINDOWS */
 
 #ifndef HAVE_NTGUI
+#ifndef macintosh
       syms_of_xmenu ();
 #endif
+#endif
 
 #ifdef HAVE_NTGUI
       syms_of_w32term ();
       syms_of_w32fns ();
-      syms_of_w32faces ();
       syms_of_w32select ();
       syms_of_w32menu ();
       syms_of_fontset ();
@@ -1328,7 +1443,10 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 #endif /* VMS */
       init_display (); /* Determine terminal type.  init_sys_modes uses results */
     }
+#ifndef macintosh
+  /* Called before init_window_once for Mac OS.  */
   init_keyboard ();    /* This too must precede init_sys_modes */
+#endif
 #ifdef VMS
   init_vmsproc ();     /* And this too. */
 #endif /* VMS */
@@ -1340,9 +1458,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
   init_xdisp ();
   init_macros ();
   init_editfns ();
-#ifdef LISP_FLOAT_TYPE
   init_floatfns ();
-#endif
 #ifdef VMS
   init_vmsfns ();
 #endif /* VMS */
@@ -1350,6 +1466,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 #ifdef HAVE_SOUND
   init_sound ();
 #endif
+  init_window ();
 
   if (!initialized)
     {
@@ -1399,7 +1516,6 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
       extern void dump_opcode_frequencies ();
 
       atexit (_mcleanup);
-      // atexit (dump_opcode_frequencies);
       /* This uses safe_bcopy because that function comes first in the
         Emacs executable.  It might be better to use something that
         gives the start of the text segment, but start_of_text is not
@@ -1425,6 +1541,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
   /* Enter editor command loop.  This never returns.  */
   Frecursive_edit ();
   /* NOTREACHED */
+  return 0;
 }
 \f
 /* Sort the args so we can find the most important ones
@@ -1893,8 +2010,15 @@ You must run Emacs in batch mode in order to dump it.")
 #ifdef DOUG_LEA_MALLOC
   malloc_state_ptr = malloc_get_state ();
 #endif
+
+#ifdef USE_MMAP_FOR_BUFFERS
+  mmap_set_vars (0);
+#endif
   unexec (XSTRING (filename)->data,
          !NILP (symfile) ? XSTRING (symfile)->data : 0, my_edata, 0, 0);
+#ifdef USE_MMAP_FOR_BUFFERS
+  mmap_set_vars (1);
+#endif
 #ifdef DOUG_LEA_MALLOC
   free (malloc_state_ptr);
 #endif