X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/25e65510a3d35524ade205c3114970c43dc6ae05..8a28a5b8d8acb314d8850b85fe5cd956a86e8ff9:/lib-src/make-docfile.c diff --git a/lib-src/make-docfile.c b/lib-src/make-docfile.c index dafb7c0afd..54a53c0d44 100644 --- a/lib-src/make-docfile.c +++ b/lib-src/make-docfile.c @@ -1,7 +1,7 @@ /* Generate doc-string file for GNU Emacs from source files. -Copyright (C) 1985-1986, 1992-1994, 1997, 1999-2012 - Free Software Foundation, Inc. +Copyright (C) 1985-1986, 1992-1994, 1997, 1999-2013 Free Software +Foundation, Inc. This file is part of GNU Emacs. @@ -58,9 +58,11 @@ along with GNU Emacs. If not, see . */ #undef chdir #define READ_TEXT "rt" #define READ_BINARY "rb" +#define IS_SLASH(c) ((c) == '/' || (c) == '\\' || (c) == ':') #else /* not DOS_NT */ #define READ_TEXT "r" #define READ_BINARY "r" +#define IS_SLASH(c) ((c) == '/') #endif /* not DOS_NT */ static int scan_file (char *filename); @@ -545,14 +547,15 @@ write_c_args (FILE *out, char *func, char *buf, int minargs, int maxargs) putc (')', out); } -/* The types of globals. */ +/* The types of globals. These are sorted roughly in decreasing alignment + order to avoid allocation gaps, except that functions are last. */ enum global_type { - FUNCTION, + INVALID, + LISP_OBJECT, EMACS_INTEGER, BOOLEAN, - LISP_OBJECT, - INVALID + FUNCTION, }; /* A single global. */ @@ -601,13 +604,8 @@ compare_globals (const void *a, const void *b) const struct global *ga = a; const struct global *gb = b; - if (ga->type == FUNCTION) - { - if (gb->type != FUNCTION) - return 1; - } - else if (gb->type == FUNCTION) - return -1; + if (ga->type != gb->type) + return ga->type - gb->type; return strcmp (ga->name, gb->name); } @@ -634,7 +632,7 @@ write_globals (void) type = "EMACS_INT"; break; case BOOLEAN: - type = "int"; + type = "bool"; break; case LISP_OBJECT: type = "Lisp_Object"; @@ -663,7 +661,9 @@ write_globals (void) special hacks. */ if (strcmp (globals[i].name, "Fthrow") == 0 || strcmp (globals[i].name, "Ftop_level") == 0 - || strcmp (globals[i].name, "Fkill_emacs") == 0) + || strcmp (globals[i].name, "Fkill_emacs") == 0 + || strcmp (globals[i].name, "Fexit_recursive_edit") == 0 + || strcmp (globals[i].name, "Fabort_recursive_edit") == 0) fprintf (outfile, "_Noreturn "); fprintf (outfile, "EXFUN (%s, ", globals[i].name); if (globals[i].value == -1) @@ -1027,9 +1027,9 @@ scan_c_file (char *filename, const char *mode) arglist, but the doc string must still have a backslash and newline immediately after the double quote. The only source files that must follow this convention are preloaded - uncompiled ones like loaddefs.el and bindings.el; aside - from that, it is always the .elc file that we look at, and they are no - problem because byte-compiler output follows this convention. + uncompiled ones like loaddefs.el; aside from that, it is always the .elc + file that we should look at, and they are no problem because byte-compiler + output follows this convention. The NAME and DOCSTRING are output. NAME is preceded by `F' for a function or `V' for a variable. An entry is output only if DOCSTRING has \ newline just after the opening ". @@ -1100,15 +1100,50 @@ search_lisp_doc_at_eol (FILE *infile) return 1; } +#define DEF_ELISP_FILE(fn) { #fn, sizeof(#fn) - 1 } + static int scan_lisp_file (const char *filename, const char *mode) { FILE *infile; register 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 + function. These conventions are automatically followed by the + byte compiler when it produces the .elc files. */ + static struct { + const char *fn; + size_t fl; + } const uncompiled[] = { + DEF_ELISP_FILE (loaddefs.el), + DEF_ELISP_FILE (loadup.el), + DEF_ELISP_FILE (charprop.el), + DEF_ELISP_FILE (cp51932.el), + DEF_ELISP_FILE (eucjp-ms.el) + }; + int i, match; + size_t flen = strlen (filename); if (generate_globals) fatal ("scanning lisp file when -g specified", 0); + if (flen > 3 && !strcmp (filename + flen - 3, ".el")) + { + for (i = 0, match = 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; + break; + } + } + if (!match) + fatal ("uncompiled lisp file %s is not supported", filename); + } infile = fopen (filename, mode); if (infile == NULL)