* lisp/international/utf7.el: Don't require CL. Use lexical-binding.
[emacs.git] / lib-src / make-docfile.c
blob9470bd635f5ccadbe6bb304f4d4963995e8b1a94
1 /* Generate doc-string file for GNU Emacs from source files.
3 Copyright (C) 1985-1986, 1992-1994, 1997, 1999-2017 Free Software
4 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 (at
11 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.
37 #include <config.h>
39 #include <stdarg.h>
40 #include <stddef.h>
41 #include <stdint.h>
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <string.h>
46 #ifdef WINDOWSNT
47 /* Defined to be sys_fopen in ms-w32.h, but only #ifdef emacs, so this
48 is really just insurance. */
49 #undef fopen
50 #include <direct.h>
51 #endif /* WINDOWSNT */
53 #include <binary-io.h>
54 #include <intprops.h>
55 #include <min-max.h>
57 #ifdef DOS_NT
58 /* Defined to be sys_chdir in ms-w32.h, but only #ifdef emacs, so this
59 is really just insurance.
61 Similarly, msdos defines this as sys_chdir, but we're not linking with the
62 file where that function is defined. */
63 #undef chdir
64 #define IS_SLASH(c) ((c) == '/' || (c) == '\\' || (c) == ':')
65 #else /* not DOS_NT */
66 #define IS_SLASH(c) ((c) == '/')
67 #endif /* not DOS_NT */
69 static void scan_file (char *filename);
70 static void scan_lisp_file (const char *filename, const char *mode);
71 static void scan_c_file (char *filename, const char *mode);
72 static void scan_c_stream (FILE *infile);
73 static void start_globals (void);
74 static void write_globals (void);
76 #include <unistd.h>
78 /* Name this program was invoked with. */
79 static char *progname;
81 /* True if this invocation is generating globals.h. */
82 static bool generate_globals;
84 /* Print error message. Args are like vprintf. */
86 static void ATTRIBUTE_FORMAT_PRINTF (1, 0)
87 verror (char const *m, va_list ap)
89 fprintf (stderr, "%s: ", progname);
90 vfprintf (stderr, m, ap);
91 fprintf (stderr, "\n");
94 /* Print error message. Args are like printf. */
96 static void ATTRIBUTE_FORMAT_PRINTF (1, 2)
97 error (char const *m, ...)
99 va_list ap;
100 va_start (ap, m);
101 verror (m, ap);
102 va_end (ap);
105 /* Print error message and exit. Args are like printf. */
107 static _Noreturn void ATTRIBUTE_FORMAT_PRINTF (1, 2)
108 fatal (char const *m, ...)
110 va_list ap;
111 va_start (ap, m);
112 verror (m, ap);
113 va_end (ap);
114 exit (EXIT_FAILURE);
117 static _Noreturn void
118 memory_exhausted (void)
120 fatal ("virtual memory exhausted");
123 /* Like malloc but get fatal error if memory is exhausted. */
125 static void *
126 xmalloc (ptrdiff_t size)
128 void *result = malloc (size);
129 if (result == NULL)
130 memory_exhausted ();
131 return result;
134 /* Like realloc but get fatal error if memory is exhausted. */
136 static void *
137 xrealloc (void *arg, ptrdiff_t size)
139 void *result = realloc (arg, size);
140 if (result == NULL)
141 memory_exhausted ();
142 return result;
147 main (int argc, char **argv)
149 int i;
151 progname = argv[0];
153 /* If first two args are -o FILE, output to FILE. */
154 i = 1;
155 if (argc > i + 1 && !strcmp (argv[i], "-o"))
157 if (! freopen (argv[i + 1], "w", stdout))
159 perror (argv[i + 1]);
160 return EXIT_FAILURE;
162 i += 2;
164 if (argc > i + 1 && !strcmp (argv[i], "-a"))
166 if (! freopen (argv[i + 1], "a", stdout))
168 perror (argv[i + 1]);
169 return EXIT_FAILURE;
171 i += 2;
173 if (argc > i + 1 && !strcmp (argv[i], "-d"))
175 if (chdir (argv[i + 1]) != 0)
177 perror (argv[i + 1]);
178 return EXIT_FAILURE;
180 i += 2;
182 if (argc > i && !strcmp (argv[i], "-g"))
184 generate_globals = true;
185 ++i;
188 set_binary_mode (fileno (stdout), O_BINARY);
190 if (generate_globals)
191 start_globals ();
193 if (argc <= i)
194 scan_c_stream (stdin);
195 else
197 int first_infile = i;
198 for (; i < argc; i++)
200 int j;
201 /* Don't process one file twice. */
202 for (j = first_infile; j < i; j++)
203 if (strcmp (argv[i], argv[j]) == 0)
204 break;
205 if (j == i)
206 scan_file (argv[i]);
210 if (generate_globals)
211 write_globals ();
213 if (ferror (stdout) || fclose (stdout) != 0)
214 fatal ("write error");
216 return EXIT_SUCCESS;
219 /* Add a source file name boundary marker in the output file. */
220 static void
221 put_filename (char *filename)
223 char *tmp;
225 for (tmp = filename; *tmp; tmp++)
227 if (IS_DIRECTORY_SEP (*tmp))
228 filename = tmp + 1;
231 printf ("\037S%s\n", filename);
234 /* Read file FILENAME and output its doc strings to stdout.
235 Return true if file is found, false otherwise. */
237 static void
238 scan_file (char *filename)
240 ptrdiff_t len = strlen (filename);
242 if (!generate_globals)
243 put_filename (filename);
244 if (len > 4 && !strcmp (filename + len - 4, ".elc"))
245 scan_lisp_file (filename, "rb");
246 else if (len > 3 && !strcmp (filename + len - 3, ".el"))
247 scan_lisp_file (filename, "r");
248 else
249 scan_c_file (filename, "r");
252 static void
253 start_globals (void)
255 puts ("/* This file was auto-generated by make-docfile. */");
256 puts ("/* DO NOT EDIT. */");
257 puts ("struct emacs_globals {");
260 static char input_buffer[128];
262 /* Some state during the execution of `read_c_string_or_comment'. */
263 struct rcsoc_state
265 /* A count of spaces and newlines that have been read, but not output. */
266 intmax_t pending_spaces, pending_newlines;
268 /* Where we're reading from. */
269 FILE *in_file;
271 /* If non-zero, a buffer into which to copy characters. */
272 char *buf_ptr;
273 /* If non-zero, a file into which to copy characters. */
274 FILE *out_file;
276 /* A keyword we look for at the beginning of lines. If found, it is
277 not copied, and SAW_KEYWORD is set to true. */
278 const char *keyword;
279 /* The current point we've reached in an occurrence of KEYWORD in
280 the input stream. */
281 const char *cur_keyword_ptr;
282 /* Set to true if we saw an occurrence of KEYWORD. */
283 bool saw_keyword;
286 /* Output CH to the file or buffer in STATE. Any pending newlines or
287 spaces are output first. */
289 static void
290 put_char (char ch, struct rcsoc_state *state)
292 char out_ch;
295 if (state->pending_newlines > 0)
297 state->pending_newlines--;
298 out_ch = '\n';
300 else if (state->pending_spaces > 0)
302 state->pending_spaces--;
303 out_ch = ' ';
305 else
306 out_ch = ch;
308 if (state->out_file)
309 putc (out_ch, state->out_file);
310 if (state->buf_ptr)
311 *state->buf_ptr++ = out_ch;
313 while (out_ch != ch);
316 /* If in the middle of scanning a keyword, continue scanning with
317 character CH, otherwise output CH to the file or buffer in STATE.
318 Any pending newlines or spaces are output first, as well as any
319 previously scanned characters that were thought to be part of a
320 keyword, but were in fact not. */
322 static void
323 scan_keyword_or_put_char (char ch, struct rcsoc_state *state)
325 if (state->keyword
326 && *state->cur_keyword_ptr == ch
327 && (state->cur_keyword_ptr > state->keyword
328 || state->pending_newlines > 0))
329 /* We might be looking at STATE->keyword at some point.
330 Keep looking until we know for sure. */
332 if (*++state->cur_keyword_ptr == '\0')
333 /* Saw the whole keyword. Set SAW_KEYWORD flag to true. */
335 state->saw_keyword = true;
337 /* Reset the scanning pointer. */
338 state->cur_keyword_ptr = state->keyword;
340 /* Canonicalize whitespace preceding a usage string. */
341 state->pending_newlines = 2;
342 state->pending_spaces = 0;
344 /* Skip any whitespace between the keyword and the
345 usage string. */
346 int c;
348 c = getc (state->in_file);
349 while (c == ' ' || c == '\n');
351 /* Output the open-paren we just read. */
352 if (c != '(')
353 fatal ("Missing '(' after keyword");
354 put_char (c, state);
356 /* Skip the function name and replace it with `fn'. */
359 c = getc (state->in_file);
360 if (c == EOF)
361 fatal ("Unexpected EOF after keyword");
363 while (c != ' ' && c != ')');
364 put_char ('f', state);
365 put_char ('n', state);
367 /* Put back the last character. */
368 ungetc (c, state->in_file);
371 else
373 if (state->keyword && state->cur_keyword_ptr > state->keyword)
374 /* We scanned the beginning of a potential usage
375 keyword, but it was a false alarm. Output the
376 part we scanned. */
378 const char *p;
380 for (p = state->keyword; p < state->cur_keyword_ptr; p++)
381 put_char (*p, state);
383 state->cur_keyword_ptr = state->keyword;
386 put_char (ch, state);
391 /* Skip a C string or C-style comment from INFILE, and return the
392 byte that follows, or EOF. COMMENT means skip a comment. If
393 PRINTFLAG is positive, output string contents to stdout. If it is
394 negative, store contents in buf. Convert escape sequences \n and
395 \t to newline and tab; discard \ followed by newline.
396 If SAW_USAGE is non-null, then any occurrences of the string "usage:"
397 at the beginning of a line will be removed, and *SAW_USAGE set to
398 true if any were encountered. */
400 static int
401 read_c_string_or_comment (FILE *infile, int printflag, bool comment,
402 bool *saw_usage)
404 int c;
405 struct rcsoc_state state;
407 state.in_file = infile;
408 state.buf_ptr = (printflag < 0 ? input_buffer : 0);
409 state.out_file = (printflag > 0 ? stdout : 0);
410 state.pending_spaces = 0;
411 state.pending_newlines = 0;
412 state.keyword = (saw_usage ? "usage:" : 0);
413 state.cur_keyword_ptr = state.keyword;
414 state.saw_keyword = false;
416 c = getc (infile);
417 if (comment)
418 while (c == '\n' || c == '\r' || c == '\t' || c == ' ')
419 c = getc (infile);
421 while (c != EOF)
423 while (c != EOF && (comment ? c != '*' : c != '"'))
425 if (c == '\\')
427 c = getc (infile);
428 if (c == '\n' || c == '\r')
430 c = getc (infile);
431 continue;
433 if (c == 'n')
434 c = '\n';
435 if (c == 't')
436 c = '\t';
439 if (c == ' ')
440 state.pending_spaces++;
441 else if (c == '\n')
443 state.pending_newlines++;
444 state.pending_spaces = 0;
446 else
447 scan_keyword_or_put_char (c, &state);
449 c = getc (infile);
452 if (c != EOF)
453 c = getc (infile);
455 if (comment)
457 if (c == '/')
459 c = getc (infile);
460 break;
463 scan_keyword_or_put_char ('*', &state);
465 else
467 if (c != '"')
468 break;
470 /* If we had a "", concatenate the two strings. */
471 c = getc (infile);
475 if (printflag < 0)
476 *state.buf_ptr = 0;
478 if (saw_usage)
479 *saw_usage = state.saw_keyword;
481 return c;
486 /* Write to stdout the argument names of function FUNC, whose text is in BUF.
487 MINARGS and MAXARGS are the minimum and maximum number of arguments. */
489 static void
490 write_c_args (char *func, char *buf, int minargs, int maxargs)
492 char *p;
493 bool in_ident = false;
494 char *ident_start UNINIT;
495 ptrdiff_t ident_length = 0;
497 fputs ("(fn", stdout);
499 if (*buf == '(')
500 ++buf;
502 for (p = buf; *p; p++)
504 char c = *p;
506 /* Notice when a new identifier starts. */
507 if ((('A' <= c && c <= 'Z')
508 || ('a' <= c && c <= 'z')
509 || ('0' <= c && c <= '9')
510 || c == '_')
511 != in_ident)
513 if (!in_ident)
515 in_ident = true;
516 ident_start = p;
518 else
520 in_ident = false;
521 ident_length = p - ident_start;
525 /* Found the end of an argument, write out the last seen
526 identifier. */
527 if (c == ',' || c == ')')
529 if (ident_length == 0)
531 error ("empty arg list for '%s' should be (void), not ()", func);
532 continue;
535 if (strncmp (ident_start, "void", ident_length) == 0)
536 continue;
538 putchar (' ');
540 if (minargs == 0 && maxargs > 0)
541 fputs ("&optional ", stdout);
543 minargs--;
544 maxargs--;
546 /* In C code, `default' is a reserved word, so we spell it
547 `defalt'; demangle that here. */
548 if (ident_length == 6 && memcmp (ident_start, "defalt", 6) == 0)
549 fputs ("DEFAULT", stdout);
550 else
551 while (ident_length-- > 0)
553 c = *ident_start++;
554 if (c >= 'a' && c <= 'z')
555 /* Upcase the letter. */
556 c += 'A' - 'a';
557 else if (c == '_')
558 /* Print underscore as hyphen. */
559 c = '-';
560 putchar (c);
565 putchar (')');
568 /* The types of globals. These are sorted roughly in decreasing alignment
569 order to avoid allocation gaps, except that symbols and functions
570 are last. */
571 enum global_type
573 INVALID,
574 LISP_OBJECT,
575 EMACS_INTEGER,
576 BOOLEAN,
577 SYMBOL,
578 FUNCTION
581 /* A single global. */
582 struct global
584 enum global_type type;
585 char *name;
586 int flags;
587 union
589 int value;
590 char const *svalue;
591 } v;
594 /* Bit values for FLAGS field from the above. Applied for DEFUNs only. */
595 enum { DEFUN_noreturn = 1, DEFUN_const = 2 };
597 /* All the variable names we saw while scanning C sources in `-g'
598 mode. */
599 static ptrdiff_t num_globals;
600 static ptrdiff_t num_globals_allocated;
601 static struct global *globals;
603 static struct global *
604 add_global (enum global_type type, char const *name, int value,
605 char const *svalue)
607 /* Ignore the one non-symbol that can occur. */
608 if (strcmp (name, "..."))
610 if (num_globals == num_globals_allocated)
612 ptrdiff_t num_globals_max = (min (PTRDIFF_MAX, SIZE_MAX)
613 / sizeof *globals);
614 if (num_globals_allocated == num_globals_max)
615 memory_exhausted ();
616 if (num_globals_allocated < num_globals_max / 2)
617 num_globals_allocated = 2 * num_globals_allocated + 1;
618 else
619 num_globals_allocated = num_globals_max;
620 globals = xrealloc (globals, num_globals_allocated * sizeof *globals);
623 ++num_globals;
625 ptrdiff_t namesize = strlen (name) + 1;
626 char *buf = xmalloc (namesize + (svalue ? strlen (svalue) + 1 : 0));
627 globals[num_globals - 1].type = type;
628 globals[num_globals - 1].name = strcpy (buf, name);
629 if (svalue)
630 globals[num_globals - 1].v.svalue = strcpy (buf + namesize, svalue);
631 else
632 globals[num_globals - 1].v.value = value;
633 globals[num_globals - 1].flags = 0;
634 return globals + num_globals - 1;
636 return NULL;
639 static int
640 compare_globals (const void *a, const void *b)
642 const struct global *ga = a;
643 const struct global *gb = b;
645 if (ga->type != gb->type)
646 return ga->type - gb->type;
648 /* Consider "nil" to be the least, so that iQnil is zero. That
649 way, Qnil's internal representation is zero, which is a bit faster. */
650 if (ga->type == SYMBOL)
652 bool a_nil = strcmp (ga->name, "Qnil") == 0;
653 bool b_nil = strcmp (gb->name, "Qnil") == 0;
654 if (a_nil | b_nil)
655 return b_nil - a_nil;
658 return strcmp (ga->name, gb->name);
661 static void
662 close_emacs_globals (ptrdiff_t num_symbols)
664 printf (("};\n"
665 "extern struct emacs_globals globals;\n"
666 "\n"
667 "#ifndef DEFINE_SYMBOLS\n"
668 "extern\n"
669 "#endif\n"
670 "struct Lisp_Symbol alignas (GCALIGNMENT) lispsym[%td];\n"),
671 num_symbols);
674 static void
675 write_globals (void)
677 ptrdiff_t i, j;
678 bool seen_defun = false;
679 ptrdiff_t symnum = 0;
680 ptrdiff_t num_symbols = 0;
681 qsort (globals, num_globals, sizeof (struct global), compare_globals);
683 j = 0;
684 for (i = 0; i < num_globals; i++)
686 while (i + 1 < num_globals
687 && strcmp (globals[i].name, globals[i + 1].name) == 0)
689 if (globals[i].type == FUNCTION
690 && globals[i].v.value != globals[i + 1].v.value)
691 error ("function '%s' defined twice with differing signatures",
692 globals[i].name);
693 free (globals[i].name);
694 i++;
696 num_symbols += globals[i].type == SYMBOL;
697 globals[j++] = globals[i];
699 num_globals = j;
701 for (i = 0; i < num_globals; ++i)
703 char const *type = 0;
705 switch (globals[i].type)
707 case EMACS_INTEGER:
708 type = "EMACS_INT";
709 break;
710 case BOOLEAN:
711 type = "bool";
712 break;
713 case LISP_OBJECT:
714 type = "Lisp_Object";
715 break;
716 case SYMBOL:
717 case FUNCTION:
718 if (!seen_defun)
720 close_emacs_globals (num_symbols);
721 putchar ('\n');
722 seen_defun = true;
724 break;
725 default:
726 fatal ("not a recognized DEFVAR_");
729 if (type)
731 printf (" %s f_%s;\n", type, globals[i].name);
732 printf ("#define %s globals.f_%s\n",
733 globals[i].name, globals[i].name);
735 else if (globals[i].type == SYMBOL)
736 printf (("#define i%s %td\n"
737 "DEFINE_LISP_SYMBOL (%s)\n"),
738 globals[i].name, symnum++, globals[i].name);
739 else
741 if (globals[i].flags & DEFUN_noreturn)
742 fputs ("_Noreturn ", stdout);
744 printf ("EXFUN (%s, ", globals[i].name);
745 if (globals[i].v.value == -1)
746 fputs ("MANY", stdout);
747 else if (globals[i].v.value == -2)
748 fputs ("UNEVALLED", stdout);
749 else
750 printf ("%d", globals[i].v.value);
751 putchar (')');
753 if (globals[i].flags & DEFUN_const)
754 fputs (" ATTRIBUTE_CONST", stdout);
756 puts (";");
760 if (!seen_defun)
761 close_emacs_globals (num_symbols);
763 puts ("#ifdef DEFINE_SYMBOLS");
764 puts ("static char const *const defsym_name[] = {");
765 for (ptrdiff_t i = 0; i < num_globals; i++)
766 if (globals[i].type == SYMBOL)
767 printf ("\t\"%s\",\n", globals[i].v.svalue);
768 puts ("};");
769 puts ("#endif");
771 puts ("#define Qnil builtin_lisp_symbol (0)");
772 puts ("#if DEFINE_NON_NIL_Q_SYMBOL_MACROS");
773 num_symbols = 0;
774 for (ptrdiff_t i = 0; i < num_globals; i++)
775 if (globals[i].type == SYMBOL && num_symbols++ != 0)
776 printf ("# define %s builtin_lisp_symbol (%td)\n",
777 globals[i].name, num_symbols - 1);
778 puts ("#endif");
782 /* Read through a c file. If a .o file is named,
783 the corresponding .c or .m file is read instead.
784 Looks for DEFUN constructs such as are defined in ../src/lisp.h.
785 Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */
787 static void
788 scan_c_file (char *filename, const char *mode)
790 FILE *infile;
791 char extension = filename[strlen (filename) - 1];
793 if (extension == 'o')
794 filename[strlen (filename) - 1] = 'c';
796 infile = fopen (filename, mode);
798 if (infile == NULL && extension == 'o')
800 /* Try .m. */
801 filename[strlen (filename) - 1] = 'm';
802 infile = fopen (filename, mode);
803 if (infile == NULL)
804 filename[strlen (filename) - 1] = 'c'; /* Don't confuse people. */
807 if (infile == NULL)
809 perror (filename);
810 exit (EXIT_FAILURE);
813 /* Reset extension to be able to detect duplicate files. */
814 filename[strlen (filename) - 1] = extension;
815 scan_c_stream (infile);
818 /* Return 1 if next input from INFILE is equal to P, -1 if EOF,
819 0 if input doesn't match. */
821 static int
822 stream_match (FILE *infile, const char *p)
824 for (; *p; p++)
826 int c = getc (infile);
827 if (c == EOF)
828 return -1;
829 if (c != *p)
830 return 0;
832 return 1;
835 static void
836 scan_c_stream (FILE *infile)
838 int commas, minargs, maxargs;
839 int c = '\n';
841 while (!feof (infile))
843 bool doc_keyword = false;
844 bool defunflag = false;
845 bool defvarperbufferflag = false;
846 bool defvarflag = false;
847 enum global_type type = INVALID;
848 static char name[sizeof input_buffer];
850 if (c != '\n' && c != '\r')
852 c = getc (infile);
853 continue;
855 c = getc (infile);
856 if (c == ' ')
858 while (c == ' ')
859 c = getc (infile);
860 if (c != 'D')
861 continue;
862 c = getc (infile);
863 if (c != 'E')
864 continue;
865 c = getc (infile);
866 if (c != 'F')
867 continue;
868 c = getc (infile);
869 if (c == 'S')
871 c = getc (infile);
872 if (c != 'Y')
873 continue;
874 c = getc (infile);
875 if (c != 'M')
876 continue;
877 c = getc (infile);
878 if (c != ' ' && c != '\t' && c != '(')
879 continue;
880 type = SYMBOL;
882 else if (c == 'V')
884 c = getc (infile);
885 if (c != 'A')
886 continue;
887 c = getc (infile);
888 if (c != 'R')
889 continue;
890 c = getc (infile);
891 if (c != '_')
892 continue;
894 defvarflag = true;
896 c = getc (infile);
897 defvarperbufferflag = (c == 'P');
898 if (generate_globals)
900 if (c == 'I')
901 type = EMACS_INTEGER;
902 else if (c == 'L')
903 type = LISP_OBJECT;
904 else if (c == 'B')
905 type = BOOLEAN;
908 c = getc (infile);
909 /* We need to distinguish between DEFVAR_BOOL and
910 DEFVAR_BUFFER_DEFAULTS. */
911 if (generate_globals && type == BOOLEAN && c != 'O')
912 type = INVALID;
914 else
915 continue;
917 else if (c == 'D')
919 c = getc (infile);
920 if (c != 'E')
921 continue;
922 c = getc (infile);
923 if (c != 'F')
924 continue;
925 c = getc (infile);
926 defunflag = c == 'U';
928 else continue;
930 if (generate_globals
931 && (!defvarflag || defvarperbufferflag || type == INVALID)
932 && !defunflag && type != SYMBOL)
933 continue;
935 while (c != '(')
937 if (c < 0)
938 goto eof;
939 c = getc (infile);
942 if (type != SYMBOL)
944 /* Lisp variable or function name. */
945 c = getc (infile);
946 if (c != '"')
947 continue;
948 c = read_c_string_or_comment (infile, -1, false, 0);
951 if (generate_globals)
953 ptrdiff_t i = 0;
954 char const *svalue = 0;
956 /* Skip "," and whitespace. */
959 c = getc (infile);
961 while (c == ',' || c == ' ' || c == '\t' || c == '\n' || c == '\r');
963 /* Read in the identifier. */
966 if (c < 0)
967 goto eof;
968 input_buffer[i++] = c;
969 if (sizeof input_buffer <= i)
970 fatal ("identifier too long");
971 c = getc (infile);
973 while (! (c == ',' || c == ' ' || c == '\t'
974 || c == '\n' || c == '\r'));
975 input_buffer[i] = '\0';
976 memcpy (name, input_buffer, i + 1);
978 if (type == SYMBOL)
981 c = getc (infile);
982 while (c == ' ' || c == '\t' || c == '\n' || c == '\r');
983 if (c != '"')
984 continue;
985 c = read_c_string_or_comment (infile, -1, false, 0);
986 svalue = input_buffer;
989 if (!defunflag)
991 add_global (type, name, 0, svalue);
992 continue;
996 if (type == SYMBOL)
997 continue;
999 /* DEFVAR_LISP ("name", addr, "doc")
1000 DEFVAR_LISP ("name", addr /\* doc *\/)
1001 DEFVAR_LISP ("name", addr, doc: /\* doc *\/) */
1003 if (defunflag)
1004 commas = generate_globals ? 4 : 5;
1005 else if (defvarperbufferflag)
1006 commas = 3;
1007 else if (defvarflag)
1008 commas = 1;
1009 else /* For DEFSIMPLE and DEFPRED. */
1010 commas = 2;
1012 while (commas)
1014 if (c == ',')
1016 commas--;
1018 if (defunflag && (commas == 1 || commas == 2))
1020 int scanned = 0;
1022 c = getc (infile);
1023 while (c == ' ' || c == '\n' || c == '\r' || c == '\t');
1024 if (c < 0)
1025 goto eof;
1026 ungetc (c, infile);
1027 if (commas == 2) /* Pick up minargs. */
1028 scanned = fscanf (infile, "%d", &minargs);
1029 else /* Pick up maxargs. */
1030 if (c == 'M' || c == 'U') /* MANY || UNEVALLED */
1032 if (generate_globals)
1033 maxargs = (c == 'M') ? -1 : -2;
1034 else
1035 maxargs = -1;
1037 else
1038 scanned = fscanf (infile, "%d", &maxargs);
1039 if (scanned < 0)
1040 goto eof;
1044 if (c == EOF)
1045 goto eof;
1046 c = getc (infile);
1049 if (generate_globals)
1051 struct global *g = add_global (FUNCTION, name, maxargs, 0);
1052 if (!g)
1053 continue;
1055 /* The following code tries to recognize function attributes
1056 specified after the docstring, e.g.:
1058 DEFUN ("foo", Ffoo, Sfoo, X, Y, Z,
1059 doc: /\* doc *\/
1060 attributes: attribute1 attribute2 ...)
1061 (Lisp_Object arg...)
1063 Now only 'noreturn' and 'const' attributes are used. */
1065 /* Advance to the end of docstring. */
1066 c = getc (infile);
1067 if (c == EOF)
1068 goto eof;
1069 int d = getc (infile);
1070 if (d == EOF)
1071 goto eof;
1072 while (1)
1074 if (c == '*' && d == '/')
1075 break;
1076 c = d, d = getc (infile);
1077 if (d == EOF)
1078 goto eof;
1080 /* Skip spaces, if any. */
1083 c = getc (infile);
1084 if (c == EOF)
1085 goto eof;
1087 while (c == ' ' || c == '\n' || c == '\r' || c == '\t');
1088 /* Check for 'attributes:' token. */
1089 if (c == 'a' && stream_match (infile, "ttributes:"))
1091 char *p = input_buffer;
1092 /* Collect attributes up to ')'. */
1093 while (1)
1095 c = getc (infile);
1096 if (c == EOF)
1097 goto eof;
1098 if (c == ')')
1099 break;
1100 if (p - input_buffer > sizeof (input_buffer))
1101 abort ();
1102 *p++ = c;
1104 *p = 0;
1105 if (strstr (input_buffer, "noreturn"))
1106 g->flags |= DEFUN_noreturn;
1107 if (strstr (input_buffer, "const"))
1108 g->flags |= DEFUN_const;
1110 continue;
1113 while (c == ' ' || c == '\n' || c == '\r' || c == '\t')
1114 c = getc (infile);
1116 if (c == '"')
1117 c = read_c_string_or_comment (infile, 0, false, 0);
1119 while (c != EOF && c != ',' && c != '/')
1120 c = getc (infile);
1121 if (c == ',')
1123 c = getc (infile);
1124 while (c == ' ' || c == '\n' || c == '\r' || c == '\t')
1125 c = getc (infile);
1126 while ((c >= 'a' && c <= 'z') || (c >= 'Z' && c <= 'Z'))
1127 c = getc (infile);
1128 if (c == ':')
1130 doc_keyword = true;
1131 c = getc (infile);
1132 while (c == ' ' || c == '\n' || c == '\r' || c == '\t')
1133 c = getc (infile);
1137 if (c == '"'
1138 || (c == '/'
1139 && (c = getc (infile),
1140 ungetc (c, infile),
1141 c == '*')))
1143 bool comment = c != '"';
1144 bool saw_usage;
1146 printf ("\037%c%s\n", defvarflag ? 'V' : 'F', input_buffer);
1148 if (comment)
1149 getc (infile); /* Skip past `*'. */
1150 c = read_c_string_or_comment (infile, 1, comment, &saw_usage);
1152 /* If this is a defun, find the arguments and print them. If
1153 this function takes MANY or UNEVALLED args, then the C source
1154 won't give the names of the arguments, so we shouldn't bother
1155 trying to find them.
1157 Various doc-string styles:
1158 0: DEFUN (..., "DOC") (args) [!comment]
1159 1: DEFUN (..., /\* DOC *\/ (args)) [comment && !doc_keyword]
1160 2: DEFUN (..., doc: /\* DOC *\/) (args) [comment && doc_keyword]
1162 if (defunflag && maxargs != -1 && !saw_usage)
1164 char argbuf[1024], *p = argbuf;
1166 if (!comment || doc_keyword)
1167 while (c != ')')
1169 if (c < 0)
1170 goto eof;
1171 c = getc (infile);
1174 /* Skip into arguments. */
1175 while (c != '(')
1177 if (c < 0)
1178 goto eof;
1179 c = getc (infile);
1181 /* Copy arguments into ARGBUF. */
1182 *p++ = c;
1184 *p++ = c = getc (infile);
1185 while (c != ')');
1186 *p = '\0';
1187 /* Output them. */
1188 fputs ("\n\n", stdout);
1189 write_c_args (input_buffer, argbuf, minargs, maxargs);
1191 else if (defunflag && maxargs == -1 && !saw_usage)
1192 /* The DOC should provide the usage form. */
1193 fprintf (stderr, "Missing 'usage' for function '%s'.\n",
1194 input_buffer);
1197 eof:
1198 if (ferror (infile) || fclose (infile) != 0)
1199 fatal ("read error");
1202 /* Read a file of Lisp code, compiled or interpreted.
1203 Looks for
1204 (defun NAME ARGS DOCSTRING ...)
1205 (defmacro NAME ARGS DOCSTRING ...)
1206 (defsubst NAME ARGS DOCSTRING ...)
1207 (autoload (quote NAME) FILE DOCSTRING ...)
1208 (defvar NAME VALUE DOCSTRING)
1209 (defconst NAME VALUE DOCSTRING)
1210 (fset (quote NAME) (make-byte-code ... DOCSTRING ...))
1211 (fset (quote NAME) #[... DOCSTRING ...])
1212 (defalias (quote NAME) #[... DOCSTRING ...])
1213 (custom-declare-variable (quote NAME) VALUE DOCSTRING ...)
1214 starting in column zero.
1215 (quote NAME) may appear as 'NAME as well.
1217 We also look for #@LENGTH CONTENTS^_ at the beginning of the line.
1218 When we find that, we save it for the following defining-form,
1219 and we use that instead of reading a doc string within that defining-form.
1221 For defvar, defconst, and fset we skip to the docstring with a kludgy
1222 formatting convention: all docstrings must appear on the same line as the
1223 initial open-paren (the one in column zero) and must contain a backslash
1224 and a newline immediately after the initial double-quote. No newlines
1225 must appear between the beginning of the form and the first double-quote.
1226 For defun, defmacro, and autoload, we know how to skip over the
1227 arglist, but the doc string must still have a backslash and newline
1228 immediately after the double quote.
1229 The only source files that must follow this convention are preloaded
1230 uncompiled ones like loaddefs.el; aside from that, it is always the .elc
1231 file that we should look at, and they are no problem because byte-compiler
1232 output follows this convention.
1233 The NAME and DOCSTRING are output.
1234 NAME is preceded by `F' for a function or `V' for a variable.
1235 An entry is output only if DOCSTRING has \ newline just after the opening ".
1238 static void
1239 skip_white (FILE *infile)
1241 char c = ' ';
1242 while (c == ' ' || c == '\t' || c == '\n' || c == '\r')
1243 c = getc (infile);
1244 ungetc (c, infile);
1247 static void
1248 read_lisp_symbol (FILE *infile, char *buffer)
1250 char c;
1251 char *fillp = buffer;
1253 skip_white (infile);
1254 while (1)
1256 c = getc (infile);
1257 if (c == '\\')
1258 *(++fillp) = getc (infile);
1259 else if (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '(' || c == ')')
1261 ungetc (c, infile);
1262 *fillp = 0;
1263 break;
1265 else
1266 *fillp++ = c;
1269 if (! buffer[0])
1270 fprintf (stderr, "## expected a symbol, got '%c'\n", c);
1272 skip_white (infile);
1275 static bool
1276 search_lisp_doc_at_eol (FILE *infile)
1278 int c = 0, c1 = 0, c2 = 0;
1280 /* Skip until the end of line; remember two previous chars. */
1281 while (c != '\n' && c != '\r' && c != EOF)
1283 c2 = c1;
1284 c1 = c;
1285 c = getc (infile);
1288 /* If two previous characters were " and \,
1289 this is a doc string. Otherwise, there is none. */
1290 if (c2 != '"' || c1 != '\\')
1292 #ifdef DEBUG
1293 fprintf (stderr, "## non-docstring found\n");
1294 #endif
1295 ungetc (c, infile);
1296 return false;
1298 return true;
1301 #define DEF_ELISP_FILE(fn) { #fn, sizeof(#fn) - 1 }
1303 static void
1304 scan_lisp_file (const char *filename, const char *mode)
1306 FILE *infile;
1307 int c;
1308 char *saved_string = 0;
1309 /* These are the only files that are loaded uncompiled, and must
1310 follow the conventions of the doc strings expected by this
1311 function. These conventions are automatically followed by the
1312 byte compiler when it produces the .elc files. */
1313 static struct {
1314 const char *fn;
1315 int fl;
1316 } const uncompiled[] = {
1317 DEF_ELISP_FILE (loaddefs.el),
1318 DEF_ELISP_FILE (loadup.el),
1319 DEF_ELISP_FILE (charprop.el),
1320 DEF_ELISP_FILE (cp51932.el),
1321 DEF_ELISP_FILE (eucjp-ms.el)
1323 int i;
1324 int flen = strlen (filename);
1326 if (generate_globals)
1327 fatal ("scanning lisp file when -g specified");
1328 if (flen > 3 && !strcmp (filename + flen - 3, ".el"))
1330 bool match = false;
1331 for (i = 0; i < sizeof (uncompiled) / sizeof (uncompiled[0]); i++)
1333 if (uncompiled[i].fl <= flen
1334 && !strcmp (filename + flen - uncompiled[i].fl, uncompiled[i].fn)
1335 && (flen == uncompiled[i].fl
1336 || IS_SLASH (filename[flen - uncompiled[i].fl - 1])))
1338 match = true;
1339 break;
1342 if (!match)
1343 fatal ("uncompiled lisp file %s is not supported", filename);
1346 infile = fopen (filename, mode);
1347 if (infile == NULL)
1349 perror (filename);
1350 exit (EXIT_FAILURE);
1353 c = '\n';
1354 while (!feof (infile))
1356 char buffer[BUFSIZ];
1357 char type;
1359 /* If not at end of line, skip till we get to one. */
1360 if (c != '\n' && c != '\r')
1362 c = getc (infile);
1363 continue;
1365 /* Skip the line break. */
1366 while (c == '\n' || c == '\r')
1367 c = getc (infile);
1368 /* Detect a dynamic doc string and save it for the next expression. */
1369 if (c == '#')
1371 c = getc (infile);
1372 if (c == '@')
1374 ptrdiff_t length = 0;
1375 ptrdiff_t i;
1377 /* Read the length. */
1378 while ((c = getc (infile),
1379 c >= '0' && c <= '9'))
1381 if (INT_MULTIPLY_WRAPV (length, 10, &length)
1382 || INT_ADD_WRAPV (length, c - '0', &length)
1383 || SIZE_MAX < length)
1384 memory_exhausted ();
1387 if (length <= 1)
1388 fatal ("invalid dynamic doc string length");
1390 if (c != ' ')
1391 fatal ("space not found after dynamic doc string length");
1393 /* The next character is a space that is counted in the length
1394 but not part of the doc string.
1395 We already read it, so just ignore it. */
1396 length--;
1398 /* Read in the contents. */
1399 free (saved_string);
1400 saved_string = xmalloc (length);
1401 for (i = 0; i < length; i++)
1402 saved_string[i] = getc (infile);
1403 /* The last character is a ^_.
1404 That is needed in the .elc file
1405 but it is redundant in DOC. So get rid of it here. */
1406 saved_string[length - 1] = 0;
1407 /* Skip the line break. */
1408 while (c == '\n' || c == '\r')
1409 c = getc (infile);
1410 /* Skip the following line. */
1411 while (c != '\n' && c != '\r')
1412 c = getc (infile);
1414 continue;
1417 if (c != '(')
1418 continue;
1420 read_lisp_symbol (infile, buffer);
1422 if (! strcmp (buffer, "defun")
1423 || ! strcmp (buffer, "defmacro")
1424 || ! strcmp (buffer, "defsubst"))
1426 type = 'F';
1427 read_lisp_symbol (infile, buffer);
1429 /* Skip the arguments: either "nil" or a list in parens. */
1431 c = getc (infile);
1432 if (c == 'n') /* nil */
1434 if ((c = getc (infile)) != 'i'
1435 || (c = getc (infile)) != 'l')
1437 fprintf (stderr, "## unparsable arglist in %s (%s)\n",
1438 buffer, filename);
1439 continue;
1442 else if (c != '(')
1444 fprintf (stderr, "## unparsable arglist in %s (%s)\n",
1445 buffer, filename);
1446 continue;
1448 else
1449 while (c != ')')
1450 c = getc (infile);
1451 skip_white (infile);
1453 /* If the next three characters aren't `dquote bslash newline'
1454 then we're not reading a docstring.
1456 if ((c = getc (infile)) != '"'
1457 || (c = getc (infile)) != '\\'
1458 || ((c = getc (infile)) != '\n' && c != '\r'))
1460 #ifdef DEBUG
1461 fprintf (stderr, "## non-docstring in %s (%s)\n",
1462 buffer, filename);
1463 #endif
1464 continue;
1468 /* defcustom can only occur in uncompiled Lisp files. */
1469 else if (! strcmp (buffer, "defvar")
1470 || ! strcmp (buffer, "defconst")
1471 || ! strcmp (buffer, "defcustom"))
1473 type = 'V';
1474 read_lisp_symbol (infile, buffer);
1476 if (saved_string == 0)
1477 if (!search_lisp_doc_at_eol (infile))
1478 continue;
1481 else if (! strcmp (buffer, "custom-declare-variable")
1482 || ! strcmp (buffer, "defvaralias")
1485 type = 'V';
1487 c = getc (infile);
1488 if (c == '\'')
1489 read_lisp_symbol (infile, buffer);
1490 else
1492 if (c != '(')
1494 fprintf (stderr,
1495 "## unparsable name in custom-declare-variable in %s\n",
1496 filename);
1497 continue;
1499 read_lisp_symbol (infile, buffer);
1500 if (strcmp (buffer, "quote"))
1502 fprintf (stderr,
1503 "## unparsable name in custom-declare-variable in %s\n",
1504 filename);
1505 continue;
1507 read_lisp_symbol (infile, buffer);
1508 c = getc (infile);
1509 if (c != ')')
1511 fprintf (stderr,
1512 "## unparsable quoted name in custom-declare-variable in %s\n",
1513 filename);
1514 continue;
1518 if (saved_string == 0)
1519 if (!search_lisp_doc_at_eol (infile))
1520 continue;
1523 else if (! strcmp (buffer, "fset") || ! strcmp (buffer, "defalias"))
1525 type = 'F';
1527 c = getc (infile);
1528 if (c == '\'')
1529 read_lisp_symbol (infile, buffer);
1530 else
1532 if (c != '(')
1534 fprintf (stderr, "## unparsable name in fset in %s\n",
1535 filename);
1536 continue;
1538 read_lisp_symbol (infile, buffer);
1539 if (strcmp (buffer, "quote"))
1541 fprintf (stderr, "## unparsable name in fset in %s\n",
1542 filename);
1543 continue;
1545 read_lisp_symbol (infile, buffer);
1546 c = getc (infile);
1547 if (c != ')')
1549 fprintf (stderr,
1550 "## unparsable quoted name in fset in %s\n",
1551 filename);
1552 continue;
1556 if (saved_string == 0)
1557 if (!search_lisp_doc_at_eol (infile))
1558 continue;
1561 else if (! strcmp (buffer, "autoload"))
1563 type = 'F';
1564 c = getc (infile);
1565 if (c == '\'')
1566 read_lisp_symbol (infile, buffer);
1567 else
1569 if (c != '(')
1571 fprintf (stderr, "## unparsable name in autoload in %s\n",
1572 filename);
1573 continue;
1575 read_lisp_symbol (infile, buffer);
1576 if (strcmp (buffer, "quote"))
1578 fprintf (stderr, "## unparsable name in autoload in %s\n",
1579 filename);
1580 continue;
1582 read_lisp_symbol (infile, buffer);
1583 c = getc (infile);
1584 if (c != ')')
1586 fprintf (stderr,
1587 "## unparsable quoted name in autoload in %s\n",
1588 filename);
1589 continue;
1592 skip_white (infile);
1593 if ((c = getc (infile)) != '\"')
1595 fprintf (stderr, "## autoload of %s unparsable (%s)\n",
1596 buffer, filename);
1597 continue;
1599 read_c_string_or_comment (infile, 0, false, 0);
1601 if (saved_string == 0)
1602 if (!search_lisp_doc_at_eol (infile))
1603 continue;
1606 #ifdef DEBUG
1607 else if (! strcmp (buffer, "if")
1608 || ! strcmp (buffer, "byte-code"))
1609 continue;
1610 #endif
1612 else
1614 #ifdef DEBUG
1615 fprintf (stderr, "## unrecognized top-level form, %s (%s)\n",
1616 buffer, filename);
1617 #endif
1618 continue;
1621 /* At this point, we should either use the previous dynamic doc string in
1622 saved_string or gobble a doc string from the input file.
1623 In the latter case, the opening quote (and leading backslash-newline)
1624 have already been read. */
1626 printf ("\037%c%s\n", type, buffer);
1627 if (saved_string)
1629 fputs (saved_string, stdout);
1630 /* Don't use one dynamic doc string twice. */
1631 free (saved_string);
1632 saved_string = 0;
1634 else
1635 read_c_string_or_comment (infile, 1, false, 0);
1637 free (saved_string);
1638 if (ferror (infile) || fclose (infile) != 0)
1639 fatal ("%s: read error", filename);
1643 /* make-docfile.c ends here */