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 fatal (const char *s1
, const char *s2
) NO_RETURN
;
80 static void start_globals (void);
81 static void write_globals (void);
84 /* s/msdos.h defines this as sys_chdir, but we're not linking with the
85 file where that function is defined. */
91 /* Stdio stream for output to the DOC file. */
94 /* Name this program was invoked with. */
97 /* Nonzero if this invocation is generating globals.h. */
100 /* Print error message. `s1' is printf control string, `s2' is arg for it. */
104 error (const char *s1
, const char *s2
)
106 fprintf (stderr
, "%s: ", progname
);
107 fprintf (stderr
, s1
, s2
);
108 fprintf (stderr
, "\n");
111 /* Print error message and exit. */
115 fatal (const char *s1
, const char *s2
)
121 /* Like malloc but get fatal error if memory is exhausted. */
124 xmalloc (unsigned int size
)
126 void *result
= (void *) malloc (size
);
128 fatal ("virtual memory exhausted", 0);
132 /* Like realloc but get fatal error if memory is exhausted. */
135 xrealloc (void *arg
, unsigned int size
)
137 void *result
= (void *) realloc (arg
, size
);
139 fatal ("virtual memory exhausted", 0);
145 main (int argc
, char **argv
)
155 /* Don't put CRs in the DOC file. */
158 #if 0 /* Suspicion is that this causes hanging.
159 So instead we require people to use -o on MSDOS. */
160 (stdout
)->_flag
&= ~_IOTEXT
;
161 _setmode (fileno (stdout
), O_BINARY
);
167 _setmode (fileno (stdout
), O_BINARY
);
168 #endif /* WINDOWSNT */
170 /* If first two args are -o FILE, output to FILE. */
172 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-o"))
174 outfile
= fopen (argv
[i
+ 1], "w");
177 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-a"))
179 outfile
= fopen (argv
[i
+ 1], "a");
182 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-d"))
184 if (chdir (argv
[i
+ 1]) != 0)
186 perror (argv
[i
+ 1]);
191 if (argc
> i
&& !strcmp (argv
[i
], "-g"))
193 generate_globals
= 1;
198 fatal ("No output file specified", "");
200 if (generate_globals
)
204 for (; i
< argc
; i
++)
207 /* Don't process one file twice. */
208 for (j
= first_infile
; j
< i
; j
++)
209 if (! strcmp (argv
[i
], argv
[j
]))
212 err_count
+= scan_file (argv
[i
]);
215 if (err_count
== 0 && generate_globals
)
218 return (err_count
> 0 ? EXIT_FAILURE
: EXIT_SUCCESS
);
221 /* Add a source file name boundary marker in the output file. */
223 put_filename (char *filename
)
227 for (tmp
= filename
; *tmp
; tmp
++)
229 if (IS_DIRECTORY_SEP(*tmp
))
235 fprintf (outfile
, "%s\n", filename
);
238 /* Read file FILENAME and output its doc strings to outfile. */
239 /* Return 1 if file is not found, 0 if it is found. */
242 scan_file (char *filename
)
245 size_t len
= strlen (filename
);
247 if (!generate_globals
)
248 put_filename (filename
);
249 if (len
> 4 && !strcmp (filename
+ len
- 4, ".elc"))
250 return scan_lisp_file (filename
, READ_BINARY
);
251 else if (len
> 3 && !strcmp (filename
+ len
- 3, ".el"))
252 return scan_lisp_file (filename
, READ_TEXT
);
254 return scan_c_file (filename
, READ_TEXT
);
260 fprintf (outfile
, "/* This file was auto-generated by make-docfile. */\n");
261 fprintf (outfile
, "/* DO NOT EDIT. */\n");
262 fprintf (outfile
, "struct emacs_globals {\n");
265 static char input_buffer
[128];
267 /* Some state during the execution of `read_c_string_or_comment'. */
270 /* A count of spaces and newlines that have been read, but not output. */
271 unsigned pending_spaces
, pending_newlines
;
273 /* Where we're reading from. */
276 /* If non-zero, a buffer into which to copy characters. */
278 /* If non-zero, a file into which to copy characters. */
281 /* A keyword we look for at the beginning of lines. If found, it is
282 not copied, and SAW_KEYWORD is set to true. */
284 /* The current point we've reached in an occurrence of KEYWORD in
286 const char *cur_keyword_ptr
;
287 /* Set to true if we saw an occurrence of KEYWORD. */
291 /* Output CH to the file or buffer in STATE. Any pending newlines or
292 spaces are output first. */
295 put_char (int ch
, struct rcsoc_state
*state
)
300 if (state
->pending_newlines
> 0)
302 state
->pending_newlines
--;
305 else if (state
->pending_spaces
> 0)
307 state
->pending_spaces
--;
314 putc (out_ch
, state
->out_file
);
316 *state
->buf_ptr
++ = out_ch
;
318 while (out_ch
!= ch
);
321 /* If in the middle of scanning a keyword, continue scanning with
322 character CH, otherwise output CH to the file or buffer in STATE.
323 Any pending newlines or spaces are output first, as well as any
324 previously scanned characters that were thought to be part of a
325 keyword, but were in fact not. */
328 scan_keyword_or_put_char (int ch
, struct rcsoc_state
*state
)
331 && *state
->cur_keyword_ptr
== ch
332 && (state
->cur_keyword_ptr
> state
->keyword
333 || state
->pending_newlines
> 0))
334 /* We might be looking at STATE->keyword at some point.
335 Keep looking until we know for sure. */
337 if (*++state
->cur_keyword_ptr
== '\0')
338 /* Saw the whole keyword. Set SAW_KEYWORD flag to true. */
340 state
->saw_keyword
= 1;
342 /* Reset the scanning pointer. */
343 state
->cur_keyword_ptr
= state
->keyword
;
345 /* Canonicalize whitespace preceding a usage string. */
346 state
->pending_newlines
= 2;
347 state
->pending_spaces
= 0;
349 /* Skip any whitespace between the keyword and the
352 ch
= getc (state
->in_file
);
353 while (ch
== ' ' || ch
== '\n');
355 /* Output the open-paren we just read. */
356 put_char (ch
, state
);
358 /* Skip the function name and replace it with `fn'. */
360 ch
= getc (state
->in_file
);
361 while (ch
!= ' ' && ch
!= ')');
362 put_char ('f', state
);
363 put_char ('n', state
);
365 /* Put back the last character. */
366 ungetc (ch
, state
->in_file
);
371 if (state
->keyword
&& state
->cur_keyword_ptr
> state
->keyword
)
372 /* We scanned the beginning of a potential usage
373 keyword, but it was a false alarm. Output the
378 for (p
= state
->keyword
; p
< state
->cur_keyword_ptr
; p
++)
379 put_char (*p
, state
);
381 state
->cur_keyword_ptr
= state
->keyword
;
384 put_char (ch
, state
);
389 /* Skip a C string or C-style comment from INFILE, and return the
390 character that follows. COMMENT non-zero means skip a comment. If
391 PRINTFLAG is positive, output string contents to outfile. If it is
392 negative, store contents in buf. Convert escape sequences \n and
393 \t to newline and tab; discard \ followed by newline.
394 If SAW_USAGE is non-zero, then any occurrences of the string `usage:'
395 at the beginning of a line will be removed, and *SAW_USAGE set to
396 true if any were encountered. */
399 read_c_string_or_comment (FILE *infile
, int printflag
, int comment
, int *saw_usage
)
402 struct rcsoc_state state
;
404 state
.in_file
= infile
;
405 state
.buf_ptr
= (printflag
< 0 ? input_buffer
: 0);
406 state
.out_file
= (printflag
> 0 ? outfile
: 0);
407 state
.pending_spaces
= 0;
408 state
.pending_newlines
= 0;
409 state
.keyword
= (saw_usage
? "usage:" : 0);
410 state
.cur_keyword_ptr
= state
.keyword
;
411 state
.saw_keyword
= 0;
415 while (c
== '\n' || c
== '\r' || c
== '\t' || c
== ' ')
420 while (c
!= EOF
&& (comment
? c
!= '*' : c
!= '"'))
425 if (c
== '\n' || c
== '\r')
437 state
.pending_spaces
++;
440 state
.pending_newlines
++;
441 state
.pending_spaces
= 0;
444 scan_keyword_or_put_char (c
, &state
);
460 scan_keyword_or_put_char ('*', &state
);
467 /* If we had a "", concatenate the two strings. */
476 *saw_usage
= state
.saw_keyword
;
483 /* Write to file OUT the argument names of function FUNC, whose text is in BUF.
484 MINARGS and MAXARGS are the minimum and maximum number of arguments. */
487 write_c_args (FILE *out
, char *func
, char *buf
, int minargs
, int maxargs
)
491 char *ident_start
IF_LINT (= NULL
);
492 size_t ident_length
= 0;
494 fprintf (out
, "(fn");
499 for (p
= buf
; *p
; p
++)
503 /* Notice when a new identifier starts. */
504 if ((('A' <= c
&& c
<= 'Z')
505 || ('a' <= c
&& c
<= 'z')
506 || ('0' <= c
&& c
<= '9')
518 ident_length
= p
- ident_start
;
522 /* Found the end of an argument, write out the last seen
524 if (c
== ',' || c
== ')')
526 if (ident_length
== 0)
528 error ("empty arg list for `%s' should be (void), not ()", func
);
532 if (strncmp (ident_start
, "void", ident_length
) == 0)
537 if (minargs
== 0 && maxargs
> 0)
538 fprintf (out
, "&optional ");
543 /* In C code, `default' is a reserved word, so we spell it
544 `defalt'; demangle that here. */
545 if (ident_length
== 6 && strncmp (ident_start
, "defalt", 6) == 0)
546 fprintf (out
, "DEFAULT");
548 while (ident_length
-- > 0)
551 if (c
>= 'a' && c
<= 'z')
552 /* Upcase the letter. */
555 /* Print underscore as hyphen. */
565 /* The types of globals. */
574 /* A single global. */
577 enum global_type type
;
581 /* All the variable names we saw while scanning C sources in `-g'
584 int num_globals_allocated
;
585 struct global
*globals
;
588 add_global (enum global_type type
, char *name
)
590 /* Ignore the one non-symbol that can occur. */
591 if (strcmp (name
, "..."))
595 if (num_globals_allocated
== 0)
597 num_globals_allocated
= 100;
598 globals
= xmalloc (num_globals_allocated
* sizeof (struct global
));
600 else if (num_globals
== num_globals_allocated
)
602 num_globals_allocated
*= 2;
603 globals
= xrealloc (globals
,
604 num_globals_allocated
* sizeof (struct global
));
607 globals
[num_globals
- 1].type
= type
;
608 globals
[num_globals
- 1].name
= name
;
613 compare_globals (const void *a
, const void *b
)
615 const struct global
*ga
= a
;
616 const struct global
*gb
= b
;
617 return strcmp (ga
->name
, gb
->name
);
624 qsort (globals
, num_globals
, sizeof (struct global
), compare_globals
);
625 for (i
= 0; i
< num_globals
; ++i
)
629 switch (globals
[i
].type
)
638 type
= "Lisp_Object";
641 fatal ("not a recognized DEFVAR_", 0);
644 fprintf (outfile
, " %s f_%s;\n", type
, globals
[i
].name
);
645 fprintf (outfile
, "#define %s globals.f_%s\n",
646 globals
[i
].name
, globals
[i
].name
);
647 while (i
+ 1 < num_globals
648 && !strcmp (globals
[i
].name
, globals
[i
+ 1].name
))
652 fprintf (outfile
, "};\n");
653 fprintf (outfile
, "extern struct emacs_globals globals;\n");
657 /* Read through a c file. If a .o file is named,
658 the corresponding .c or .m file is read instead.
659 Looks for DEFUN constructs such as are defined in ../src/lisp.h.
660 Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */
663 scan_c_file (char *filename
, const char *mode
)
668 int minargs
, maxargs
;
669 int extension
= filename
[strlen (filename
) - 1];
671 if (extension
== 'o')
672 filename
[strlen (filename
) - 1] = 'c';
674 infile
= fopen (filename
, mode
);
676 if (infile
== NULL
&& extension
== 'o')
679 filename
[strlen (filename
) - 1] = 'm';
680 infile
= fopen (filename
, mode
);
682 filename
[strlen (filename
) - 1] = 'c'; /* don't confuse people */
685 /* No error if non-ex input file */
692 /* Reset extension to be able to detect duplicate files. */
693 filename
[strlen (filename
) - 1] = extension
;
696 while (!feof (infile
))
700 int defvarperbufferflag
= 0;
702 enum global_type type
= INVALID
;
704 if (c
!= '\n' && c
!= '\r')
738 defvarperbufferflag
= (c
== 'P');
739 if (generate_globals
)
742 type
= EMACS_INTEGER
;
750 /* We need to distinguish between DEFVAR_BOOL and
751 DEFVAR_BUFFER_DEFAULTS. */
752 if (generate_globals
&& type
== BOOLEAN
&& c
!= 'O')
764 defunflag
= c
== 'U';
768 if (generate_globals
&& (!defvarflag
|| defvarperbufferflag
779 /* Lisp variable or function name. */
783 c
= read_c_string_or_comment (infile
, -1, 0, 0);
785 if (generate_globals
)
790 /* Skip "," and whitespace. */
795 while (c
== ',' || c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r');
797 /* Read in the identifier. */
800 input_buffer
[i
++] = c
;
803 while (! (c
== ',' || c
== ' ' || c
== '\t' ||
804 c
== '\n' || c
== '\r'));
805 input_buffer
[i
] = '\0';
807 name
= xmalloc (i
+ 1);
808 memcpy (name
, input_buffer
, i
+ 1);
809 add_global (type
, name
);
813 /* DEFVAR_LISP ("name", addr, "doc")
814 DEFVAR_LISP ("name", addr /\* doc *\/)
815 DEFVAR_LISP ("name", addr, doc: /\* doc *\/) */
819 else if (defvarperbufferflag
)
823 else /* For DEFSIMPLE and DEFPRED */
832 if (defunflag
&& (commas
== 1 || commas
== 2))
837 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t');
841 if (commas
== 2) /* pick up minargs */
842 scanned
= fscanf (infile
, "%d", &minargs
);
843 else /* pick up maxargs */
844 if (c
== 'M' || c
== 'U') /* MANY || UNEVALLED */
847 scanned
= fscanf (infile
, "%d", &maxargs
);
858 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
862 c
= read_c_string_or_comment (infile
, 0, 0, 0);
864 while (c
!= EOF
&& c
!= ',' && c
!= '/')
869 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
871 while ((c
>= 'a' && c
<= 'z') || (c
>= 'Z' && c
<= 'Z'))
877 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
884 && (c
= getc (infile
),
888 int comment
= c
!= '"';
892 putc (defvarflag
? 'V' : 'F', outfile
);
893 fprintf (outfile
, "%s\n", input_buffer
);
896 getc (infile
); /* Skip past `*' */
897 c
= read_c_string_or_comment (infile
, 1, comment
, &saw_usage
);
899 /* If this is a defun, find the arguments and print them. If
900 this function takes MANY or UNEVALLED args, then the C source
901 won't give the names of the arguments, so we shouldn't bother
904 Various doc-string styles:
905 0: DEFUN (..., "DOC") (args) [!comment]
906 1: DEFUN (..., /\* DOC *\/ (args)) [comment && !doc_keyword]
907 2: DEFUN (..., doc: /\* DOC *\/) (args) [comment && doc_keyword]
909 if (defunflag
&& maxargs
!= -1 && !saw_usage
)
911 char argbuf
[1024], *p
= argbuf
;
913 if (!comment
|| doc_keyword
)
921 /* Skip into arguments. */
928 /* Copy arguments into ARGBUF. */
931 *p
++ = c
= getc (infile
);
935 fprintf (outfile
, "\n\n");
936 write_c_args (outfile
, input_buffer
, argbuf
, minargs
, maxargs
);
938 else if (defunflag
&& maxargs
== -1 && !saw_usage
)
939 /* The DOC should provide the usage form. */
940 fprintf (stderr
, "Missing `usage' for function `%s'.\n",
949 /* Read a file of Lisp code, compiled or interpreted.
951 (defun NAME ARGS DOCSTRING ...)
952 (defmacro NAME ARGS DOCSTRING ...)
953 (defsubst NAME ARGS DOCSTRING ...)
954 (autoload (quote NAME) FILE DOCSTRING ...)
955 (defvar NAME VALUE DOCSTRING)
956 (defconst NAME VALUE DOCSTRING)
957 (fset (quote NAME) (make-byte-code ... DOCSTRING ...))
958 (fset (quote NAME) #[... DOCSTRING ...])
959 (defalias (quote NAME) #[... DOCSTRING ...])
960 (custom-declare-variable (quote NAME) VALUE DOCSTRING ...)
961 starting in column zero.
962 (quote NAME) may appear as 'NAME as well.
964 We also look for #@LENGTH CONTENTS^_ at the beginning of the line.
965 When we find that, we save it for the following defining-form,
966 and we use that instead of reading a doc string within that defining-form.
968 For defvar, defconst, and fset we skip to the docstring with a kludgy
969 formatting convention: all docstrings must appear on the same line as the
970 initial open-paren (the one in column zero) and must contain a backslash
971 and a newline immediately after the initial double-quote. No newlines
972 must appear between the beginning of the form and the first double-quote.
973 For defun, defmacro, and autoload, we know how to skip over the
974 arglist, but the doc string must still have a backslash and newline
975 immediately after the double quote.
976 The only source files that must follow this convention are preloaded
977 uncompiled ones like loaddefs.el and bindings.el; aside
978 from that, it is always the .elc file that we look at, and they are no
979 problem because byte-compiler output follows this convention.
980 The NAME and DOCSTRING are output.
981 NAME is preceded by `F' for a function or `V' for a variable.
982 An entry is output only if DOCSTRING has \ newline just after the opening "
986 skip_white (FILE *infile
)
989 while (c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r')
995 read_lisp_symbol (FILE *infile
, char *buffer
)
998 char *fillp
= buffer
;
1000 skip_white (infile
);
1005 *(++fillp
) = getc (infile
);
1006 else if (c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r' || c
== '(' || c
== ')')
1017 fprintf (stderr
, "## expected a symbol, got '%c'\n", c
);
1019 skip_white (infile
);
1023 scan_lisp_file (const char *filename
, const char *mode
)
1027 char *saved_string
= 0;
1029 if (generate_globals
)
1030 fatal ("scanning lisp file when -g specified", 0);
1032 infile
= fopen (filename
, mode
);
1036 return 0; /* No error */
1040 while (!feof (infile
))
1042 char buffer
[BUFSIZ
];
1045 /* If not at end of line, skip till we get to one. */
1046 if (c
!= '\n' && c
!= '\r')
1051 /* Skip the line break. */
1052 while (c
== '\n' || c
== '\r')
1054 /* Detect a dynamic doc string and save it for the next expression. */
1063 /* Read the length. */
1064 while ((c
= getc (infile
),
1065 c
>= '0' && c
<= '9'))
1072 fatal ("invalid dynamic doc string length", "");
1075 fatal ("space not found after dynamic doc string length", "");
1077 /* The next character is a space that is counted in the length
1078 but not part of the doc string.
1079 We already read it, so just ignore it. */
1082 /* Read in the contents. */
1083 free (saved_string
);
1084 saved_string
= (char *) xmalloc (length
);
1085 for (i
= 0; i
< length
; i
++)
1086 saved_string
[i
] = getc (infile
);
1087 /* The last character is a ^_.
1088 That is needed in the .elc file
1089 but it is redundant in DOC. So get rid of it here. */
1090 saved_string
[length
- 1] = 0;
1091 /* Skip the line break. */
1092 while (c
== '\n' || c
== '\r')
1094 /* Skip the following line. */
1095 while (c
!= '\n' && c
!= '\r')
1104 read_lisp_symbol (infile
, buffer
);
1106 if (! strcmp (buffer
, "defun")
1107 || ! strcmp (buffer
, "defmacro")
1108 || ! strcmp (buffer
, "defsubst"))
1111 read_lisp_symbol (infile
, buffer
);
1113 /* Skip the arguments: either "nil" or a list in parens */
1116 if (c
== 'n') /* nil */
1118 if ((c
= getc (infile
)) != 'i'
1119 || (c
= getc (infile
)) != 'l')
1121 fprintf (stderr
, "## unparsable arglist in %s (%s)\n",
1128 fprintf (stderr
, "## unparsable arglist in %s (%s)\n",
1135 skip_white (infile
);
1137 /* If the next three characters aren't `dquote bslash newline'
1138 then we're not reading a docstring.
1140 if ((c
= getc (infile
)) != '"'
1141 || (c
= getc (infile
)) != '\\'
1142 || ((c
= getc (infile
)) != '\n' && c
!= '\r'))
1145 fprintf (stderr
, "## non-docstring in %s (%s)\n",
1152 /* defcustom can only occur in uncompiled Lisp files. */
1153 else if (! strcmp (buffer
, "defvar")
1154 || ! strcmp (buffer
, "defconst")
1155 || ! strcmp (buffer
, "defcustom"))
1157 char c1
= 0, c2
= 0;
1159 read_lisp_symbol (infile
, buffer
);
1161 if (saved_string
== 0)
1164 /* Skip until the end of line; remember two previous chars. */
1165 while (c
!= '\n' && c
!= '\r' && c
>= 0)
1172 /* If two previous characters were " and \,
1173 this is a doc string. Otherwise, there is none. */
1174 if (c2
!= '"' || c1
!= '\\')
1177 fprintf (stderr
, "## non-docstring in %s (%s)\n",
1185 else if (! strcmp (buffer
, "custom-declare-variable")
1186 || ! strcmp (buffer
, "defvaralias")
1189 char c1
= 0, c2
= 0;
1194 read_lisp_symbol (infile
, buffer
);
1200 "## unparsable name in custom-declare-variable in %s\n",
1204 read_lisp_symbol (infile
, buffer
);
1205 if (strcmp (buffer
, "quote"))
1208 "## unparsable name in custom-declare-variable in %s\n",
1212 read_lisp_symbol (infile
, buffer
);
1217 "## unparsable quoted name in custom-declare-variable in %s\n",
1223 if (saved_string
== 0)
1225 /* Skip to end of line; remember the two previous chars. */
1226 while (c
!= '\n' && c
!= '\r' && c
>= 0)
1233 /* If two previous characters were " and \,
1234 this is a doc string. Otherwise, there is none. */
1235 if (c2
!= '"' || c1
!= '\\')
1238 fprintf (stderr
, "## non-docstring in %s (%s)\n",
1246 else if (! strcmp (buffer
, "fset") || ! strcmp (buffer
, "defalias"))
1248 char c1
= 0, c2
= 0;
1253 read_lisp_symbol (infile
, buffer
);
1258 fprintf (stderr
, "## unparsable name in fset in %s\n",
1262 read_lisp_symbol (infile
, buffer
);
1263 if (strcmp (buffer
, "quote"))
1265 fprintf (stderr
, "## unparsable name in fset in %s\n",
1269 read_lisp_symbol (infile
, buffer
);
1274 "## unparsable quoted name in fset in %s\n",
1280 if (saved_string
== 0)
1282 /* Skip to end of line; remember the two previous chars. */
1283 while (c
!= '\n' && c
!= '\r' && c
>= 0)
1290 /* If two previous characters were " and \,
1291 this is a doc string. Otherwise, there is none. */
1292 if (c2
!= '"' || c1
!= '\\')
1295 fprintf (stderr
, "## non-docstring in %s (%s)\n",
1303 else if (! strcmp (buffer
, "autoload"))
1308 read_lisp_symbol (infile
, buffer
);
1313 fprintf (stderr
, "## unparsable name in autoload in %s\n",
1317 read_lisp_symbol (infile
, buffer
);
1318 if (strcmp (buffer
, "quote"))
1320 fprintf (stderr
, "## unparsable name in autoload in %s\n",
1324 read_lisp_symbol (infile
, buffer
);
1329 "## unparsable quoted name in autoload in %s\n",
1334 skip_white (infile
);
1335 if ((c
= getc (infile
)) != '\"')
1337 fprintf (stderr
, "## autoload of %s unparsable (%s)\n",
1341 read_c_string_or_comment (infile
, 0, 0, 0);
1342 skip_white (infile
);
1344 if (saved_string
== 0)
1346 /* If the next three characters aren't `dquote bslash newline'
1347 then we're not reading a docstring. */
1348 if ((c
= getc (infile
)) != '"'
1349 || (c
= getc (infile
)) != '\\'
1350 || ((c
= getc (infile
)) != '\n' && c
!= '\r'))
1353 fprintf (stderr
, "## non-docstring in %s (%s)\n",
1362 else if (! strcmp (buffer
, "if")
1363 || ! strcmp (buffer
, "byte-code"))
1370 fprintf (stderr
, "## unrecognized top-level form, %s (%s)\n",
1376 /* At this point, we should either use the previous
1377 dynamic doc string in saved_string
1378 or gobble a doc string from the input file.
1380 In the latter case, the opening quote (and leading
1381 backslash-newline) have already been read. */
1383 putc (037, outfile
);
1384 putc (type
, outfile
);
1385 fprintf (outfile
, "%s\n", buffer
);
1388 fputs (saved_string
, outfile
);
1389 /* Don't use one dynamic doc string twice. */
1390 free (saved_string
);
1394 read_c_string_or_comment (infile
, 1, 0, 0);
1401 /* make-docfile.c ends here */