emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master a644fa3 3/7: Merge from origin/emacs-25


From: John Wiegley
Subject: [Emacs-diffs] master a644fa3 3/7: Merge from origin/emacs-25
Date: Mon, 15 Feb 2016 22:43:34 +0000

branch: master
commit a644fa367504c4587c1b9e5fc20b7af79e6e99a0
Merge: 8c4e041 f5d6b9b
Author: John Wiegley <address@hidden>
Commit: John Wiegley <address@hidden>

    Merge from origin/emacs-25
    
    f5d6b9b Revert "Support integer image rotation and respect EXIF rotations"
    afe7d1f Revert "Document EXIF image rotation"
    c6f377c Document OS X LANG default
    eb4a18c Set locale when run from OS X GUI
    456c0a3 make-docfile cleanup for I/O, etc.
    25ec995 Memory-management cleanup in make-docfile
    02d925e Kevin Gallagher has new email address
    4ef153b Improve doc strings of 'forward/backward-word-strictly'
    3ad05a0 Describe Makefile test targets in test/README
---
 Makefile.in                  |    4 +
 doc/emacs/cmdargs.texi       |    9 +-
 doc/lispref/display.texi     |    4 +-
 doc/misc/edt.texi            |    5 +-
 etc/NEWS                     |    4 -
 etc/edt-user.el              |    4 +-
 lib-src/make-docfile.c       |  326 +++++++++++++++++++++++-------------------
 lisp/emulation/edt-lk201.el  |    4 +-
 lisp/emulation/edt-mapper.el |    4 +-
 lisp/emulation/edt-pc.el     |    4 +-
 lisp/emulation/edt-vt100.el  |    4 +-
 lisp/emulation/edt.el        |    7 +-
 lisp/simple.el               |    8 +-
 src/emacs.c                  |    5 +
 src/image.c                  |    2 +-
 src/nsterm.h                 |    2 +
 src/nsterm.m                 |   21 +++
 src/syntax.c                 |   12 ++-
 test/README                  |   58 ++++++++
 19 files changed, 312 insertions(+), 175 deletions(-)

diff --git a/Makefile.in b/Makefile.in
index 31a073b..7aac403 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -57,6 +57,10 @@
 #
 # make docs
 #      Make Emacs documentation files from their sources; requires makeinfo.
+#
+# make check  or  make check-expensive
+#      Run Emacs test suite.  check-expensive runs also tests which
+#      take more time to perform.
 
 SHELL = @SHELL@
 
diff --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi
index a1b0b09..a842cb8 100644
--- a/doc/emacs/cmdargs.texi
+++ b/doc/emacs/cmdargs.texi
@@ -550,10 +550,11 @@ variables is not set, the category defaults to the value 
of the
 @env{LANG} is not set.  But if @env{LC_ALL} is specified, it overrides
 the settings of all the other locale environment variables.
 
-On MS-Windows, if @env{LANG} is not already set in the environment
-when Emacs starts, Emacs sets it based on the system-wide default
-language, which you can set in the @samp{Regional Settings} Control Panel
-on some versions of MS-Windows.
+On MS-Windows and OS X, if @env{LANG} is not already set in the
+environment, Emacs sets it based on the system-wide default.  You can
+set this in the ``Regional Settings'' Control Panel on some versions
+of MS-Windows, and in the ``Language and Region'' System Preference on
+OS X.
 
 The value of the @env{LC_CTYPE} category is
 matched against entries in @code{locale-language-names},
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index 608ce0e..26f3de4 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -5213,9 +5213,7 @@ when the image does not have an associated file name, to 
provide a
 hint to ImageMagick to help it detect the image type.
 
 @item :rotation @var{angle}
-Specifies a rotation angle in degrees.  If no rotation is explicitly
-specified, and the @acronym{EXIF} headers specify a rotation, the
-rotation from the @acronym{EXIF} headers are used instead.
+Specifies a rotation angle in degrees.
 
 @item :index @var{frame}
 @c Doesn't work: http://debbugs.gnu.org/7978
diff --git a/doc/misc/edt.texi b/doc/misc/edt.texi
index 4f3fdae..2361313 100644
--- a/doc/misc/edt.texi
+++ b/doc/misc/edt.texi
@@ -30,7 +30,7 @@ modify this GNU manual.''
 @titlepage
 @title EDT Emulation User's Manual
 @author Kevin Gallagher
address@hidden @email{Kevin.Gallagher@@boeing.com}
address@hidden @address@hidden
 @page
 @vskip 0pt plus 1filll
 @insertcopying
@@ -106,7 +106,8 @@ how to customize it to your liking.
 @file{edt.texi}---This manual.
 
 @item
address@hidden example customization file.
address@hidden example customization file (located in the
+Emacs distribution etc directory).
 
 @item
 @file{edt.el}---EDT emulation functions and default configuration.
diff --git a/etc/NEWS b/etc/NEWS
index 37eb2bc..957b0c2 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -718,10 +718,6 @@ text in the region.  The search engine to use for this is 
specified by
 the customizable variable `eww-search-prefix'.
 
 +++
-*** Images that have rotation specified in the EXIF headers are now
-automatically rotated (if displayed as ImageMagick images).
-
-+++
 *** Query-replace history is enhanced.
 When query-replace reads the FROM string from the minibuffer, typing
 `M-p' will now show previous replacements as "FROM SEP TO", where FROM
