comparison src/emacs.c @ 26088:b7aa6ac26872

Add support for large files, 64-bit Solaris, system locale codings. * Makefile.in (emacs): Set the LC_ALL environment variable to "C" when dumping, so that the dumped Emacs doesn't have stray locale info. (dired.o): Depend on systime.h. (editfns.o): Depend on coding.h. * alloc.c, buffer.c, callproc.c, ccl.c, charset.c, coding.c, data.c, dispnew.c, editfns.c, emacs.c, filelock.c, floatfns.c, hftctl.c, keyboard.c, process.c, sysdep.c, unexelf.c, unexhp9k800.c, unexsunos4.c, vmsfns.c, vmsgmalloc.c, w32faces.c, w32menu.c, w32term.c, w32xfns.c, xfaces.c, xfns.c, xmenu.c, xterm.c: Include <config.h> before any system include files. * alloc.c, buffer.c, ccl.c, data.c, editfns.c, emacs.c, eval.c, fileio.c, filelock.c, frame.c, insdel.c, keymap.c, lread.c, m/alpha.h, print.c, search.c, sysdep.c, xdisp.c, xfaces.c, xfns.c, xmenu.c, xterm.c: Do not include <stdlib.h>, as <config.h> does this now. * callproc.c (Fcall_process): Synchronize messages locale before invoking strerror. Decode resulting string with locale-coding-system. * coding.c (Vlocale_coding_system): New var. (syms_of_coding): Adjust to above change. (emacs_strerror): New function. * coding.h (emacs_strerror, Vlocale_coding_system): New decls. * config.in (HAVE_STDIO_EXT_H, HAVE_TM_GMTOFF, HAVE___FPENDING, HAVE_FTELLO, HAVE_GETLOADAVG, HAVE_MBLEN, HAVE_MBRLEN, HAVE_STRSIGNAL): New macros. (BITS_PER_LONG): Default to 64 if _LP64 is defined. <stdlib.h>: Include if HAVE_STDLIB_H is defined and NOT_C_CODE isn't. * dired.c: Include "systime.h". (Ffile_attributes): Do not cast s.st_size to int; this loses information if int is 32 bits but st_size and EMACS_INT are larger. Treat large device numbers like large inode numbers. * dispnew.c (PENDING_OUTPUT_COUNT): Use __fpending if available. * editfns.c: Include coding.h. (emacs_strftime): Remove decl. (emacs_strftimeu): New decl. (emacs_memftimeu): Renamed from emacs_memftime; new arg UT. Use emacs_strftimeu instead of emacs_strftime. (Fformat_time_string): Convert format string using Vlocale_coding_system, and convert result back. Synchronize time locale before invoking lower level function. Invoke emacs_memftimeu, passing ut, instead of emacs_memftime. * emacs.c: Include <locale.h> if HAVE_SETLOCALE is defined. (Vmessages_locale, Vprevious_messages_locale, Vtime_locale, Vprevious_time_locale): New variables. (main): Invoke setlocale early, so that initial error messages are localized properly. But skip locale-setting if LC_ALL is "C". Fix up locale when it's safe to do so. (fixup_locale): Moved here from xterm.c. (synchronize_locale, synchronize_time_locale, synchronize_messages_locale): New functions. (syms_of_emacs): Accommodate above changes. * fileio.c (report_file_error): Convert strerror output according to Vlocale_coding_system. (Finsert_file_contents): Check for arithmetic overflow in computations that depend on file size. Report IO errors with emacs_strerror, not strerror. * fns.c (Fgethash): Declare dflt parameter. * gmalloc.c: Do not define const to nothing if HAVE_CONFIG_H is defined; that's config.h's job. * lisp.h (EMACS_INT, BITS_PER_EMACS_INT, EMACS_UINT): If _LP64, default these values to long, BITS_PER_LONG, and unsigned long. (VALBITS, MARKBIT, XINT): Do not assume 32-bit EMACS_INT. (PNTR_COMPARISON_TYPE): Default to EMACS_UINT, not to unsigned int. (code_convert_string_norecord, fixup_locale, synchronize_messages_locale, synchronize_time_locale, emacs_open, emacs_close, emacs_read, emacs_write): New decls. All Emacs callers of open, close, read, write changed to use emacs_open, emacs_close, emacs_read, emacs_write. * lread.c (file_offset, file_tell): New macros. All uses of ftell changed to file_tell. (saved_doc_string_position, prev_saved_doc_string_position): Now of type file_offset. (init_lread): Do not fix locale here; fixup_locale now does this. * m/amdahl.h, s/usg5-4.h: (NSIG): Remove. (NSIG_MINIMUM): New macro. * m/cydra5.h, m/dpx2.h, m/mips.h, m/pfa50.h, m/sps7.h, m/stride.h, m/ustation.h, s/gnu-linux.h, s/hpux.h, s/iris3-5.h, s/iris3-6.h, s/umips.h, s/usg5-4.h: (SIGIO): Do not undef. (BROKEN_SIGIO): New macro. * m/ustation.h: (SIGTSTP): Do not undef. (BROKEN_SIGTSTP): New macro. * s/gnu-linux.h: (SIGPOLL, SIGURG): Do not undef. (BROKEN_SIGPOLL, BROKEN_SIGURG): New macros. * s/ptx4.h: (SIGINFO): Do not undef. (BROKEN_SIGINFO): New macros. * m/delta.h, s/ptx.h, s/template.h: Doc fix. * mktime.c, strftime.c: Update to glibc 2.1.2 version, with some Emacs-related changes merged. * print.c (float_to_string): Prepend "-" to representation of a NaN if the NaN is negative. * process.c (sys_siglist): Omit if HAVE_STRSIGNAL. (wait_reading_process_input): Use emacs_strerror, not strerror. * process.c (status_message, sigchld_handler): Synchronize locale, then use strsignal istead of sys_siglist. * w32proc.c (sys_wait): Likewise. * s/aix3-1.h, s/bsd4-1.h, s/dgux.h, s/gnu-linux.h, s/hiuxmpp.h, s/hpux.h, s/iris3-5.h, s/iris3-6.h, s/irix3-3.h, s/osf1.h, s/rtu.h, s/sunos4-1.h, s/unipl5-0.h, s/unipl5-2.h, s/usg5-0.h, s/usg5-2-2.h, s/usg5-2.h, s/usg5-3.h, s/xenix.h: (open, close, read, write, INTERRUPTIBLE_OPEN, INTERRUPTIBLE_CLOSE, INTERRUPTIBLE_IO): Remove. * s/sol2-5.h (_LARGEFILE_SOURCE, _FILE_OFFSET_BITS): New macros. * sysdep.c (sys_read, sys_write, read, write, sys_close, close, sys_open, open): Remove. (emacs_open, emacs_close, emacs_read, emacs_write): Always define; the old INTERRUPTIBLE_OPEN, INTERRUPTIBLE_CLOSE, and INTERRUPTIBLE_IO macros are no longer used. (emacs_open): Renamed from sys_open. Merge BSD4_1 version. (emacs_close): Renamed from sys_close. (emacs_read): Renamed from sys_read. (emacs_write): Renamed from sys_write. (sys_siglist): Do not declare if HAVE_STRSIGNAL. (dup2): Do not print error on failure; the real dup2 doesn't. (strsignal): New function, defined if !HAVE_STRSIGNAL. * syssignal.h (SIGINFO): Undef if defined and if BROKEN_SIGINFO is defined. (SIGIO, SIGPOLL, SIGTSTP, SIGURG): Likewise. (NSIG): If less than NSIG_MINIMUM, define to NSIG_MINIMUM. (strsignal): Declare if !HAVE_STRSIGNAL. * unexelf.c (ElfBitsW, ELFSIZE, ElfExpandBitsW): New macros. (ElfW): Define in terms of ElfExpandBitsW. * w32proc.c (sys_siglist): Remove decl. * xdisp.c (decode_mode_spec): 3rd arg is int, not char, to comply with ANSI C. (display_string): Declare face_string_pos arg. * xfns.c (Fx_show_tip): Declare timeout param. * xterm.c: No need to include locale.h. (x_alloc_lighter_color, x_setup_relief_color): Pass arg as double, not float, for compatibility with ANSI C. (fixup_locale): Move to emacs.c. (x_term_init): Do not setlocale or fixup locale; the main program does this now.
author Paul Eggert <eggert@twinsun.com>
date Tue, 19 Oct 1999 07:25:11 +0000
parents 8690532ba294
children d82f40019d74
comparison
equal deleted inserted replaced
26087:e0d966fb548f 26088:b7aa6ac26872
1 /* Fully extensible Emacs, running on Unix, intended for GNU. 1 /* Fully extensible Emacs, running on Unix, intended for GNU.
2 Copyright (C) 1985,86,87,93,94,95,97,1998 Free Software Foundation, Inc. 2 Copyright (C) 1985,86,87,93,94,95,97,98,1999 Free Software Foundation, Inc.
3 3
4 This file is part of GNU Emacs. 4 This file is part of GNU Emacs.
5 5
6 GNU Emacs is free software; you can redistribute it and/or modify 6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by 7 it under the terms of the GNU General Public License as published by
17 along with GNU Emacs; see the file COPYING. If not, write to 17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */ 19 Boston, MA 02111-1307, USA. */
20 20
21 21
22 #include <config.h>
22 #include <signal.h> 23 #include <signal.h>
23 #include <errno.h> 24 #include <errno.h>
24
25 #include <config.h>
26 #include <stdio.h> 25 #include <stdio.h>
27 26
28 #include <sys/types.h> 27 #include <sys/types.h>
29 #include <sys/file.h> 28 #include <sys/file.h>
30 29
36 #include <unistd.h> 35 #include <unistd.h>
37 #endif 36 #endif
38 37
39 #ifdef BSD_SYSTEM 38 #ifdef BSD_SYSTEM
40 #include <sys/ioctl.h> 39 #include <sys/ioctl.h>
41 #endif
42
43 #ifdef STDC_HEADERS
44 #include <stdlib.h>
45 #endif 40 #endif
46 41
47 #include "lisp.h" 42 #include "lisp.h"
48 #include "commands.h" 43 #include "commands.h"
49 #include "intervals.h" 44 #include "intervals.h"
53 #include "blockinput.h" 48 #include "blockinput.h"
54 #include "syssignal.h" 49 #include "syssignal.h"
55 #include "process.h" 50 #include "process.h"
56 #include "termhooks.h" 51 #include "termhooks.h"
57 #include "keyboard.h" 52 #include "keyboard.h"
53
54 #ifdef HAVE_SETLOCALE
55 #include <locale.h>
56 #endif
58 57
59 #ifdef HAVE_SETRLIMIT 58 #ifdef HAVE_SETRLIMIT
60 #include <sys/time.h> 59 #include <sys/time.h>
61 #include <sys/resource.h> 60 #include <sys/resource.h>
62 #endif 61 #endif
125 /* Variable whose value is string giving configuration options, 124 /* Variable whose value is string giving configuration options,
126 for use when reporting bugs. */ 125 for use when reporting bugs. */
127 Lisp_Object Vsystem_configuration_options; 126 Lisp_Object Vsystem_configuration_options;
128 127
129 Lisp_Object Qfile_name_handler_alist; 128 Lisp_Object Qfile_name_handler_alist;
129
130 /* Current and previous system locales for messages and time. */
131 Lisp_Object Vmessages_locale;
132 Lisp_Object Vprevious_messages_locale;
133 Lisp_Object Vtime_locale;
134 Lisp_Object Vprevious_time_locale;
130 135
131 /* If non-zero, emacs should not attempt to use an window-specific code, 136 /* If non-zero, emacs should not attempt to use an window-specific code,
132 but instead should use the virtual terminal under which it was started */ 137 but instead should use the virtual terminal under which it was started */
133 int inhibit_window_system; 138 int inhibit_window_system;
134 139
600 int argc; 605 int argc;
601 char **argv; 606 char **argv;
602 char **envp; 607 char **envp;
603 { 608 {
604 char stack_bottom_variable; 609 char stack_bottom_variable;
610 int do_initial_setlocale;
605 int skip_args = 0; 611 int skip_args = 0;
606 extern int errno; 612 extern int errno;
607 extern int sys_nerr; 613 extern int sys_nerr;
608 #ifdef HAVE_SETRLIMIT 614 #ifdef HAVE_SETRLIMIT
609 struct rlimit rlim; 615 struct rlimit rlim;
783 if (emacs_priority) 789 if (emacs_priority)
784 nice (emacs_priority); 790 nice (emacs_priority);
785 setuid (getuid ()); 791 setuid (getuid ());
786 #endif /* SET_EMACS_PRIORITY */ 792 #endif /* SET_EMACS_PRIORITY */
787 793
794 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
795 The build procedure uses this while dumping, to ensure that the
796 dumped Emacs does not have its system locale tables initialized,
797 as that might cause screwups when the dumped Emacs starts up. */
798 {
799 char *lc_all = getenv ("LC_ALL");
800 do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
801 }
802
803 /* Set locale now, so that initial error messages are localized properly.
804 fixup_locale must wait until later, since it builds strings. */
805 if (do_initial_setlocale)
806 setlocale (LC_ALL, "");
807
788 #ifdef EXTRA_INITIALIZE 808 #ifdef EXTRA_INITIALIZE
789 EXTRA_INITIALIZE; 809 EXTRA_INITIALIZE;
790 #endif 810 #endif
791 811
792 inhibit_window_system = 0; 812 inhibit_window_system = 0;
796 { 816 {
797 char *term; 817 char *term;
798 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args)) 818 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
799 { 819 {
800 int result; 820 int result;
801 close (0); 821 emacs_close (0);
802 close (1); 822 emacs_close (1);
803 result = open (term, O_RDWR, 2 ); 823 result = emacs_open (term, O_RDWR, 0);
804 if (result < 0) 824 if (result < 0)
805 { 825 {
806 char *errstring = strerror (errno); 826 char *errstring = strerror (errno);
807 fprintf (stderr, "emacs: %s: %s\n", term, errstring); 827 fprintf (stderr, "emacs: %s: %s\n", term, errstring);
808 exit (1); 828 exit (1);
992 init_window_once (); /* Init the window system */ 1012 init_window_once (); /* Init the window system */
993 init_fileio_once (); /* Must precede any path manipulation. */ 1013 init_fileio_once (); /* Must precede any path manipulation. */
994 } 1014 }
995 1015
996 init_alloc (); 1016 init_alloc ();
1017
1018 if (do_initial_setlocale)
1019 {
1020 fixup_locale ();
1021 Vmessages_locale = Vprevious_messages_locale;
1022 Vtime_locale = Vprevious_time_locale;
1023 }
1024
997 init_eval (); 1025 init_eval ();
998 init_coding (); 1026 init_coding ();
999 init_data (); 1027 init_data ();
1000 #ifdef CLASH_DETECTION 1028 #ifdef CLASH_DETECTION
1001 init_filelock ();; 1029 init_filelock ();;
1857 1885
1858 #endif /* not HAVE_SHM */ 1886 #endif /* not HAVE_SHM */
1859 1887
1860 #endif /* not CANNOT_DUMP */ 1888 #endif /* not CANNOT_DUMP */
1861 1889
1890 #if HAVE_SETLOCALE
1891 /* Recover from setlocale (LC_ALL, ""). */
1892 void
1893 fixup_locale ()
1894 {
1895 char *l;
1896
1897 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
1898 so that numbers are read and printed properly for Emacs Lisp. */
1899 setlocale (LC_NUMERIC, "C");
1900
1901 #ifdef LC_MESSAGES
1902 l = setlocale (LC_MESSAGES, (char *) 0);
1903 Vprevious_messages_locale = l ? build_string (l) : Qnil;
1904 #endif
1905 l = setlocale (LC_TIME, (char *) 0);
1906 Vprevious_time_locale = l ? build_string (l) : Qnil;
1907 }
1908
1909 static void
1910 synchronize_locale (category, plocale, desired_locale)
1911 int category;
1912 Lisp_Object *plocale;
1913 Lisp_Object desired_locale;
1914 {
1915 if (STRINGP (desired_locale)
1916 && (NILP (*plocale) || NILP (Fstring_equal (*plocale, desired_locale)))
1917 && setlocale (category, XSTRING (desired_locale)->data))
1918 *plocale = desired_locale;
1919 }
1920
1921 /* Set system time locale to match Vtime_locale, if possible. */
1922 void
1923 synchronize_time_locale ()
1924 {
1925 synchronize_locale (LC_TIME, &Vprevious_time_locale, Vtime_locale);
1926 }
1927
1928 /* Set system messages locale to match Vmessages_locale, if possible. */
1929 void
1930 synchronize_messages_locale ()
1931 {
1932 #ifdef LC_MESSAGES
1933 synchronize_locale (LC_MESSAGES, &Vprevious_messages_locale,
1934 Vmessages_locale);
1935 #endif
1936 }
1937 #endif /* HAVE_SETLOCALE */
1938
1862 #ifndef SEPCHAR 1939 #ifndef SEPCHAR
1863 #define SEPCHAR ':' 1940 #define SEPCHAR ':'
1864 #endif 1941 #endif
1865 1942
1866 Lisp_Object 1943 Lisp_Object
2001 "A directory within which to look for the `lib-src' and `etc' directories.\n\ 2078 "A directory within which to look for the `lib-src' and `etc' directories.\n\
2002 This is non-nil when we can't find those directories in their standard\n\ 2079 This is non-nil when we can't find those directories in their standard\n\
2003 installed locations, but we can find them\n\ 2080 installed locations, but we can find them\n\
2004 near where the Emacs executable was found."); 2081 near where the Emacs executable was found.");
2005 Vinstallation_directory = Qnil; 2082 Vinstallation_directory = Qnil;
2006 } 2083
2084 DEFVAR_LISP ("messages-locale", &Vmessages_locale,
2085 "System locale for messages.");
2086 Vmessages_locale = Qnil;
2087
2088 DEFVAR_LISP ("previous-messages-locale", &Vprevious_messages_locale,
2089 "Most recently used system locale for messages.");
2090 Vprevious_messages_locale = Qnil;
2091
2092 DEFVAR_LISP ("time-locale", &Vtime_locale,
2093 "System locale for time.");
2094 Vtime_locale = Qnil;
2095
2096 DEFVAR_LISP ("previous-time-locale", &Vprevious_time_locale,
2097 "Most recently used system locale for time.");
2098 Vprevious_time_locale = Qnil;
2099 }