Commit 00b3c7ac authored by Tom Tromey's avatar Tom Tromey

Make globals.h a generated header

	* configure: Rebuild.
	* configure.in (NS_OBJC_OBJ): New subst.
lib-src
	* make-docfile.c: Unconditionally include stdlib.h.
	(generate_globals): New global.
	(xrealloc): New function.
	(main): Handle '-g'.  Call start_globals, write_globals.
	(scan_file): Conditionally call put_filename.
	(start_globals): New function.
	(struct global): New.
	(num_globals, globals): New globals.
	(add_global, compare_globals, write_globals): New functions.
	(scan_c_file): Update for "-g".
	(scan_lisp_file): Fail if "-g".
	(enum global_type): New.
src
	* Makefile.in (NS_OBJC_OBJ): New variable.
	(base_obj): Rename from 'obj'.
	(obj): New variable.
	(globals.h, gl-stamp, $(obj)): New targets.
	(GLOBAL_SOURCES): New variable.
	* globals.h: Remove.
	* nsselect.m (Vselection_alist): Define.  Reverts part of
	2011-01-19T22:11:33Z!jan.h.d@swipnet.se.
	* buffer.c: Don't use "no_cell" for name of kill-buffer-hook's
	variable.
	* xselect.c (Vselection_alist): Define.  Reverts part of 2011-01-19T23:32:42Z!eggert@cs.ucla.edu.