diff --git a/etc/edt-user.el b/etc/edt-user.el
index 5541ce6..cf1acbc 100644
--- a/etc/edt-user.el
+++ b/etc/edt-user.el
@@ -3,8 +3,8 @@
 ;; Copyright (C) 1986, 1992-1993, 2000-2016 Free Software Foundation,
 ;; Inc.
 
-;; Author: Kevin Gallagher <kgallagh@@spd.dsccc.com>
-;; Maintainer: Kevin Gallagher <kgallagh@@spd.dsccc.com>
+;; Author: Kevin Gallagher <address@hidden>
+;; Maintainer: Kevin Gallagher <address@hidden>
 ;; Keywords: emulations
 
 ;; This file is part of GNU Emacs.
diff --git a/lib-src/make-docfile.c b/lib-src/make-docfile.c
index 02b5e76..12222c3 100644
--- a/lib-src/make-docfile.c
+++ b/lib-src/make-docfile.c
@@ -37,6 +37,8 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 #include <config.h>
 
 #include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>   /* config.h unconditionally includes this anyway */
 
@@ -48,6 +50,8 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 #endif /* WINDOWSNT */
 
 #include <binary-io.h>
+#include <intprops.h>
+#include <min-max.h>
 
 #ifdef DOS_NT
 /* Defined to be sys_chdir in ms-w32.h, but only #ifdef emacs, so this
@@ -61,72 +65,79 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 #define IS_SLASH(c)  ((c) == '/')
 #endif /* not DOS_NT */
 
-static int scan_file (char *filename);
-static int scan_lisp_file (const char *filename, const char *mode);
-static int scan_c_file (char *filename, const char *mode);
-static int scan_c_stream (FILE *infile);
+static void scan_file (char *filename);
+static void scan_lisp_file (const char *filename, const char *mode);
+static void scan_c_file (char *filename, const char *mode);
+static void scan_c_stream (FILE *infile);
 static void start_globals (void);
 static void write_globals (void);
 
 #include <unistd.h>
 
 /* Name this program was invoked with.  */
-char *progname;
+static char *progname;
 
-/* Nonzero if this invocation is generating globals.h.  */
-int generate_globals;
+/* True if this invocation is generating globals.h.  */
+static bool generate_globals;
 
-/* Print error message.  `s1' is printf control string, `s2' is arg for it.  */
+/* Print error message.  Args are like vprintf.  */
 
-/* VARARGS1 */
-static void
-error (const char *s1, const char *s2)
+static void ATTRIBUTE_FORMAT_PRINTF (1, 0)
+verror (char const *m, va_list ap)
 {
   fprintf (stderr, "%s: ", progname);
-  fprintf (stderr, s1, s2);
+  vfprintf (stderr, m, ap);
   fprintf (stderr, "\n");
 }
 
-/* Print error message and exit.  */
+/* Print error message.  Args are like printf.  */
 
-/* VARARGS1 */
-static _Noreturn void
-fatal (const char *s1, const char *s2)
+static void ATTRIBUTE_FORMAT_PRINTF (1, 2)
+error (char const *m, ...)
 {
-  error (s1, s2);
-  exit (EXIT_FAILURE);
+  va_list ap;
+  va_start (ap, m);
+  verror (m, ap);
+  va_end (ap);
 }
 
-/* Like malloc but get fatal error if memory is exhausted.  */
+/* Print error message and exit.  Args are like printf.  */
 
-static void *
-xmalloc (unsigned int size)
+static _Noreturn void ATTRIBUTE_FORMAT_PRINTF (1, 2)
+fatal (char const *m, ...)
 {
-  void *result = (void *) malloc (size);
-  if (result == NULL)
-    fatal ("virtual memory exhausted", 0);
-  return result;
+  va_list ap;
+  va_start (ap, m);
+  verror (m, ap);
+  va_end (ap);
+  exit (EXIT_FAILURE);
+}
+
+static _Noreturn void
+memory_exhausted (void)
+{
+  fatal ("virtual memory exhausted");
 }
 
-/* Like strdup, but get fatal error if memory is exhausted.  */
+/* Like malloc but get fatal error if memory is exhausted.  */
 
-static char *
-xstrdup (char *s)
+static void *
+xmalloc (ptrdiff_t size)
 {
-  char *result = strdup (s);
-  if (! result)
-    fatal ("virtual memory exhausted", 0);
+  void *result = malloc (size);
+  if (result == NULL)
+    memory_exhausted ();
   return result;
 }
 
 /* Like realloc but get fatal error if memory is exhausted.  */
 
 static void *
-xrealloc (void *arg, unsigned int size)
+xrealloc (void *arg, ptrdiff_t size)
 {
-  void *result = (void *) realloc (arg, size);
+  void *result = realloc (arg, size);
   if (result == NULL)
-    fatal ("virtual memory exhausted", 0);
+    memory_exhausted ();
   return result;
 }
 
@@ -135,7 +146,6 @@ int
 main (int argc, char **argv)
 {
   int i;
-  int err_count = 0;
 
   progname = argv[0];
 
@@ -170,7 +180,7 @@ main (int argc, char **argv)
     }
   if (argc > i && !strcmp (argv[i], "-g"))
     {
-      generate_globals = 1;
+      generate_globals = true;
       ++i;
     }
 
@@ -192,14 +202,17 @@ main (int argc, char **argv)
            if (strcmp (argv[i], argv[j]) == 0)
              break;
          if (j == i)
-           err_count += scan_file (argv[i]);
+           scan_file (argv[i]);
        }
     }
 
