mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-04 11:00:45 -08:00
Merge from origin/emacs-25
f5d6b9bRevert "Support integer image rotation and respect EXIF rotations"afe7d1fRevert "Document EXIF image rotation"c6f377cDocument OS X LANG defaulteb4a18cSet locale when run from OS X GUI456c0a3make-docfile cleanup for I/O, etc.25ec995Memory-management cleanup in make-docfile02d925eKevin Gallagher has new email address4ef153bImprove doc strings of 'forward/backward-word-strictly'3ad05a0Describe Makefile test targets in test/README
This commit is contained in:
commit
a644fa3675
19 changed files with 313 additions and 176 deletions
|
|
@ -57,6 +57,10 @@
|
||||||
#
|
#
|
||||||
# make docs
|
# make docs
|
||||||
# Make Emacs documentation files from their sources; requires makeinfo.
|
# 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@
|
SHELL = @SHELL@
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
@env{LANG} is not set. But if @env{LC_ALL} is specified, it overrides
|
||||||
the settings of all the other locale environment variables.
|
the settings of all the other locale environment variables.
|
||||||
|
|
||||||
On MS-Windows, if @env{LANG} is not already set in the environment
|
On MS-Windows and OS X, if @env{LANG} is not already set in the
|
||||||
when Emacs starts, Emacs sets it based on the system-wide default
|
environment, Emacs sets it based on the system-wide default. You can
|
||||||
language, which you can set in the @samp{Regional Settings} Control Panel
|
set this in the ``Regional Settings'' Control Panel on some versions
|
||||||
on some versions of MS-Windows.
|
of MS-Windows, and in the ``Language and Region'' System Preference on
|
||||||
|
OS X.
|
||||||
|
|
||||||
The value of the @env{LC_CTYPE} category is
|
The value of the @env{LC_CTYPE} category is
|
||||||
matched against entries in @code{locale-language-names},
|
matched against entries in @code{locale-language-names},
|
||||||
|
|
|
||||||
|
|
@ -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.
|
hint to ImageMagick to help it detect the image type.
|
||||||
|
|
||||||
@item :rotation @var{angle}
|
@item :rotation @var{angle}
|
||||||
Specifies a rotation angle in degrees. If no rotation is explicitly
|
Specifies a rotation angle in degrees.
|
||||||
specified, and the @acronym{EXIF} headers specify a rotation, the
|
|
||||||
rotation from the @acronym{EXIF} headers are used instead.
|
|
||||||
|
|
||||||
@item :index @var{frame}
|
@item :index @var{frame}
|
||||||
@c Doesn't work: http://debbugs.gnu.org/7978
|
@c Doesn't work: http://debbugs.gnu.org/7978
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ modify this GNU manual.''
|
||||||
@titlepage
|
@titlepage
|
||||||
@title EDT Emulation User's Manual
|
@title EDT Emulation User's Manual
|
||||||
@author Kevin Gallagher
|
@author Kevin Gallagher
|
||||||
@author @email{Kevin.Gallagher@@boeing.com}
|
@author @email{kevin.gal@verizon.net}
|
||||||
@page
|
@page
|
||||||
@vskip 0pt plus 1filll
|
@vskip 0pt plus 1filll
|
||||||
@insertcopying
|
@insertcopying
|
||||||
|
|
@ -106,7 +106,8 @@ how to customize it to your liking.
|
||||||
@file{edt.texi}---This manual.
|
@file{edt.texi}---This manual.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
@file{edt-user.el}---An example customization file.
|
@file{edt-user.el}---An example customization file (located in the
|
||||||
|
Emacs distribution etc directory).
|
||||||
|
|
||||||
@item
|
@item
|
||||||
@file{edt.el}---EDT emulation functions and default configuration.
|
@file{edt.el}---EDT emulation functions and default configuration.
|
||||||
|
|
|
||||||
4
etc/NEWS
4
etc/NEWS
|
|
@ -717,10 +717,6 @@ character-folds into STRING.
|
||||||
text in the region. The search engine to use for this is specified by
|
text in the region. The search engine to use for this is specified by
|
||||||
the customizable variable `eww-search-prefix'.
|
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.
|
*** Query-replace history is enhanced.
|
||||||
When query-replace reads the FROM string from the minibuffer, typing
|
When query-replace reads the FROM string from the minibuffer, typing
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
;; Copyright (C) 1986, 1992-1993, 2000-2016 Free Software Foundation,
|
;; Copyright (C) 1986, 1992-1993, 2000-2016 Free Software Foundation,
|
||||||
;; Inc.
|
;; Inc.
|
||||||
|
|
||||||
;; Author: Kevin Gallagher <kgallagh@@spd.dsccc.com>
|
;; Author: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Maintainer: Kevin Gallagher <kgallagh@@spd.dsccc.com>
|
;; Maintainer: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Keywords: emulations
|
;; Keywords: emulations
|
||||||
|
|
||||||
;; This file is part of GNU Emacs.
|
;; This file is part of GNU Emacs.
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h> /* config.h unconditionally includes this anyway */
|
#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 */
|
#endif /* WINDOWSNT */
|
||||||
|
|
||||||
#include <binary-io.h>
|
#include <binary-io.h>
|
||||||
|
#include <intprops.h>
|
||||||
|
#include <min-max.h>
|
||||||
|
|
||||||
#ifdef DOS_NT
|
#ifdef DOS_NT
|
||||||
/* Defined to be sys_chdir in ms-w32.h, but only #ifdef emacs, so this
|
/* 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) == '/')
|
#define IS_SLASH(c) ((c) == '/')
|
||||||
#endif /* not DOS_NT */
|
#endif /* not DOS_NT */
|
||||||
|
|
||||||
static int scan_file (char *filename);
|
static void scan_file (char *filename);
|
||||||
static int scan_lisp_file (const char *filename, const char *mode);
|
static void scan_lisp_file (const char *filename, const char *mode);
|
||||||
static int scan_c_file (char *filename, const char *mode);
|
static void scan_c_file (char *filename, const char *mode);
|
||||||
static int scan_c_stream (FILE *infile);
|
static void scan_c_stream (FILE *infile);
|
||||||
static void start_globals (void);
|
static void start_globals (void);
|
||||||
static void write_globals (void);
|
static void write_globals (void);
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
/* Name this program was invoked with. */
|
/* Name this program was invoked with. */
|
||||||
char *progname;
|
static char *progname;
|
||||||
|
|
||||||
/* Nonzero if this invocation is generating globals.h. */
|
/* True if this invocation is generating globals.h. */
|
||||||
int generate_globals;
|
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 ATTRIBUTE_FORMAT_PRINTF (1, 0)
|
||||||
static void
|
verror (char const *m, va_list ap)
|
||||||
error (const char *s1, const char *s2)
|
|
||||||
{
|
{
|
||||||
fprintf (stderr, "%s: ", progname);
|
fprintf (stderr, "%s: ", progname);
|
||||||
fprintf (stderr, s1, s2);
|
vfprintf (stderr, m, ap);
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print error message and exit. */
|
/* Print error message. Args are like printf. */
|
||||||
|
|
||||||
/* VARARGS1 */
|
static void ATTRIBUTE_FORMAT_PRINTF (1, 2)
|
||||||
static _Noreturn void
|
error (char const *m, ...)
|
||||||
fatal (const char *s1, const char *s2)
|
|
||||||
{
|
{
|
||||||
error (s1, s2);
|
va_list ap;
|
||||||
|
va_start (ap, m);
|
||||||
|
verror (m, ap);
|
||||||
|
va_end (ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print error message and exit. Args are like printf. */
|
||||||
|
|
||||||
|
static _Noreturn void ATTRIBUTE_FORMAT_PRINTF (1, 2)
|
||||||
|
fatal (char const *m, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start (ap, m);
|
||||||
|
verror (m, ap);
|
||||||
|
va_end (ap);
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static _Noreturn void
|
||||||
|
memory_exhausted (void)
|
||||||
|
{
|
||||||
|
fatal ("virtual memory exhausted");
|
||||||
|
}
|
||||||
|
|
||||||
/* Like malloc but get fatal error if memory is exhausted. */
|
/* Like malloc but get fatal error if memory is exhausted. */
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
xmalloc (unsigned int size)
|
xmalloc (ptrdiff_t size)
|
||||||
{
|
{
|
||||||
void *result = (void *) malloc (size);
|
void *result = malloc (size);
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
fatal ("virtual memory exhausted", 0);
|
memory_exhausted ();
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Like strdup, but get fatal error if memory is exhausted. */
|
|
||||||
|
|
||||||
static char *
|
|
||||||
xstrdup (char *s)
|
|
||||||
{
|
|
||||||
char *result = strdup (s);
|
|
||||||
if (! result)
|
|
||||||
fatal ("virtual memory exhausted", 0);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like realloc but get fatal error if memory is exhausted. */
|
/* Like realloc but get fatal error if memory is exhausted. */
|
||||||
|
|
||||||
static void *
|
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)
|
if (result == NULL)
|
||||||
fatal ("virtual memory exhausted", 0);
|
memory_exhausted ();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -135,7 +146,6 @@ int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int err_count = 0;
|
|
||||||
|
|
||||||
progname = argv[0];
|
progname = argv[0];
|
||||||
|
|
||||||
|
|
@ -170,7 +180,7 @@ main (int argc, char **argv)
|
||||||
}
|
}
|
||||||
if (argc > i && !strcmp (argv[i], "-g"))
|
if (argc > i && !strcmp (argv[i], "-g"))
|
||||||
{
|
{
|
||||||
generate_globals = 1;
|
generate_globals = true;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -192,14 +202,17 @@ main (int argc, char **argv)
|
||||||
if (strcmp (argv[i], argv[j]) == 0)
|
if (strcmp (argv[i], argv[j]) == 0)
|
||||||
break;
|
break;
|
||||||
if (j == i)
|
if (j == i)
|
||||||
err_count += scan_file (argv[i]);
|
scan_file (argv[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err_count == 0 && generate_globals)
|
if (generate_globals)
|
||||||
write_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. */
|
/* 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.
|
/* 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)
|
scan_file (char *filename)
|
||||||
{
|
{
|
||||||
|
ptrdiff_t len = strlen (filename);
|
||||||
size_t len = strlen (filename);
|
|
||||||
|
|
||||||
if (!generate_globals)
|
if (!generate_globals)
|
||||||
put_filename (filename);
|
put_filename (filename);
|
||||||
if (len > 4 && !strcmp (filename + len - 4, ".elc"))
|
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"))
|
else if (len > 3 && !strcmp (filename + len - 3, ".el"))
|
||||||
return scan_lisp_file (filename, "r");
|
scan_lisp_file (filename, "r");
|
||||||
else
|
else
|
||||||
return scan_c_file (filename, "r");
|
scan_c_file (filename, "r");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -250,7 +262,7 @@ static char input_buffer[128];
|
||||||
struct rcsoc_state
|
struct rcsoc_state
|
||||||
{
|
{
|
||||||
/* A count of spaces and newlines that have been read, but not output. */
|
/* 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. */
|
/* Where we're reading from. */
|
||||||
FILE *in_file;
|
FILE *in_file;
|
||||||
|
|
@ -267,16 +279,16 @@ struct rcsoc_state
|
||||||
the input stream. */
|
the input stream. */
|
||||||
const char *cur_keyword_ptr;
|
const char *cur_keyword_ptr;
|
||||||
/* Set to true if we saw an occurrence of KEYWORD. */
|
/* 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
|
/* Output CH to the file or buffer in STATE. Any pending newlines or
|
||||||
spaces are output first. */
|
spaces are output first. */
|
||||||
|
|
||||||
static void
|
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
|
do
|
||||||
{
|
{
|
||||||
if (state->pending_newlines > 0)
|
if (state->pending_newlines > 0)
|
||||||
|
|
@ -307,7 +319,7 @@ put_char (int ch, struct rcsoc_state *state)
|
||||||
keyword, but were in fact not. */
|
keyword, but were in fact not. */
|
||||||
|
|
||||||
static void
|
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
|
if (state->keyword
|
||||||
&& *state->cur_keyword_ptr == ch
|
&& *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')
|
if (*++state->cur_keyword_ptr == '\0')
|
||||||
/* Saw the whole keyword. Set SAW_KEYWORD flag to true. */
|
/* Saw the whole keyword. Set SAW_KEYWORD flag to true. */
|
||||||
{
|
{
|
||||||
state->saw_keyword = 1;
|
state->saw_keyword = true;
|
||||||
|
|
||||||
/* Reset the scanning pointer. */
|
/* Reset the scanning pointer. */
|
||||||
state->cur_keyword_ptr = state->keyword;
|
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
|
/* Skip any whitespace between the keyword and the
|
||||||
usage string. */
|
usage string. */
|
||||||
|
int c;
|
||||||
do
|
do
|
||||||
ch = getc (state->in_file);
|
c = getc (state->in_file);
|
||||||
while (ch == ' ' || ch == '\n');
|
while (c == ' ' || c == '\n');
|
||||||
|
|
||||||
/* Output the open-paren we just read. */
|
/* 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'. */
|
/* Skip the function name and replace it with `fn'. */
|
||||||
do
|
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 ('f', state);
|
||||||
put_char ('n', state);
|
put_char ('n', state);
|
||||||
|
|
||||||
/* Put back the last character. */
|
/* Put back the last character. */
|
||||||
ungetc (ch, state->in_file);
|
ungetc (c, state->in_file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
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
|
/* 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
|
PRINTFLAG is positive, output string contents to stdout. If it is
|
||||||
negative, store contents in buf. Convert escape sequences \n and
|
negative, store contents in buf. Convert escape sequences \n and
|
||||||
\t to newline and tab; discard \ followed by newline.
|
\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
|
at the beginning of a line will be removed, and *SAW_USAGE set to
|
||||||
true if any were encountered. */
|
true if any were encountered. */
|
||||||
|
|
||||||
static int
|
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;
|
struct rcsoc_state state;
|
||||||
|
|
||||||
state.in_file = infile;
|
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.pending_newlines = 0;
|
||||||
state.keyword = (saw_usage ? "usage:" : 0);
|
state.keyword = (saw_usage ? "usage:" : 0);
|
||||||
state.cur_keyword_ptr = state.keyword;
|
state.cur_keyword_ptr = state.keyword;
|
||||||
state.saw_keyword = 0;
|
state.saw_keyword = false;
|
||||||
|
|
||||||
c = getc (infile);
|
c = getc (infile);
|
||||||
if (comment)
|
if (comment)
|
||||||
|
|
@ -468,10 +488,10 @@ read_c_string_or_comment (FILE *infile, int printflag, int comment, int *saw_usa
|
||||||
static void
|
static void
|
||||||
write_c_args (char *func, char *buf, int minargs, int maxargs)
|
write_c_args (char *func, char *buf, int minargs, int maxargs)
|
||||||
{
|
{
|
||||||
register char *p;
|
char *p;
|
||||||
int in_ident = 0;
|
bool in_ident = false;
|
||||||
char *ident_start IF_LINT (= NULL);
|
char *ident_start IF_LINT (= NULL);
|
||||||
size_t ident_length = 0;
|
ptrdiff_t ident_length = 0;
|
||||||
|
|
||||||
fputs ("(fn", stdout);
|
fputs ("(fn", stdout);
|
||||||
|
|
||||||
|
|
@ -491,12 +511,12 @@ write_c_args (char *func, char *buf, int minargs, int maxargs)
|
||||||
{
|
{
|
||||||
if (!in_ident)
|
if (!in_ident)
|
||||||
{
|
{
|
||||||
in_ident = 1;
|
in_ident = true;
|
||||||
ident_start = p;
|
ident_start = p;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
in_ident = 0;
|
in_ident = false;
|
||||||
ident_length = p - ident_start;
|
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'
|
/* All the variable names we saw while scanning C sources in `-g'
|
||||||
mode. */
|
mode. */
|
||||||
int num_globals;
|
static ptrdiff_t num_globals;
|
||||||
int num_globals_allocated;
|
static ptrdiff_t num_globals_allocated;
|
||||||
struct global *globals;
|
static struct global *globals;
|
||||||
|
|
||||||
static struct global *
|
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. */
|
/* Ignore the one non-symbol that can occur. */
|
||||||
if (strcmp (name, "..."))
|
if (strcmp (name, "..."))
|
||||||
{
|
{
|
||||||
|
if (num_globals == num_globals_allocated)
|
||||||
|
{
|
||||||
|
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;
|
++num_globals;
|
||||||
|
|
||||||
if (num_globals_allocated == 0)
|
ptrdiff_t namesize = strlen (name) + 1;
|
||||||
{
|
char *buf = xmalloc (namesize + (svalue ? strlen (svalue) + 1 : 0));
|
||||||
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
globals[num_globals - 1].type = type;
|
globals[num_globals - 1].type = type;
|
||||||
globals[num_globals - 1].name = name;
|
globals[num_globals - 1].name = strcpy (buf, name);
|
||||||
if (svalue)
|
if (svalue)
|
||||||
globals[num_globals - 1].v.svalue = svalue;
|
globals[num_globals - 1].v.svalue = strcpy (buf + namesize, svalue);
|
||||||
else
|
else
|
||||||
globals[num_globals - 1].v.value = value;
|
globals[num_globals - 1].v.value = value;
|
||||||
globals[num_globals - 1].flags = 0;
|
globals[num_globals - 1].flags = 0;
|
||||||
|
|
@ -634,7 +658,7 @@ compare_globals (const void *a, const void *b)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
close_emacs_globals (int num_symbols)
|
close_emacs_globals (ptrdiff_t num_symbols)
|
||||||
{
|
{
|
||||||
printf (("};\n"
|
printf (("};\n"
|
||||||
"extern struct emacs_globals globals;\n"
|
"extern struct emacs_globals globals;\n"
|
||||||
|
|
@ -642,17 +666,17 @@ close_emacs_globals (int num_symbols)
|
||||||
"#ifndef DEFINE_SYMBOLS\n"
|
"#ifndef DEFINE_SYMBOLS\n"
|
||||||
"extern\n"
|
"extern\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"struct Lisp_Symbol alignas (GCALIGNMENT) lispsym[%d];\n"),
|
"struct Lisp_Symbol alignas (GCALIGNMENT) lispsym[%td];\n"),
|
||||||
num_symbols);
|
num_symbols);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write_globals (void)
|
write_globals (void)
|
||||||
{
|
{
|
||||||
int i, j;
|
ptrdiff_t i, j;
|
||||||
bool seen_defun = false;
|
bool seen_defun = false;
|
||||||
int symnum = 0;
|
ptrdiff_t symnum = 0;
|
||||||
int num_symbols = 0;
|
ptrdiff_t num_symbols = 0;
|
||||||
qsort (globals, num_globals, sizeof (struct global), compare_globals);
|
qsort (globals, num_globals, sizeof (struct global), compare_globals);
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
|
|
@ -665,6 +689,7 @@ write_globals (void)
|
||||||
&& globals[i].v.value != globals[i + 1].v.value)
|
&& globals[i].v.value != globals[i + 1].v.value)
|
||||||
error ("function '%s' defined twice with differing signatures",
|
error ("function '%s' defined twice with differing signatures",
|
||||||
globals[i].name);
|
globals[i].name);
|
||||||
|
free (globals[i].name);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
num_symbols += globals[i].type == SYMBOL;
|
num_symbols += globals[i].type == SYMBOL;
|
||||||
|
|
@ -697,7 +722,7 @@ write_globals (void)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fatal ("not a recognized DEFVAR_", 0);
|
fatal ("not a recognized DEFVAR_");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type)
|
if (type)
|
||||||
|
|
@ -707,7 +732,7 @@ write_globals (void)
|
||||||
globals[i].name, globals[i].name);
|
globals[i].name, globals[i].name);
|
||||||
}
|
}
|
||||||
else if (globals[i].type == SYMBOL)
|
else if (globals[i].type == SYMBOL)
|
||||||
printf (("#define i%s %d\n"
|
printf (("#define i%s %td\n"
|
||||||
"DEFINE_LISP_SYMBOL (%s)\n"),
|
"DEFINE_LISP_SYMBOL (%s)\n"),
|
||||||
globals[i].name, symnum++, globals[i].name);
|
globals[i].name, symnum++, globals[i].name);
|
||||||
else
|
else
|
||||||
|
|
@ -736,7 +761,7 @@ write_globals (void)
|
||||||
|
|
||||||
puts ("#ifdef DEFINE_SYMBOLS");
|
puts ("#ifdef DEFINE_SYMBOLS");
|
||||||
puts ("static char const *const defsym_name[] = {");
|
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)
|
if (globals[i].type == SYMBOL)
|
||||||
printf ("\t\"%s\",\n", globals[i].v.svalue);
|
printf ("\t\"%s\",\n", globals[i].v.svalue);
|
||||||
puts ("};");
|
puts ("};");
|
||||||
|
|
@ -745,9 +770,9 @@ write_globals (void)
|
||||||
puts ("#define Qnil builtin_lisp_symbol (0)");
|
puts ("#define Qnil builtin_lisp_symbol (0)");
|
||||||
puts ("#if DEFINE_NON_NIL_Q_SYMBOL_MACROS");
|
puts ("#if DEFINE_NON_NIL_Q_SYMBOL_MACROS");
|
||||||
num_symbols = 0;
|
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)
|
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);
|
globals[i].name, num_symbols - 1);
|
||||||
puts ("#endif");
|
puts ("#endif");
|
||||||
}
|
}
|
||||||
|
|
@ -758,11 +783,11 @@ write_globals (void)
|
||||||
Looks for DEFUN constructs such as are defined in ../src/lisp.h.
|
Looks for DEFUN constructs such as are defined in ../src/lisp.h.
|
||||||
Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */
|
Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */
|
||||||
|
|
||||||
static int
|
static void
|
||||||
scan_c_file (char *filename, const char *mode)
|
scan_c_file (char *filename, const char *mode)
|
||||||
{
|
{
|
||||||
FILE *infile;
|
FILE *infile;
|
||||||
int extension = filename[strlen (filename) - 1];
|
char extension = filename[strlen (filename) - 1];
|
||||||
|
|
||||||
if (extension == 'o')
|
if (extension == 'o')
|
||||||
filename[strlen (filename) - 1] = 'c';
|
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. */
|
filename[strlen (filename) - 1] = 'c'; /* Don't confuse people. */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No error if non-ex input file. */
|
|
||||||
if (infile == NULL)
|
if (infile == NULL)
|
||||||
{
|
{
|
||||||
perror (filename);
|
perror (filename);
|
||||||
return 0;
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset extension to be able to detect duplicate files. */
|
/* Reset extension to be able to detect duplicate files. */
|
||||||
filename[strlen (filename) - 1] = extension;
|
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,
|
/* 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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static void
|
||||||
scan_c_stream (FILE *infile)
|
scan_c_stream (FILE *infile)
|
||||||
{
|
{
|
||||||
int commas, minargs, maxargs;
|
int commas, minargs, maxargs;
|
||||||
|
|
@ -815,12 +839,13 @@ scan_c_stream (FILE *infile)
|
||||||
|
|
||||||
while (!feof (infile))
|
while (!feof (infile))
|
||||||
{
|
{
|
||||||
int doc_keyword = 0;
|
bool doc_keyword = false;
|
||||||
int defunflag = 0;
|
bool defunflag = false;
|
||||||
int defvarperbufferflag = 0;
|
bool defvarperbufferflag = false;
|
||||||
int defvarflag = 0;
|
bool defvarflag = false;
|
||||||
enum global_type type = INVALID;
|
enum global_type type = INVALID;
|
||||||
char *name IF_LINT (= 0);
|
static char *name;
|
||||||
|
static ptrdiff_t name_size;
|
||||||
|
|
||||||
if (c != '\n' && c != '\r')
|
if (c != '\n' && c != '\r')
|
||||||
{
|
{
|
||||||
|
|
@ -866,7 +891,7 @@ scan_c_stream (FILE *infile)
|
||||||
if (c != '_')
|
if (c != '_')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
defvarflag = 1;
|
defvarflag = true;
|
||||||
|
|
||||||
c = getc (infile);
|
c = getc (infile);
|
||||||
defvarperbufferflag = (c == 'P');
|
defvarperbufferflag = (c == 'P');
|
||||||
|
|
@ -920,12 +945,12 @@ scan_c_stream (FILE *infile)
|
||||||
c = getc (infile);
|
c = getc (infile);
|
||||||
if (c != '"')
|
if (c != '"')
|
||||||
continue;
|
continue;
|
||||||
c = read_c_string_or_comment (infile, -1, 0, 0);
|
c = read_c_string_or_comment (infile, -1, false, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (generate_globals)
|
if (generate_globals)
|
||||||
{
|
{
|
||||||
int i = 0;
|
ptrdiff_t i = 0;
|
||||||
char const *svalue = 0;
|
char const *svalue = 0;
|
||||||
|
|
||||||
/* Skip "," and whitespace. */
|
/* Skip "," and whitespace. */
|
||||||
|
|
@ -947,7 +972,16 @@ scan_c_stream (FILE *infile)
|
||||||
|| c == '\n' || c == '\r'));
|
|| c == '\n' || c == '\r'));
|
||||||
input_buffer[i] = '\0';
|
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);
|
memcpy (name, input_buffer, i + 1);
|
||||||
|
|
||||||
if (type == SYMBOL)
|
if (type == SYMBOL)
|
||||||
|
|
@ -957,8 +991,8 @@ scan_c_stream (FILE *infile)
|
||||||
while (c == ' ' || c == '\t' || c == '\n' || c == '\r');
|
while (c == ' ' || c == '\t' || c == '\n' || c == '\r');
|
||||||
if (c != '"')
|
if (c != '"')
|
||||||
continue;
|
continue;
|
||||||
c = read_c_string_or_comment (infile, -1, 0, 0);
|
c = read_c_string_or_comment (infile, -1, false, 0);
|
||||||
svalue = xstrdup (input_buffer);
|
svalue = input_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!defunflag)
|
if (!defunflag)
|
||||||
|
|
@ -1024,6 +1058,8 @@ scan_c_stream (FILE *infile)
|
||||||
if (generate_globals)
|
if (generate_globals)
|
||||||
{
|
{
|
||||||
struct global *g = add_global (FUNCTION, name, maxargs, 0);
|
struct global *g = add_global (FUNCTION, name, maxargs, 0);
|
||||||
|
if (!g)
|
||||||
|
continue;
|
||||||
|
|
||||||
/* The following code tries to recognize function attributes
|
/* The following code tries to recognize function attributes
|
||||||
specified after the docstring, e.g.:
|
specified after the docstring, e.g.:
|
||||||
|
|
@ -1087,7 +1123,7 @@ scan_c_stream (FILE *infile)
|
||||||
c = getc (infile);
|
c = getc (infile);
|
||||||
|
|
||||||
if (c == '"')
|
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 != '/')
|
while (c != EOF && c != ',' && c != '/')
|
||||||
c = getc (infile);
|
c = getc (infile);
|
||||||
|
|
@ -1100,7 +1136,7 @@ scan_c_stream (FILE *infile)
|
||||||
c = getc (infile);
|
c = getc (infile);
|
||||||
if (c == ':')
|
if (c == ':')
|
||||||
{
|
{
|
||||||
doc_keyword = 1;
|
doc_keyword = true;
|
||||||
c = getc (infile);
|
c = getc (infile);
|
||||||
while (c == ' ' || c == '\n' || c == '\r' || c == '\t')
|
while (c == ' ' || c == '\n' || c == '\r' || c == '\t')
|
||||||
c = getc (infile);
|
c = getc (infile);
|
||||||
|
|
@ -1113,8 +1149,8 @@ scan_c_stream (FILE *infile)
|
||||||
ungetc (c, infile),
|
ungetc (c, infile),
|
||||||
c == '*')))
|
c == '*')))
|
||||||
{
|
{
|
||||||
int comment = c != '"';
|
bool comment = c != '"';
|
||||||
int saw_usage;
|
bool saw_usage;
|
||||||
|
|
||||||
printf ("\037%c%s\n", defvarflag ? 'V' : 'F', input_buffer);
|
printf ("\037%c%s\n", defvarflag ? 'V' : 'F', input_buffer);
|
||||||
|
|
||||||
|
|
@ -1168,8 +1204,8 @@ scan_c_stream (FILE *infile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
eof:
|
eof:
|
||||||
fclose (infile);
|
if (ferror (infile) || fclose (infile) != 0)
|
||||||
return 0;
|
fatal ("read error");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read a file of Lisp code, compiled or interpreted.
|
/* Read a file of Lisp code, compiled or interpreted.
|
||||||
|
|
@ -1245,7 +1281,7 @@ read_lisp_symbol (FILE *infile, char *buffer)
|
||||||
skip_white (infile);
|
skip_white (infile);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static bool
|
||||||
search_lisp_doc_at_eol (FILE *infile)
|
search_lisp_doc_at_eol (FILE *infile)
|
||||||
{
|
{
|
||||||
int c = 0, c1 = 0, c2 = 0;
|
int c = 0, c1 = 0, c2 = 0;
|
||||||
|
|
@ -1265,20 +1301,19 @@ search_lisp_doc_at_eol (FILE *infile)
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf (stderr, "## non-docstring found\n");
|
fprintf (stderr, "## non-docstring found\n");
|
||||||
#endif
|
#endif
|
||||||
if (c != EOF)
|
ungetc (c, infile);
|
||||||
ungetc (c, infile);
|
return false;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return 1;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEF_ELISP_FILE(fn) { #fn, sizeof(#fn) - 1 }
|
#define DEF_ELISP_FILE(fn) { #fn, sizeof(#fn) - 1 }
|
||||||
|
|
||||||
static int
|
static void
|
||||||
scan_lisp_file (const char *filename, const char *mode)
|
scan_lisp_file (const char *filename, const char *mode)
|
||||||
{
|
{
|
||||||
FILE *infile;
|
FILE *infile;
|
||||||
register int c;
|
int c;
|
||||||
char *saved_string = 0;
|
char *saved_string = 0;
|
||||||
/* These are the only files that are loaded uncompiled, and must
|
/* These are the only files that are loaded uncompiled, and must
|
||||||
follow the conventions of the doc strings expected by this
|
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. */
|
byte compiler when it produces the .elc files. */
|
||||||
static struct {
|
static struct {
|
||||||
const char *fn;
|
const char *fn;
|
||||||
size_t fl;
|
int fl;
|
||||||
} const uncompiled[] = {
|
} const uncompiled[] = {
|
||||||
DEF_ELISP_FILE (loaddefs.el),
|
DEF_ELISP_FILE (loaddefs.el),
|
||||||
DEF_ELISP_FILE (loadup.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 (cp51932.el),
|
||||||
DEF_ELISP_FILE (eucjp-ms.el)
|
DEF_ELISP_FILE (eucjp-ms.el)
|
||||||
};
|
};
|
||||||
int i, match;
|
int i;
|
||||||
size_t flen = strlen (filename);
|
int flen = strlen (filename);
|
||||||
|
|
||||||
if (generate_globals)
|
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"))
|
if (flen > 3 && !strcmp (filename + flen - 3, ".el"))
|
||||||
{
|
{
|
||||||
for (i = 0, match = 0; i < sizeof (uncompiled) / sizeof (uncompiled[0]);
|
bool match = false;
|
||||||
i++)
|
for (i = 0; i < sizeof (uncompiled) / sizeof (uncompiled[0]); i++)
|
||||||
{
|
{
|
||||||
if (uncompiled[i].fl <= flen
|
if (uncompiled[i].fl <= flen
|
||||||
&& !strcmp (filename + flen - uncompiled[i].fl, uncompiled[i].fn)
|
&& !strcmp (filename + flen - uncompiled[i].fl, uncompiled[i].fn)
|
||||||
&& (flen == uncompiled[i].fl
|
&& (flen == uncompiled[i].fl
|
||||||
|| IS_SLASH (filename[flen - uncompiled[i].fl - 1])))
|
|| IS_SLASH (filename[flen - uncompiled[i].fl - 1])))
|
||||||
{
|
{
|
||||||
match = 1;
|
match = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1321,7 +1356,7 @@ scan_lisp_file (const char *filename, const char *mode)
|
||||||
if (infile == NULL)
|
if (infile == NULL)
|
||||||
{
|
{
|
||||||
perror (filename);
|
perror (filename);
|
||||||
return 0; /* No error. */
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
c = '\n';
|
c = '\n';
|
||||||
|
|
@ -1345,22 +1380,24 @@ scan_lisp_file (const char *filename, const char *mode)
|
||||||
c = getc (infile);
|
c = getc (infile);
|
||||||
if (c == '@')
|
if (c == '@')
|
||||||
{
|
{
|
||||||
size_t length = 0;
|
ptrdiff_t length = 0;
|
||||||
size_t i;
|
ptrdiff_t i;
|
||||||
|
|
||||||
/* Read the length. */
|
/* Read the length. */
|
||||||
while ((c = getc (infile),
|
while ((c = getc (infile),
|
||||||
c >= '0' && c <= '9'))
|
c >= '0' && c <= '9'))
|
||||||
{
|
{
|
||||||
length *= 10;
|
if (INT_MULTIPLY_WRAPV (length, 10, &length)
|
||||||
length += c - '0';
|
|| INT_ADD_WRAPV (length, c - '0', &length)
|
||||||
|
|| SIZE_MAX < length)
|
||||||
|
memory_exhausted ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length <= 1)
|
if (length <= 1)
|
||||||
fatal ("invalid dynamic doc string length", "");
|
fatal ("invalid dynamic doc string length");
|
||||||
|
|
||||||
if (c != ' ')
|
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
|
/* The next character is a space that is counted in the length
|
||||||
but not part of the doc string.
|
but not part of the doc string.
|
||||||
|
|
@ -1369,7 +1406,7 @@ scan_lisp_file (const char *filename, const char *mode)
|
||||||
|
|
||||||
/* Read in the contents. */
|
/* Read in the contents. */
|
||||||
free (saved_string);
|
free (saved_string);
|
||||||
saved_string = (char *) xmalloc (length);
|
saved_string = xmalloc (length);
|
||||||
for (i = 0; i < length; i++)
|
for (i = 0; i < length; i++)
|
||||||
saved_string[i] = getc (infile);
|
saved_string[i] = getc (infile);
|
||||||
/* The last character is a ^_.
|
/* The last character is a ^_.
|
||||||
|
|
@ -1568,7 +1605,7 @@ scan_lisp_file (const char *filename, const char *mode)
|
||||||
buffer, filename);
|
buffer, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
read_c_string_or_comment (infile, 0, 0, 0);
|
read_c_string_or_comment (infile, 0, false, 0);
|
||||||
|
|
||||||
if (saved_string == 0)
|
if (saved_string == 0)
|
||||||
if (!search_lisp_doc_at_eol (infile))
|
if (!search_lisp_doc_at_eol (infile))
|
||||||
|
|
@ -1604,10 +1641,11 @@ scan_lisp_file (const char *filename, const char *mode)
|
||||||
saved_string = 0;
|
saved_string = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
read_c_string_or_comment (infile, 1, 0, 0);
|
read_c_string_or_comment (infile, 1, false, 0);
|
||||||
}
|
}
|
||||||
fclose (infile);
|
free (saved_string);
|
||||||
return 0;
|
if (ferror (infile) || fclose (infile) != 0)
|
||||||
|
fatal ("%s: read error", filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
;; Copyright (C) 1986, 1992-1993, 1995, 2001-2016 Free Software
|
;; Copyright (C) 1986, 1992-1993, 1995, 2001-2016 Free Software
|
||||||
;; Foundation, Inc.
|
;; Foundation, Inc.
|
||||||
|
|
||||||
;; Author: Kevin Gallagher <Kevin.Gallagher@boeing.com>
|
;; Author: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Maintainer: Kevin Gallagher <Kevin.Gallagher@boeing.com>
|
;; Maintainer: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Keywords: emulations
|
;; Keywords: emulations
|
||||||
;; Package: edt
|
;; Package: edt
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
;; Copyright (C) 1994-1995, 2000-2016 Free Software Foundation, Inc.
|
;; Copyright (C) 1994-1995, 2000-2016 Free Software Foundation, Inc.
|
||||||
|
|
||||||
;; Author: Kevin Gallagher <Kevin.Gallagher@boeing.com>
|
;; Author: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Maintainer: Kevin Gallagher <Kevin.Gallagher@boeing.com>
|
;; Maintainer: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Keywords: emulations
|
;; Keywords: emulations
|
||||||
;; Package: edt
|
;; Package: edt
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
;; Copyright (C) 1986, 1994-1995, 2001-2016 Free Software Foundation,
|
;; Copyright (C) 1986, 1994-1995, 2001-2016 Free Software Foundation,
|
||||||
;; Inc.
|
;; Inc.
|
||||||
|
|
||||||
;; Author: Kevin Gallagher <Kevin.Gallagher@boeing.com>
|
;; Author: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Maintainer: Kevin Gallagher <Kevin.Gallagher@boeing.com>
|
;; Maintainer: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Keywords: emulations
|
;; Keywords: emulations
|
||||||
;; Package: edt
|
;; Package: edt
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
;; Copyright (C) 1986, 1992-1993, 1995, 2002-2016 Free Software
|
;; Copyright (C) 1986, 1992-1993, 1995, 2002-2016 Free Software
|
||||||
;; Foundation, Inc.
|
;; Foundation, Inc.
|
||||||
|
|
||||||
;; Author: Kevin Gallagher <Kevin.Gallagher@boeing.com>
|
;; Author: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Maintainer: Kevin Gallagher <Kevin.Gallagher@boeing.com>
|
;; Maintainer: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Keywords: emulations
|
;; Keywords: emulations
|
||||||
;; Package: edt
|
;; Package: edt
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
;; Copyright (C) 1986, 1992-1995, 2000-2016 Free Software Foundation,
|
;; Copyright (C) 1986, 1992-1995, 2000-2016 Free Software Foundation,
|
||||||
;; Inc.
|
;; Inc.
|
||||||
|
|
||||||
;; Author: Kevin Gallagher <Kevin.Gallagher@boeing.com>
|
;; Author: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Maintainer: Kevin Gallagher <Kevin.Gallagher@boeing.com>
|
;; Maintainer: Kevin Gallagher <kevin.gal@verizon.net>
|
||||||
;; Keywords: emulations
|
;; Keywords: emulations
|
||||||
|
|
||||||
;; This file is part of GNU Emacs.
|
;; This file is part of GNU Emacs.
|
||||||
|
|
@ -59,7 +59,8 @@
|
||||||
;; The EDT emulation consists of the following files:
|
;; The EDT emulation consists of the following files:
|
||||||
;;
|
;;
|
||||||
;; edt.texi - User manual
|
;; 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.el - EDT Emulation Functions and Default Configuration
|
||||||
;; edt-lk201.el - Built-in support for DEC LK-201 Keyboards
|
;; edt-lk201.el - Built-in support for DEC LK-201 Keyboards
|
||||||
;; edt-vt100.el - Built-in support for DEC VT-100 (and above) terminals
|
;; edt-vt100.el - Built-in support for DEC VT-100 (and above) terminals
|
||||||
|
|
|
||||||
|
|
@ -6736,7 +6736,13 @@ current object."
|
||||||
(defun backward-word (&optional arg)
|
(defun backward-word (&optional arg)
|
||||||
"Move backward until encountering the beginning of a word.
|
"Move backward until encountering the beginning of a word.
|
||||||
With argument ARG, do this that many times.
|
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")
|
(interactive "^p")
|
||||||
(forward-word (- (or arg 1))))
|
(forward-word (- (or arg 1))))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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. */
|
init_ntproc (dumping); /* must precede init_editfns. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_NS
|
||||||
|
/* Initialise the locale from user defaults. */
|
||||||
|
ns_init_locale();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize and GC-protect Vinitial_environment and
|
/* Initialize and GC-protect Vinitial_environment and
|
||||||
Vprocess_environment before set_initial_environment fills them
|
Vprocess_environment before set_initial_environment fills them
|
||||||
in. */
|
in. */
|
||||||
|
|
|
||||||
|
|
@ -8672,7 +8672,7 @@ imagemagick_load_image (struct frame *f, struct image *img,
|
||||||
image_spec_value (img->spec, QCbackground, NULL); if (!STRINGP
|
image_spec_value (img->spec, QCbackground, NULL); if (!STRINGP
|
||||||
(specified_bg). */
|
(specified_bg). */
|
||||||
value = image_spec_value (img->spec, QCrotation, NULL);
|
value = image_spec_value (img->spec, QCrotation, NULL);
|
||||||
if (FLOATP (value) || INTEGERP (value))
|
if (FLOATP (value))
|
||||||
{
|
{
|
||||||
rotation = extract_float (value);
|
rotation = extract_float (value);
|
||||||
status = MagickRotateImage (image_wand, bg_wand, rotation);
|
status = MagickRotateImage (image_wand, bg_wand, rotation);
|
||||||
|
|
|
||||||
|
|
@ -1141,6 +1141,8 @@ extern void ns_retain_object (void *obj);
|
||||||
extern void *ns_alloc_autorelease_pool (void);
|
extern void *ns_alloc_autorelease_pool (void);
|
||||||
extern void ns_release_autorelease_pool (void *);
|
extern void ns_release_autorelease_pool (void *);
|
||||||
extern const char *ns_get_defaults_value (const char *key);
|
extern const char *ns_get_defaults_value (const char *key);
|
||||||
|
extern void ns_init_locale (void);
|
||||||
|
|
||||||
|
|
||||||
/* in nsmenu */
|
/* in nsmenu */
|
||||||
extern void update_frame_tool_bar (struct frame *f);
|
extern void update_frame_tool_bar (struct frame *f);
|
||||||
|
|
|
||||||
21
src/nsterm.m
21
src/nsterm.m
|
|
@ -585,6 +585,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
|
void
|
||||||
ns_release_object (void *obj)
|
ns_release_object (void *obj)
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
|
|
|
||||||
12
src/syntax.c
12
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).
|
doc: /* Move point forward ARG words (backward if ARG is negative).
|
||||||
If ARG is omitted or nil, move point forward one word.
|
If ARG is omitted or nil, move point forward one word.
|
||||||
Normally returns t.
|
Normally returns t.
|
||||||
If an edge of the buffer or a field boundary is reached, point is left there
|
If an edge of the buffer or a field boundary is reached, point is
|
||||||
and the function returns nil. Field boundaries are not noticed if
|
left there and the function returns nil. Field boundaries are not
|
||||||
`inhibit-field-text-motion' is non-nil. */)
|
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 arg)
|
||||||
{
|
{
|
||||||
Lisp_Object tmp;
|
Lisp_Object tmp;
|
||||||
|
|
|
||||||
58
test/README
58
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
|
This directory contains files intended to test various aspects of
|
||||||
Emacs's functionality. Please help add tests!
|
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.)
|
(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/>.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue