Mercurial > emacs
annotate lib-src/make-docfile.c @ 12245:e8a6dfd8d5d2
Initial revision
| author | Karl Heuer <kwzh@gnu.org> |
|---|---|
| date | Thu, 15 Jun 1995 20:45:57 +0000 |
| parents | cf65209088d6 |
| children | dbc55496f684 |
| rev | line source |
|---|---|
| 24 | 1 /* Generate doc-string file for GNU Emacs from source files. |
|
5604
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
2 Copyright (C) 1985, 1986, 1992, 1993, 1994 Free Software Foundation, Inc. |
| 24 | 3 |
| 4 This file is part of GNU Emacs. | |
| 5 | |
| 38 | 6 GNU Emacs is free software; you can redistribute it and/or modify |
| 7 it under the terms of the GNU General Public License as published by | |
| 638 | 8 the Free Software Foundation; either version 2, or (at your option) |
| 38 | 9 any later version. |
| 24 | 10 |
| 38 | 11 GNU Emacs is distributed in the hope that it will be useful, |
| 12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 GNU General Public License for more details. | |
| 15 | |
| 16 You should have received a copy of the GNU General Public License | |
| 17 along with GNU Emacs; see the file COPYING. If not, write to | |
| 18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
| 24 | 19 |
| 20 /* The arguments given to this program are all the C and Lisp source files | |
| 21 of GNU Emacs. .elc and .el and .c files are allowed. | |
| 22 A .o file can also be specified; the .c file it was made from is used. | |
| 23 This helps the makefile pass the correct list of files. | |
| 24 | |
| 25 The results, which go to standard output or to a file | |
| 26 specified with -a or -o (-a to append, -o to start from nothing), | |
| 27 are entries containing function or variable names and their documentation. | |
| 28 Each entry starts with a ^_ character. | |
| 29 Then comes F for a function or V for a variable. | |
| 30 Then comes the function or variable name, terminated with a newline. | |
| 31 Then comes the documentation for that function or variable. | |
| 32 */ | |
| 33 | |
| 11690 | 34 #define NO_SHORTNAMES /* Tell config not to load remap.h */ |
| 35 #include <../src/config.h> | |
| 36 | |
| 24 | 37 #include <stdio.h> |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
38 #ifdef MSDOS |
|
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
39 #include <fcntl.h> |
|
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
40 #endif /* MSDOS */ |
|
9772
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
41 #ifdef WINDOWSNT |
|
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
42 #include <stdlib.h> |
|
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
43 #include <fcntl.h> |
|
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
44 #include <direct.h> |
|
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
45 #endif /* WINDOWSNT */ |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
46 |
|
9772
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
47 #ifdef DOS_NT |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
48 #define READ_TEXT "rt" |
|
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
49 #define READ_BINARY "rb" |
|
9772
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
50 #else /* not DOS_NT */ |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
51 #define READ_TEXT "r" |
|
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
52 #define READ_BINARY "r" |
|
9772
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
53 #endif /* not DOS_NT */ |
| 24 | 54 |
|
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
7564
diff
changeset
|
55 int scan_file (); |
|
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
7564
diff
changeset
|
56 int scan_lisp_file (); |
|
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
7564
diff
changeset
|
57 int scan_c_file (); |
|
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
7564
diff
changeset
|
58 |
| 12134 | 59 #ifdef MSDOS |
| 60 /* s/msdos.h defines this as sys_chdir, but we're not linking with the | |
| 61 file where that function is defined. */ | |
| 62 #undef chdir | |
| 63 #endif | |
| 64 | |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
65 /* Stdio stream for output to the DOC file. */ |
| 24 | 66 FILE *outfile; |
| 67 | |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
68 /* Name this program was invoked with. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
69 char *progname; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
70 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
71 /* Print error message. `s1' is printf control string, `s2' is arg for it. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
72 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
73 /* VARARGS1 */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
74 void |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
75 error (s1, s2) |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
76 char *s1, *s2; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
77 { |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
78 fprintf (stderr, "%s: ", progname); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
79 fprintf (stderr, s1, s2); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
80 fprintf (stderr, "\n"); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
81 } |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
82 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
83 /* Print error message and exit. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
84 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
85 /* VARARGS1 */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
86 void |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
87 fatal (s1, s2) |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
88 char *s1, *s2; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
89 { |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
90 error (s1, s2); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
91 exit (1); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
92 } |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
93 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
94 /* Like malloc but get fatal error if memory is exhausted. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
95 |
| 11690 | 96 long * |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
97 xmalloc (size) |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
98 unsigned int size; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
99 { |
| 11690 | 100 long *result = (long *) malloc (size); |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
101 if (result == NULL) |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
102 fatal ("virtual memory exhausted", 0); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
103 return result; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
104 } |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
105 |
|
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
7564
diff
changeset
|
106 int |
| 24 | 107 main (argc, argv) |
| 108 int argc; | |
| 109 char **argv; | |
| 110 { | |
| 111 int i; | |
| 112 int err_count = 0; | |
|
9643
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
113 int first_infile; |
| 24 | 114 |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
115 progname = argv[0]; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
116 |
|
9772
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
117 /* Don't put CRs in the DOC file. */ |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
118 #ifdef MSDOS |
|
9772
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
119 _fmode = O_BINARY; |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
120 (stdout)->_flag &= ~_IOTEXT; |
|
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
121 _setmode (fileno (stdout), O_BINARY); |
|
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
122 #endif /* MSDOS */ |
|
9772
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
123 #ifdef WINDOWSNT |
|
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
124 _fmode = O_BINARY; |
|
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
125 _setmode (fileno (stdout), O_BINARY); |
|
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
126 #endif /* WINDOWSNT */ |
|
20652342eb9a
(main) [WINDOWSNT]: Now sets _fmode and stdout to O_BINARY.
Richard M. Stallman <rms@gnu.org>
parents:
9643
diff
changeset
|
127 |
| 24 | 128 outfile = stdout; |
| 129 | |
| 130 /* If first two args are -o FILE, output to FILE. */ | |
| 131 i = 1; | |
| 132 if (argc > i + 1 && !strcmp (argv[i], "-o")) | |
| 133 { | |
| 134 outfile = fopen (argv[i + 1], "w"); | |
| 135 i += 2; | |
| 136 } | |
| 137 if (argc > i + 1 && !strcmp (argv[i], "-a")) | |
| 138 { | |
| 139 outfile = fopen (argv[i + 1], "a"); | |
| 140 i += 2; | |
| 141 } | |
|
2814
0da5b58e98ed
Install patches from David J. Mackenzie to make the srcdir option
Jim Blandy <jimb@redhat.com>
parents:
2483
diff
changeset
|
142 if (argc > i + 1 && !strcmp (argv[i], "-d")) |
|
0da5b58e98ed
Install patches from David J. Mackenzie to make the srcdir option
Jim Blandy <jimb@redhat.com>
parents:
2483
diff
changeset
|
143 { |
|
0da5b58e98ed
Install patches from David J. Mackenzie to make the srcdir option
Jim Blandy <jimb@redhat.com>
parents:
2483
diff
changeset
|
144 chdir (argv[i + 1]); |
|
0da5b58e98ed
Install patches from David J. Mackenzie to make the srcdir option
Jim Blandy <jimb@redhat.com>
parents:
2483
diff
changeset
|
145 i += 2; |
|
0da5b58e98ed
Install patches from David J. Mackenzie to make the srcdir option
Jim Blandy <jimb@redhat.com>
parents:
2483
diff
changeset
|
146 } |
| 24 | 147 |
|
9643
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
148 first_infile = i; |
| 24 | 149 for (; i < argc; i++) |
|
9643
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
150 { |
|
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
151 int j; |
|
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
152 /* Don't process one file twice. */ |
|
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
153 for (j = first_infile; j < i; j++) |
|
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
154 if (! strcmp (argv[i], argv[j])) |
|
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
155 break; |
|
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
156 if (j == i) |
|
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
157 err_count += scan_file (argv[i]); |
|
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
158 } |
| 24 | 159 #ifndef VMS |
|
9643
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
160 exit (err_count > 0); |
| 3028 | 161 #endif /* VMS */ |
|
9643
5d1e70b22a93
(main): Don't process one input file twice.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
162 return err_count > 0; |
| 24 | 163 } |
| 164 | |
| 164 | 165 /* Read file FILENAME and output its doc strings to outfile. */ |
| 24 | 166 /* Return 1 if file is not found, 0 if it is found. */ |
| 167 | |
|
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
7564
diff
changeset
|
168 int |
| 24 | 169 scan_file (filename) |
| 170 char *filename; | |
| 171 { | |
| 172 int len = strlen (filename); | |
| 173 if (!strcmp (filename + len - 4, ".elc")) | |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
174 return scan_lisp_file (filename, READ_BINARY); |
| 24 | 175 else if (!strcmp (filename + len - 3, ".el")) |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
176 return scan_lisp_file (filename, READ_TEXT); |
| 24 | 177 else |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
178 return scan_c_file (filename, READ_TEXT); |
| 24 | 179 } |
| 180 | |
| 181 char buf[128]; | |
| 182 | |
| 183 /* Skip a C string from INFILE, | |
| 184 and return the character that follows the closing ". | |
| 164 | 185 If printflag is positive, output string contents to outfile. |
| 24 | 186 If it is negative, store contents in buf. |
| 187 Convert escape sequences \n and \t to newline and tab; | |
| 188 discard \ followed by newline. */ | |
| 189 | |
|
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
7564
diff
changeset
|
190 int |
| 24 | 191 read_c_string (infile, printflag) |
| 192 FILE *infile; | |
| 193 int printflag; | |
| 194 { | |
| 195 register int c; | |
| 196 char *p = buf; | |
| 197 | |
| 198 c = getc (infile); | |
| 199 while (c != EOF) | |
| 200 { | |
| 201 while (c != '"' && c != EOF) | |
| 202 { | |
| 203 if (c == '\\') | |
| 204 { | |
| 205 c = getc (infile); | |
| 206 if (c == '\n') | |
| 207 { | |
| 208 c = getc (infile); | |
| 209 continue; | |
| 210 } | |
| 211 if (c == 'n') | |
| 212 c = '\n'; | |
| 213 if (c == 't') | |
| 214 c = '\t'; | |
| 215 } | |
| 216 if (printflag > 0) | |
| 217 putc (c, outfile); | |
| 218 else if (printflag < 0) | |
| 219 *p++ = c; | |
| 220 c = getc (infile); | |
| 221 } | |
| 222 c = getc (infile); | |
| 223 if (c != '"') | |
| 224 break; | |
|
4987
f052db139432
(read_c_string): For "", concatenate the two strings.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
225 /* If we had a "", concatenate the two strings. */ |
| 24 | 226 c = getc (infile); |
| 227 } | |
| 228 | |
| 229 if (printflag < 0) | |
| 230 *p = 0; | |
| 231 | |
| 232 return c; | |
| 233 } | |
| 234 | |
|
5604
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
235 /* Write to file OUT the argument names of function FUNC, whose text is in BUF. |
| 24 | 236 MINARGS and MAXARGS are the minimum and maximum number of arguments. */ |
| 237 | |
|
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
7564
diff
changeset
|
238 void |
|
5604
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
239 write_c_args (out, func, buf, minargs, maxargs) |
| 24 | 240 FILE *out; |
|
5604
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
241 char *func, *buf; |
| 24 | 242 int minargs, maxargs; |
| 243 { | |
| 1206 | 244 register char *p; |
| 1250 | 245 int in_ident = 0; |
| 246 int just_spaced = 0; | |
|
5604
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
247 int need_space = 1; |
| 24 | 248 |
|
5604
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
249 fprintf (out, "(%s", func); |
|
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
250 |
|
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
251 if (*buf == '(') |
|
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
252 ++buf; |
| 24 | 253 |
| 1206 | 254 for (p = buf; *p; p++) |
| 24 | 255 { |
| 1250 | 256 char c = *p; |
|
2483
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
257 int ident_start = 0; |
| 1250 | 258 |
| 259 /* Notice when we start printing a new identifier. */ | |
| 260 if ((('A' <= c && c <= 'Z') | |
| 261 || ('a' <= c && c <= 'z') | |
| 262 || ('0' <= c && c <= '9') | |
| 263 || c == '_') | |
| 264 != in_ident) | |
| 24 | 265 { |
| 1250 | 266 if (!in_ident) |
| 267 { | |
| 268 in_ident = 1; | |
|
2483
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
269 ident_start = 1; |
| 1206 | 270 |
|
5604
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
271 if (need_space) |
|
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
272 putc (' ', out); |
|
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
273 |
| 1250 | 274 if (minargs == 0 && maxargs > 0) |
| 275 fprintf (out, "&optional "); | |
| 276 just_spaced = 1; | |
| 1206 | 277 |
| 1250 | 278 minargs--; |
| 279 maxargs--; | |
| 280 } | |
| 281 else | |
| 282 in_ident = 0; | |
| 24 | 283 } |
| 638 | 284 |
| 1250 | 285 /* Print the C argument list as it would appear in lisp: |
| 286 print underscores as hyphens, and print commas as spaces. | |
| 287 Collapse adjacent spaces into one. */ | |
| 288 if (c == '_') c = '-'; | |
| 289 if (c == ',') c = ' '; | |
| 290 | |
|
2483
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
291 /* In C code, `default' is a reserved word, so we spell it |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
292 `defalt'; unmangle that here. */ |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
293 if (ident_start |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
294 && strncmp (p, "defalt", 6) == 0 |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
295 && ! (('A' <= p[6] && p[6] <= 'Z') |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
296 || ('a' <= p[6] && p[6] <= 'z') |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
297 || ('0' <= p[6] && p[6] <= '9') |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
298 || p[6] == '_')) |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
299 { |
|
7564
d5d803ffff27
(write_c_args): Put `default' in upper case.
Richard M. Stallman <rms@gnu.org>
parents:
5604
diff
changeset
|
300 fprintf (out, "DEFAULT"); |
|
2483
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
301 p += 5; |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
302 in_ident = 0; |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
303 just_spaced = 0; |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
304 } |
|
b4145a12422d
* make-docfile.c (write_c_args): Print an argument named "defalt"
Jim Blandy <jimb@redhat.com>
parents:
1676
diff
changeset
|
305 else if (c != ' ' || ! just_spaced) |
|
5604
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
306 { |
|
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
307 if (c >= 'a' && c <= 'z') |
|
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
308 /* Upcase the letter. */ |
|
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
309 c += 'A' - 'a'; |
|
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
310 putc (c, out); |
|
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
311 } |
| 1250 | 312 |
| 313 just_spaced = (c == ' '); | |
|
5604
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
314 need_space = 0; |
| 24 | 315 } |
| 316 } | |
| 317 | |
| 318 /* Read through a c file. If a .o file is named, | |
| 319 the corresponding .c file is read instead. | |
| 320 Looks for DEFUN constructs such as are defined in ../src/lisp.h. | |
| 321 Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */ | |
| 322 | |
|
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
7564
diff
changeset
|
323 int |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
324 scan_c_file (filename, mode) |
|
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
325 char *filename, *mode; |
| 24 | 326 { |
| 327 FILE *infile; | |
| 328 register int c; | |
| 329 register int commas; | |
| 330 register int defunflag; | |
|
1676
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
331 register int defvarperbufferflag; |
| 24 | 332 register int defvarflag; |
| 333 int minargs, maxargs; | |
|
11413
9cd115f44483
(scan_c_file): At end, restore file name last char to its original value.
Richard M. Stallman <rms@gnu.org>
parents:
10199
diff
changeset
|
334 int extension = filename[strlen (filename) - 1]; |
| 24 | 335 |
|
11413
9cd115f44483
(scan_c_file): At end, restore file name last char to its original value.
Richard M. Stallman <rms@gnu.org>
parents:
10199
diff
changeset
|
336 if (extension == 'o') |
| 24 | 337 filename[strlen (filename) - 1] = 'c'; |
| 338 | |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
339 infile = fopen (filename, mode); |
| 24 | 340 |
| 341 /* No error if non-ex input file */ | |
| 342 if (infile == NULL) | |
| 343 { | |
| 344 perror (filename); | |
| 345 return 0; | |
| 346 } | |
| 347 | |
|
11413
9cd115f44483
(scan_c_file): At end, restore file name last char to its original value.
Richard M. Stallman <rms@gnu.org>
parents:
10199
diff
changeset
|
348 /* Reset extension to be able to detect duplicate files. */ |
|
9cd115f44483
(scan_c_file): At end, restore file name last char to its original value.
Richard M. Stallman <rms@gnu.org>
parents:
10199
diff
changeset
|
349 filename[strlen (filename) - 1] = extension; |
|
9cd115f44483
(scan_c_file): At end, restore file name last char to its original value.
Richard M. Stallman <rms@gnu.org>
parents:
10199
diff
changeset
|
350 |
| 24 | 351 c = '\n'; |
| 352 while (!feof (infile)) | |
| 353 { | |
| 354 if (c != '\n') | |
| 355 { | |
| 356 c = getc (infile); | |
| 357 continue; | |
| 358 } | |
| 359 c = getc (infile); | |
| 360 if (c == ' ') | |
| 361 { | |
| 362 while (c == ' ') | |
| 363 c = getc (infile); | |
| 364 if (c != 'D') | |
| 365 continue; | |
| 366 c = getc (infile); | |
| 367 if (c != 'E') | |
| 368 continue; | |
| 369 c = getc (infile); | |
| 370 if (c != 'F') | |
| 371 continue; | |
| 372 c = getc (infile); | |
| 373 if (c != 'V') | |
| 374 continue; | |
|
1676
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
375 c = getc (infile); |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
376 if (c != 'A') |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
377 continue; |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
378 c = getc (infile); |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
379 if (c != 'R') |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
380 continue; |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
381 c = getc (infile); |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
382 if (c != '_') |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
383 continue; |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
384 |
| 24 | 385 defvarflag = 1; |
| 386 defunflag = 0; | |
|
1676
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
387 |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
388 c = getc (infile); |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
389 defvarperbufferflag = (c == 'P'); |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
390 |
| 24 | 391 c = getc (infile); |
| 392 } | |
| 393 else if (c == 'D') | |
| 394 { | |
| 395 c = getc (infile); | |
| 396 if (c != 'E') | |
| 397 continue; | |
| 398 c = getc (infile); | |
| 399 if (c != 'F') | |
| 400 continue; | |
| 401 c = getc (infile); | |
| 402 defunflag = c == 'U'; | |
| 403 defvarflag = 0; | |
| 404 } | |
| 405 else continue; | |
| 406 | |
| 407 while (c != '(') | |
| 408 { | |
| 409 if (c < 0) | |
| 410 goto eof; | |
| 411 c = getc (infile); | |
| 412 } | |
| 413 | |
| 414 c = getc (infile); | |
| 415 if (c != '"') | |
| 416 continue; | |
| 417 c = read_c_string (infile, -1); | |
| 418 | |
| 419 if (defunflag) | |
| 420 commas = 5; | |
|
1676
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
421 else if (defvarperbufferflag) |
|
e8b3c6b52c1e
* make-docfile.c (scan_c_file): Since DEFVAR_PER_BUFFER now takes
Jim Blandy <jimb@redhat.com>
parents:
1250
diff
changeset
|
422 commas = 2; |
| 24 | 423 else if (defvarflag) |
| 424 commas = 1; | |
| 425 else /* For DEFSIMPLE and DEFPRED */ | |
| 426 commas = 2; | |
| 427 | |
| 428 while (commas) | |
| 429 { | |
| 430 if (c == ',') | |
| 431 { | |
| 432 commas--; | |
| 433 if (defunflag && (commas == 1 || commas == 2)) | |
| 434 { | |
| 435 do | |
| 436 c = getc (infile); | |
| 437 while (c == ' ' || c == '\n' || c == '\t'); | |
| 438 if (c < 0) | |
| 439 goto eof; | |
| 440 ungetc (c, infile); | |
| 441 if (commas == 2) /* pick up minargs */ | |
| 442 fscanf (infile, "%d", &minargs); | |
| 443 else /* pick up maxargs */ | |
| 444 if (c == 'M' || c == 'U') /* MANY || UNEVALLED */ | |
| 445 maxargs = -1; | |
| 446 else | |
| 447 fscanf (infile, "%d", &maxargs); | |
| 448 } | |
| 449 } | |
| 450 if (c < 0) | |
| 451 goto eof; | |
| 452 c = getc (infile); | |
| 453 } | |
| 454 while (c == ' ' || c == '\n' || c == '\t') | |
| 455 c = getc (infile); | |
| 456 if (c == '"') | |
| 457 c = read_c_string (infile, 0); | |
| 458 while (c != ',') | |
| 459 c = getc (infile); | |
| 460 c = getc (infile); | |
| 461 while (c == ' ' || c == '\n' || c == '\t') | |
| 462 c = getc (infile); | |
| 463 | |
| 464 if (c == '"') | |
| 465 { | |
| 466 putc (037, outfile); | |
| 467 putc (defvarflag ? 'V' : 'F', outfile); | |
| 468 fprintf (outfile, "%s\n", buf); | |
| 168 | 469 c = read_c_string (infile, 1); |
| 470 | |
| 471 /* If this is a defun, find the arguments and print them. If | |
| 472 this function takes MANY or UNEVALLED args, then the C source | |
| 473 won't give the names of the arguments, so we shouldn't bother | |
| 474 trying to find them. */ | |
| 475 if (defunflag && maxargs != -1) | |
| 24 | 476 { |
| 477 char argbuf[1024], *p = argbuf; | |
| 478 while (c != ')') | |
| 479 { | |
| 480 if (c < 0) | |
| 481 goto eof; | |
| 482 c = getc (infile); | |
| 483 } | |
| 484 /* Skip into arguments. */ | |
| 485 while (c != '(') | |
| 486 { | |
| 487 if (c < 0) | |
| 488 goto eof; | |
| 489 c = getc (infile); | |
| 490 } | |
| 491 /* Copy arguments into ARGBUF. */ | |
| 492 *p++ = c; | |
| 493 do | |
| 494 *p++ = c = getc (infile); | |
| 495 while (c != ')'); | |
| 496 *p = '\0'; | |
| 497 /* Output them. */ | |
| 498 fprintf (outfile, "\n\n"); | |
|
5604
32ac07bd58ef
Make the argument list output look more like the Lisp docstrings do.
Roland McGrath <roland@gnu.org>
parents:
5449
diff
changeset
|
499 write_c_args (outfile, buf, argbuf, minargs, maxargs); |
| 24 | 500 } |
| 501 } | |
| 502 } | |
| 503 eof: | |
| 504 fclose (infile); | |
| 505 return 0; | |
| 506 } | |
| 507 | |
| 508 /* Read a file of Lisp code, compiled or interpreted. | |
| 509 Looks for | |
| 510 (defun NAME ARGS DOCSTRING ...) | |
| 753 | 511 (defmacro NAME ARGS DOCSTRING ...) |
| 512 (autoload (quote NAME) FILE DOCSTRING ...) | |
| 24 | 513 (defvar NAME VALUE DOCSTRING) |
| 514 (defconst NAME VALUE DOCSTRING) | |
| 753 | 515 (fset (quote NAME) (make-byte-code ... DOCSTRING ...)) |
| 516 (fset (quote NAME) #[... DOCSTRING ...]) | |
|
2966
e936d56c2354
(scan_lisp_file): Recognize defalias like fset.
Richard M. Stallman <rms@gnu.org>
parents:
2814
diff
changeset
|
517 (defalias (quote NAME) #[... DOCSTRING ...]) |
| 24 | 518 starting in column zero. |
| 753 | 519 (quote NAME) may appear as 'NAME as well. |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
520 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
521 We also look for #@LENGTH CONTENTS^_ at the beginning of the line. |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
522 When we find that, we save it for the following defining-form, |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
523 and we use that instead of reading a doc string within that defining-form. |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
524 |
| 753 | 525 For defun, defmacro, and autoload, we know how to skip over the arglist. |
|
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3028
diff
changeset
|
526 For defvar, defconst, and fset we skip to the docstring with a kludgy |
| 753 | 527 formatting convention: all docstrings must appear on the same line as the |
| 528 initial open-paren (the one in column zero) and must contain a backslash | |
| 529 and a double-quote immediately after the initial double-quote. No newlines | |
| 530 must appear between the beginning of the form and the first double-quote. | |
| 531 The only source file that must follow this convention is loaddefs.el; aside | |
| 532 from that, it is always the .elc file that we look at, and they are no | |
| 533 problem because byte-compiler output follows this convention. | |
| 24 | 534 The NAME and DOCSTRING are output. |
| 535 NAME is preceded by `F' for a function or `V' for a variable. | |
| 536 An entry is output only if DOCSTRING has \ newline just after the opening " | |
| 537 */ | |
| 538 | |
| 753 | 539 void |
| 540 skip_white (infile) | |
| 541 FILE *infile; | |
| 542 { | |
| 543 char c = ' '; | |
| 544 while (c == ' ' || c == '\t' || c == '\n') | |
| 545 c = getc (infile); | |
| 546 ungetc (c, infile); | |
| 547 } | |
| 548 | |
| 549 void | |
| 550 read_lisp_symbol (infile, buffer) | |
| 551 FILE *infile; | |
| 552 char *buffer; | |
| 553 { | |
| 554 char c; | |
| 555 char *fillp = buffer; | |
| 556 | |
| 557 skip_white (infile); | |
| 558 while (1) | |
| 559 { | |
| 560 c = getc (infile); | |
| 561 if (c == '\\') | |
| 562 *(++fillp) = getc (infile); | |
| 563 else if (c == ' ' || c == '\t' || c == '\n' || c == '(' || c == ')') | |
| 564 { | |
| 565 ungetc (c, infile); | |
| 566 *fillp = 0; | |
| 567 break; | |
| 568 } | |
| 569 else | |
| 570 *fillp++ = c; | |
| 571 } | |
| 572 | |
| 573 if (! buffer[0]) | |
| 574 fprintf (stderr, "## expected a symbol, got '%c'\n", c); | |
| 575 | |
| 576 skip_white (infile); | |
| 577 } | |
| 578 | |
|
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
7564
diff
changeset
|
579 int |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
580 scan_lisp_file (filename, mode) |
|
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
581 char *filename, *mode; |
| 24 | 582 { |
| 583 FILE *infile; | |
| 584 register int c; | |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
585 char *saved_string = 0; |
| 24 | 586 |
|
5449
296db649863d
[MSDOS]: Use text/binary mode as appropriate.
Richard M. Stallman <rms@gnu.org>
parents:
5317
diff
changeset
|
587 infile = fopen (filename, mode); |
| 24 | 588 if (infile == NULL) |
| 589 { | |
| 590 perror (filename); | |
| 591 return 0; /* No error */ | |
| 592 } | |
| 593 | |
| 594 c = '\n'; | |
| 595 while (!feof (infile)) | |
| 596 { | |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
597 char buffer[BUFSIZ]; |
| 753 | 598 char type; |
| 599 | |
| 24 | 600 if (c != '\n') |
| 601 { | |
| 602 c = getc (infile); | |
| 603 continue; | |
| 604 } | |
| 605 c = getc (infile); | |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
606 /* Detect a dynamic doc string and save it for the next expression. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
607 if (c == '#') |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
608 { |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
609 c = getc (infile); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
610 if (c == '@') |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
611 { |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
612 int length = 0; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
613 int i; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
614 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
615 /* Read the length. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
616 while ((c = getc (infile), |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
617 c >= '0' && c <= '9')) |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
618 { |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
619 length *= 10; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
620 length += c - '0'; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
621 } |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
622 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
623 /* The next character is a space that is counted in the length |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
624 but not part of the doc string. |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
625 We already read it, so just ignore it. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
626 length--; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
627 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
628 /* Read in the contents. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
629 if (saved_string != 0) |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
630 free (saved_string); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
631 saved_string = (char *) malloc (length); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
632 for (i = 0; i < length; i++) |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
633 saved_string[i] = getc (infile); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
634 /* The last character is a ^_. |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
635 That is needed in the .elc file |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
636 but it is redundant in DOC. So get rid of it here. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
637 saved_string[length - 1] = 0; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
638 /* Skip the newline. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
639 c = getc (infile); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
640 while (c != '\n') |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
641 c = getc (infile); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
642 } |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
643 continue; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
644 } |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
645 |
| 24 | 646 if (c != '(') |
| 647 continue; | |
| 164 | 648 |
| 753 | 649 read_lisp_symbol (infile, buffer); |
| 650 | |
| 651 if (! strcmp (buffer, "defun") || | |
| 652 ! strcmp (buffer, "defmacro")) | |
| 24 | 653 { |
| 753 | 654 type = 'F'; |
| 655 read_lisp_symbol (infile, buffer); | |
| 656 | |
| 657 /* Skip the arguments: either "nil" or a list in parens */ | |
| 24 | 658 |
| 659 c = getc (infile); | |
| 753 | 660 if (c == 'n') /* nil */ |
| 661 { | |
| 662 if ((c = getc (infile)) != 'i' || | |
| 663 (c = getc (infile)) != 'l') | |
| 664 { | |
| 665 fprintf (stderr, "## unparsable arglist in %s (%s)\n", | |
| 666 buffer, filename); | |
| 667 continue; | |
| 668 } | |
| 669 } | |
| 670 else if (c != '(') | |
| 671 { | |
| 672 fprintf (stderr, "## unparsable arglist in %s (%s)\n", | |
| 673 buffer, filename); | |
| 674 continue; | |
| 675 } | |
| 676 else | |
| 677 while (c != ')') | |
| 678 c = getc (infile); | |
| 679 skip_white (infile); | |
| 24 | 680 |
| 753 | 681 /* If the next three characters aren't `dquote bslash newline' |
| 682 then we're not reading a docstring. | |
| 683 */ | |
| 684 if ((c = getc (infile)) != '"' || | |
| 685 (c = getc (infile)) != '\\' || | |
| 686 (c = getc (infile)) != '\n') | |
| 24 | 687 { |
| 753 | 688 #ifdef DEBUG |
| 689 fprintf (stderr, "## non-docstring in %s (%s)\n", | |
| 690 buffer, filename); | |
| 691 #endif | |
| 692 continue; | |
| 693 } | |
| 694 } | |
| 695 | |
| 696 else if (! strcmp (buffer, "defvar") || | |
| 697 ! strcmp (buffer, "defconst")) | |
| 698 { | |
| 699 char c1 = 0, c2 = 0; | |
| 700 type = 'V'; | |
| 701 read_lisp_symbol (infile, buffer); | |
| 702 | |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
703 if (saved_string == 0) |
| 753 | 704 { |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
705 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
706 /* Skip until the first newline; remember the two previous chars. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
707 while (c != '\n' && c >= 0) |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
708 { |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
709 c2 = c1; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
710 c1 = c; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
711 c = getc (infile); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
712 } |
| 753 | 713 |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
714 /* If two previous characters were " and \, |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
715 this is a doc string. Otherwise, there is none. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
716 if (c2 != '"' || c1 != '\\') |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
717 { |
| 753 | 718 #ifdef DEBUG |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
719 fprintf (stderr, "## non-docstring in %s (%s)\n", |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
720 buffer, filename); |
| 753 | 721 #endif |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
722 continue; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
723 } |
| 753 | 724 } |
| 725 } | |
| 726 | |
|
2966
e936d56c2354
(scan_lisp_file): Recognize defalias like fset.
Richard M. Stallman <rms@gnu.org>
parents:
2814
diff
changeset
|
727 else if (! strcmp (buffer, "fset") || ! strcmp (buffer, "defalias")) |
| 753 | 728 { |
| 729 char c1 = 0, c2 = 0; | |
| 730 type = 'F'; | |
| 731 | |
| 732 c = getc (infile); | |
| 733 if (c == '\'') | |
| 734 read_lisp_symbol (infile, buffer); | |
| 24 | 735 else |
| 736 { | |
| 737 if (c != '(') | |
| 753 | 738 { |
| 739 fprintf (stderr, "## unparsable name in fset in %s\n", | |
| 740 filename); | |
| 741 continue; | |
| 742 } | |
| 743 read_lisp_symbol (infile, buffer); | |
| 744 if (strcmp (buffer, "quote")) | |
| 745 { | |
| 746 fprintf (stderr, "## unparsable name in fset in %s\n", | |
| 747 filename); | |
| 748 continue; | |
| 749 } | |
| 750 read_lisp_symbol (infile, buffer); | |
| 24 | 751 c = getc (infile); |
| 753 | 752 if (c != ')') |
| 753 { | |
| 754 fprintf (stderr, | |
| 755 "## unparsable quoted name in fset in %s\n", | |
| 756 filename); | |
| 757 continue; | |
| 758 } | |
| 24 | 759 } |
| 164 | 760 |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
761 if (saved_string == 0) |
| 24 | 762 { |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
763 /* Skip until the first newline; remember the two previous chars. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
764 while (c != '\n' && c >= 0) |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
765 { |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
766 c2 = c1; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
767 c1 = c; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
768 c = getc (infile); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
769 } |
| 753 | 770 |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
771 /* If two previous characters were " and \, |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
772 this is a doc string. Otherwise, there is none. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
773 if (c2 != '"' || c1 != '\\') |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
774 { |
| 753 | 775 #ifdef DEBUG |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
776 fprintf (stderr, "## non-docstring in %s (%s)\n", |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
777 buffer, filename); |
| 753 | 778 #endif |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
779 continue; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
780 } |
| 24 | 781 } |
| 782 } | |
| 753 | 783 |
| 784 else if (! strcmp (buffer, "autoload")) | |
| 164 | 785 { |
| 753 | 786 type = 'F'; |
| 164 | 787 c = getc (infile); |
| 753 | 788 if (c == '\'') |
| 789 read_lisp_symbol (infile, buffer); | |
| 790 else | |
| 791 { | |
| 792 if (c != '(') | |
| 793 { | |
| 794 fprintf (stderr, "## unparsable name in autoload in %s\n", | |
| 795 filename); | |
| 796 continue; | |
| 797 } | |
| 798 read_lisp_symbol (infile, buffer); | |
| 799 if (strcmp (buffer, "quote")) | |
| 800 { | |
| 801 fprintf (stderr, "## unparsable name in autoload in %s\n", | |
| 802 filename); | |
| 803 continue; | |
| 804 } | |
| 805 read_lisp_symbol (infile, buffer); | |
| 806 c = getc (infile); | |
| 807 if (c != ')') | |
| 808 { | |
| 809 fprintf (stderr, | |
| 810 "## unparsable quoted name in autoload in %s\n", | |
| 811 filename); | |
| 812 continue; | |
| 813 } | |
| 814 } | |
| 815 skip_white (infile); | |
| 816 if ((c = getc (infile)) != '\"') | |
| 817 { | |
| 818 fprintf (stderr, "## autoload of %s unparsable (%s)\n", | |
| 819 buffer, filename); | |
| 820 continue; | |
| 821 } | |
| 822 read_c_string (infile, 0); | |
| 823 skip_white (infile); | |
| 164 | 824 |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
825 if (saved_string == 0) |
| 753 | 826 { |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
827 /* If the next three characters aren't `dquote bslash newline' |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
828 then we're not reading a docstring. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
829 if ((c = getc (infile)) != '"' || |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
830 (c = getc (infile)) != '\\' || |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
831 (c = getc (infile)) != '\n') |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
832 { |
| 753 | 833 #ifdef DEBUG |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
834 fprintf (stderr, "## non-docstring in %s (%s)\n", |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
835 buffer, filename); |
| 753 | 836 #endif |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
837 continue; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
838 } |
| 753 | 839 } |
| 164 | 840 } |
| 24 | 841 |
| 753 | 842 #ifdef DEBUG |
| 843 else if (! strcmp (buffer, "if") || | |
| 844 ! strcmp (buffer, "byte-code")) | |
| 845 ; | |
| 846 #endif | |
| 24 | 847 |
| 753 | 848 else |
| 849 { | |
| 850 #ifdef DEBUG | |
| 851 fprintf (stderr, "## unrecognised top-level form, %s (%s)\n", | |
| 852 buffer, filename); | |
| 853 #endif | |
| 854 continue; | |
| 855 } | |
| 24 | 856 |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
857 /* At this point, we should either use the previous |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
858 dynamic doc string in saved_string |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
859 or gobble a doc string from the input file. |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
860 |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
861 In the latter case, the opening quote (and leading |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
862 backslash-newline) have already been read. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
863 |
| 24 | 864 putc (037, outfile); |
| 753 | 865 putc (type, outfile); |
| 866 fprintf (outfile, "%s\n", buffer); | |
|
10199
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
867 if (saved_string) |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
868 { |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
869 fputs (saved_string, outfile); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
870 /* Don't use one dynamic doc string twice. */ |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
871 free (saved_string); |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
872 saved_string = 0; |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
873 } |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
874 else |
|
3e2571e22b61
(scan_lisp_file): Handle dynamic doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
9772
diff
changeset
|
875 read_c_string (infile, 1); |
| 24 | 876 } |
| 877 fclose (infile); | |
| 878 return 0; | |
| 879 } |
