X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/acfa068f4a1a4652b784af1d7aaac92929399249..164b1ba3f311a3c333df8bcbd4ad65ad4ec864b5:/lib-src/make-docfile.c diff --git a/lib-src/make-docfile.c b/lib-src/make-docfile.c index 2654387fb3..9bc91bc4f7 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); @@ -274,7 +276,7 @@ struct rcsoc_state /* Output CH to the file or buffer in STATE. Any pending newlines or spaces are output first. */ -static inline void +static void put_char (int ch, struct rcsoc_state *state) { int out_ch; @@ -622,7 +624,7 @@ write_globals (void) qsort (globals, num_globals, sizeof (struct global), compare_globals); for (i = 0; i < num_globals; ++i) { - char const *type; + char const *type = 0; switch (globals[i].type) { @@ -647,7 +649,7 @@ write_globals (void) fatal ("not a recognized DEFVAR_", 0); } - if (globals[i].type != FUNCTION) + if (type) { fprintf (outfile, " %s f_%s;\n", type, globals[i].name); fprintf (outfile, "#define %s globals.f_%s\n", @@ -659,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) @@ -1023,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 ". @@ -1086,8 +1090,7 @@ search_lisp_doc_at_eol (FILE *infile) if (c2 != '"' || c1 != '\\') { #ifdef DEBUG - fprintf (stderr, "## non-docstring in %s (%s)\n", - buffer, filename); + fprintf (stderr, "## non-docstring found\n"); #endif if (c != EOF) ungetc (c, infile); @@ -1096,15 +1099,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)