1 /* Generate doc-string file for GNU Emacs from source files.
2 Copyright (C) 1985, 1986, 1992 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20 /* The arguments given to this program are all the C and Lisp source files
21 of GNU Emacs. .elc and .el and .c files are allowed.
22 A .o file can also be specified; the .c file it was made from is used.
23 This helps the makefile pass the correct list of files.
25 The results, which go to standard output or to a file
26 specified with -a or -o (-a to append, -o to start from nothing),
27 are entries containing function or variable names and their documentation.
28 Each entry starts with a ^_ character.
29 Then comes F for a function or V for a variable.
30 Then comes the function or variable name, terminated with a newline.
31 Then comes the documentation for that function or variable.
47 /* If first two args are -o FILE, output to FILE. */
49 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-o"))
51 outfile
= fopen (argv
[i
+ 1], "w");
54 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-a"))
56 outfile
= fopen (argv
[i
+ 1], "a");
61 err_count
+= scan_file (argv
[i
]); /* err_count seems to be {mis,un}used */
63 exit (err_count
); /* see below - shane */
67 /* Read file FILENAME and output its doc strings to outfile. */
68 /* Return 1 if file is not found, 0 if it is found. */
73 int len
= strlen (filename
);
74 if (!strcmp (filename
+ len
- 4, ".elc"))
75 return scan_lisp_file (filename
);
76 else if (!strcmp (filename
+ len
- 3, ".el"))
77 return scan_lisp_file (filename
);
79 return scan_c_file (filename
);
84 /* Skip a C string from INFILE,
85 and return the character that follows the closing ".
86 If printflag is positive, output string contents to outfile.
87 If it is negative, store contents in buf.
88 Convert escape sequences \n and \t to newline and tab;
89 discard \ followed by newline. */
91 read_c_string (infile
, printflag
)
101 while (c
!= '"' && c
!= EOF
)
118 else if (printflag
< 0)
127 else if (printflag
< 0)
138 /* Write to file OUT the argument names of the function whose text is in BUF.
139 MINARGS and MAXARGS are the minimum and maximum number of arguments. */
141 write_c_args (out
, buf
, minargs
, maxargs
)
144 int minargs
, maxargs
;
147 register char *p
= buf
;
150 fprintf (out
, "arguments: ");
161 if (minargs
== 0 && maxargs
> 0)
162 fprintf (out
, "&optional ");
166 else if (c
== ' ' && space
)
170 /* Print the C arguments as they would appear in Elisp;
171 print underscores as hyphens. */
180 /* Read through a c file. If a .o file is named,
181 the corresponding .c file is read instead.
182 Looks for DEFUN constructs such as are defined in ../src/lisp.h.
183 Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */
185 scan_c_file (filename
)
191 register int defunflag
;
192 register int defvarflag
;
193 int minargs
, maxargs
;
195 if (filename
[strlen (filename
) - 1] == 'o')
196 filename
[strlen (filename
) - 1] = 'c';
198 infile
= fopen (filename
, "r");
200 /* No error if non-ex input file */
208 while (!feof (infile
))
244 defunflag
= c
== 'U';
259 c
= read_c_string (infile
, -1);
265 else /* For DEFSIMPLE and DEFPRED */
273 if (defunflag
&& (commas
== 1 || commas
== 2))
277 while (c
== ' ' || c
== '\n' || c
== '\t');
281 if (commas
== 2) /* pick up minargs */
282 fscanf (infile
, "%d", &minargs
);
283 else /* pick up maxargs */
284 if (c
== 'M' || c
== 'U') /* MANY || UNEVALLED */
287 fscanf (infile
, "%d", &maxargs
);
294 while (c
== ' ' || c
== '\n' || c
== '\t')
297 c
= read_c_string (infile
, 0);
301 while (c
== ' ' || c
== '\n' || c
== '\t')
307 putc (defvarflag
? 'V' : 'F', outfile
);
308 fprintf (outfile
, "%s\n", buf
);
309 c
= read_c_string (infile
, 1);
311 /* If this is a defun, find the arguments and print them. If
312 this function takes MANY or UNEVALLED args, then the C source
313 won't give the names of the arguments, so we shouldn't bother
314 trying to find them. */
315 if (defunflag
&& maxargs
!= -1)
317 char argbuf
[1024], *p
= argbuf
;
324 /* Skip into arguments. */
331 /* Copy arguments into ARGBUF. */
334 *p
++ = c
= getc (infile
);
338 fprintf (outfile
, "\n\n");
339 write_c_args (outfile
, argbuf
, minargs
, maxargs
);
348 /* Read a file of Lisp code, compiled or interpreted.
350 (defun NAME ARGS DOCSTRING ...)
351 (defmacro NAME ARGS DOCSTRING ...)
352 (autoload (quote NAME) FILE DOCSTRING ...)
353 (defvar NAME VALUE DOCSTRING)
354 (defconst NAME VALUE DOCSTRING)
355 (fset (quote NAME) (make-byte-code ... DOCSTRING ...))
356 (fset (quote NAME) #[... DOCSTRING ...])
357 starting in column zero.
358 (quote NAME) may appear as 'NAME as well.
359 For defun, defmacro, and autoload, we know how to skip over the arglist.
360 For defvar, defconst, and fset we skip to the docstring with a klugey
361 formatting convention: all docstrings must appear on the same line as the
362 initial open-paren (the one in column zero) and must contain a backslash
363 and a double-quote immediately after the initial double-quote. No newlines
364 must appear between the beginning of the form and the first double-quote.
365 The only source file that must follow this convention is loaddefs.el; aside
366 from that, it is always the .elc file that we look at, and they are no
367 problem because byte-compiler output follows this convention.
368 The NAME and DOCSTRING are output.
369 NAME is preceded by `F' for a function or `V' for a variable.
370 An entry is output only if DOCSTRING has \ newline just after the opening "
378 while (c
== ' ' || c
== '\t' || c
== '\n')
384 read_lisp_symbol (infile
, buffer
)
389 char *fillp
= buffer
;
396 *(++fillp
) = getc (infile
);
397 else if (c
== ' ' || c
== '\t' || c
== '\n' || c
== '(' || c
== ')')
408 fprintf (stderr
, "## expected a symbol, got '%c'\n", c
);
414 scan_lisp_file (filename
)
420 infile
= fopen (filename
, "r");
424 return 0; /* No error */
428 while (!feof (infile
))
430 char buffer
[BUFSIZ
];
431 char *fillp
= buffer
;
443 read_lisp_symbol (infile
, buffer
);
445 if (! strcmp (buffer
, "defun") ||
446 ! strcmp (buffer
, "defmacro"))
449 read_lisp_symbol (infile
, buffer
);
451 /* Skip the arguments: either "nil" or a list in parens */
454 if (c
== 'n') /* nil */
456 if ((c
= getc (infile
)) != 'i' ||
457 (c
= getc (infile
)) != 'l')
459 fprintf (stderr
, "## unparsable arglist in %s (%s)\n",
466 fprintf (stderr
, "## unparsable arglist in %s (%s)\n",
475 /* If the next three characters aren't `dquote bslash newline'
476 then we're not reading a docstring.
478 if ((c
= getc (infile
)) != '"' ||
479 (c
= getc (infile
)) != '\\' ||
480 (c
= getc (infile
)) != '\n')
483 fprintf (stderr
, "## non-docstring in %s (%s)\n",
490 else if (! strcmp (buffer
, "defvar") ||
491 ! strcmp (buffer
, "defconst"))
495 read_lisp_symbol (infile
, buffer
);
497 /* Skip until the first newline; remember the two previous chars. */
498 while (c
!= '\n' && c
>= 0)
505 /* If two previous characters were " and \,
506 this is a doc string. Otherwise, there is none. */
507 if (c2
!= '"' || c1
!= '\\')
510 fprintf (stderr
, "## non-docstring in %s (%s)\n",
517 else if (! strcmp (buffer
, "fset"))
524 read_lisp_symbol (infile
, buffer
);
529 fprintf (stderr
, "## unparsable name in fset in %s\n",
533 read_lisp_symbol (infile
, buffer
);
534 if (strcmp (buffer
, "quote"))
536 fprintf (stderr
, "## unparsable name in fset in %s\n",
540 read_lisp_symbol (infile
, buffer
);
545 "## unparsable quoted name in fset in %s\n",
551 /* Skip until the first newline; remember the two previous chars. */
552 while (c
!= '\n' && c
>= 0)
559 /* If two previous characters were " and \,
560 this is a doc string. Otherwise, there is none. */
561 if (c2
!= '"' || c1
!= '\\')
564 fprintf (stderr
, "## non-docstring in %s (%s)\n",
571 else if (! strcmp (buffer
, "autoload"))
576 read_lisp_symbol (infile
, buffer
);
581 fprintf (stderr
, "## unparsable name in autoload in %s\n",
585 read_lisp_symbol (infile
, buffer
);
586 if (strcmp (buffer
, "quote"))
588 fprintf (stderr
, "## unparsable name in autoload in %s\n",
592 read_lisp_symbol (infile
, buffer
);
597 "## unparsable quoted name in autoload in %s\n",
603 if ((c
= getc (infile
)) != '\"')
605 fprintf (stderr
, "## autoload of %s unparsable (%s)\n",
609 read_c_string (infile
, 0);
612 /* If the next three characters aren't `dquote bslash newline'
613 then we're not reading a docstring.
615 if ((c
= getc (infile
)) != '"' ||
616 (c
= getc (infile
)) != '\\' ||
617 (c
= getc (infile
)) != '\n')
620 fprintf (stderr
, "## non-docstring in %s (%s)\n",
628 else if (! strcmp (buffer
, "if") ||
629 ! strcmp (buffer
, "byte-code"))
636 fprintf (stderr
, "## unrecognised top-level form, %s (%s)\n",
642 /* At this point, there is a docstring that we should gobble.
643 The opening quote (and leading backslash-newline) have already
646 putc ('\n', outfile
);
648 putc (type
, outfile
);
649 fprintf (outfile
, "%s\n", buffer
);
650 read_c_string (infile
, 1);