-  if (err_count == 0 && generate_globals)
+  if (generate_globals)
     write_globals ();
 
-  return (err_count > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
+  if (ferror (stdout) || fclose (stdout) != 0)
+    fatal ("write error");
+
+  return EXIT_SUCCESS;
 }
 
 /* Add a source file name boundary marker in the output file.  */
@@ -218,22 +231,21 @@ put_filename (char *filename)
 }
 
 /* Read file FILENAME and output its doc strings to stdout.
-   Return 1 if file is not found, 0 if it is found.  */
+   Return true if file is found, false otherwise.  */
 
-static int
+static void
 scan_file (char *filename)
 {
-
-  size_t len = strlen (filename);
+  ptrdiff_t len = strlen (filename);
 
   if (!generate_globals)
     put_filename (filename);
   if (len > 4 && !strcmp (filename + len - 4, ".elc"))
-    return scan_lisp_file (filename, "rb");
+    scan_lisp_file (filename, "rb");
   else if (len > 3 && !strcmp (filename + len - 3, ".el"))
-    return scan_lisp_file (filename, "r");
+    scan_lisp_file (filename, "r");
   else
-    return scan_c_file (filename, "r");
+    scan_c_file (filename, "r");
 }
 
 static void
@@ -250,7 +262,7 @@ static char input_buffer[128];
 struct rcsoc_state
 {
   /* A count of spaces and newlines that have been read, but not output.  */
-  unsigned pending_spaces, pending_newlines;
+  intmax_t pending_spaces, pending_newlines;
 
   /* Where we're reading from.  */
   FILE *in_file;
@@ -267,16 +279,16 @@ struct rcsoc_state
      the input stream.  */
   const char *cur_keyword_ptr;
   /* Set to true if we saw an occurrence of KEYWORD.  */
-  int saw_keyword;
+  bool saw_keyword;
 };
 
 /* Output CH to the file or buffer in STATE.  Any pending newlines or
    spaces are output first.  */
 
 static void
