]> code.delx.au - gnu-emacs/blobdiff - lib-src/make-docfile.c
Merge from emacs-23
[gnu-emacs] / lib-src / make-docfile.c
index 1564aca5bbea67e686f3c6267b6e8801aceda701..e2dc99214d2d5f64a5e115420f4832e7f08f5315 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>.  */
+
 
 /* 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 <config.h>
 
 /* 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)
 }
 \f
 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);
 }
 \f
 /* 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;