1 /* Generate doc-string file for GNU Emacs from source files.
2 Copyright (C) 1985-1986, 1992-1994, 1997, 1999-2012
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 3 of the License, or
10 (at your option) any later version.
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. If not, see <http://www.gnu.org/licenses/>. */
21 /* The arguments given to this program are all the C and Lisp source files
22 of GNU Emacs. .elc and .el and .c files are allowed.
23 A .o file can also be specified; the .c file it was made from is used.
24 This helps the makefile pass the correct list of files.
25 Option -d DIR means change to DIR before looking for 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.
38 /* Defined to be emacs_main, sys_fopen, etc. in config.h. */
51 #endif /* WINDOWSNT */
54 #define READ_TEXT "rt"
55 #define READ_BINARY "rb"
56 #else /* not DOS_NT */
58 #define READ_BINARY "r"
59 #endif /* not DOS_NT */
62 #define DIRECTORY_SEP '/'
65 #ifndef IS_DIRECTORY_SEP
66 #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
69 /* Use this to suppress gcc's `...may be used before initialized' warnings. */
71 # define IF_LINT(Code) Code
73 # define IF_LINT(Code) /* empty */
76 static int scan_file (char *filename
);
77 static int scan_lisp_file (const char *filename
, const char *mode
);
78 static int scan_c_file (char *filename
, const char *mode
);
79 static void start_globals (void);
80 static void write_globals (void);
83 /* s/msdos.h defines this as sys_chdir, but we're not linking with the
84 file where that function is defined. */
90 /* Stdio stream for output to the DOC file. */
93 /* Name this program was invoked with. */
96 /* Nonzero if this invocation is generating globals.h. */
99 /* Print error message. `s1' is printf control string, `s2' is arg for it. */
103 error (const char *s1
, const char *s2
)
105 fprintf (stderr
, "%s: ", progname
);
106 fprintf (stderr
, s1
, s2
);
107 fprintf (stderr
, "\n");
110 /* Print error message and exit. */
113 static _Noreturn
void
114 fatal (const char *s1
, const char *s2
)
120 /* Like malloc but get fatal error if memory is exhausted. */
123 xmalloc (unsigned int size
)
125 void *result
= (void *) malloc (size
);
127 fatal ("virtual memory exhausted", 0);
131 /* Like realloc but get fatal error if memory is exhausted. */
134 xrealloc (void *arg
, unsigned int size
)
136 void *result
= (void *) realloc (arg
, size
);
138 fatal ("virtual memory exhausted", 0);
144 main (int argc
, char **argv
)
154 /* Don't put CRs in the DOC file. */
157 #if 0 /* Suspicion is that this causes hanging.
158 So instead we require people to use -o on MSDOS. */
159 (stdout
)->_flag
&= ~_IOTEXT
;
160 _setmode (fileno (stdout
), O_BINARY
);
166 _setmode (fileno (stdout
), O_BINARY
);
167 #endif /* WINDOWSNT */
169 /* If first two args are -o FILE, output to FILE. */
171 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-o"))
173 outfile
= fopen (argv
[i
+ 1], "w");
176 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-a"))
178 outfile
= fopen (argv
[i
+ 1], "a");
181 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-d"))
183 if (chdir (argv
[i
+ 1]) != 0)
185 perror (argv
[i
+ 1]);
190 if (argc
> i
&& !strcmp (argv
[i
], "-g"))
192 generate_globals
= 1;
197 fatal ("No output file specified", "");
199 if (generate_globals
)
203 for (; i
< argc
; i
++)
206 /* Don't process one file twice. */
207 for (j
= first_infile
; j
< i
; j
++)
208 if (! strcmp (argv
[i
], argv
[j
]))
211 err_count
+= scan_file (argv
[i
]);
214 if (err_count
== 0 && generate_globals
)
217 return (err_count
> 0 ? EXIT_FAILURE
: EXIT_SUCCESS
);
220 /* Add a source file name boundary marker in the output file. */
222 put_filename (char *filename
)
226 for (tmp
= filename
; *tmp
; tmp
++)
228 if (IS_DIRECTORY_SEP (*tmp
))
234 fprintf (outfile
, "%s\n", filename
);
237 /* Read file FILENAME and output its doc strings to outfile. */
238 /* Return 1 if file is not found, 0 if it is found. */
241 scan_file (char *filename
)
244 size_t len
= strlen (filename
);
246 if (!generate_globals
)
247 put_filename (filename
);
248 if (len
> 4 && !strcmp (filename
+ len
- 4, ".elc"))
249 return scan_lisp_file (filename
, READ_BINARY
);
250 else if (len
> 3 && !strcmp (filename
+ len
- 3, ".el"))
251 return scan_lisp_file (filename
, READ_TEXT
);
253 return scan_c_file (filename
, READ_TEXT
);
259 fprintf (outfile
, "/* This file was auto-generated by make-docfile. */\n");
260 fprintf (outfile
, "/* DO NOT EDIT. */\n");
261 fprintf (outfile
, "struct emacs_globals {\n");
264 static char input_buffer
[128];
266 /* Some state during the execution of `read_c_string_or_comment'. */
269 /* A count of spaces and newlines that have been read, but not output. */
270 unsigned pending_spaces
, pending_newlines
;
272 /* Where we're reading from. */
275 /* If non-zero, a buffer into which to copy characters. */
277 /* If non-zero, a file into which to copy characters. */
280 /* A keyword we look for at the beginning of lines. If found, it is
281 not copied, and SAW_KEYWORD is set to true. */
283 /* The current point we've reached in an occurrence of KEYWORD in
285 const char *cur_keyword_ptr
;
286 /* Set to true if we saw an occurrence of KEYWORD. */
290 /* Output CH to the file or buffer in STATE. Any pending newlines or
291 spaces are output first. */
294 put_char (int ch
, struct rcsoc_state
*state
)
299 if (state
->pending_newlines
> 0)
301 state
->pending_newlines
--;
304 else if (state
->pending_spaces
> 0)
306 state
->pending_spaces
--;
313 putc (out_ch
, state
->out_file
);
315 *state
->buf_ptr
++ = out_ch
;
317 while (out_ch
!= ch
);
320 /* If in the middle of scanning a keyword, continue scanning with
321 character CH, otherwise output CH to the file or buffer in STATE.
322 Any pending newlines or spaces are output first, as well as any
323 previously scanned characters that were thought to be part of a
324 keyword, but were in fact not. */
327 scan_keyword_or_put_char (int ch
, struct rcsoc_state
*state
)
330 && *state
->cur_keyword_ptr
== ch
331 && (state
->cur_keyword_ptr
> state
->keyword
332 || state
->pending_newlines
> 0))
333 /* We might be looking at STATE->keyword at some point.
334 Keep looking until we know for sure. */
336 if (*++state
->cur_keyword_ptr
== '\0')
337 /* Saw the whole keyword. Set SAW_KEYWORD flag to true. */
339 state
->saw_keyword
= 1;
341 /* Reset the scanning pointer. */
342 state
->cur_keyword_ptr
= state
->keyword
;
344 /* Canonicalize whitespace preceding a usage string. */
345 state
->pending_newlines
= 2;
346 state
->pending_spaces
= 0;
348 /* Skip any whitespace between the keyword and the
351 ch
= getc (state
->in_file
);
352 while (ch
== ' ' || ch
== '\n');
354 /* Output the open-paren we just read. */
355 put_char (ch
, state
);
357 /* Skip the function name and replace it with `fn'. */
359 ch
= getc (state
->in_file
);
360 while (ch
!= ' ' && ch
!= ')');
361 put_char ('f', state
);
362 put_char ('n', state
);
364 /* Put back the last character. */
365 ungetc (ch
, state
->in_file
);
370 if (state
->keyword
&& state
->cur_keyword_ptr
> state
->keyword
)
371 /* We scanned the beginning of a potential usage
372 keyword, but it was a false alarm. Output the
377 for (p
= state
->keyword
; p
< state
->cur_keyword_ptr
; p
++)
378 put_char (*p
, state
);
380 state
->cur_keyword_ptr
= state
->keyword
;
383 put_char (ch
, state
);
388 /* Skip a C string or C-style comment from INFILE, and return the
389 character that follows. COMMENT non-zero means skip a comment. If
390 PRINTFLAG is positive, output string contents to outfile. If it is
391 negative, store contents in buf. Convert escape sequences \n and
392 \t to newline and tab; discard \ followed by newline.
393 If SAW_USAGE is non-zero, then any occurrences of the string `usage:'
394 at the beginning of a line will be removed, and *SAW_USAGE set to
395 true if any were encountered. */
398 read_c_string_or_comment (FILE *infile
, int printflag
, int comment
, int *saw_usage
)
401 struct rcsoc_state state
;
403 state
.in_file
= infile
;
404 state
.buf_ptr
= (printflag
< 0 ? input_buffer
: 0);
405 state
.out_file
= (printflag
> 0 ? outfile
: 0);
406 state
.pending_spaces
= 0;
407 state
.pending_newlines
= 0;
408 state
.keyword
= (saw_usage
? "usage:" : 0);
409 state
.cur_keyword_ptr
= state
.keyword
;
410 state
.saw_keyword
= 0;
414 while (c
== '\n' || c
== '\r' || c
== '\t' || c
== ' ')
419 while (c
!= EOF
&& (comment
? c
!= '*' : c
!= '"'))
424 if (c
== '\n' || c
== '\r')
436 state
.pending_spaces
++;
439 state
.pending_newlines
++;
440 state
.pending_spaces
= 0;
443 scan_keyword_or_put_char (c
, &state
);
459 scan_keyword_or_put_char ('*', &state
);
466 /* If we had a "", concatenate the two strings. */
475 *saw_usage
= state
.saw_keyword
;
482 /* Write to file OUT the argument names of function FUNC, whose text is in BUF.
483 MINARGS and MAXARGS are the minimum and maximum number of arguments. */
486 write_c_args (FILE *out
, char *func
, char *buf
, int minargs
, int maxargs
)
490 char *ident_start
IF_LINT (= NULL
);
491 size_t ident_length
= 0;
493 fprintf (out
, "(fn");
498 for (p
= buf
; *p
; p
++)
502 /* Notice when a new identifier starts. */
503 if ((('A' <= c
&& c
<= 'Z')
504 || ('a' <= c
&& c
<= 'z')
505 || ('0' <= c
&& c
<= '9')
517 ident_length
= p
- ident_start
;
521 /* Found the end of an argument, write out the last seen
523 if (c
== ',' || c
== ')')
525 if (ident_length
== 0)
527 error ("empty arg list for `%s' should be (void), not ()", func
);
531 if (strncmp (ident_start
, "void", ident_length
) == 0)
536 if (minargs
== 0 && maxargs
> 0)
537 fprintf (out
, "&optional ");
542 /* In C code, `default' is a reserved word, so we spell it
543 `defalt'; demangle that here. */
544 if (ident_length
== 6 && strncmp (ident_start
, "defalt", 6) == 0)
545 fprintf (out
, "DEFAULT");
547 while (ident_length
-- > 0)
550 if (c
>= 'a' && c
<= 'z')
551 /* Upcase the letter. */
554 /* Print underscore as hyphen. */
564 /* The types of globals. */
574 /* A single global. */
577 enum global_type type
;
582 /* All the variable names we saw while scanning C sources in `-g'
585 int num_globals_allocated
;
586 struct global
*globals
;
589 add_global (enum global_type type
, char *name
, int value
)
591 /* Ignore the one non-symbol that can occur. */
592 if (strcmp (name
, "..."))
596 if (num_globals_allocated
== 0)
598 num_globals_allocated
= 100;
599 globals
= xmalloc (num_globals_allocated
* sizeof (struct global
));
601 else if (num_globals
== num_globals_allocated
)
603 num_globals_allocated
*= 2;
604 globals
= xrealloc (globals
,
605 num_globals_allocated
* sizeof (struct global
));
608 globals
[num_globals
- 1].type
= type
;
609 globals
[num_globals
- 1].name
= name
;
610 globals
[num_globals
- 1].value
= value
;
615 compare_globals (const void *a
, const void *b
)
617 const struct global
*ga
= a
;
618 const struct global
*gb
= b
;
620 if (ga
->type
== FUNCTION
)
622 if (gb
->type
!= FUNCTION
)
625 else if (gb
->type
== FUNCTION
)
628 return strcmp (ga
->name
, gb
->name
);
632 close_emacs_globals (void)
634 fprintf (outfile
, "};\n");
635 fprintf (outfile
, "extern struct emacs_globals globals;\n");
641 int i
, seen_defun
= 0;
642 qsort (globals
, num_globals
, sizeof (struct global
), compare_globals
);
643 for (i
= 0; i
< num_globals
; ++i
)
647 switch (globals
[i
].type
)
656 type
= "Lisp_Object";
661 close_emacs_globals ();
662 fprintf (outfile
, "\n");
667 fatal ("not a recognized DEFVAR_", 0);
670 if (globals
[i
].type
!= FUNCTION
)
672 fprintf (outfile
, " %s f_%s;\n", type
, globals
[i
].name
);
673 fprintf (outfile
, "#define %s globals.f_%s\n",
674 globals
[i
].name
, globals
[i
].name
);
678 /* It would be nice to have a cleaner way to deal with these
680 if (strcmp (globals
[i
].name
, "Fthrow") == 0
681 || strcmp (globals
[i
].name
, "Ftop_level") == 0
682 || strcmp (globals
[i
].name
, "Fkill_emacs") == 0)
683 fprintf (outfile
, "_Noreturn ");
684 fprintf (outfile
, "EXFUN (%s, ", globals
[i
].name
);
685 if (globals
[i
].value
== -1)
686 fprintf (outfile
, "MANY");
687 else if (globals
[i
].value
== -2)
688 fprintf (outfile
, "UNEVALLED");
690 fprintf (outfile
, "%d", globals
[i
].value
);
691 fprintf (outfile
, ");\n");
694 while (i
+ 1 < num_globals
695 && !strcmp (globals
[i
].name
, globals
[i
+ 1].name
))
700 close_emacs_globals ();
704 /* Read through a c file. If a .o file is named,
705 the corresponding .c or .m file is read instead.
706 Looks for DEFUN constructs such as are defined in ../src/lisp.h.
707 Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */
710 scan_c_file (char *filename
, const char *mode
)
715 int minargs
, maxargs
;
716 int extension
= filename
[strlen (filename
) - 1];
718 if (extension
== 'o')
719 filename
[strlen (filename
) - 1] = 'c';
721 infile
= fopen (filename
, mode
);
723 if (infile
== NULL
&& extension
== 'o')
726 filename
[strlen (filename
) - 1] = 'm';
727 infile
= fopen (filename
, mode
);
729 filename
[strlen (filename
) - 1] = 'c'; /* Don't confuse people. */
732 /* No error if non-ex input file. */
739 /* Reset extension to be able to detect duplicate files. */
740 filename
[strlen (filename
) - 1] = extension
;
743 while (!feof (infile
))
747 int defvarperbufferflag
= 0;
749 enum global_type type
= INVALID
;
750 char *name
IF_LINT (= 0);
752 if (c
!= '\n' && c
!= '\r')
786 defvarperbufferflag
= (c
== 'P');
787 if (generate_globals
)
790 type
= EMACS_INTEGER
;
798 /* We need to distinguish between DEFVAR_BOOL and
799 DEFVAR_BUFFER_DEFAULTS. */
800 if (generate_globals
&& type
== BOOLEAN
&& c
!= 'O')
812 defunflag
= c
== 'U';
817 && (!defvarflag
|| defvarperbufferflag
|| type
== INVALID
)
828 /* Lisp variable or function name. */
832 c
= read_c_string_or_comment (infile
, -1, 0, 0);
834 if (generate_globals
)
838 /* Skip "," and whitespace. */
843 while (c
== ',' || c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r');
845 /* Read in the identifier. */
848 input_buffer
[i
++] = c
;
851 while (! (c
== ',' || c
== ' ' || c
== '\t'
852 || c
== '\n' || c
== '\r'));
853 input_buffer
[i
] = '\0';
855 name
= xmalloc (i
+ 1);
856 memcpy (name
, input_buffer
, i
+ 1);
860 add_global (type
, name
, 0);
865 /* DEFVAR_LISP ("name", addr, "doc")
866 DEFVAR_LISP ("name", addr /\* doc *\/)
867 DEFVAR_LISP ("name", addr, doc: /\* doc *\/) */
870 commas
= generate_globals
? 4 : 5;
871 else if (defvarperbufferflag
)
875 else /* For DEFSIMPLE and DEFPRED. */
884 if (defunflag
&& (commas
== 1 || commas
== 2))
889 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t');
893 if (commas
== 2) /* Pick up minargs. */
894 scanned
= fscanf (infile
, "%d", &minargs
);
895 else /* Pick up maxargs. */
896 if (c
== 'M' || c
== 'U') /* MANY || UNEVALLED */
898 if (generate_globals
)
899 maxargs
= (c
== 'M') ? -1 : -2;
904 scanned
= fscanf (infile
, "%d", &maxargs
);
915 if (generate_globals
)
917 add_global (FUNCTION
, name
, maxargs
);
921 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
925 c
= read_c_string_or_comment (infile
, 0, 0, 0);
927 while (c
!= EOF
&& c
!= ',' && c
!= '/')
932 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
934 while ((c
>= 'a' && c
<= 'z') || (c
>= 'Z' && c
<= 'Z'))
940 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
947 && (c
= getc (infile
),
951 int comment
= c
!= '"';
955 putc (defvarflag
? 'V' : 'F', outfile
);
956 fprintf (outfile
, "%s\n", input_buffer
);
959 getc (infile
); /* Skip past `*'. */
960 c
= read_c_string_or_comment (infile
, 1, comment
, &saw_usage
);
962 /* If this is a defun, find the arguments and print them. If
963 this function takes MANY or UNEVALLED args, then the C source
964 won't give the names of the arguments, so we shouldn't bother
967 Various doc-string styles:
968 0: DEFUN (..., "DOC") (args) [!comment]
969 1: DEFUN (..., /\* DOC *\/ (args)) [comment && !doc_keyword]
970 2: DEFUN (..., doc: /\* DOC *\/) (args) [comment && doc_keyword]
972 if (defunflag
&& maxargs
!= -1 && !saw_usage
)
974 char argbuf
[1024], *p
= argbuf
;
976 if (!comment
|| doc_keyword
)
984 /* Skip into arguments. */
991 /* Copy arguments into ARGBUF. */
994 *p
++ = c
= getc (infile
);
998 fprintf (outfile
, "\n\n");
999 write_c_args (outfile
, input_buffer
, argbuf
, minargs
, maxargs
);
1001 else if (defunflag
&& maxargs
== -1 && !saw_usage
)
1002 /* The DOC should provide the usage form. */
1003 fprintf (stderr
, "Missing `usage' for function `%s'.\n",
1012 /* Read a file of Lisp code, compiled or interpreted.
1014 (defun NAME ARGS DOCSTRING ...)
1015 (defmacro NAME ARGS DOCSTRING ...)
1016 (defsubst NAME ARGS DOCSTRING ...)
1017 (autoload (quote NAME) FILE DOCSTRING ...)
1018 (defvar NAME VALUE DOCSTRING)
1019 (defconst NAME VALUE DOCSTRING)
1020 (fset (quote NAME) (make-byte-code ... DOCSTRING ...))
1021 (fset (quote NAME) #[... DOCSTRING ...])
1022 (defalias (quote NAME) #[... DOCSTRING ...])
1023 (custom-declare-variable (quote NAME) VALUE DOCSTRING ...)
1024 starting in column zero.
1025 (quote NAME) may appear as 'NAME as well.
1027 We also look for #@LENGTH CONTENTS^_ at the beginning of the line.
1028 When we find that, we save it for the following defining-form,
1029 and we use that instead of reading a doc string within that defining-form.
1031 For defvar, defconst, and fset we skip to the docstring with a kludgy
1032 formatting convention: all docstrings must appear on the same line as the
1033 initial open-paren (the one in column zero) and must contain a backslash
1034 and a newline immediately after the initial double-quote. No newlines
1035 must appear between the beginning of the form and the first double-quote.
1036 For defun, defmacro, and autoload, we know how to skip over the
1037 arglist, but the doc string must still have a backslash and newline
1038 immediately after the double quote.
1039 The only source files that must follow this convention are preloaded
1040 uncompiled ones like loaddefs.el and bindings.el; aside
1041 from that, it is always the .elc file that we look at, and they are no
1042 problem because byte-compiler output follows this convention.
1043 The NAME and DOCSTRING are output.
1044 NAME is preceded by `F' for a function or `V' for a variable.
1045 An entry is output only if DOCSTRING has \ newline just after the opening ".
1049 skip_white (FILE *infile
)
1052 while (c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r')
1058 read_lisp_symbol (FILE *infile
, char *buffer
)
1061 char *fillp
= buffer
;
1063 skip_white (infile
);
1068 *(++fillp
) = getc (infile
);
1069 else if (c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r' || c
== '(' || c
== ')')
1080 fprintf (stderr
, "## expected a symbol, got '%c'\n", c
);
1082 skip_white (infile
);
1086 search_lisp_doc_at_eol (FILE *infile
)
1088 char c
= 0, c1
= 0, c2
= 0;
1090 /* Skip until the end of line; remember two previous chars. */
1091 while (c
!= '\n' && c
!= '\r' && c
!= EOF
)
1098 /* If two previous characters were " and \,
1099 this is a doc string. Otherwise, there is none. */
1100 if (c2
!= '"' || c1
!= '\\')
1103 fprintf (stderr
, "## non-docstring in %s (%s)\n",
1114 scan_lisp_file (const char *filename
, const char *mode
)
1118 char *saved_string
= 0;
1120 if (generate_globals
)
1121 fatal ("scanning lisp file when -g specified", 0);
1123 infile
= fopen (filename
, mode
);
1127 return 0; /* No error. */
1131 while (!feof (infile
))
1133 char buffer
[BUFSIZ
];
1136 /* If not at end of line, skip till we get to one. */
1137 if (c
!= '\n' && c
!= '\r')
1142 /* Skip the line break. */
1143 while (c
== '\n' || c
== '\r')
1145 /* Detect a dynamic doc string and save it for the next expression. */
1154 /* Read the length. */
1155 while ((c
= getc (infile
),
1156 c
>= '0' && c
<= '9'))
1163 fatal ("invalid dynamic doc string length", "");
1166 fatal ("space not found after dynamic doc string length", "");
1168 /* The next character is a space that is counted in the length
1169 but not part of the doc string.
1170 We already read it, so just ignore it. */
1173 /* Read in the contents. */
1174 free (saved_string
);
1175 saved_string
= (char *) xmalloc (length
);
1176 for (i
= 0; i
< length
; i
++)
1177 saved_string
[i
] = getc (infile
);
1178 /* The last character is a ^_.
1179 That is needed in the .elc file
1180 but it is redundant in DOC. So get rid of it here. */
1181 saved_string
[length
- 1] = 0;
1182 /* Skip the line break. */
1183 while (c
== '\n' || c
== '\r')
1185 /* Skip the following line. */
1186 while (c
!= '\n' && c
!= '\r')
1195 read_lisp_symbol (infile
, buffer
);
1197 if (! strcmp (buffer
, "defun")
1198 || ! strcmp (buffer
, "defmacro")
1199 || ! strcmp (buffer
, "defsubst"))
1202 read_lisp_symbol (infile
, buffer
);
1204 /* Skip the arguments: either "nil" or a list in parens. */
1207 if (c
== 'n') /* nil */
1209 if ((c
= getc (infile
)) != 'i'
1210 || (c
= getc (infile
)) != 'l')
1212 fprintf (stderr
, "## unparsable arglist in %s (%s)\n",
1219 fprintf (stderr
, "## unparsable arglist in %s (%s)\n",
1226 skip_white (infile
);
1228 /* If the next three characters aren't `dquote bslash newline'
1229 then we're not reading a docstring.
1231 if ((c
= getc (infile
)) != '"'
1232 || (c
= getc (infile
)) != '\\'
1233 || ((c
= getc (infile
)) != '\n' && c
!= '\r'))
1236 fprintf (stderr
, "## non-docstring in %s (%s)\n",
1243 /* defcustom can only occur in uncompiled Lisp files. */
1244 else if (! strcmp (buffer
, "defvar")
1245 || ! strcmp (buffer
, "defconst")
1246 || ! strcmp (buffer
, "defcustom"))
1249 read_lisp_symbol (infile
, buffer
);
1251 if (saved_string
== 0)
1252 if (!search_lisp_doc_at_eol (infile
))
1256 else if (! strcmp (buffer
, "custom-declare-variable")
1257 || ! strcmp (buffer
, "defvaralias")
1264 read_lisp_symbol (infile
, buffer
);
1270 "## unparsable name in custom-declare-variable in %s\n",
1274 read_lisp_symbol (infile
, buffer
);
1275 if (strcmp (buffer
, "quote"))
1278 "## unparsable name in custom-declare-variable in %s\n",
1282 read_lisp_symbol (infile
, buffer
);
1287 "## unparsable quoted name in custom-declare-variable in %s\n",
1293 if (saved_string
== 0)
1294 if (!search_lisp_doc_at_eol (infile
))
1298 else if (! strcmp (buffer
, "fset") || ! strcmp (buffer
, "defalias"))
1304 read_lisp_symbol (infile
, buffer
);
1309 fprintf (stderr
, "## unparsable name in fset in %s\n",
1313 read_lisp_symbol (infile
, buffer
);
1314 if (strcmp (buffer
, "quote"))
1316 fprintf (stderr
, "## unparsable name in fset in %s\n",
1320 read_lisp_symbol (infile
, buffer
);
1325 "## unparsable quoted name in fset in %s\n",
1331 if (saved_string
== 0)
1332 if (!search_lisp_doc_at_eol (infile
))
1336 else if (! strcmp (buffer
, "autoload"))
1341 read_lisp_symbol (infile
, buffer
);
1346 fprintf (stderr
, "## unparsable name in autoload in %s\n",
1350 read_lisp_symbol (infile
, buffer
);
1351 if (strcmp (buffer
, "quote"))
1353 fprintf (stderr
, "## unparsable name in autoload in %s\n",
1357 read_lisp_symbol (infile
, buffer
);
1362 "## unparsable quoted name in autoload in %s\n",
1367 skip_white (infile
);
1368 if ((c
= getc (infile
)) != '\"')
1370 fprintf (stderr
, "## autoload of %s unparsable (%s)\n",
1374 read_c_string_or_comment (infile
, 0, 0, 0);
1376 if (saved_string
== 0)
1377 if (!search_lisp_doc_at_eol (infile
))
1382 else if (! strcmp (buffer
, "if")
1383 || ! strcmp (buffer
, "byte-code"))
1390 fprintf (stderr
, "## unrecognized top-level form, %s (%s)\n",
1396 /* At this point, we should either use the previous dynamic doc string in
1397 saved_string or gobble a doc string from the input file.
1398 In the latter case, the opening quote (and leading backslash-newline)
1399 have already been read. */
1401 putc (037, outfile
);
1402 putc (type
, outfile
);
1403 fprintf (outfile
, "%s\n", buffer
);
1406 fputs (saved_string
, outfile
);
1407 /* Don't use one dynamic doc string twice. */
1408 free (saved_string
);
1412 read_c_string_or_comment (infile
, 1, 0, 0);
1419 /* make-docfile.c ends here */