-put_char (int ch, struct rcsoc_state *state)
+put_char (char ch, struct rcsoc_state *state)
 {
-  int out_ch;
+  char out_ch;
   do
     {
       if (state->pending_newlines > 0)
@@ -307,7 +319,7 @@ put_char (int ch, struct rcsoc_state *state)
    keyword, but were in fact not.  */
 
 static void
-scan_keyword_or_put_char (int ch, struct rcsoc_state *state)
+scan_keyword_or_put_char (char ch, struct rcsoc_state *state)
 {
   if (state->keyword
       && *state->cur_keyword_ptr == ch
@@ -319,7 +331,7 @@ scan_keyword_or_put_char (int ch, struct rcsoc_state *state)
       if (*++state->cur_keyword_ptr == '\0')
        /* Saw the whole keyword.  Set SAW_KEYWORD flag to true.  */
        {
-         state->saw_keyword = 1;
+         state->saw_keyword = true;
 
          /* Reset the scanning pointer.  */
          state->cur_keyword_ptr = state->keyword;
@@ -330,22 +342,29 @@ scan_keyword_or_put_char (int ch, struct rcsoc_state 
*state)
 
          /* Skip any whitespace between the keyword and the
             usage string.  */
+         int c;
          do
-           ch = getc (state->in_file);
-         while (ch == ' ' || ch == '\n');
+           c = getc (state->in_file);
+         while (c == ' ' || c == '\n');
 
          /* Output the open-paren we just read.  */
-         put_char (ch, state);
+         if (c != '(')
+           fatal ("Missing '(' after keyword");
+         put_char (c, state);
 
          /* Skip the function name and replace it with `fn'.  */
          do
-           ch = getc (state->in_file);
-         while (ch != ' ' && ch != ')');
+           {
+             c = getc (state->in_file);
+             if (c == EOF)
+               fatal ("Unexpected EOF after keyword");
+           }
+         while (c != ' ' && c != ')');
          put_char ('f', state);
          put_char ('n', state);
 
          /* Put back the last character.  */
-         ungetc (ch, state->in_file);
+         ungetc (c, state->in_file);
        }
     }
   else
@@ -369,18 +388,19 @@ scan_keyword_or_put_char (int ch, struct rcsoc_state 
*state)
 
 
 /* Skip a C string or C-style comment from INFILE, and return the
-   character that follows.  COMMENT non-zero means skip a comment.  If
+   byte that follows, or EOF.  COMMENT means skip a comment.  If
    PRINTFLAG is positive, output string contents to stdout.  If it is
    negative, store contents in buf.  Convert escape sequences \n and
    \t to newline and tab; discard \ followed by newline.
-   If SAW_USAGE is non-zero, then any occurrences of the string `usage:'
+   If SAW_USAGE is non-null, then any occurrences of the string "usage:"
    at the beginning of a line will be removed, and *SAW_USAGE set to
    true if any were encountered.  */
 
 static int
-read_c_string_or_comment (FILE *infile, int printflag, int comment, int 
*saw_usage)
+read_c_string_or_comment (FILE *infile, int printflag, bool comment,
+                         bool *saw_usage)
 {
-  register int c;
+  int c;
   struct rcsoc_state state;
 
   state.in_file = infile;
@@ -390,7 +410,7 @@ read_c_string_or_comment (FILE *infile, int printflag, int 
comment, int *saw_usa
   state.pending_newlines = 0;
   state.keyword = (saw_usage ? "usage:" : 0);
   state.cur_keyword_ptr = state.keyword;
-  state.saw_keyword = 0;
+  state.saw_keyword = false;
 
   c = getc (infile);
   if (comment)
@@ -468,10 +488,10 @@ read_c_string_or_comment (FILE *infile, int printflag, 
int comment, int *saw_usa
 static void
 write_c_args (char *func, char *buf, int minargs, int maxargs)
 {
-  register char *p;
-  int in_ident = 0;
+  char *p;
+  bool in_ident = false;
   char *ident_start IF_LINT (= NULL);
-  size_t ident_length = 0;
+  ptrdiff_t ident_length = 0;
 
   fputs ("(fn", stdout);
 
@@ -491,12 +511,12 @@ write_c_args (char *func, char *buf, int minargs, int 
maxargs)
        {
          if (!in_ident)
            {
-             in_ident = 1;
+             in_ident = true;
              ident_start = p;
            }
          else
            {
-             in_ident = 0;
+             in_ident = false;
              ident_length = p - ident_start;
            }
        }
@@ -575,34 +595,38 @@ enum { DEFUN_noreturn = 1, DEFUN_const = 2 };
 
 /* All the variable names we saw while scanning C sources in `-g'
    mode.  */
-int num_globals;
-int num_globals_allocated;
-struct global *globals;
+static ptrdiff_t num_globals;
+static ptrdiff_t num_globals_allocated;
+static struct global *globals;
 
 static struct global *
-add_global (enum global_type type, char *name, int value, char const *svalue)
+add_global (enum global_type type, char const *name, int value,
+           char const *svalue)
 {
   /* Ignore the one non-symbol that can occur.  */
   if (strcmp (name, "..."))
     {
-      ++num_globals;
-
-      if (num_globals_allocated == 0)
+      if (num_globals == num_globals_allocated)
        {
-         num_globals_allocated = 100;
-         globals = xmalloc (num_globals_allocated * sizeof (struct global));
-       }
-      else if (num_globals == num_globals_allocated)
-       {
-         num_globals_allocated *= 2;
-         globals = xrealloc (globals,
-                             num_globals_allocated * sizeof (struct global));
+         ptrdiff_t num_globals_max = (min (PTRDIFF_MAX, SIZE_MAX)
+                                      / sizeof *globals);
+         if (num_globals_allocated == num_globals_max)
+           memory_exhausted ();
+         if (num_globals_allocated < num_globals_max / 2)
+           num_globals_allocated = 2 * num_globals_allocated + 1;
+         else
+           num_globals_allocated = num_globals_max;
+         globals = xrealloc (globals, num_globals_allocated * sizeof *globals);
        }
 
+      ++num_globals;
+
+      ptrdiff_t namesize = strlen (name) + 1;
+      char *buf = xmalloc (namesize + (svalue ? strlen (svalue) + 1 : 0));
       globals[num_globals - 1].type = type;
-      globals[num_globals - 1].name = name;
+      globals[num_globals - 1].name = strcpy (buf, name);
       if (svalue)
-       globals[num_globals - 1].v.svalue = svalue;
+       globals[num_globals - 1].v.svalue = strcpy (buf + namesize, svalue);
       else
        globals[num_globals - 1].v.value = value;
       globals[num_globals - 1].flags = 0;
@@ -634,7 +658,7 @@ compare_globals (const void *a, const void *b)
 }
 
 static void
-close_emacs_globals (int num_symbols)
+close_emacs_globals (ptrdiff_t num_symbols)
 {
   printf (("};\n"
           "extern struct emacs_globals globals;\n"
@@ -642,17 +666,17 @@ close_emacs_globals (int num_symbols)
           "#ifndef DEFINE_SYMBOLS\n"
           "extern\n"
           "#endif\n"
-          "struct Lisp_Symbol alignas (GCALIGNMENT) lispsym[%d];\n"),
+          "struct Lisp_Symbol alignas (GCALIGNMENT) lispsym[%td];\n"),
          num_symbols);
 }
 
 static void
 write_globals (void)
 {
-  int i, j;
+  ptrdiff_t i, j;
   bool seen_defun = false;
-  int symnum = 0;
-  int num_symbols = 0;
+  ptrdiff_t symnum = 0;
+  ptrdiff_t num_symbols = 0;
   qsort (globals, num_globals, sizeof (struct global), compare_globals);
 
   j = 0;
@@ -665,6 +689,7 @@ write_globals (void)
              && globals[i].v.value != globals[i + 1].v.value)
            error ("function '%s' defined twice with differing signatures",
                   globals[i].name);
+         free (globals[i].name);
          i++;
        }
       num_symbols += globals[i].type == SYMBOL;
@@ -697,7 +722,7 @@ write_globals (void)
            }
          break;
        default:
-         fatal ("not a recognized DEFVAR_", 0);
+         fatal ("not a recognized DEFVAR_");
        }
 
       if (type)
@@ -707,7 +732,7 @@ write_globals (void)
                  globals[i].name, globals[i].name);
        }
       else if (globals[i].type == SYMBOL)
-       printf (("#define i%s %d\n"
+       printf (("#define i%s %td\n"
                 "DEFINE_LISP_SYMBOL (%s)\n"),
                globals[i].name, symnum++, globals[i].name);
       else
@@ -736,7 +761,7 @@ write_globals (void)
 
   puts ("#ifdef DEFINE_SYMBOLS");
   puts ("static char const *const defsym_name[] = {");
-  for (int i = 0; i < num_globals; i++)
+  for (ptrdiff_t i = 0; i < num_globals; i++)
     if (globals[i].type == SYMBOL)
       printf ("\t\"%s\",\n", globals[i].v.svalue);
   puts ("};");
@@ -745,9 +770,9 @@ write_globals (void)
   puts ("#define Qnil builtin_lisp_symbol (0)");
   puts ("#if DEFINE_NON_NIL_Q_SYMBOL_MACROS");
   num_symbols = 0;
-  for (int i = 0; i < num_globals; i++)
+  for (ptrdiff_t i = 0; i < num_globals; i++)
     if (globals[i].type == SYMBOL && num_symbols++ != 0)
-      printf ("# define %s builtin_lisp_symbol (%d)\n",
+      printf ("# define %s builtin_lisp_symbol (%td)\n",
              globals[i].name, num_symbols - 1);
   puts ("#endif");
 }
@@ -758,11 +783,11 @@ write_globals (void)
    Looks for DEFUN constructs such as are defined in ../src/lisp.h.
    Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED.  */
 
-static int
+static void
 scan_c_file (char *filename, const char *mode)
 {
   FILE *infile;
-  int extension = filename[strlen (filename) - 1];
+  char extension = filename[strlen (filename) - 1];
 
   if (extension == 'o')
     filename[strlen (filename) - 1] = 'c';
@@ -778,16 +803,15 @@ scan_c_file (char *filename, const char *mode)
         filename[strlen (filename) - 1] = 'c'; /* Don't confuse people.  */
     }
 
-  /* No error if non-ex input file.  */
   if (infile == NULL)
     {
       perror (filename);
-      return 0;
+      exit (EXIT_FAILURE);
     }
 
   /* Reset extension to be able to detect duplicate files.  */
   filename[strlen (filename) - 1] = extension;
-  return scan_c_stream (infile);
+  scan_c_stream (infile);
 }
 
 /* Return 1 if next input from INFILE is equal to P, -1 if EOF,
@@ -807,7 +831,7 @@ stream_match (FILE *infile, const char *p)
   return 1;
 }
 
-static int
+static void
 scan_c_stream (FILE *infile)
 {
   int commas, minargs, maxargs;
@@ -815,12 +839,13 @@ scan_c_stream (FILE *infile)
 
   while (!feof (infile))
     {
-      int doc_keyword = 0;
-      int defunflag = 0;
-      int defvarperbufferflag = 0;
-      int defvarflag = 0;
+      bool doc_keyword = false;
+      bool defunflag = false;
+      bool defvarperbufferflag = false;
+      bool defvarflag = false;
       enum global_type type = INVALID;
-      char *name IF_LINT (= 0);
+      static char *name;
+      static ptrdiff_t name_size;
 
       if (c != '\n' && c != '\r')
        {
@@ -866,7 +891,7 @@ scan_c_stream (FILE *infile)
              if (c != '_')
                continue;
 
-             defvarflag = 1;
+             defvarflag = true;
 
              c = getc (infile);
              defvarperbufferflag = (c == 'P');
@@ -920,12 +945,12 @@ scan_c_stream (FILE *infile)
          c = getc (infile);
          if (c != '"')
            continue;
-         c = read_c_string_or_comment (infile, -1, 0, 0);
+         c = read_c_string_or_comment (infile, -1, false, 0);
        }
 
       if (generate_globals)
        {
-         int i = 0;
+         ptrdiff_t i = 0;
          char const *svalue = 0;
 
          /* Skip "," and whitespace.  */
@@ -947,7 +972,16 @@ scan_c_stream (FILE *infile)
                    || c == '\n' || c == '\r'));
          input_buffer[i] = '\0';
 
-         name = xmalloc (i + 1);
+         if (name_size <= i)
+           {
+             free (name);
+             name_size = i + 1;
+             ptrdiff_t doubled;
+             if (! INT_MULTIPLY_WRAPV (name_size, 2, &doubled)
+                 && doubled <= SIZE_MAX)
+               name_size = doubled;
+             name = xmalloc (name_size);
+           }
          memcpy (name, input_buffer, i + 1);
 
          if (type == SYMBOL)
@@ -957,8 +991,8 @@ scan_c_stream (FILE *infile)
              while (c == ' ' || c == '\t' || c == '\n' || c == '\r');
              if (c != '"')
                continue;
-             c = read_c_string_or_comment (infile, -1, 0, 0);
-             svalue = xstrdup (input_buffer);
+             c = read_c_string_or_comment (infile, -1, false, 0);
+             svalue = input_buffer;
            }
 
          if (!defunflag)
