]>
code.delx.au - gnu-emacs/blob - lib-src/make-docfile.c
1 /* Generate doc-string file for GNU Emacs from source files.
3 Copyright (C) 1985-1986, 1992-1994, 1997, 1999-2012
4 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
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.
26 Option -d DIR means change to DIR before looking for files.
28 The results, which go to standard output or to a file
29 specified with -a or -o (-a to append, -o to start from nothing),
30 are entries containing function or variable names and their documentation.
31 Each entry starts with a ^_ character.
32 Then comes F for a function or V for a variable.
33 Then comes the function or variable name, terminated with a newline.
34 Then comes the documentation for that function or variable.
40 #include <stdlib.h> /* config.h unconditionally includes this anyway */
45 /* Defined to be sys_fopen in ms-w32.h, but only #ifdef emacs, so this
46 is really just insurance. */
50 #endif /* WINDOWSNT */
53 /* Defined to be sys_chdir in ms-w32.h, but only #ifdef emacs, so this
54 is really just insurance.
56 Similarly, msdos defines this as sys_chdir, but we're not linking with the
57 file where that function is defined. */
59 #define READ_TEXT "rt"
60 #define READ_BINARY "rb"
61 #else /* not DOS_NT */
63 #define READ_BINARY "r"
64 #endif /* not DOS_NT */
66 static int scan_file (char *filename
);
67 static int scan_lisp_file (const char *filename
, const char *mode
);
68 static int scan_c_file (char *filename
, const char *mode
);
69 static void start_globals (void);
70 static void write_globals (void);
74 /* Stdio stream for output to the DOC file. */
77 /* Name this program was invoked with. */
80 /* Nonzero if this invocation is generating globals.h. */
83 /* Print error message. `s1' is printf control string, `s2' is arg for it. */
87 error (const char *s1
, const char *s2
)
89 fprintf (stderr
, "%s: ", progname
);
90 fprintf (stderr
, s1
, s2
);
91 fprintf (stderr
, "\n");
94 /* Print error message and exit. */
98 fatal (const char *s1
, const char *s2
)
104 /* Like malloc but get fatal error if memory is exhausted. */
107 xmalloc (unsigned int size
)
109 void *result
= (void *) malloc (size
);
111 fatal ("virtual memory exhausted", 0);
115 /* Like realloc but get fatal error if memory is exhausted. */
118 xrealloc (void *arg
, unsigned int size
)
120 void *result
= (void *) realloc (arg
, size
);
122 fatal ("virtual memory exhausted", 0);
128 main (int argc
, char **argv
)
138 /* Don't put CRs in the DOC file. */
141 #if 0 /* Suspicion is that this causes hanging.
142 So instead we require people to use -o on MSDOS. */
143 (stdout
)->_flag
&= ~_IOTEXT
;
144 _setmode (fileno (stdout
), O_BINARY
);
150 _setmode (fileno (stdout
), O_BINARY
);
151 #endif /* WINDOWSNT */
153 /* If first two args are -o FILE, output to FILE. */
155 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-o"))
157 outfile
= fopen (argv
[i
+ 1], "w");
160 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-a"))
162 outfile
= fopen (argv
[i
+ 1], "a");
165 if (argc
> i
+ 1 && !strcmp (argv
[i
], "-d"))
167 if (chdir (argv
[i
+ 1]) != 0)
169 perror (argv
[i
+ 1]);
174 if (argc
> i
&& !strcmp (argv
[i
], "-g"))
176 generate_globals
= 1;
181 fatal ("No output file specified", "");
183 if (generate_globals
)
187 for (; i
< argc
; i
++)
190 /* Don't process one file twice. */
191 for (j
= first_infile
; j
< i
; j
++)
192 if (! strcmp (argv
[i
], argv
[j
]))
195 err_count
+= scan_file (argv
[i
]);
198 if (err_count
== 0 && generate_globals
)
201 return (err_count
> 0 ? EXIT_FAILURE
: EXIT_SUCCESS
);
204 /* Add a source file name boundary marker in the output file. */
206 put_filename (char *filename
)
210 for (tmp
= filename
; *tmp
; tmp
++)
212 if (IS_DIRECTORY_SEP (*tmp
))
218 fprintf (outfile
, "%s\n", filename
);
221 /* Read file FILENAME and output its doc strings to outfile. */
222 /* Return 1 if file is not found, 0 if it is found. */
225 scan_file (char *filename
)
228 size_t len
= strlen (filename
);
230 if (!generate_globals
)
231 put_filename (filename
);
232 if (len
> 4 && !strcmp (filename
+ len
- 4, ".elc"))
233 return scan_lisp_file (filename
, READ_BINARY
);
234 else if (len
> 3 && !strcmp (filename
+ len
- 3, ".el"))
235 return scan_lisp_file (filename
, READ_TEXT
);
237 return scan_c_file (filename
, READ_TEXT
);
243 fprintf (outfile
, "/* This file was auto-generated by make-docfile. */\n");
244 fprintf (outfile
, "/* DO NOT EDIT. */\n");
245 fprintf (outfile
, "struct emacs_globals {\n");
248 static char input_buffer
[128];
250 /* Some state during the execution of `read_c_string_or_comment'. */
253 /* A count of spaces and newlines that have been read, but not output. */
254 unsigned pending_spaces
, pending_newlines
;
256 /* Where we're reading from. */
259 /* If non-zero, a buffer into which to copy characters. */
261 /* If non-zero, a file into which to copy characters. */
264 /* A keyword we look for at the beginning of lines. If found, it is
265 not copied, and SAW_KEYWORD is set to true. */
267 /* The current point we've reached in an occurrence of KEYWORD in
269 const char *cur_keyword_ptr
;
270 /* Set to true if we saw an occurrence of KEYWORD. */
274 /* Output CH to the file or buffer in STATE. Any pending newlines or
275 spaces are output first. */
278 put_char (int ch
, struct rcsoc_state
*state
)
283 if (state
->pending_newlines
> 0)
285 state
->pending_newlines
--;
288 else if (state
->pending_spaces
> 0)
290 state
->pending_spaces
--;
297 putc (out_ch
, state
->out_file
);
299 *state
->buf_ptr
++ = out_ch
;
301 while (out_ch
!= ch
);
304 /* If in the middle of scanning a keyword, continue scanning with
305 character CH, otherwise output CH to the file or buffer in STATE.
306 Any pending newlines or spaces are output first, as well as any
307 previously scanned characters that were thought to be part of a
308 keyword, but were in fact not. */
311 scan_keyword_or_put_char (int ch
, struct rcsoc_state
*state
)
314 && *state
->cur_keyword_ptr
== ch
315 && (state
->cur_keyword_ptr
> state
->keyword
316 || state
->pending_newlines
> 0))
317 /* We might be looking at STATE->keyword at some point.
318 Keep looking until we know for sure. */
320 if (*++state
->cur_keyword_ptr
== '\0')
321 /* Saw the whole keyword. Set SAW_KEYWORD flag to true. */
323 state
->saw_keyword
= 1;
325 /* Reset the scanning pointer. */
326 state
->cur_keyword_ptr
= state
->keyword
;
328 /* Canonicalize whitespace preceding a usage string. */
329 state
->pending_newlines
= 2;
330 state
->pending_spaces
= 0;
332 /* Skip any whitespace between the keyword and the
335 ch
= getc (state
->in_file
);
336 while (ch
== ' ' || ch
== '\n');
338 /* Output the open-paren we just read. */
339 put_char (ch
, state
);
341 /* Skip the function name and replace it with `fn'. */
343 ch
= getc (state
->in_file
);
344 while (ch
!= ' ' && ch
!= ')');
345 put_char ('f', state
);
346 put_char ('n', state
);
348 /* Put back the last character. */
349 ungetc (ch
, state
->in_file
);
354 if (state
->keyword
&& state
->cur_keyword_ptr
> state
->keyword
)
355 /* We scanned the beginning of a potential usage
356 keyword, but it was a false alarm. Output the
361 for (p
= state
->keyword
; p
< state
->cur_keyword_ptr
; p
++)
362 put_char (*p
, state
);
364 state
->cur_keyword_ptr
= state
->keyword
;
367 put_char (ch
, state
);
372 /* Skip a C string or C-style comment from INFILE, and return the
373 character that follows. COMMENT non-zero means skip a comment. If
374 PRINTFLAG is positive, output string contents to outfile. If it is
375 negative, store contents in buf. Convert escape sequences \n and
376 \t to newline and tab; discard \ followed by newline.
377 If SAW_USAGE is non-zero, then any occurrences of the string `usage:'
378 at the beginning of a line will be removed, and *SAW_USAGE set to
379 true if any were encountered. */
382 read_c_string_or_comment (FILE *infile
, int printflag
, int comment
, int *saw_usage
)
385 struct rcsoc_state state
;
387 state
.in_file
= infile
;
388 state
.buf_ptr
= (printflag
< 0 ? input_buffer
: 0);
389 state
.out_file
= (printflag
> 0 ? outfile
: 0);
390 state
.pending_spaces
= 0;
391 state
.pending_newlines
= 0;
392 state
.keyword
= (saw_usage
? "usage:" : 0);
393 state
.cur_keyword_ptr
= state
.keyword
;
394 state
.saw_keyword
= 0;
398 while (c
== '\n' || c
== '\r' || c
== '\t' || c
== ' ')
403 while (c
!= EOF
&& (comment
? c
!= '*' : c
!= '"'))
408 if (c
== '\n' || c
== '\r')
420 state
.pending_spaces
++;
423 state
.pending_newlines
++;
424 state
.pending_spaces
= 0;
427 scan_keyword_or_put_char (c
, &state
);
443 scan_keyword_or_put_char ('*', &state
);
450 /* If we had a "", concatenate the two strings. */
459 *saw_usage
= state
.saw_keyword
;
466 /* Write to file OUT the argument names of function FUNC, whose text is in BUF.
467 MINARGS and MAXARGS are the minimum and maximum number of arguments. */
470 write_c_args (FILE *out
, char *func
, char *buf
, int minargs
, int maxargs
)
474 char *ident_start
IF_LINT (= NULL
);
475 size_t ident_length
= 0;
477 fprintf (out
, "(fn");
482 for (p
= buf
; *p
; p
++)
486 /* Notice when a new identifier starts. */
487 if ((('A' <= c
&& c
<= 'Z')
488 || ('a' <= c
&& c
<= 'z')
489 || ('0' <= c
&& c
<= '9')
501 ident_length
= p
- ident_start
;
505 /* Found the end of an argument, write out the last seen
507 if (c
== ',' || c
== ')')
509 if (ident_length
== 0)
511 error ("empty arg list for `%s' should be (void), not ()", func
);
515 if (strncmp (ident_start
, "void", ident_length
) == 0)
520 if (minargs
== 0 && maxargs
> 0)
521 fprintf (out
, "&optional ");
526 /* In C code, `default' is a reserved word, so we spell it
527 `defalt'; demangle that here. */
528 if (ident_length
== 6 && memcmp (ident_start
, "defalt", 6) == 0)
529 fprintf (out
, "DEFAULT");
531 while (ident_length
-- > 0)
534 if (c
>= 'a' && c
<= 'z')
535 /* Upcase the letter. */
538 /* Print underscore as hyphen. */
548 /* The types of globals. These are sorted roughly in decreasing alignment
549 order to avoid allocation gaps, except that functions are last. */
559 /* A single global. */
562 enum global_type type
;
567 /* All the variable names we saw while scanning C sources in `-g'
570 int num_globals_allocated
;
571 struct global
*globals
;
574 add_global (enum global_type type
, char *name
, int value
)
576 /* Ignore the one non-symbol that can occur. */
577 if (strcmp (name
, "..."))
581 if (num_globals_allocated
== 0)
583 num_globals_allocated
= 100;
584 globals
= xmalloc (num_globals_allocated
* sizeof (struct global
));
586 else if (num_globals
== num_globals_allocated
)
588 num_globals_allocated
*= 2;
589 globals
= xrealloc (globals
,
590 num_globals_allocated
* sizeof (struct global
));
593 globals
[num_globals
- 1].type
= type
;
594 globals
[num_globals
- 1].name
= name
;
595 globals
[num_globals
- 1].value
= value
;
600 compare_globals (const void *a
, const void *b
)
602 const struct global
*ga
= a
;
603 const struct global
*gb
= b
;
605 if (ga
->type
!= gb
->type
)
606 return ga
->type
- gb
->type
;
608 return strcmp (ga
->name
, gb
->name
);
612 close_emacs_globals (void)
614 fprintf (outfile
, "};\n");
615 fprintf (outfile
, "extern struct emacs_globals globals;\n");
621 int i
, seen_defun
= 0;
622 qsort (globals
, num_globals
, sizeof (struct global
), compare_globals
);
623 for (i
= 0; i
< num_globals
; ++i
)
627 switch (globals
[i
].type
)
636 type
= "Lisp_Object";
641 close_emacs_globals ();
642 fprintf (outfile
, "\n");
647 fatal ("not a recognized DEFVAR_", 0);
650 if (globals
[i
].type
!= FUNCTION
)
652 fprintf (outfile
, " %s f_%s;\n", type
, globals
[i
].name
);
653 fprintf (outfile
, "#define %s globals.f_%s\n",
654 globals
[i
].name
, globals
[i
].name
);
658 /* It would be nice to have a cleaner way to deal with these
660 if (strcmp (globals
[i
].name
, "Fthrow") == 0
661 || strcmp (globals
[i
].name
, "Ftop_level") == 0
662 || strcmp (globals
[i
].name
, "Fkill_emacs") == 0
663 || strcmp (globals
[i
].name
, "Fexit_recursive_edit") == 0
664 || strcmp (globals
[i
].name
, "Fabort_recursive_edit") == 0)
665 fprintf (outfile
, "_Noreturn ");
666 fprintf (outfile
, "EXFUN (%s, ", globals
[i
].name
);
667 if (globals
[i
].value
== -1)
668 fprintf (outfile
, "MANY");
669 else if (globals
[i
].value
== -2)
670 fprintf (outfile
, "UNEVALLED");
672 fprintf (outfile
, "%d", globals
[i
].value
);
673 fprintf (outfile
, ");\n");
676 while (i
+ 1 < num_globals
677 && !strcmp (globals
[i
].name
, globals
[i
+ 1].name
))
679 if (globals
[i
].type
== FUNCTION
680 && globals
[i
].value
!= globals
[i
+ 1].value
)
681 error ("function '%s' defined twice with differing signatures",
688 close_emacs_globals ();
692 /* Read through a c file. If a .o file is named,
693 the corresponding .c or .m file is read instead.
694 Looks for DEFUN constructs such as are defined in ../src/lisp.h.
695 Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */
698 scan_c_file (char *filename
, const char *mode
)
703 int minargs
, maxargs
;
704 int extension
= filename
[strlen (filename
) - 1];
706 if (extension
== 'o')
707 filename
[strlen (filename
) - 1] = 'c';
709 infile
= fopen (filename
, mode
);
711 if (infile
== NULL
&& extension
== 'o')
714 filename
[strlen (filename
) - 1] = 'm';
715 infile
= fopen (filename
, mode
);
717 filename
[strlen (filename
) - 1] = 'c'; /* Don't confuse people. */
720 /* No error if non-ex input file. */
727 /* Reset extension to be able to detect duplicate files. */
728 filename
[strlen (filename
) - 1] = extension
;
731 while (!feof (infile
))
735 int defvarperbufferflag
= 0;
737 enum global_type type
= INVALID
;
738 char *name
IF_LINT (= 0);
740 if (c
!= '\n' && c
!= '\r')
774 defvarperbufferflag
= (c
== 'P');
775 if (generate_globals
)
778 type
= EMACS_INTEGER
;
786 /* We need to distinguish between DEFVAR_BOOL and
787 DEFVAR_BUFFER_DEFAULTS. */
788 if (generate_globals
&& type
== BOOLEAN
&& c
!= 'O')
800 defunflag
= c
== 'U';
805 && (!defvarflag
|| defvarperbufferflag
|| type
== INVALID
)
816 /* Lisp variable or function name. */
820 c
= read_c_string_or_comment (infile
, -1, 0, 0);
822 if (generate_globals
)
826 /* Skip "," and whitespace. */
831 while (c
== ',' || c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r');
833 /* Read in the identifier. */
836 input_buffer
[i
++] = c
;
839 while (! (c
== ',' || c
== ' ' || c
== '\t'
840 || c
== '\n' || c
== '\r'));
841 input_buffer
[i
] = '\0';
843 name
= xmalloc (i
+ 1);
844 memcpy (name
, input_buffer
, i
+ 1);
848 add_global (type
, name
, 0);
853 /* DEFVAR_LISP ("name", addr, "doc")
854 DEFVAR_LISP ("name", addr /\* doc *\/)
855 DEFVAR_LISP ("name", addr, doc: /\* doc *\/) */
858 commas
= generate_globals
? 4 : 5;
859 else if (defvarperbufferflag
)
863 else /* For DEFSIMPLE and DEFPRED. */
872 if (defunflag
&& (commas
== 1 || commas
== 2))
877 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t');
881 if (commas
== 2) /* Pick up minargs. */
882 scanned
= fscanf (infile
, "%d", &minargs
);
883 else /* Pick up maxargs. */
884 if (c
== 'M' || c
== 'U') /* MANY || UNEVALLED */
886 if (generate_globals
)
887 maxargs
= (c
== 'M') ? -1 : -2;
892 scanned
= fscanf (infile
, "%d", &maxargs
);
903 if (generate_globals
)
905 add_global (FUNCTION
, name
, maxargs
);
909 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
913 c
= read_c_string_or_comment (infile
, 0, 0, 0);
915 while (c
!= EOF
&& c
!= ',' && c
!= '/')
920 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
922 while ((c
>= 'a' && c
<= 'z') || (c
>= 'Z' && c
<= 'Z'))
928 while (c
== ' ' || c
== '\n' || c
== '\r' || c
== '\t')
935 && (c
= getc (infile
),
939 int comment
= c
!= '"';
943 putc (defvarflag
? 'V' : 'F', outfile
);
944 fprintf (outfile
, "%s\n", input_buffer
);
947 getc (infile
); /* Skip past `*'. */
948 c
= read_c_string_or_comment (infile
, 1, comment
, &saw_usage
);
950 /* If this is a defun, find the arguments and print them. If
951 this function takes MANY or UNEVALLED args, then the C source
952 won't give the names of the arguments, so we shouldn't bother
955 Various doc-string styles:
956 0: DEFUN (..., "DOC") (args) [!comment]
957 1: DEFUN (..., /\* DOC *\/ (args)) [comment && !doc_keyword]
958 2: DEFUN (..., doc: /\* DOC *\/) (args) [comment && doc_keyword]
960 if (defunflag
&& maxargs
!= -1 && !saw_usage
)
962 char argbuf
[1024], *p
= argbuf
;
964 if (!comment
|| doc_keyword
)
972 /* Skip into arguments. */
979 /* Copy arguments into ARGBUF. */
982 *p
++ = c
= getc (infile
);
986 fprintf (outfile
, "\n\n");
987 write_c_args (outfile
, input_buffer
, argbuf
, minargs
, maxargs
);
989 else if (defunflag
&& maxargs
== -1 && !saw_usage
)
990 /* The DOC should provide the usage form. */
991 fprintf (stderr
, "Missing `usage' for function `%s'.\n",
1000 /* Read a file of Lisp code, compiled or interpreted.
1002 (defun NAME ARGS DOCSTRING ...)
1003 (defmacro NAME ARGS DOCSTRING ...)
1004 (defsubst NAME ARGS DOCSTRING ...)
1005 (autoload (quote NAME) FILE DOCSTRING ...)
1006 (defvar NAME VALUE DOCSTRING)
1007 (defconst NAME VALUE DOCSTRING)
1008 (fset (quote NAME) (make-byte-code ... DOCSTRING ...))
1009 (fset (quote NAME) #[... DOCSTRING ...])
1010 (defalias (quote NAME) #[... DOCSTRING ...])
1011 (custom-declare-variable (quote NAME) VALUE DOCSTRING ...)
1012 starting in column zero.
1013 (quote NAME) may appear as 'NAME as well.
1015 We also look for #@LENGTH CONTENTS^_ at the beginning of the line.
1016 When we find that, we save it for the following defining-form,
1017 and we use that instead of reading a doc string within that defining-form.
1019 For defvar, defconst, and fset we skip to the docstring with a kludgy
1020 formatting convention: all docstrings must appear on the same line as the
1021 initial open-paren (the one in column zero) and must contain a backslash
1022 and a newline immediately after the initial double-quote. No newlines
1023 must appear between the beginning of the form and the first double-quote.
1024 For defun, defmacro, and autoload, we know how to skip over the
1025 arglist, but the doc string must still have a backslash and newline
1026 immediately after the double quote.
1027 The only source files that must follow this convention are preloaded
1028 uncompiled ones like loaddefs.el; aside from that, it is always the .elc
1029 file that we should look at, and they are no problem because byte-compiler
1030 output follows this convention.
1031 The NAME and DOCSTRING are output.
1032 NAME is preceded by `F' for a function or `V' for a variable.
1033 An entry is output only if DOCSTRING has \ newline just after the opening ".
1037 skip_white (FILE *infile
)
1040 while (c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r')
1046 read_lisp_symbol (FILE *infile
, char *buffer
)
1049 char *fillp
= buffer
;
1051 skip_white (infile
);
1056 *(++fillp
) = getc (infile
);
1057 else if (c
== ' ' || c
== '\t' || c
== '\n' || c
== '\r' || c
== '(' || c
== ')')
1068 fprintf (stderr
, "## expected a symbol, got '%c'\n", c
);
1070 skip_white (infile
);
1074 search_lisp_doc_at_eol (FILE *infile
)
1076 char c
= 0, c1
= 0, c2
= 0;
1078 /* Skip until the end of line; remember two previous chars. */
1079 while (c
!= '\n' && c
!= '\r' && c
!= EOF
)
1086 /* If two previous characters were " and \,
1087 this is a doc string. Otherwise, there is none. */
1088 if (c2
!= '"' || c1
!= '\\')
1091 fprintf (stderr
, "## non-docstring in %s (%s)\n",
1102 scan_lisp_file (const char *filename
, const char *mode
)
1106 char *saved_string
= 0;
1107 /* These are the only files that are loaded uncompiled, and must
1108 follow the conventions of the doc strings expected by this
1109 function. These conventions are automatically followed by the
1110 byte compiler when it produces the .elc files. */
1111 static const char *const uncompiled
[] =
1118 size_t flen
= strlen (filename
);
1120 if (generate_globals
)
1121 fatal ("scanning lisp file when -g specified", 0);
1122 if (flen
> 3 && !strcmp (filename
+ flen
- 3, ".el"))
1124 for (i
= 0, match
= 0; i
< sizeof (uncompiled
) / sizeof (uncompiled
[0]);
1127 if (strlen (uncompiled
[i
]) <= flen
1128 && !strcmp (filename
+ flen
- strlen (uncompiled
[i
]),
1136 fatal ("uncompiled lisp file %s is not supported", filename
);
1139 infile
= fopen (filename
, mode
);
1143 return 0; /* No error. */
1147 while (!feof (infile
))
1149 char buffer
[BUFSIZ
];
1152 /* If not at end of line, skip till we get to one. */
1153 if (c
!= '\n' && c
!= '\r')
1158 /* Skip the line break. */
1159 while (c
== '\n' || c
== '\r')
1161 /* Detect a dynamic doc string and save it for the next expression. */
1170 /* Read the length. */
1171 while ((c
= getc (infile
),
1172 c
>= '0' && c
<= '9'))
1179 fatal ("invalid dynamic doc string length", "");
1182 fatal ("space not found after dynamic doc string length", "");
1184 /* The next character is a space that is counted in the length
1185 but not part of the doc string.
1186 We already read it, so just ignore it. */
1189 /* Read in the contents. */
1190 free (saved_string
);
1191 saved_string
= (char *) xmalloc (length
);
1192 for (i
= 0; i
< length
; i
++)
1193 saved_string
[i
] = getc (infile
);
1194 /* The last character is a ^_.
1195 That is needed in the .elc file
1196 but it is redundant in DOC. So get rid of it here. */
1197 saved_string
[length
- 1] = 0;
1198 /* Skip the line break. */
1199 while (c
== '\n' || c
== '\r')
1201 /* Skip the following line. */
1202 while (c
!= '\n' && c
!= '\r')
1211 read_lisp_symbol (infile
, buffer
);
1213 if (! strcmp (buffer
, "defun")
1214 || ! strcmp (buffer
, "defmacro")
1215 || ! strcmp (buffer
, "defsubst"))
1218 read_lisp_symbol (infile
, buffer
);
1220 /* Skip the arguments: either "nil" or a list in parens. */
1223 if (c
== 'n') /* nil */
1225 if ((c
= getc (infile
)) != 'i'
1226 || (c
= getc (infile
)) != 'l')
1228 fprintf (stderr
, "## unparsable arglist in %s (%s)\n",
1235 fprintf (stderr
, "## unparsable arglist in %s (%s)\n",
1242 skip_white (infile
);
1244 /* If the next three characters aren't `dquote bslash newline'
1245 then we're not reading a docstring.
1247 if ((c
= getc (infile
)) != '"'
1248 || (c
= getc (infile
)) != '\\'
1249 || ((c
= getc (infile
)) != '\n' && c
!= '\r'))
1252 fprintf (stderr
, "## non-docstring in %s (%s)\n",
1259 /* defcustom can only occur in uncompiled Lisp files. */
1260 else if (! strcmp (buffer
, "defvar")
1261 || ! strcmp (buffer
, "defconst")
1262 || ! strcmp (buffer
, "defcustom"))
1265 read_lisp_symbol (infile
, buffer
);
1267 if (saved_string
== 0)
1268 if (!search_lisp_doc_at_eol (infile
))
1272 else if (! strcmp (buffer
, "custom-declare-variable")
1273 || ! strcmp (buffer
, "defvaralias")
1280 read_lisp_symbol (infile
, buffer
);
1286 "## unparsable name in custom-declare-variable in %s\n",
1290 read_lisp_symbol (infile
, buffer
);
1291 if (strcmp (buffer
, "quote"))
1294 "## unparsable name in custom-declare-variable in %s\n",
1298 read_lisp_symbol (infile
, buffer
);
1303 "## unparsable quoted name in custom-declare-variable in %s\n",
1309 if (saved_string
== 0)
1310 if (!search_lisp_doc_at_eol (infile
))
1314 else if (! strcmp (buffer
, "fset") || ! strcmp (buffer
, "defalias"))
1320 read_lisp_symbol (infile
, buffer
);
1325 fprintf (stderr
, "## unparsable name in fset in %s\n",
1329 read_lisp_symbol (infile
, buffer
);
1330 if (strcmp (buffer
, "quote"))
1332 fprintf (stderr
, "## unparsable name in fset in %s\n",
1336 read_lisp_symbol (infile
, buffer
);
1341 "## unparsable quoted name in fset in %s\n",
1347 if (saved_string
== 0)
1348 if (!search_lisp_doc_at_eol (infile
))
1352 else if (! strcmp (buffer
, "autoload"))
1357 read_lisp_symbol (infile
, buffer
);
1362 fprintf (stderr
, "## unparsable name in autoload in %s\n",
1366 read_lisp_symbol (infile
, buffer
);
1367 if (strcmp (buffer
, "quote"))
1369 fprintf (stderr
, "## unparsable name in autoload in %s\n",
1373 read_lisp_symbol (infile
, buffer
);
1378 "## unparsable quoted name in autoload in %s\n",
1383 skip_white (infile
);
1384 if ((c
= getc (infile
)) != '\"')
1386 fprintf (stderr
, "## autoload of %s unparsable (%s)\n",
1390 read_c_string_or_comment (infile
, 0, 0, 0);
1392 if (saved_string
== 0)
1393 if (!search_lisp_doc_at_eol (infile
))
1398 else if (! strcmp (buffer
, "if")
1399 || ! strcmp (buffer
, "byte-code"))
1406 fprintf (stderr
, "## unrecognized top-level form, %s (%s)\n",
1412 /* At this point, we should either use the previous dynamic doc string in
1413 saved_string or gobble a doc string from the input file.
1414 In the latter case, the opening quote (and leading backslash-newline)
1415 have already been read. */
1417 putc (037, outfile
);
1418 putc (type
, outfile
);
1419 fprintf (outfile
, "%s\n", buffer
);
1422 fputs (saved_string
, outfile
);
1423 /* Don't use one dynamic doc string twice. */
1424 free (saved_string
);
1428 read_c_string_or_comment (infile
, 1, 0, 0);
1435 /* make-docfile.c ends here */