parent 6ca94a0b
2011-02-08 Tom Tromey <tromey@redhat.com>
* configure: Rebuild.
* configure.in (NS_OBJC_OBJ): New subst.
2011-02-06 Paul Eggert <eggert@cs.ucla.edu>
gnulib: allow multiple gnulib generated replacements to coexist
......
......@@ -864,6 +864,7 @@ GMALLOC_OBJ
HAVE_XSERVER
LIB_STANDARD
NS_SUPPORT
NS_OBJC_OBJ
NS_OBJ
TEMACS_LDFLAGS2
LD_SWITCH_X_SITE_AUX_RPATH
......@@ -1042,9 +1043,6 @@ LDFLAGS
LIBS
CPPFLAGS
CPP
CPPFLAGS
CPP
CPPFLAGS
XMKMF'
......@@ -8791,6 +8789,7 @@ fi
ns_frag=/dev/null
NS_OBJ=
NS_OBJC_OBJ=
NS_SUPPORT=
if test "${HAVE_NS}" = yes; then
window_system=nextstep
......@@ -8802,7 +8801,8 @@ if test "${HAVE_NS}" = yes; then
prefix=${ns_appresdir}
fi
ns_frag=$srcdir/src/ns.mk
NS_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o fontset.o fringe.o image.o"
NS_OBJ="fontset.o fringe.o image.o"
NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o"
NS_SUPPORT="\${lispsource}/emacs-lisp/easymenu.elc \${lispsource}/term/ns-win.elc"
fi
CFLAGS="$tmp_CFLAGS"
......@@ -8812,6 +8812,7 @@ CPPFLAGS="$tmp_CPPFLAGS"
case "${window_system}" in
x11 )
HAVE_X_WINDOWS=yes
......
......@@ -1519,6 +1519,7 @@ AC_SUBST(TEMACS_LDFLAGS2)
ns_frag=/dev/null
NS_OBJ=
NS_OBJC_OBJ=
NS_SUPPORT=
if test "${HAVE_NS}" = yes; then
window_system=nextstep
......@@ -1530,12 +1531,14 @@ if test "${HAVE_NS}" = yes; then
prefix=${ns_appresdir}
fi
ns_frag=$srcdir/src/ns.mk
NS_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o fontset.o fringe.o image.o"
NS_OBJ="fontset.o fringe.o image.o"
NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o"
NS_SUPPORT="\${lispsource}/emacs-lisp/easymenu.elc \${lispsource}/term/ns-win.elc"
fi
CFLAGS="$tmp_CFLAGS"
CPPFLAGS="$tmp_CPPFLAGS"
AC_SUBST(NS_OBJ)
AC_SUBST(NS_OBJC_OBJ)
AC_SUBST(NS_SUPPORT)
AC_SUBST(LIB_STANDARD)
AC_SUBST_FILE(ns_frag)
......
2011-02-08 Tom Tromey <tromey@redhat.com>
* make-docfile.c: Unconditionally include stdlib.h.
(generate_globals): New global.
(xrealloc): New function.
(main): Handle '-g'. Call start_globals, write_globals.
(scan_file): Conditionally call put_filename.
(start_globals): New function.
(struct global): New.
(num_globals, globals): New globals.
(add_global, compare_globals, write_globals): New functions.
(scan_c_file): Update for "-g".
(scan_lisp_file): Fail if "-g".
2011-02-05 Paul Eggert <eggert@cs.ucla.edu>
* emacsclient.c: conform to C89 pointer rules
......
......@@ -41,11 +41,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#undef chdir
#include <stdio.h>
#include <stdlib.h>
#ifdef MSDOS
#include <fcntl.h>
#endif /* MSDOS */
#ifdef WINDOWSNT
#include <stdlib.h>
#include <fcntl.h>
#include <direct.h>
#endif /* WINDOWSNT */
......@@ -70,6 +70,8 @@ int scan_file (char *filename);
int scan_lisp_file (const char *filename, const char *mode);
int scan_c_file (char *filename, const char *mode);
void fatal (const char *s1, const char *s2) NO_RETURN;
void start_globals (void);
void write_globals (void);
#ifdef MSDOS
/* s/msdos.h defines this as sys_chdir, but we're not linking with the
......@@ -85,6 +87,9 @@ FILE *outfile;
/* Name this program was invoked with. */
char *progname;
/* Nonzero if this invocation is generating globals.h. */
int generate_globals;
/* Print error message. `s1' is printf control string, `s2' is arg for it. */
/* VARARGS1 */
......@@ -116,6 +121,18 @@ xmalloc (unsigned int size)
fatal ("virtual memory exhausted", 0);
return result;
}
/* Like realloc but get fatal error if memory is exhausted. */
void *
xrealloc (void *arg, unsigned int size)
{
void *result = (void *) realloc (arg, size);
if (result == NULL)
fatal ("virtual memory exhausted", 0);
return result;
}
int
main (int argc, char **argv)
......@@ -164,10 +181,18 @@ main (int argc, char **argv)
}
i += 2;
}
if (argc > i && !strcmp (argv[i], "-g"))
{
generate_globals = 1;
++i;
}
if (outfile == 0)
fatal ("No output file specified", "");
if (generate_globals)
start_globals ();
first_infile = i;
for (; i < argc; i++)
{
......@@ -179,6 +204,10 @@ main (int argc, char **argv)
if (j == i)
err_count += scan_file (argv[i]);
}
if (err_count == 0 && generate_globals)
write_globals ();
return (err_count > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
}
......@@ -208,7 +237,8 @@ scan_file (char *filename)
size_t len = strlen (filename);
put_filename (filename);
if (!generate_globals)
put_filename (filename);
if (len > 4 && !strcmp (filename + len - 4, ".elc"))
return scan_lisp_file (filename, READ_BINARY);
else if (len > 3 && !strcmp (filename + len - 3, ".el"))
......@@ -216,6 +246,14 @@ scan_file (char *filename)
else
return scan_c_file (filename, READ_TEXT);
}
void
start_globals (void)
{
fprintf (outfile, "/* This file was auto-generated by make-docfile. */\n");
fprintf (outfile, "/* DO NOT EDIT. */\n");
fprintf (outfile, "struct emacs_globals {\n");
}
char buf[128];
......@@ -516,6 +554,98 @@ write_c_args (FILE *out, char *func, char *buf, int minargs, int maxargs)
putc (')', out);
}
/* The types of globals. */
enum global_type
{
EMACS_INT,
BOOLEAN,
LISP_OBJECT,
INVALID
};
/* A single global. */
struct global
{
enum global_type type;
char *name;
};
/* All the variable names we saw while scanning C sources in `-g'
mode. */
int num_globals;
int num_globals_allocated;
struct global *globals;
static void
add_global (enum global_type type, char *name)
{
/* Ignore the one non-symbol that can occur. */
if (strcmp (name, "..."))
{
++num_globals;
if (num_globals_allocated == 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].name = name;
}
}
static int
compare_globals (const void *a, const void *b)
{
const struct global *ga = a;
const struct global *gb = b;
return strcmp (ga->name, gb->name);
}
void
write_globals (void)
{
int i;
qsort (globals, num_globals, sizeof (struct global), compare_globals);
for (i = 0; i < num_globals; ++i)
{
char *type;
switch (globals[i].type)
{
case EMACS_INT:
type = "EMACS_INT";
break;
case BOOLEAN:
type = "int";
break;
case LISP_OBJECT:
type = "Lisp_Object";
break;
default:
fatal ("not a recognized DEFVAR_", 0);
}
fprintf (outfile, " %s f_%s;\n", type, globals[i].name);
fprintf (outfile, "#define %s globals.f_%s\n",
globals[i].name, globals[i].name);
while (i + 1 < num_globals
&& !strcmp (globals[i].name, globals[i + 1].name))
++i;
}
fprintf (outfile, "};\n");
fprintf (outfile, "extern struct emacs_globals globals;\n");
}
/* Read through a c file. If a .o file is named,
the corresponding .c or .m file is read instead.
......@@ -533,6 +663,7 @@ scan_c_file (char *filename, const char *mode)
register int defvarflag;
int minargs, maxargs;
int extension = filename[strlen (filename) - 1];
enum global_type type;
if (extension == 'o')
filename[strlen (filename) - 1] = 'c';
......@@ -599,8 +730,23 @@ scan_c_file (char *filename, const char *mode)
c = getc (infile);
defvarperbufferflag = (c == 'P');
if (generate_globals)
{
if (c == 'I')
type = EMACS_INT;
else if (c == 'L')
type = LISP_OBJECT;
else if (c == 'B')
type = BOOLEAN;
else
type = INVALID;
}
c = getc (infile);
/* We need to distinguish between DEFVAR_BOOL and
DEFVAR_BUFFER_DEFAULTS. */
if (generate_globals && type == BOOLEAN && c != 'O')
type = INVALID;
}
else if (c == 'D')
{
......@@ -617,6 +763,10 @@ scan_c_file (char *filename, const char *mode)
}
else continue;
if (generate_globals && (!defvarflag || defvarperbufferflag
|| type == INVALID))
continue;
while (c != '(')
{
if (c < 0)
......@@ -630,6 +780,34 @@ scan_c_file (char *filename, const char *mode)
continue;
c = read_c_string_or_comment (infile, -1, 0, 0);
if (generate_globals)
{
int i = 0;
char *name;
/* Skip "," and whitespace. */
do
{
c = getc (infile);
}
while (c == ',' || c == ' ' || c == '\t' || c == '\n' || c == '\r');
/* Read in the identifier. */
do
{
buf[i++] = c;
c = getc (infile);
}
while (! (c == ',' || c == ' ' || c == '\t' ||
c == '\n' || c == '\r'));
buf[i] = '\0';
name = xmalloc (i + 1);
memcpy (name, buf, i + 1);
add_global (type, name);
continue;
}
/* DEFVAR_LISP ("name", addr, "doc")
DEFVAR_LISP ("name", addr /\* doc *\/)
DEFVAR_LISP ("name", addr, doc: /\* doc *\/) */
......@@ -845,6 +1023,9 @@ scan_lisp_file (const char *filename, const char *mode)
register int c;
char *saved_string = 0;
if (generate_globals)
fatal ("scanning lisp file when -g specified", 0);
infile = fopen (filename, mode);
if (infile == NULL)
{
......
2011-02-08 Tom Tromey <tromey@redhat.com>
* Makefile.in (NS_OBJC_OBJ): New variable.
(base_obj): Rename from 'obj'.
(obj): New variable.
(globals.h, gl-stamp, $(obj)): New targets.
(GLOBAL_SOURCES): New variable.
* globals.h: Remove.
* nsselect.m (Vselection_alist): Define. Reverts part of
2011-01-19T22:11:33Z!jan.h.d@swipnet.se.
* buffer.c: Don't use "no_cell" for name of kill-buffer-hook's
variable.
* xselect.c (Vselection_alist): Define. Reverts part of 2011-01-19T23:32:42Z!eggert@cs.ucla.edu.
2011-02-08 Kenichi Handa <handa@m17n.org>
* font.c (Ffont_get): Do not cache :otf value.
......@@ -247,6 +247,7 @@ ns_appdir=@ns_appdir@
ns_appbindir=@ns_appbindir@
ns_appsrc=@ns_appsrc@
NS_OBJ=@NS_OBJ@
NS_OBJC_OBJ=@NS_OBJC_OBJ@
NS_SUPPORT=@NS_SUPPORT@
## Only set if NS_IMPL_GNUSTEP.
GNU_OBJC_CFLAGS=@GNU_OBJC_CFLAGS@
......@@ -341,7 +342,7 @@ ALL_OBJC_CFLAGS=$(ALL_CFLAGS) $(GNU_OBJC_CFLAGS)
## lastfile must follow all files whose initialized data areas should
## be dumped as pure by dump-emacs.
obj= dispnew.o frame.o scroll.o xdisp.o menu.o $(XMENU_OBJ) window.o \
base_obj = dispnew.o frame.o scroll.o xdisp.o menu.o $(XMENU_OBJ) window.o \
charset.o coding.o category.o ccl.o character.o chartab.o bidi.o \
cm.o term.o terminal.o xfaces.o $(XOBJ) $(GTK_OBJ) $(DBUS_OBJ) \
emacs.o keyboard.o macros.o keymap.o sysdep.o \
......@@ -355,6 +356,7 @@ obj= dispnew.o frame.o scroll.o xdisp.o menu.o $(XMENU_OBJ) window.o \
region-cache.o sound.o atimer.o \
doprnt.o intervals.o textprop.o composite.o md5.o xml.o \
$(MSDOS_OBJ) $(MSDOS_X_OBJ) $(NS_OBJ) $(CYGWIN_OBJ) $(FONT_OBJ)
obj = $(base_obj) $(NS_OBJC_OBJ)
## Object files used on some machine or other.
## These go in the DOC file on all machines in case they are needed.
......@@ -645,6 +647,18 @@ $(libsrc)/make-docfile$(EXEEXT):
buildobj.h: Makefile
echo "#define BUILDOBJ \"$(obj) $(otherobj) " "\"" > buildobj.h
globals.h: gl-stamp
cp gl-stamp globals.h
GLOBAL_SOURCES = $(base_obj:.o=.c) $(NS_OBJC_OBJ:.o=.m)
gl-stamp: $(libsrc)/make-docfile$(EXEEXT) $(GLOBAL_SOURCES)
@rm -f gl-tmp
$(libsrc)/make-docfile -d $(srcdir) -g $(SOME_MACHINE_OBJECTS) $(obj) > gl-tmp
$(srcdir)/../move-if-change gl-tmp gl-stamp
$(obj): globals.h
$(lib)/libgnu.a: $(config_h)
cd $(lib) && $(MAKE) libgnu.a
......
......@@ -1320,7 +1320,7 @@ No argument or nil as argument means do this for the current buffer. */)
}
/*
DEFVAR_LISP ("kill-buffer-hook", no_cell, "\
DEFVAR_LISP ("kill-buffer-hook", ..., "\
Hook to be run (by `run-hooks', which see) when a buffer is killed.\n\
The buffer being killed will be current while the hook is running.\n\
See `kill-buffer'."
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -39,6 +39,8 @@ Updated by Christian Limpach (chris@nice.ch)
Lisp_Object QCLIPBOARD, QSECONDARY, QTEXT, QFILE_NAME;
static Lisp_Object Vselection_alist;
static Lisp_Object Qforeign_selection;
/* NSGeneralPboard is pretty much analogous to X11 CLIPBOARD */
......
......@@ -126,6 +126,20 @@ static Lisp_Object Qforeign_selection;
/* Defined in keyboard.c. */
extern unsigned long last_event_timestamp;
/* This is an association list whose elements are of the form
( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME)
SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom.
SELECTION-VALUE is the value that emacs owns for that selection.
It may be any kind of Lisp object.
SELECTION-TIMESTAMP is the time at which emacs began owning this selection,
as a cons of two 16-bit numbers (making a 32 bit time.)
FRAME is the frame for which we made the selection.
If there is an entry in this alist, then it can be assumed that Emacs owns
that selection.
The only (eq) parts of this list that are visible from Lisp are the
selection-values. */
static Lisp_Object Vselection_alist;
/* Define a queue to save up SELECTION_REQUEST_EVENT events for later
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment