X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/59ce725a3b68cbc324f01bc8dc5f9e07286431d1..4a47c2757309e338321da1e7a2f6d399a306ce7d:/lib-src/make-docfile.c?ds=sidebyside diff --git a/lib-src/make-docfile.c b/lib-src/make-docfile.c index 1564aca5bb..e2dc99214d 100644 --- a/lib-src/make-docfile.c +++ b/lib-src/make-docfile.c @@ -1,14 +1,14 @@ /* Generate doc-string file for GNU Emacs from source files. Copyright (C) 1985, 1986, 1992, 1993, 1994, 1997, 1999, 2000, 2001, - 2002, 2003, 2004, 2005, 2006, 2007, 2008 + 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GNU Emacs. -GNU Emacs is free software; you can redistribute it and/or modify +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, or (at your option) -any later version. +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 @@ -16,9 +16,8 @@ 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; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +along with GNU Emacs. If not, see . */ + /* The arguments given to this program are all the C and Lisp source files of GNU Emacs. .elc and .el and .c files are allowed. @@ -35,7 +34,6 @@ Boston, MA 02110-1301, USA. */ Then comes the documentation for that function or variable. */ -#define NO_SHORTNAMES /* Tell config not to load remap.h */ #include /* defined to be emacs_main, sys_fopen, etc. in config.h */ @@ -62,20 +60,17 @@ Boston, MA 02110-1301, USA. */ #endif /* not DOS_NT */ #ifndef DIRECTORY_SEP -#ifdef MAC_OS8 -#define DIRECTORY_SEP ':' -#else /* not MAC_OS8 */ #define DIRECTORY_SEP '/' -#endif /* not MAC_OS8 */ #endif #ifndef IS_DIRECTORY_SEP #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP) #endif -int scan_file (); -int scan_lisp_file (); -int scan_c_file (); +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; #ifdef MSDOS /* s/msdos.h defines this as sys_chdir, but we're not linking with the @@ -97,8 +92,7 @@ char *progname; /* VARARGS1 */ void -error (s1, s2) - char *s1, *s2; +error (const char *s1, const char *s2) { fprintf (stderr, "%s: ", progname); fprintf (stderr, s1, s2); @@ -109,8 +103,7 @@ error (s1, s2) /* VARARGS1 */ void -fatal (s1, s2) - char *s1, *s2; +fatal (const char *s1, const char *s2) { error (s1, s2); exit (EXIT_FAILURE); @@ -119,8 +112,7 @@ fatal (s1, s2) /* Like malloc but get fatal error if memory is exhausted. */ void * -xmalloc (size) - unsigned int size; +xmalloc (unsigned int size) { void *result = (void *) malloc (size); if (result == NULL) @@ -129,9 +121,7 @@ xmalloc (size) } int -main (argc, argv) - int argc; - char **argv; +main (int argc, char **argv) { int i; int err_count = 0; @@ -193,8 +183,7 @@ main (argc, argv) /* Add a source file name boundary marker in the output file. */ void -put_filename (filename) - char *filename; +put_filename (char *filename) { char *tmp; @@ -213,10 +202,10 @@ put_filename (filename) /* Return 1 if file is not found, 0 if it is found. */ int -scan_file (filename) - char *filename; +scan_file (char *filename) { - int len = strlen (filename); + + size_t len = strlen (filename); put_filename (filename); if (len > 4 && !strcmp (filename + len - 4, ".elc")) @@ -245,11 +234,11 @@ struct rcsoc_state /* A keyword we look for at the beginning of lines. If found, it is not copied, and SAW_KEYWORD is set to true. */ - char *keyword; - /* The current point we've reached in an occurance of KEYWORD in + const char *keyword; + /* The current point we've reached in an occurrence of KEYWORD in the input stream. */ - char *cur_keyword_ptr; - /* Set to true if we saw an occurance of KEYWORD. */ + const char *cur_keyword_ptr; + /* Set to true if we saw an occurrence of KEYWORD. */ int saw_keyword; }; @@ -257,9 +246,7 @@ struct rcsoc_state spaces are output first. */ static INLINE void -put_char (ch, state) - int ch; - struct rcsoc_state *state; +put_char (int ch, struct rcsoc_state *state) { int out_ch; do @@ -292,9 +279,7 @@ put_char (ch, state) keyword, but were in fact not. */ static void -scan_keyword_or_put_char (ch, state) - int ch; - struct rcsoc_state *state; +scan_keyword_or_put_char (int ch, struct rcsoc_state *state) { if (state->keyword && *state->cur_keyword_ptr == ch @@ -342,7 +327,7 @@ scan_keyword_or_put_char (ch, state) keyword, but it was a false alarm. Output the part we scanned. */ { - char *p; + const char *p; for (p = state->keyword; p < state->cur_keyword_ptr; p++) put_char (*p, state); @@ -360,16 +345,12 @@ scan_keyword_or_put_char (ch, state) PRINTFLAG is positive, output string contents to outfile. 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 occurances of the string `usage:' + If SAW_USAGE is non-zero, 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. */ int -read_c_string_or_comment (infile, printflag, comment, saw_usage) - FILE *infile; - int printflag; - int *saw_usage; - int comment; +read_c_string_or_comment (FILE *infile, int printflag, int comment, int *saw_usage) { register int c; struct rcsoc_state state; @@ -457,15 +438,12 @@ read_c_string_or_comment (infile, printflag, comment, saw_usage) MINARGS and MAXARGS are the minimum and maximum number of arguments. */ void -write_c_args (out, func, buf, minargs, maxargs) - FILE *out; - char *func, *buf; - int minargs, maxargs; +write_c_args (FILE *out, char *func, char *buf, int minargs, int maxargs) { register char *p; int in_ident = 0; - int just_spaced = 0; - int need_space = 1; + char *ident_start; + size_t ident_length = 0; fprintf (out, "(fn"); @@ -475,9 +453,8 @@ write_c_args (out, func, buf, minargs, maxargs) for (p = buf; *p; p++) { char c = *p; - int ident_start = 0; - /* Notice when we start printing a new identifier. */ + /* Notice when a new identifier starts. */ if ((('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9') @@ -487,65 +464,65 @@ write_c_args (out, func, buf, minargs, maxargs) if (!in_ident) { in_ident = 1; - ident_start = 1; - - if (need_space) - putc (' ', out); - - if (minargs == 0 && maxargs > 0) - fprintf (out, "&optional "); - just_spaced = 1; - - minargs--; - maxargs--; + ident_start = p; } else - in_ident = 0; + { + in_ident = 0; + ident_length = p - ident_start; + } } - /* Print the C argument list as it would appear in lisp: - print underscores as hyphens, and print commas and newlines - as spaces. Collapse adjacent spaces into one. */ - if (c == '_') - c = '-'; - else if (c == ',' || c == '\n') - c = ' '; - - /* In C code, `default' is a reserved word, so we spell it - `defalt'; unmangle that here. */ - if (ident_start - && strncmp (p, "defalt", 6) == 0 - && ! (('A' <= p[6] && p[6] <= 'Z') - || ('a' <= p[6] && p[6] <= 'z') - || ('0' <= p[6] && p[6] <= '9') - || p[6] == '_')) - { - fprintf (out, "DEFAULT"); - p += 5; - in_ident = 0; - just_spaced = 0; - } - else if (c != ' ' || !just_spaced) + /* Found the end of an argument, write out the last seen + identifier. */ + if (c == ',' || c == ')') { - if (c >= 'a' && c <= 'z') - /* Upcase the letter. */ - c += 'A' - 'a'; - putc (c, out); - } + if (ident_length == 0) + { + error ("empty arg list for `%s' should be (void), not ()", func); + continue; + } + + if (strncmp (ident_start, "void", ident_length) == 0) + continue; + + putc (' ', out); + + if (minargs == 0 && maxargs > 0) + fprintf (out, "&optional "); + + minargs--; + maxargs--; - just_spaced = c == ' '; - need_space = 0; + /* In C code, `default' is a reserved word, so we spell it + `defalt'; unmangle that here. */ + if (ident_length == 6 && strncmp (ident_start, "defalt", 6) == 0) + fprintf (out, "DEFAULT"); + else + while (ident_length-- > 0) + { + c = *ident_start++; + if (c >= 'a' && c <= 'z') + /* Upcase the letter. */ + c += 'A' - 'a'; + else if (c == '_') + /* Print underscore as hyphen. */ + c = '-'; + putc (c, out); + } + } } + + putc (')', out); } /* Read through a c file. If a .o file is named, - the corresponding .c file is read instead. + the corresponding .c or .m file is read instead. Looks for DEFUN constructs such as are defined in ../src/lisp.h. Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */ int -scan_c_file (filename, mode) - char *filename, *mode; +scan_c_file (char *filename, const char *mode) { FILE *infile; register int c; @@ -561,6 +538,15 @@ scan_c_file (filename, mode) infile = fopen (filename, mode); + if (infile == NULL && extension == 'o') + { + /* try .m */ + filename[strlen (filename) - 1] = 'm'; + infile = fopen (filename, mode); + if (infile == NULL) + filename[strlen (filename) - 1] = 'c'; /* don't confuse people */ + } + /* No error if non-ex input file */ if (infile == NULL) { @@ -812,8 +798,7 @@ scan_c_file (filename, mode) */ void -skip_white (infile) - FILE *infile; +skip_white (FILE *infile) { char c = ' '; while (c == ' ' || c == '\t' || c == '\n' || c == '\r') @@ -822,9 +807,7 @@ skip_white (infile) } void -read_lisp_symbol (infile, buffer) - FILE *infile; - char *buffer; +read_lisp_symbol (FILE *infile, char *buffer) { char c; char *fillp = buffer; @@ -852,8 +835,7 @@ read_lisp_symbol (infile, buffer) } int -scan_lisp_file (filename, mode) - char *filename, *mode; +scan_lisp_file (const char *filename, const char *mode) { FILE *infile; register int c; @@ -904,9 +886,8 @@ scan_lisp_file (filename, mode) length--; /* Read in the contents. */ - if (saved_string != 0) - free (saved_string); - saved_string = (char *) malloc (length); + free (saved_string); + saved_string = (char *) xmalloc (length); for (i = 0; i < length; i++) saved_string[i] = getc (infile); /* The last character is a ^_. @@ -1005,7 +986,9 @@ scan_lisp_file (filename, mode) } } - else if (! strcmp (buffer, "custom-declare-variable")) + else if (! strcmp (buffer, "custom-declare-variable") + || ! strcmp (buffer, "defvaralias") + ) { char c1 = 0, c2 = 0; type = 'V'; @@ -1188,7 +1171,7 @@ scan_lisp_file (filename, mode) else { #ifdef DEBUG - fprintf (stderr, "## unrecognised top-level form, %s (%s)\n", + fprintf (stderr, "## unrecognized top-level form, %s (%s)\n", buffer, filename); #endif continue;