1 /* Generate doc-string file for GNU Emacs from source files.
2 Copyright (C) 1985, 86, 92, 93, 94, 97, 1999, 2000, 2001
3 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* The arguments given to this program are all the C and Lisp source files
23 of GNU Emacs. .elc and .el and .c files are allowed.
24 A .o file can also be specified; the .c file it was made from is used.
25 This helps the makefile pass the correct list of files.
27 The results, which go to standard output or to a file
28 specified with -a or -o (-a to append, -o to start from nothing),
29 are entries containing function or variable names and their documentation.
30 Each entry starts with a ^_ character.
31 Then comes F for a function or V for a variable.
32 Then comes the function or variable name, terminated with a newline.
33 Then comes the documentation for that function or variable.
36 #define NO_SHORTNAMES /* Tell config not to load remap.h */
39 /* defined to be emacs_main, sys_fopen, etc. in config.h */
52 #endif /* WINDOWSNT */
55 #define READ_TEXT "rt"
56 #define READ_BINARY "rb"
57 #else /* not DOS_NT */
59 #define READ_BINARY "r"
60 #endif /* not DOS_NT */
63 int scan_lisp_file ();
67 /* s/msdos.h defines this as sys_chdir, but we're not linking with the
68 file where that function is defined. */
76 /* Stdio stream for output to the DOC file. */
79 /* Name this program was invoked with. */
82 /* Print error message. `s1' is printf control string, `s2' is arg for it. */
89 fprintf (stderr
, "%s: ", progname
);
90 fprintf (stderr
, s1
, s2
);
91 fprintf (stderr
, "\n");
94 /* Print error message and exit. */
105 /* Like malloc but get fatal error if memory is exhausted. */
111 long *result
= (long *) malloc (size
);
113 fatal ("virtual memory exhausted", 0);
130 /* Don't put CRs in the DOC file. */
133 #if 0 /* Suspicion is that this causes hanging.
134 So instead we require people to use -o on MSDOS. */
135 (stdout
)->_flag
&= ~_IOTEXT
;
136 _setmode (fileno (stdout
), O_BINARY
);
142 _setmode (fileno (stdout
), O_BINARY
);
143 #endif /* WINDOWSNT */
145 /* If first two args are -o FILE, output to FILE. */
147 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-o"))
149 outfile
= fopen (argv
[i
+ 1], "w");
152 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-a"))
154 outfile
= fopen (argv
[i
+ 1], "a");
157 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-d"))
164 fatal ("No output file specified", "");
167 for (; i
< argc
; i
++)
170 /* Don't process one file twice. */
171 for (j
= first_infile
; j
< i
; j
++)
172 if (! strcmp (argv
[i
], argv
[j
]))
175 err_count
+= scan_file (argv
[i
]);
178 exit (err_count
> 0);
180 return err_count
> 0;
183 /* Read file FILENAME and output its doc strings to outfile. */
184 /* Return 1 if file is not found, 0 if it is found. */
190 int len
= strlen (filename
);
191 if (len
> 4 && !strcmp (filename
+ len
- 4, ".elc"))
192 return scan_lisp_file (filename
, READ_BINARY
);
193 else if (len
> 3 && !strcmp (filename
+ len
- 3, ".el"))
194 return scan_lisp_file (filename
, READ_TEXT
);
196 return scan_c_file (filename
, READ_TEXT
);
201 /* Skip a C string from INFILE,
202 and return the character that follows the closing ".
203 If printflag is positive, output string contents to outfile.
204 If it is negative, store contents in buf.
205 Convert escape sequences \n and \t to newline and tab;
206 discard \ followed by newline. */
209 read_c_string (infile
, printflag
)
219 while (c
!= '"' && c
!= EOF
)
224 if (c
== '\n' || c
== '\r')
236 else if (printflag
< 0)
243 /* If we had a "", concatenate the two strings. */
253 /* Write to file OUT the argument names of function FUNC, whose text is in BUF.
254 MINARGS and MAXARGS are the minimum and maximum number of arguments. */
257 write_c_args (out
, func
, buf
, minargs
, maxargs
)
260 int minargs
, maxargs
;
267 fprintf (out
, "(%s", func
);
272 for (p
= buf
; *p
; p
++)
277 /* Notice when we start printing a new identifier. */
278 if ((('A' <= c
&& c
<= 'Z')
279 || ('a' <= c
&& c
<= 'z')
280 || ('0' <= c
&& c
<= '9')
292 if (minargs
== 0 && maxargs
> 0)
293 fprintf (out
, "&optional ");
303 /* Print the C argument list as it would appear in lisp:
304 print underscores as hyphens, and print commas and newlines
305 as spaces. Collapse adjacent spaces into one. */
308 else if (c
== ',' || c
== '\n')
311 /* In C code, `default' is a reserved word, so we spell it
312 `defalt'; unmangle that here. */
314 && strncmp (p
, "defalt", 6) == 0
315 && ! (('A' <= p
[6] && p
[6] <= 'Z')
316 || ('a' <= p
[6] && p
[6] <= 'z')
317 || ('0' <= p
[6] && p
[6] <= '9')
320 fprintf (out
, "DEFAULT");
325 else if (c
!= ' ' || !just_spaced
)
327 if (c
>= 'a' && c
<= 'z')
328 /* Upcase the letter. */
333 just_spaced
= c
== ' ';
338 /* Read through a c file. If a .o file is named,
339 the corresponding .c file is read instead.
340 Looks for DEFUN constructs such as are defined in ../src/lisp.h.
341 Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */
344 scan_c_file (filename
, mode
)
345 char *filename
, *mode
;
350 register int defunflag
;
351 register int defvarperbufferflag
;
352 register int defvarflag
;
353 int minargs
, maxargs
;
354 int extension
= filename
[strlen (filename
) - 1];
356 if (extension
== 'o')
357 filename
[strlen (filename
) - 1] = 'c';
359 infile
= fopen (filename
, mode
);
361 /* No error if non-ex input file */
368 /* Reset extension to be able to detect duplicate files. */
369 filename
[strlen (filename
) - 1] = extension
;
372 while (!feof (infile
))
374 if (c
!= '\n' && c
!= '\r')
409 defvarperbufferflag
= (c
== 'P');
422 defunflag
= c
== 'U';
437 c
= read_c_string (infile
, -1);
441 else if (defvarperbufferflag
)
445 else /* For DEFSIMPLE and DEFPRED */
453 if (defunflag
&& (commas
== 1 || commas
== 2))
457 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t');
461 if (commas
== 2) /* pick up minargs */
462 fscanf (infile
, "%d", &minargs
);
463 else /* pick up maxargs */
464 if (c
== 'M' || c
== 'U') /* MANY || UNEVALLED */
467 fscanf (infile
, "%d", &maxargs
);
474 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
477 c
= read_c_string (infile
, 0);
481 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
487 putc (defvarflag
? 'V' : 'F', outfile
);
488 fprintf (outfile
, "%s\n", buf
);
489 c
= read_c_string (infile
, 1);
491 /* If this is a defun, find the arguments and print them. If
492 this function takes MANY or UNEVALLED args, then the C source
493 won't give the names of the arguments, so we shouldn't bother
494 trying to find them. */
495 if (defunflag
&& maxargs
!= -1)
497 char argbuf
[1024], *p
= argbuf
;
504 /* Skip into arguments. */
511 /* Copy arguments into ARGBUF. */
514 *p
++ = c
= getc (infile
);
518 fprintf (outfile
, "\n\n");
519 write_c_args (outfile
, buf
, argbuf
, minargs
, maxargs
);
528 /* Read a file of Lisp code, compiled or interpreted.
530 (defun NAME ARGS DOCSTRING ...)
531 (defmacro NAME ARGS DOCSTRING ...)
532 (defsubst NAME ARGS DOCSTRING ...)
533 (autoload (quote NAME) FILE DOCSTRING ...)
534 (defvar NAME VALUE DOCSTRING)
535 (defconst NAME VALUE DOCSTRING)
536 (fset (quote NAME) (make-byte-code ... DOCSTRING ...))
537 (fset (quote NAME) #[... DOCSTRING ...])
538 (defalias (quote NAME) #[... DOCSTRING ...])
539 (custom-declare-variable (quote NAME) VALUE DOCSTRING ...)
540 starting in column zero.
541 (quote NAME) may appear as 'NAME as well.
543 We also look for #@LENGTH CONTENTS^_ at the beginning of the line.
544 When we find that, we save it for the following defining-form,
545 and we use that instead of reading a doc string within that defining-form.
547 For defvar, defconst, and fset we skip to the docstring with a kludgy
548 formatting convention: all docstrings must appear on the same line as the
549 initial open-paren (the one in column zero) and must contain a backslash
550 and a newline immediately after the initial double-quote. No newlines
551 must appear between the beginning of the form and the first double-quote.
552 For defun, defmacro, and autoload, we know how to skip over the
553 arglist, but the doc string must still have a backslash and newline
554 immediately after the double quote.
555 The only source files that must follow this convention are preloaded
556 uncompiled ones like loaddefs.el and bindings.el; aside
557 from that, it is always the .elc file that we look at, and they are no
558 problem because byte-compiler output follows this convention.
559 The NAME and DOCSTRING are output.
560 NAME is preceded by `F' for a function or `V' for a variable.
561 An entry is output only if DOCSTRING has \ newline just after the opening "
569 while (c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r')
575 read_lisp_symbol (infile
, buffer
)
580 char *fillp
= buffer
;
587 *(++fillp
) = getc (infile
);
588 else if (c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r' || c
== '(' || c
== ')')
599 fprintf (stderr
, "## expected a symbol, got '%c'\n", c
);
605 scan_lisp_file (filename
, mode
)
606 char *filename
, *mode
;
610 char *saved_string
= 0;
612 infile
= fopen (filename
, mode
);
616 return 0; /* No error */
620 while (!feof (infile
))
625 /* If not at end of line, skip till we get to one. */
626 if (c
!= '\n' && c
!= '\r')
631 /* Skip the line break. */
632 while (c
== '\n' || c
== '\r')
634 /* Detect a dynamic doc string and save it for the next expression. */
643 /* Read the length. */
644 while ((c
= getc (infile
),
645 c
>= '0' && c
<= '9'))
651 /* The next character is a space that is counted in the length
652 but not part of the doc string.
653 We already read it, so just ignore it. */
656 /* Read in the contents. */
657 if (saved_string
!= 0)
659 saved_string
= (char *) malloc (length
);
660 for (i
= 0; i
< length
; i
++)
661 saved_string
[i
] = getc (infile
);
662 /* The last character is a ^_.
663 That is needed in the .elc file
664 but it is redundant in DOC. So get rid of it here. */
665 saved_string
[length
- 1] = 0;
666 /* Skip the line break. */
667 while (c
== '\n' && c
== '\r')
669 /* Skip the following line. */
670 while (c
!= '\n' && c
!= '\r')
679 read_lisp_symbol (infile
, buffer
);
681 if (! strcmp (buffer
, "defun")
682 || ! strcmp (buffer
, "defmacro")
683 || ! strcmp (buffer
, "defsubst"))
686 read_lisp_symbol (infile
, buffer
);
688 /* Skip the arguments: either "nil" or a list in parens */
691 if (c
== 'n') /* nil */
693 if ((c
= getc (infile
)) != 'i'
694 || (c
= getc (infile
)) != 'l')
696 fprintf (stderr
, "## unparsable arglist in %s (%s)\n",
703 fprintf (stderr
, "## unparsable arglist in %s (%s)\n",
712 /* If the next three characters aren't `dquote bslash newline'
713 then we're not reading a docstring.
715 if ((c
= getc (infile
)) != '"'
716 || (c
= getc (infile
)) != '\\'
717 || ((c
= getc (infile
)) != '\n' && c
!= '\r'))
720 fprintf (stderr
, "## non-docstring in %s (%s)\n",
727 else if (! strcmp (buffer
, "defvar")
728 || ! strcmp (buffer
, "defconst"))
732 read_lisp_symbol (infile
, buffer
);
734 if (saved_string
== 0)
737 /* Skip until the end of line; remember two previous chars. */
738 while (c
!= '\n' && c
!= '\r' && c
>= 0)
745 /* If two previous characters were " and \,
746 this is a doc string. Otherwise, there is none. */
747 if (c2
!= '"' || c1
!= '\\')
750 fprintf (stderr
, "## non-docstring in %s (%s)\n",
758 else if (! strcmp (buffer
, "custom-declare-variable"))
765 read_lisp_symbol (infile
, buffer
);
771 "## unparsable name in custom-declare-variable in %s\n",
775 read_lisp_symbol (infile
, buffer
);
776 if (strcmp (buffer
, "quote"))
779 "## unparsable name in custom-declare-variable in %s\n",
783 read_lisp_symbol (infile
, buffer
);
788 "## unparsable quoted name in custom-declare-variable in %s\n",
794 if (saved_string
== 0)
796 /* Skip to end of line; remember the two previous chars. */
797 while (c
!= '\n' && c
!= '\r' && c
>= 0)
804 /* If two previous characters were " and \,
805 this is a doc string. Otherwise, there is none. */
806 if (c2
!= '"' || c1
!= '\\')
809 fprintf (stderr
, "## non-docstring in %s (%s)\n",
817 else if (! strcmp (buffer
, "fset") || ! strcmp (buffer
, "defalias"))
824 read_lisp_symbol (infile
, buffer
);
829 fprintf (stderr
, "## unparsable name in fset in %s\n",
833 read_lisp_symbol (infile
, buffer
);
834 if (strcmp (buffer
, "quote"))
836 fprintf (stderr
, "## unparsable name in fset in %s\n",
840 read_lisp_symbol (infile
, buffer
);
845 "## unparsable quoted name in fset in %s\n",
851 if (saved_string
== 0)
853 /* Skip to end of line; remember the two previous chars. */
854 while (c
!= '\n' && c
!= '\r' && c
>= 0)
861 /* If two previous characters were " and \,
862 this is a doc string. Otherwise, there is none. */
863 if (c2
!= '"' || c1
!= '\\')
866 fprintf (stderr
, "## non-docstring in %s (%s)\n",
874 else if (! strcmp (buffer
, "autoload"))
879 read_lisp_symbol (infile
, buffer
);
884 fprintf (stderr
, "## unparsable name in autoload in %s\n",
888 read_lisp_symbol (infile
, buffer
);
889 if (strcmp (buffer
, "quote"))
891 fprintf (stderr
, "## unparsable name in autoload in %s\n",
895 read_lisp_symbol (infile
, buffer
);
900 "## unparsable quoted name in autoload in %s\n",
906 if ((c
= getc (infile
)) != '\"')
908 fprintf (stderr
, "## autoload of %s unparsable (%s)\n",
912 read_c_string (infile
, 0);
915 if (saved_string
== 0)
917 /* If the next three characters aren't `dquote bslash newline'
918 then we're not reading a docstring. */
919 if ((c
= getc (infile
)) != '"'
920 || (c
= getc (infile
)) != '\\'
921 || ((c
= getc (infile
)) != '\n' && c
!= '\r'))
924 fprintf (stderr
, "## non-docstring in %s (%s)\n",
933 else if (! strcmp (buffer
, "if")
934 || ! strcmp (buffer
, "byte-code"))
941 fprintf (stderr
, "## unrecognised top-level form, %s (%s)\n",
947 /* At this point, we should either use the previous
948 dynamic doc string in saved_string
949 or gobble a doc string from the input file.
951 In the latter case, the opening quote (and leading
952 backslash-newline) have already been read. */
955 putc (type
, outfile
);
956 fprintf (outfile
, "%s\n", buffer
);
959 fputs (saved_string
, outfile
);
960 /* Don't use one dynamic doc string twice. */
965 read_c_string (infile
, 1);