@@ -1024,6 +1058,8 @@ scan_c_stream (FILE *infile)
       if (generate_globals)
        {
          struct global *g = add_global (FUNCTION, name, maxargs, 0);
+         if (!g)
+           continue;
 
          /* The following code tries to recognize function attributes
             specified after the docstring, e.g.:
@@ -1087,7 +1123,7 @@ scan_c_stream (FILE *infile)
        c = getc (infile);
 
       if (c == '"')
-       c = read_c_string_or_comment (infile, 0, 0, 0);
+       c = read_c_string_or_comment (infile, 0, false, 0);
 
       while (c != EOF && c != ',' && c != '/')
        c = getc (infile);
@@ -1100,7 +1136,7 @@ scan_c_stream (FILE *infile)
            c = getc (infile);
          if (c == ':')
            {
-             doc_keyword = 1;
+             doc_keyword = true;
              c = getc (infile);
              while (c == ' ' || c == '\n' || c == '\r' || c == '\t')
                c = getc (infile);
@@ -1113,8 +1149,8 @@ scan_c_stream (FILE *infile)
                  ungetc (c, infile),
                  c == '*')))
        {
-         int comment = c != '"';
-         int saw_usage;
+         bool comment = c != '"';
+         bool saw_usage;
 
          printf ("\037%c%s\n", defvarflag ? 'V' : 'F', input_buffer);
 
@@ -1168,8 +1204,8 @@ scan_c_stream (FILE *infile)
        }
     }
  eof:
-  fclose (infile);
-  return 0;
+  if (ferror (infile) || fclose (infile) != 0)
+    fatal ("read error");
 }
 
 /* Read a file of Lisp code, compiled or interpreted.
@@ -1245,7 +1281,7 @@ read_lisp_symbol (FILE *infile, char *buffer)
   skip_white (infile);
 }
 
-static int
+static bool
 search_lisp_doc_at_eol (FILE *infile)
 {
   int c = 0, c1 = 0, c2 = 0;
@@ -1265,20 +1301,19 @@ search_lisp_doc_at_eol (FILE *infile)
 #ifdef DEBUG
       fprintf (stderr, "## non-docstring found\n");
 #endif
-      if (c != EOF)
-       ungetc (c, infile);
-      return 0;
+      ungetc (c, infile);
+      return false;
     }
-  return 1;
+  return true;
 }
 
 #define DEF_ELISP_FILE(fn)  { #fn, sizeof(#fn) - 1 }
 
-static int
+static void
 scan_lisp_file (const char *filename, const char *mode)
 {
   FILE *infile;
-  register int c;
+  int c;
   char *saved_string = 0;
   /* These are the only files that are loaded uncompiled, and must
      follow the conventions of the doc strings expected by this
@@ -1286,7 +1321,7 @@ scan_lisp_file (const char *filename, const char *mode)
      byte compiler when it produces the .elc files.  */
   static struct {
     const char *fn;
-    size_t fl;
+    int fl;
   } const uncompiled[] = {
     DEF_ELISP_FILE (loaddefs.el),
     DEF_ELISP_FILE (loadup.el),
@@ -1294,22 +1329,22 @@ scan_lisp_file (const char *filename, const char *mode)
     DEF_ELISP_FILE (cp51932.el),
     DEF_ELISP_FILE (eucjp-ms.el)
   };
-  int i, match;
-  size_t flen = strlen (filename);
+  int i;
+  int flen = strlen (filename);
 
   if (generate_globals)
-    fatal ("scanning lisp file when -g specified", 0);
+    fatal ("scanning lisp file when -g specified");
   if (flen > 3 && !strcmp (filename + flen - 3, ".el"))
     {
-      for (i = 0, match = 0; i < sizeof (uncompiled) / sizeof (uncompiled[0]);
-          i++)
+      bool match = false;
+      for (i = 0; i < sizeof (uncompiled) / sizeof (uncompiled[0]); i++)
        {
          if (uncompiled[i].fl <= flen
              && !strcmp (filename + flen - uncompiled[i].fl, uncompiled[i].fn)
              && (flen == uncompiled[i].fl
                  || IS_SLASH (filename[flen - uncompiled[i].fl - 1])))
            {
-             match = 1;
+             match = true;
              break;
            }
        }
@@ -1321,7 +1356,7 @@ scan_lisp_file (const char *filename, const char *mode)
   if (infile == NULL)
     {
       perror (filename);
-      return 0;                                /* No error.  */
+      exit (EXIT_FAILURE);
     }
 
   c = '\n';
@@ -1345,22 +1380,24 @@ scan_lisp_file (const char *filename, const char *mode)
          c = getc (infile);
          if (c == '@')
            {
-             size_t length = 0;
-             size_t i;
+             ptrdiff_t length = 0;
+             ptrdiff_t i;
 
              /* Read the length.  */
              while ((c = getc (infile),
                      c >= '0' && c <= '9'))
                {
-                 length *= 10;
-                 length += c - '0';
+                 if (INT_MULTIPLY_WRAPV (length, 10, &length)
+                     || INT_ADD_WRAPV (length, c - '0', &length)
+                     || SIZE_MAX < length)
+                   memory_exhausted ();
                }
 
              if (length <= 1)
-               fatal ("invalid dynamic doc string length", "");
+               fatal ("invalid dynamic doc string length");
 
              if (c != ' ')
-               fatal ("space not found after dynamic doc string length", "");
+               fatal ("space not found after dynamic doc string length");
 
              /* The next character is a space that is counted in the length
                 but not part of the doc string.
@@ -1369,7 +1406,7 @@ scan_lisp_file (const char *filename, const char *mode)
 
              /* Read in the contents.  */
              free (saved_string);
-             saved_string = (char *) xmalloc (length);
+             saved_string = xmalloc (length);
              for (i = 0; i < length; i++)
                saved_string[i] = getc (infile);
              /* The last character is a ^_.
@@ -1568,7 +1605,7 @@ scan_lisp_file (const char *filename, const char *mode)
                       buffer, filename);
              continue;
            }
-         read_c_string_or_comment (infile, 0, 0, 0);
+         read_c_string_or_comment (infile, 0, false, 0);
 
          if (saved_string == 0)
            if (!search_lisp_doc_at_eol (infile))
@@ -1604,10 +1641,11 @@ scan_lisp_file (const char *filename, const char *mode)
          saved_string = 0;
        }
       else
-       read_c_string_or_comment (infile, 1, 0, 0);
+       read_c_string_or_comment (infile, 1, false, 0);
     }
-  fclose (infile);
-  return 0;
+  free (saved_string);
+  if (ferror (infile) || fclose (infile) != 0)
+    fatal ("%s: read error", filename);
 }
 
 
diff --git a/lisp/emulation/edt-lk201.el b/lisp/emulation/edt-lk201.el
index c30a84d..bb8577c 100644
--- a/lisp/emulation/edt-lk201.el
+++ b/lisp/emulation/edt-lk201.el
@@ -3,8 +3,8 @@
 ;; Copyright (C) 1986, 1992-1993, 1995, 2001-2016 Free Software
 ;; Foundation, Inc.
 
-;; Author: Kevin Gallagher <address@hidden>
-;; Maintainer: Kevin Gallagher <address@hidden>
+;; Author: Kevin Gallagher <address@hidden>
+;; Maintainer: Kevin Gallagher <address@hidden>
 ;; Keywords: emulations
 ;; Package: edt
 
diff --git a/lisp/emulation/edt-mapper.el b/lisp/emulation/edt-mapper.el
index df32ac0..0bba9e3 100644
--- a/lisp/emulation/edt-mapper.el
+++ b/lisp/emulation/edt-mapper.el
@@ -2,8 +2,8 @@
 
 ;; Copyright (C) 1994-1995, 2000-2016 Free Software Foundation, Inc.
 
-;; Author: Kevin Gallagher <address@hidden>
-;; Maintainer: Kevin Gallagher <address@hidden>
+;; Author: Kevin Gallagher <address@hidden>
+;; Maintainer: Kevin Gallagher <address@hidden>
 ;; Keywords: emulations
 ;; Package: edt
 
diff --git a/lisp/emulation/edt-pc.el b/lisp/emulation/edt-pc.el
index 13b60fb..1f55f4a 100644
--- a/lisp/emulation/edt-pc.el
+++ b/lisp/emulation/edt-pc.el
@@ -3,8 +3,8 @@
 ;; Copyright (C) 1986, 1994-1995, 2001-2016 Free Software Foundation,
 ;; Inc.
 
-;; Author: Kevin Gallagher <address@hidden>
-;; Maintainer: Kevin Gallagher <address@hidden>
+;; Author: Kevin Gallagher <address@hidden>
+;; Maintainer: Kevin Gallagher <address@hidden>
 ;; Keywords: emulations
 ;; Package: edt
 
diff --git a/lisp/emulation/edt-vt100.el b/lisp/emulation/edt-vt100.el
index 1f134f7..019283e 100644
--- a/lisp/emulation/edt-vt100.el
+++ b/lisp/emulation/edt-vt100.el
@@ -3,8 +3,8 @@
 ;; Copyright (C) 1986, 1992-1993, 1995, 2002-2016 Free Software
 ;; Foundation, Inc.
 
-;; Author: Kevin Gallagher <address@hidden>
-;; Maintainer: Kevin Gallagher <address@hidden>
+;; Author: Kevin Gallagher <address@hidden>
+;; Maintainer: Kevin Gallagher <address@hidden>
 ;; Keywords: emulations
 ;; Package: edt
 
diff --git a/lisp/emulation/edt.el b/lisp/emulation/edt.el
index 1e55fd8..6bda15b 100644
--- a/lisp/emulation/edt.el
+++ b/lisp/emulation/edt.el
@@ -3,8 +3,8 @@
 ;; Copyright (C) 1986, 1992-1995, 2000-2016 Free Software Foundation,
 ;; Inc.
 
-;; Author: Kevin Gallagher <address@hidden>
-;; Maintainer: Kevin Gallagher <address@hidden>
+;; Author: Kevin Gallagher <address@hidden>
+;; Maintainer: Kevin Gallagher <address@hidden>
 ;; Keywords: emulations
 
 ;; This file is part of GNU Emacs.
@@ -59,7 +59,8 @@
 ;; The EDT emulation consists of the following files:
 ;;
 ;; edt.texi         - User manual
-;; edt-user.el      - Sample Customization File
+;; edt-user.el      - Sample Customization File (located in Emacs
+;;                      distribution etc directory)
 ;; edt.el           - EDT Emulation Functions and Default Configuration
 ;; edt-lk201.el     - Built-in support for DEC LK-201 Keyboards
 ;; edt-vt100.el     - Built-in support for DEC VT-100 (and above) terminals
diff --git a/lisp/simple.el b/lisp/simple.el
index cce62c2..4efad8c 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -6736,7 +6736,13 @@ current object."
 (defun backward-word (&optional arg)
   "Move backward until encountering the beginning of a word.
 With argument ARG, do this that many times.
-If ARG is omitted or nil, move point backward one word."
+If ARG is omitted or nil, move point backward one word.
+
+The word boundaries are normally determined by the buffer's syntax
+table, but `find-word-boundary-function-table', such as set up
+by `subword-mode', can change that.  If a Lisp program needs to
+move by words determined strictly by the syntax table, it should
+use `backward-word-strictly' instead."
   (interactive "^p")
   (forward-word (- (or arg 1))))
 
diff --git a/src/emacs.c b/src/emacs.c
index 540bf73..628b9be 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -1315,6 +1315,11 @@ Using an Emacs configured with --with-x-toolkit=lucid 
does not have this problem
   init_ntproc (dumping); /* must precede init_editfns.  */
 #endif
 
+#ifdef HAVE_NS
+  /* Initialise the locale from user defaults. */
+  ns_init_locale();
+#endif
+
   /* Initialize and GC-protect Vinitial_environment and
      Vprocess_environment before set_initial_environment fills them
      in.  */
diff --git a/src/image.c b/src/image.c
index f22394f..af65fde 100644
--- a/src/image.c
+++ b/src/image.c
@@ -8672,7 +8672,7 @@ imagemagick_load_image (struct frame *f, struct image 
*img,
     image_spec_value (img->spec, QCbackground, NULL); if (!STRINGP
     (specified_bg).  */
   value = image_spec_value (img->spec, QCrotation, NULL);
-  if (FLOATP (value) || INTEGERP (value))
+  if (FLOATP (value))
     {
       rotation = extract_float (value);
       status = MagickRotateImage (image_wand, bg_wand, rotation);
diff --git a/src/nsterm.h b/src/nsterm.h
index 6ca584e..fa5399c 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -1141,6 +1141,8 @@ extern void  ns_retain_object (void *obj);
 extern void *ns_alloc_autorelease_pool (void);
 extern void ns_release_autorelease_pool (void *);
 extern const char *ns_get_defaults_value (const char *key);
+extern void ns_init_locale (void);
+
 
 /* in nsmenu */
 extern void update_frame_tool_bar (struct frame *f);
diff --git a/src/nsterm.m b/src/nsterm.m
index f77aadb..43d1377 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -586,6 +586,27 @@ ns_load_path (void)
 
 
 void
+ns_init_locale (void)
+/* OS X doesn't set any environment variables for the locale when run
+   from the GUI. Get the locale from the OS and set LANG. */
+{
+  NSLocale *locale = [NSLocale currentLocale];
+
+  NSTRACE ("ns_init_locale");
+
+  @try
+    {
+      /* Set LANG to locale, but not if LANG is already set. */
+      setenv("LANG", [[locale localeIdentifier] UTF8String], 0);
+    }
+  @catch (NSException *e)
+    {
+      NSLog (@"Locale detection failed: %@: %@", [e name], [e reason]);
+    }
+}
+
+
+void
 ns_release_object (void *obj)
 /* --------------------------------------------------------------------------
     Release an object (callable from C)
diff --git a/src/syntax.c b/src/syntax.c
index db5a99d..249d0d5 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -1536,9 +1536,15 @@ DEFUN ("forward-word", Fforward_word, Sforward_word, 0, 
1, "^p",
        doc: /* Move point forward ARG words (backward if ARG is negative).
 If ARG is omitted or nil, move point forward one word.
 Normally returns t.
-If an edge of the buffer or a field boundary is reached, point is left there
-and the function returns nil.  Field boundaries are not noticed if
-`inhibit-field-text-motion' is non-nil.  */)
+If an edge of the buffer or a field boundary is reached, point is
+left there and the function returns nil.  Field boundaries are not
+noticed if `inhibit-field-text-motion' is non-nil.
+
+The word boundaries are normally determined by the buffer's syntax
+table, but `find-word-boundary-function-table', such as set up
+by `subword-mode', can change that.  If a Lisp program needs to
+move by words determined strictly by the syntax table, it should
+use `forward-word-strictly' instead.  */)
   (Lisp_Object arg)
 {
   Lisp_Object tmp;
diff --git a/test/README b/test/README
index 244832d..d2aee9b 100644
--- a/test/README
+++ b/test/README
@@ -1,4 +1,62 @@
+Copyright (C) 2008-2016 Free Software Foundation, Inc.
+See the end of the file for license conditions.
+
 This directory contains files intended to test various aspects of
 Emacs's functionality.  Please help add tests!
 
+Emacs uses ERT, Emacs Lisp Regression Testing, for testing.  See (info
+"(ert)") or https://www.gnu.org/software/emacs/manual/html_node/ert/
+for more information on writing and running tests.
+
+All ERT test files are supposed to run from subdirectory automated/.
+The Makefile in that directory supports the following targets:
+
+* make check
+  Run all tests as defined in the directory.  Expensive tests are
+  suppressed.  The result of the tests for <filename>.el is stored in
+  <filename>.log.
+
+* make check-maybe
+  Like "make check", but run only the tests for files which have
+  unresolved prerequisites.
+
+* make check-expensive
+  Like "make check", but run also the tests marked as expensive.
+
+* make <filename>  or  make <filename>.log
+  Run all tests declared in <filename>.el.  This includes expensive
+  tests.  In the former case the output is shown on the terminal, in
+  the latter case the output is written to <filename>.log.
+
+ERT offers selectors, which make it possible to filter out which test
+cases shall run.  The make variable $(SELECTOR) gives you a simple
+mean to use your own selectors.  The ERT manual describes how
+selectors are constructed, see (info "(ert)Test Selectors") or
+https://www.gnu.org/software/emacs/manual/html_node/ert/Test-Selectors.html
+
+You could use predefined selectors of the Makefile.  "make <filename>
+SELECTOR='$(SELECTOR_DEFAULT)'" runs all tests for <filename>.el
+except the tests tagged as expensive.
+
+If your test file contains the tests "test-foo", "test2-foo" and
+"test-foo-remote", and you want to run only the former two tests, you
+could use a selector regexp: "make <filename> SELECTOR='\"foo$$\"'".
+
+
 (Also, see etc/compilation.txt for compilation mode font lock tests.)
+
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]