Mercurial > emacs
comparison src/lread.c @ 88886:300f83fb46e1
Include "coding.h".
(Qget_emacs_mule_file_char, Qload_force_doc_strings,
load_each_byte, unread_char): New variables.
(readchar_backlog): This variable deleted.
(readchar): Return a character unless load_each_byte is nonzero.
Handle the case that readcharfun is Qget_emacs_mule_file_char or a
cons. If unread_char is not -1, simply return it.
(unreadchar): Handle the case that readcharfun is
Qget_emacs_mule_file_char or a cons. Set unread_char if
necessary.
(read_multibyte): This function deleted.
(readbyte_for_lambda, readbyte_from_file, readbyte_from_string)
(read_emacs_mule_char): New functions.
(Fload): Even if the file doesn't have the extention ".elc", if
safe_to_load_p returns a positive version number, assume that the
file contains bytecompiled code. If the version is less than 22,
load the file while decoding multibyte sequences by emacs-mule.
(readevalloop): Don't use readchar_backlog.
(Fread): Likewise. Pay attention to the case that STREAM is a
cons.
(Fread_from_string): Pay attention to the case that STREAM is a
cons.
(read_escape): The arg BYTEREP deleted.
(read1): Set load_each_byte to 1 temporarily while handling
#@NUMBER. Don't call read_multibyte.
(read_vector): Call Fread with a cons. If readcharfun is
Qget_emacs_mule_file_char, decode the read string by emacs-mule.
(read_list): If doc_reference is 2, make the cdr part string as
unibyte.
(syms_of_lread): Intern and staticpro Qget_emacs_mule_file_char
and Qload_force_doc_strings.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 24 Jul 2002 10:51:15 +0000 |
parents | 4b1cc2afc2c8 |
children | 1b6e73e289bc |
comparison
equal
deleted
inserted
replaced
88885:c636c5e9d6ce | 88886:300f83fb46e1 |
---|---|
29 #include "lisp.h" | 29 #include "lisp.h" |
30 #include "intervals.h" | 30 #include "intervals.h" |
31 #include "buffer.h" | 31 #include "buffer.h" |
32 #include "character.h" | 32 #include "character.h" |
33 #include "charset.h" | 33 #include "charset.h" |
34 #include "coding.h" | |
34 #include <epaths.h> | 35 #include <epaths.h> |
35 #include "commands.h" | 36 #include "commands.h" |
36 #include "keyboard.h" | 37 #include "keyboard.h" |
37 #include "termhooks.h" | 38 #include "termhooks.h" |
38 | 39 |
81 Lisp_Object Qvariable_documentation, Vvalues, Vstandard_input, Vafter_load_alist; | 82 Lisp_Object Qvariable_documentation, Vvalues, Vstandard_input, Vafter_load_alist; |
82 Lisp_Object Qascii_character, Qload, Qload_file_name; | 83 Lisp_Object Qascii_character, Qload, Qload_file_name; |
83 Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction; | 84 Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction; |
84 Lisp_Object Qinhibit_file_name_operation; | 85 Lisp_Object Qinhibit_file_name_operation; |
85 | 86 |
87 /* Used instead of Qget_file_char while loading *.elc files compiled | |
88 by Emacs 21 or older. */ | |
89 static Lisp_Object Qget_emacs_mule_file_char; | |
90 | |
91 static Lisp_Object Qload_force_doc_strings; | |
92 | |
86 extern Lisp_Object Qevent_symbol_element_mask; | 93 extern Lisp_Object Qevent_symbol_element_mask; |
87 extern Lisp_Object Qfile_exists_p; | 94 extern Lisp_Object Qfile_exists_p; |
88 | 95 |
89 /* non-zero if inside `load' */ | 96 /* non-zero if inside `load' */ |
90 int load_in_progress; | 97 int load_in_progress; |
124 static int load_force_doc_strings; | 131 static int load_force_doc_strings; |
125 | 132 |
126 /* Nonzero means read should convert strings to unibyte. */ | 133 /* Nonzero means read should convert strings to unibyte. */ |
127 static int load_convert_to_unibyte; | 134 static int load_convert_to_unibyte; |
128 | 135 |
136 /* Nonzero means READCHAR should read bytes one by one (not character) | |
137 when READCHARFUN is Qget_file_char or Qget_emacs_mule_file_char. | |
138 This is set to 1 by read1 temporarily while handling #@NUMBER. */ | |
139 static int load_each_byte; | |
140 | |
129 /* Function to use for loading an Emacs lisp source file (not | 141 /* Function to use for loading an Emacs lisp source file (not |
130 compiled) instead of readevalloop. */ | 142 compiled) instead of readevalloop. */ |
131 Lisp_Object Vload_source_file_function; | 143 Lisp_Object Vload_source_file_function; |
132 | 144 |
133 /* List of all DEFVAR_BOOL variables. Used by the byte optimizer. */ | 145 /* List of all DEFVAR_BOOL variables. Used by the byte optimizer. */ |
144 | 156 |
145 /* For use within read-from-string (this reader is non-reentrant!!) */ | 157 /* For use within read-from-string (this reader is non-reentrant!!) */ |
146 static int read_from_string_index; | 158 static int read_from_string_index; |
147 static int read_from_string_index_byte; | 159 static int read_from_string_index_byte; |
148 static int read_from_string_limit; | 160 static int read_from_string_limit; |
149 | |
150 /* Number of bytes left to read in the buffer character | |
151 that `readchar' has already advanced over. */ | |
152 static int readchar_backlog; | |
153 | 161 |
154 /* This contains the last string skipped with #@. */ | 162 /* This contains the last string skipped with #@. */ |
155 static char *saved_doc_string; | 163 static char *saved_doc_string; |
156 /* Length of buffer allocated in saved_doc_string. */ | 164 /* Length of buffer allocated in saved_doc_string. */ |
157 static int saved_doc_string_size; | 165 static int saved_doc_string_size; |
188 | 196 |
189 /* A regular expression used to detect files compiled with Emacs. */ | 197 /* A regular expression used to detect files compiled with Emacs. */ |
190 | 198 |
191 static Lisp_Object Vbytecomp_version_regexp; | 199 static Lisp_Object Vbytecomp_version_regexp; |
192 | 200 |
201 static int read_emacs_mule_char P_ ((int, int (*) (int, Lisp_Object), | |
202 Lisp_Object)); | |
203 | |
193 static void readevalloop P_ ((Lisp_Object, FILE*, Lisp_Object, | 204 static void readevalloop P_ ((Lisp_Object, FILE*, Lisp_Object, |
194 Lisp_Object (*) (), int, | 205 Lisp_Object (*) (), int, |
195 Lisp_Object, Lisp_Object)); | 206 Lisp_Object, Lisp_Object)); |
196 static Lisp_Object load_unwind P_ ((Lisp_Object)); | 207 static Lisp_Object load_unwind P_ ((Lisp_Object)); |
197 static Lisp_Object load_descriptor_unwind P_ ((Lisp_Object)); | 208 static Lisp_Object load_descriptor_unwind P_ ((Lisp_Object)); |
198 | 209 |
199 | 210 |
211 /* Functions that read one byte from the current source READCHARFUN | |
212 or unreads one byte. If the integer argument C is -1, it returns | |
213 one read byte, or -1 when there's no more byte in the source. If C | |
214 is 0 or positive, it unreads C, and the return value is not | |
215 interesting. */ | |
216 | |
217 static int readbyte_for_lambda P_ ((int, Lisp_Object)); | |
218 static int readbyte_from_file P_ ((int, Lisp_Object)); | |
219 static int readbyte_from_string P_ ((int, Lisp_Object)); | |
220 | |
200 /* Handle unreading and rereading of characters. | 221 /* Handle unreading and rereading of characters. |
201 Write READCHAR to read a character, | 222 Write READCHAR to read a character, |
202 UNREAD(c) to unread c to be read again. | 223 UNREAD(c) to unread c to be read again. |
203 | 224 |
204 These macros actually read/unread a byte code, multibyte characters | 225 These macros correctly read/unread multibyte characters. */ |
205 are not handled here. The caller should manage them if necessary. | |
206 */ | |
207 | 226 |
208 #define READCHAR readchar (readcharfun) | 227 #define READCHAR readchar (readcharfun) |
209 #define UNREAD(c) unreadchar (readcharfun, c) | 228 #define UNREAD(c) unreadchar (readcharfun, c) |
229 | |
230 /* When READCHARFUN is Qget_file_char, Qget_emacs_mule_file_char, | |
231 Qlambda, or a cons, we use this to keep unread character because a | |
232 file stream can't handle multibyte-char unreading. The value -1 | |
233 means that there's no unread character. */ | |
234 static int unread_char; | |
235 | |
210 | 236 |
211 static int | 237 static int |
212 readchar (readcharfun) | 238 readchar (readcharfun) |
213 Lisp_Object readcharfun; | 239 Lisp_Object readcharfun; |
214 { | 240 { |
215 Lisp_Object tem; | 241 Lisp_Object tem; |
216 register int c; | 242 register int c; |
243 int (*readbyte) P_ ((int, Lisp_Object)); | |
244 unsigned char buf[MAX_MULTIBYTE_LENGTH]; | |
245 int i, len; | |
246 int emacs_mule_encoding = 0; | |
217 | 247 |
218 if (BUFFERP (readcharfun)) | 248 if (BUFFERP (readcharfun)) |
219 { | 249 { |
220 register struct buffer *inbuffer = XBUFFER (readcharfun); | 250 register struct buffer *inbuffer = XBUFFER (readcharfun); |
221 | 251 |
222 int pt_byte = BUF_PT_BYTE (inbuffer); | 252 int pt_byte = BUF_PT_BYTE (inbuffer); |
223 | |
224 if (readchar_backlog > 0) | |
225 /* We get the address of the byte just passed, | |
226 which is the last byte of the character. | |
227 The other bytes in this character are consecutive with it, | |
228 because the gap can't be in the middle of a character. */ | |
229 return *(BUF_BYTE_ADDRESS (inbuffer, BUF_PT_BYTE (inbuffer) - 1) | |
230 - --readchar_backlog); | |
231 | 253 |
232 if (pt_byte >= BUF_ZV_BYTE (inbuffer)) | 254 if (pt_byte >= BUF_ZV_BYTE (inbuffer)) |
233 return -1; | 255 return -1; |
234 | |
235 readchar_backlog = -1; | |
236 | 256 |
237 if (! NILP (inbuffer->enable_multibyte_characters)) | 257 if (! NILP (inbuffer->enable_multibyte_characters)) |
238 { | 258 { |
239 /* Fetch the character code from the buffer. */ | 259 /* Fetch the character code from the buffer. */ |
240 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, pt_byte); | 260 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, pt_byte); |
242 c = STRING_CHAR (p, pt_byte - orig_pt_byte); | 262 c = STRING_CHAR (p, pt_byte - orig_pt_byte); |
243 } | 263 } |
244 else | 264 else |
245 { | 265 { |
246 c = BUF_FETCH_BYTE (inbuffer, pt_byte); | 266 c = BUF_FETCH_BYTE (inbuffer, pt_byte); |
267 if (! ASCII_BYTE_P (c)) | |
268 c = BYTE8_TO_CHAR (c); | |
247 pt_byte++; | 269 pt_byte++; |
248 } | 270 } |
249 SET_BUF_PT_BOTH (inbuffer, BUF_PT (inbuffer) + 1, pt_byte); | 271 SET_BUF_PT_BOTH (inbuffer, BUF_PT (inbuffer) + 1, pt_byte); |
250 | 272 |
251 return c; | 273 return c; |
254 { | 276 { |
255 register struct buffer *inbuffer = XMARKER (readcharfun)->buffer; | 277 register struct buffer *inbuffer = XMARKER (readcharfun)->buffer; |
256 | 278 |
257 int bytepos = marker_byte_position (readcharfun); | 279 int bytepos = marker_byte_position (readcharfun); |
258 | 280 |
259 if (readchar_backlog > 0) | |
260 /* We get the address of the byte just passed, | |
261 which is the last byte of the character. | |
262 The other bytes in this character are consecutive with it, | |
263 because the gap can't be in the middle of a character. */ | |
264 return *(BUF_BYTE_ADDRESS (inbuffer, XMARKER (readcharfun)->bytepos - 1) | |
265 - --readchar_backlog); | |
266 | |
267 if (bytepos >= BUF_ZV_BYTE (inbuffer)) | 281 if (bytepos >= BUF_ZV_BYTE (inbuffer)) |
268 return -1; | 282 return -1; |
269 | |
270 readchar_backlog = -1; | |
271 | 283 |
272 if (! NILP (inbuffer->enable_multibyte_characters)) | 284 if (! NILP (inbuffer->enable_multibyte_characters)) |
273 { | 285 { |
274 /* Fetch the character code from the buffer. */ | 286 /* Fetch the character code from the buffer. */ |
275 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, bytepos); | 287 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, bytepos); |
277 c = STRING_CHAR (p, bytepos - orig_bytepos); | 289 c = STRING_CHAR (p, bytepos - orig_bytepos); |
278 } | 290 } |
279 else | 291 else |
280 { | 292 { |
281 c = BUF_FETCH_BYTE (inbuffer, bytepos); | 293 c = BUF_FETCH_BYTE (inbuffer, bytepos); |
294 if (! ASCII_BYTE_P (c)) | |
295 c = BYTE8_TO_CHAR (c); | |
282 bytepos++; | 296 bytepos++; |
283 } | 297 } |
284 | 298 |
285 XMARKER (readcharfun)->bytepos = bytepos; | 299 XMARKER (readcharfun)->bytepos = bytepos; |
286 XMARKER (readcharfun)->charpos++; | 300 XMARKER (readcharfun)->charpos++; |
287 | 301 |
288 return c; | 302 return c; |
289 } | 303 } |
290 | 304 |
291 if (EQ (readcharfun, Qlambda)) | 305 if (EQ (readcharfun, Qlambda)) |
292 return read_bytecode_char (0); | 306 { |
293 | 307 readbyte = readbyte_for_lambda; |
308 goto read_multibyte; | |
309 } | |
294 if (EQ (readcharfun, Qget_file_char)) | 310 if (EQ (readcharfun, Qget_file_char)) |
295 { | 311 { |
296 c = getc (instream); | 312 readbyte = readbyte_from_file; |
297 #ifdef EINTR | 313 goto read_multibyte; |
298 /* Interrupted reads have been observed while reading over the network */ | 314 } |
299 while (c == EOF && ferror (instream) && errno == EINTR) | |
300 { | |
301 clearerr (instream); | |
302 c = getc (instream); | |
303 } | |
304 #endif | |
305 return c; | |
306 } | |
307 | |
308 if (STRINGP (readcharfun)) | 315 if (STRINGP (readcharfun)) |
309 { | 316 { |
310 if (read_from_string_index >= read_from_string_limit) | 317 if (read_from_string_index >= read_from_string_limit) |
311 c = -1; | 318 c = -1; |
312 else | 319 else |
314 read_from_string_index, | 321 read_from_string_index, |
315 read_from_string_index_byte); | 322 read_from_string_index_byte); |
316 | 323 |
317 return c; | 324 return c; |
318 } | 325 } |
326 if (CONSP (readcharfun)) | |
327 { | |
328 /* This is the case that read_vector is reading from a unibyte | |
329 string that contains a byte sequence previously skipped | |
330 because of #@NUMBER. The car part of readcharfun is that | |
331 string, and the cdr part is a value of readcharfun given to | |
332 read_vector. */ | |
333 readbyte = readbyte_from_string; | |
334 if (EQ (XCDR (readcharfun), Qget_emacs_mule_file_char)) | |
335 emacs_mule_encoding = 1; | |
336 goto read_multibyte; | |
337 } | |
338 if (EQ (readcharfun, Qget_emacs_mule_file_char)) | |
339 { | |
340 readbyte = readbyte_from_file; | |
341 emacs_mule_encoding = 1; | |
342 goto read_multibyte; | |
343 } | |
319 | 344 |
320 tem = call0 (readcharfun); | 345 tem = call0 (readcharfun); |
321 | 346 |
322 if (NILP (tem)) | 347 if (NILP (tem)) |
323 return -1; | 348 return -1; |
324 return XINT (tem); | 349 return XINT (tem); |
325 } | 350 |
351 read_multibyte: | |
352 if (unread_char >= 0) | |
353 { | |
354 c = unread_char; | |
355 unread_char = -1; | |
356 return c; | |
357 } | |
358 c = (*readbyte) (-1, readcharfun); | |
359 if (c < 0 || ASCII_BYTE_P (c) || load_each_byte) | |
360 return c; | |
361 if (emacs_mule_encoding) | |
362 return read_emacs_mule_char (c, readbyte, readcharfun); | |
363 i = 0; | |
364 buf[i++] = c; | |
365 len = BYTES_BY_CHAR_HEAD (c); | |
366 while (i < len) | |
367 { | |
368 c = (*readbyte) (-1, readcharfun); | |
369 if (c < 0 || ! TRAILING_CODE_P (c)) | |
370 { | |
371 while (--i > 1) | |
372 (*readbyte) (buf[i], readcharfun); | |
373 return BYTE8_TO_CHAR (buf[0]); | |
374 } | |
375 buf[i++] = c; | |
376 } | |
377 return STRING_CHAR (buf, i); | |
378 } | |
379 | |
326 | 380 |
327 /* Unread the character C in the way appropriate for the stream READCHARFUN. | 381 /* Unread the character C in the way appropriate for the stream READCHARFUN. |
328 If the stream is a user function, call it with the char as argument. */ | 382 If the stream is a user function, call it with the char as argument. */ |
329 | 383 |
330 static void | 384 static void |
339 else if (BUFFERP (readcharfun)) | 393 else if (BUFFERP (readcharfun)) |
340 { | 394 { |
341 struct buffer *b = XBUFFER (readcharfun); | 395 struct buffer *b = XBUFFER (readcharfun); |
342 int bytepos = BUF_PT_BYTE (b); | 396 int bytepos = BUF_PT_BYTE (b); |
343 | 397 |
344 if (readchar_backlog >= 0) | 398 BUF_PT (b)--; |
345 readchar_backlog++; | 399 if (! NILP (b->enable_multibyte_characters)) |
400 BUF_DEC_POS (b, bytepos); | |
346 else | 401 else |
347 { | 402 bytepos--; |
348 BUF_PT (b)--; | 403 |
349 if (! NILP (b->enable_multibyte_characters)) | 404 BUF_PT_BYTE (b) = bytepos; |
350 BUF_DEC_POS (b, bytepos); | |
351 else | |
352 bytepos--; | |
353 | |
354 BUF_PT_BYTE (b) = bytepos; | |
355 } | |
356 } | 405 } |
357 else if (MARKERP (readcharfun)) | 406 else if (MARKERP (readcharfun)) |
358 { | 407 { |
359 struct buffer *b = XMARKER (readcharfun)->buffer; | 408 struct buffer *b = XMARKER (readcharfun)->buffer; |
360 int bytepos = XMARKER (readcharfun)->bytepos; | 409 int bytepos = XMARKER (readcharfun)->bytepos; |
361 | 410 |
362 if (readchar_backlog >= 0) | 411 XMARKER (readcharfun)->charpos--; |
363 readchar_backlog++; | 412 if (! NILP (b->enable_multibyte_characters)) |
413 BUF_DEC_POS (b, bytepos); | |
364 else | 414 else |
365 { | 415 bytepos--; |
366 XMARKER (readcharfun)->charpos--; | 416 |
367 if (! NILP (b->enable_multibyte_characters)) | 417 XMARKER (readcharfun)->bytepos = bytepos; |
368 BUF_DEC_POS (b, bytepos); | |
369 else | |
370 bytepos--; | |
371 | |
372 XMARKER (readcharfun)->bytepos = bytepos; | |
373 } | |
374 } | 418 } |
375 else if (STRINGP (readcharfun)) | 419 else if (STRINGP (readcharfun)) |
376 { | 420 { |
377 read_from_string_index--; | 421 read_from_string_index--; |
378 read_from_string_index_byte | 422 read_from_string_index_byte |
379 = string_char_to_byte (readcharfun, read_from_string_index); | 423 = string_char_to_byte (readcharfun, read_from_string_index); |
380 } | 424 } |
425 else if (CONSP (readcharfun)) | |
426 { | |
427 unread_char = c; | |
428 } | |
381 else if (EQ (readcharfun, Qlambda)) | 429 else if (EQ (readcharfun, Qlambda)) |
382 read_bytecode_char (1); | 430 { |
383 else if (EQ (readcharfun, Qget_file_char)) | 431 unread_char = c; |
384 ungetc (c, instream); | 432 } |
433 else if (EQ (readcharfun, Qget_file_char) | |
434 || EQ (readcharfun, Qget_emacs_mule_file_char)) | |
435 { | |
436 if (load_each_byte) | |
437 ungetc (c, instream); | |
438 else | |
439 unread_char = c; | |
440 } | |
385 else | 441 else |
386 call1 (readcharfun, make_number (c)); | 442 call1 (readcharfun, make_number (c)); |
387 } | 443 } |
388 | 444 |
445 static int | |
446 readbyte_for_lambda (c, readcharfun) | |
447 int c; | |
448 Lisp_Object readcharfun; | |
449 { | |
450 return read_bytecode_char (c >= 0); | |
451 } | |
452 | |
453 | |
454 static int | |
455 readbyte_from_file (c, readcharfun) | |
456 int c; | |
457 Lisp_Object readcharfun; | |
458 { | |
459 if (c >= 0) | |
460 { | |
461 ungetc (c, instream); | |
462 return 0; | |
463 } | |
464 | |
465 c = getc (instream); | |
466 #ifdef EINTR | |
467 /* Interrupted reads have been observed while reading over the network */ | |
468 while (c == EOF && ferror (instream) && errno == EINTR) | |
469 { | |
470 clearerr (instream); | |
471 c = getc (instream); | |
472 } | |
473 #endif | |
474 return (c == EOF ? -1 : c); | |
475 } | |
476 | |
477 static int | |
478 readbyte_from_string (c, readcharfun) | |
479 int c; | |
480 Lisp_Object readcharfun; | |
481 { | |
482 Lisp_Object string = XCAR (readcharfun); | |
483 | |
484 if (c >= 0) | |
485 { | |
486 read_from_string_index--; | |
487 read_from_string_index_byte | |
488 = string_char_to_byte (string, read_from_string_index); | |
489 } | |
490 | |
491 if (read_from_string_index >= read_from_string_limit) | |
492 c = -1; | |
493 else | |
494 FETCH_STRING_CHAR_ADVANCE (c, string, | |
495 read_from_string_index, | |
496 read_from_string_index_byte); | |
497 return c; | |
498 } | |
499 | |
500 | |
501 /* Read one non-ASCII character from INSTREAM. The character is | |
502 encoded in `emacs-mule' and the first byte is already read in | |
503 C. */ | |
504 | |
505 extern char emacs_mule_bytes[256]; | |
506 | |
507 static int | |
508 read_emacs_mule_char (c, readbyte, readcharfun) | |
509 int c; | |
510 int (*readbyte) P_ ((int, Lisp_Object)); | |
511 Lisp_Object readcharfun; | |
512 { | |
513 /* Emacs-mule coding uses at most 4-byte for one character. */ | |
514 unsigned char buf[4]; | |
515 int len = emacs_mule_bytes[c]; | |
516 struct charset *charset; | |
517 int i; | |
518 unsigned code; | |
519 | |
520 if (len == 1) | |
521 /* C is not a valid leading-code of `emacs-mule'. */ | |
522 return BYTE8_TO_CHAR (c); | |
523 | |
524 i = 0; | |
525 buf[i++] = c; | |
526 while (i < len) | |
527 { | |
528 c = (*readbyte) (-1, readcharfun); | |
529 if (c < 0xA0) | |
530 { | |
531 while (--i > 1) | |
532 (*readbyte) (buf[i], readcharfun); | |
533 return BYTE8_TO_CHAR (buf[0]); | |
534 } | |
535 buf[i++] = c; | |
536 } | |
537 | |
538 if (len == 2) | |
539 { | |
540 charset = emacs_mule_charset[c]; | |
541 code = buf[1] & 0x7F; | |
542 } | |
543 else if (len == 3) | |
544 { | |
545 if (buf[0] == EMACS_MULE_LEADING_CODE_PRIVATE_11 | |
546 || buf[0] == EMACS_MULE_LEADING_CODE_PRIVATE_12) | |
547 { | |
548 charset = emacs_mule_charset[buf[1]]; | |
549 code = buf[2] & 0x7F; | |
550 } | |
551 else | |
552 { | |
553 charset = emacs_mule_charset[buf[0]]; | |
554 code = ((buf[1] << 8) | buf[2]) & 0x7F7F; | |
555 } | |
556 } | |
557 else | |
558 { | |
559 charset = emacs_mule_charset[buf[1]]; | |
560 code = ((buf[2] << 8) | buf[3]) & 0x7F7F; | |
561 } | |
562 c = DECODE_CHAR (charset, code); | |
563 if (c < 0) | |
564 Fsignal (Qinvalid_read_syntax, | |
565 Fcons (build_string ("invalid multibyte form"), Qnil)); | |
566 return c; | |
567 } | |
568 | |
569 | |
389 static Lisp_Object read0 (), read1 (), read_list (), read_vector (); | 570 static Lisp_Object read0 (), read1 (), read_list (), read_vector (); |
390 static int read_multibyte (); | |
391 static Lisp_Object substitute_object_recurse (); | 571 static Lisp_Object substitute_object_recurse (); |
392 static void substitute_object_in_subtree (), substitute_in_interval (); | 572 static void substitute_object_in_subtree (), substitute_in_interval (); |
393 | 573 |
394 | 574 |
395 /* Get a character from the tty. */ | 575 /* Get a character from the tty. */ |
551 return val; | 731 return val; |
552 } | 732 } |
553 | 733 |
554 | 734 |
555 | 735 |
556 /* Value is non-zero if the file asswociated with file descriptor FD | 736 /* Value is a version number of byte compiled code if the file |
557 is a compiled Lisp file that's safe to load. Only files compiled | 737 associated with file descriptor FD is a compiled Lisp file that's |
558 with Emacs are safe to load. Files compiled with XEmacs can lead | 738 safe to load. Only files compiled with Emacs are safe to load. |
559 to a crash in Fbyte_code because of an incompatible change in the | 739 Files compiled with XEmacs can lead to a crash in Fbyte_code |
560 byte compiler. */ | 740 because of an incompatible change in the byte compiler. */ |
561 | 741 |
562 static int | 742 static int |
563 safe_to_load_p (fd) | 743 safe_to_load_p (fd) |
564 int fd; | 744 int fd; |
565 { | 745 { |
576 | 756 |
577 /* Skip to the next newline, skipping over the initial `ELC' | 757 /* Skip to the next newline, skipping over the initial `ELC' |
578 with NUL bytes following it, but note the version. */ | 758 with NUL bytes following it, but note the version. */ |
579 for (i = 0; i < nbytes && buf[i] != '\n'; ++i) | 759 for (i = 0; i < nbytes && buf[i] != '\n'; ++i) |
580 if (i == 4) | 760 if (i == 4) |
581 version = buf[i]; | 761 version = buf[i]; |
582 | 762 |
583 if (i < nbytes | 763 if (i < nbytes |
584 && fast_c_string_match_ignore_case (Vbytecomp_version_regexp, | 764 && fast_c_string_match_ignore_case (Vbytecomp_version_regexp, |
585 buf + i) < 0) | 765 buf + i) < 0) |
586 safe_p = 0; | 766 safe_p = 0; |
635 /* 1 means we are loading a compiled file. */ | 815 /* 1 means we are loading a compiled file. */ |
636 int compiled = 0; | 816 int compiled = 0; |
637 Lisp_Object handler; | 817 Lisp_Object handler; |
638 int safe_p = 1; | 818 int safe_p = 1; |
639 char *fmode = "r"; | 819 char *fmode = "r"; |
820 int version; | |
821 | |
640 #ifdef DOS_NT | 822 #ifdef DOS_NT |
641 fmode = "rt"; | 823 fmode = "rt"; |
642 #endif /* DOS_NT */ | 824 #endif /* DOS_NT */ |
643 | 825 |
644 CHECK_STRING (file); | 826 CHECK_STRING (file); |
742 Fcons (found, Vloads_in_progress))); | 924 Fcons (found, Vloads_in_progress))); |
743 record_unwind_protect (record_load_unwind, Vloads_in_progress); | 925 record_unwind_protect (record_load_unwind, Vloads_in_progress); |
744 Vloads_in_progress = Fcons (found, Vloads_in_progress); | 926 Vloads_in_progress = Fcons (found, Vloads_in_progress); |
745 } | 927 } |
746 | 928 |
929 version = -1; | |
747 if (!bcmp (&(XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 4]), | 930 if (!bcmp (&(XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 4]), |
748 ".elc", 4)) | 931 ".elc", 4) |
932 || (version = safe_to_load_p (fd)) > 0) | |
749 /* Load .elc files directly, but not when they are | 933 /* Load .elc files directly, but not when they are |
750 remote and have no handler! */ | 934 remote and have no handler! */ |
751 { | 935 { |
752 if (fd != -2) | 936 if (fd != -2) |
753 { | 937 { |
754 struct stat s1, s2; | 938 struct stat s1, s2; |
755 int result, version; | 939 int result; |
756 | 940 |
757 if (!(version = safe_to_load_p (fd))) | 941 if (version < 0 |
942 && ! (version = safe_to_load_p (fd))) | |
758 { | 943 { |
759 safe_p = 0; | 944 safe_p = 0; |
760 if (!load_dangerous_libraries) | 945 if (!load_dangerous_libraries) |
761 { | 946 { |
762 emacs_close (fd); | 947 emacs_close (fd); |
767 message_with_string ("File `%s' not compiled in Emacs", found, 1); | 952 message_with_string ("File `%s' not compiled in Emacs", found, 1); |
768 } | 953 } |
769 | 954 |
770 compiled = 1; | 955 compiled = 1; |
771 | 956 |
772 if (version == 20) /* 21 isn't used */ | |
773 /* We're loading something compiled with Mule 3, 4 or 5, | |
774 and thus potentially emacs-mule-encoded; load it with | |
775 code conversion. (Perhaps the test should actually be | |
776 <22?) We could check further on whether the comment | |
777 mentions multibyte and only code-convert if it does. I | |
778 doubt it's worth the effort. -- fx */ | |
779 { | |
780 Lisp_Object val; | |
781 | |
782 if (fd >= 0) | |
783 emacs_close (fd); | |
784 /* load-with-code-conversion currently fails with | |
785 emacs-mule non-ASCII doc strings. */ | |
786 error ("Can't currently load Emacs 20/1-compiled files: %s", | |
787 XSTRING (found)->data); | |
788 #if 0 | |
789 val = call4 (intern ("load-with-code-conversion"), found, file, | |
790 NILP (noerror) ? Qnil : Qt, | |
791 NILP (nomessage) ? Qnil : Qt); | |
792 #endif | |
793 return unbind_to (count, val); | |
794 } | |
795 | |
796 #ifdef DOS_NT | 957 #ifdef DOS_NT |
797 fmode = "rb"; | 958 fmode = "rb"; |
798 #endif /* DOS_NT */ | 959 #endif /* DOS_NT */ |
799 stat ((char *)XSTRING (found)->data, &s1); | 960 stat ((char *)XSTRING (found)->data, &s1); |
800 XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 1] = 0; | 961 XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 1] = 0; |
866 specbind (Qload_file_name, found); | 1027 specbind (Qload_file_name, found); |
867 specbind (Qinhibit_file_name_operation, Qnil); | 1028 specbind (Qinhibit_file_name_operation, Qnil); |
868 load_descriptor_list | 1029 load_descriptor_list |
869 = Fcons (make_number (fileno (stream)), load_descriptor_list); | 1030 = Fcons (make_number (fileno (stream)), load_descriptor_list); |
870 load_in_progress++; | 1031 load_in_progress++; |
871 readevalloop (Qget_file_char, stream, file, Feval, 0, Qnil, Qnil); | 1032 if (version >= 22) |
1033 readevalloop (Qget_file_char, stream, file, Feval, 0, Qnil, Qnil); | |
1034 else | |
1035 { | |
1036 /* We can't handle a file which was compiled with | |
1037 byte-compile-dynamic by older version of Emacs. */ | |
1038 specbind (Qload_force_doc_strings, Qt); | |
1039 readevalloop (Qget_emacs_mule_file_char, stream, file, Feval, 0, | |
1040 Qnil, Qnil); | |
1041 } | |
872 unbind_to (count, Qnil); | 1042 unbind_to (count, Qnil); |
873 | 1043 |
874 /* Run any load-hooks for this file. */ | 1044 /* Run any load-hooks for this file. */ |
875 temp = Fassoc (file, Vafter_load_alist); | 1045 temp = Fassoc (file, Vafter_load_alist); |
876 if (!NILP (temp)) | 1046 if (!NILP (temp)) |
1240 specbind (Qstandard_input, readcharfun); | 1410 specbind (Qstandard_input, readcharfun); |
1241 specbind (Qcurrent_load_list, Qnil); | 1411 specbind (Qcurrent_load_list, Qnil); |
1242 record_unwind_protect (readevalloop_1, load_convert_to_unibyte ? Qt : Qnil); | 1412 record_unwind_protect (readevalloop_1, load_convert_to_unibyte ? Qt : Qnil); |
1243 load_convert_to_unibyte = !NILP (unibyte); | 1413 load_convert_to_unibyte = !NILP (unibyte); |
1244 | 1414 |
1245 readchar_backlog = -1; | |
1246 | |
1247 GCPRO1 (sourcename); | 1415 GCPRO1 (sourcename); |
1248 | 1416 |
1249 LOADHIST_ATTACH (sourcename); | 1417 LOADHIST_ATTACH (sourcename); |
1250 | 1418 |
1251 continue_reading_p = 1; | 1419 continue_reading_p = 1; |
1421 if (NILP (stream)) | 1589 if (NILP (stream)) |
1422 stream = Vstandard_input; | 1590 stream = Vstandard_input; |
1423 if (EQ (stream, Qt)) | 1591 if (EQ (stream, Qt)) |
1424 stream = Qread_char; | 1592 stream = Qread_char; |
1425 | 1593 |
1426 readchar_backlog = -1; | |
1427 new_backquote_flag = 0; | 1594 new_backquote_flag = 0; |
1428 read_objects = Qnil; | 1595 read_objects = Qnil; |
1429 | 1596 |
1430 if (EQ (stream, Qread_char)) | 1597 if (EQ (stream, Qread_char)) |
1431 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil); | 1598 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil); |
1432 | 1599 |
1433 if (STRINGP (stream)) | 1600 if (STRINGP (stream) || ((CONSP (stream) && STRINGP (XCAR (stream))))) |
1434 return Fcar (Fread_from_string (stream, Qnil, Qnil)); | 1601 return Fcar (Fread_from_string (stream, Qnil, Qnil)); |
1435 | 1602 |
1436 return read0 (stream); | 1603 return read0 (stream); |
1437 } | 1604 } |
1438 | 1605 |
1443 they default to 0 and (length STRING) respectively. */) | 1610 they default to 0 and (length STRING) respectively. */) |
1444 (string, start, end) | 1611 (string, start, end) |
1445 Lisp_Object string, start, end; | 1612 Lisp_Object string, start, end; |
1446 { | 1613 { |
1447 int startval, endval; | 1614 int startval, endval; |
1615 Lisp_Object str; | |
1448 Lisp_Object tem; | 1616 Lisp_Object tem; |
1449 | 1617 |
1450 CHECK_STRING (string); | 1618 if (CONSP (string)) |
1619 str = XCAR (string); | |
1620 else | |
1621 str = string; | |
1622 CHECK_STRING (str); | |
1451 | 1623 |
1452 if (NILP (end)) | 1624 if (NILP (end)) |
1453 endval = XSTRING (string)->size; | 1625 endval = XSTRING (str)->size; |
1454 else | 1626 else |
1455 { | 1627 { |
1456 CHECK_NUMBER (end); | 1628 CHECK_NUMBER (end); |
1457 endval = XINT (end); | 1629 endval = XINT (end); |
1458 if (endval < 0 || endval > XSTRING (string)->size) | 1630 if (endval < 0 || endval > XSTRING (str)->size) |
1459 args_out_of_range (string, end); | 1631 args_out_of_range (str, end); |
1460 } | 1632 } |
1461 | 1633 |
1462 if (NILP (start)) | 1634 if (NILP (start)) |
1463 startval = 0; | 1635 startval = 0; |
1464 else | 1636 else |
1465 { | 1637 { |
1466 CHECK_NUMBER (start); | 1638 CHECK_NUMBER (start); |
1467 startval = XINT (start); | 1639 startval = XINT (start); |
1468 if (startval < 0 || startval > endval) | 1640 if (startval < 0 || startval > endval) |
1469 args_out_of_range (string, start); | 1641 args_out_of_range (str, start); |
1470 } | 1642 } |
1471 | 1643 |
1472 read_from_string_index = startval; | 1644 read_from_string_index = startval; |
1473 read_from_string_index_byte = string_char_to_byte (string, startval); | 1645 read_from_string_index_byte = string_char_to_byte (str, startval); |
1474 read_from_string_limit = endval; | 1646 read_from_string_limit = endval; |
1475 | 1647 |
1476 new_backquote_flag = 0; | 1648 new_backquote_flag = 0; |
1477 read_objects = Qnil; | 1649 read_objects = Qnil; |
1478 | 1650 |
1500 } | 1672 } |
1501 | 1673 |
1502 static int read_buffer_size; | 1674 static int read_buffer_size; |
1503 static char *read_buffer; | 1675 static char *read_buffer; |
1504 | 1676 |
1505 /* Read multibyte form and return it as a character. C is a first | 1677 /* Read a \-escape sequence, assuming we already read the `\'. |
1506 byte of multibyte form, and rest of them are read from | 1678 If the escape sequence forces unibyte, return eight-bit-char. */ |
1507 READCHARFUN. Store the byte length of the form into *NBYTES. */ | |
1508 | 1679 |
1509 static int | 1680 static int |
1510 read_multibyte (c, readcharfun, nbytes) | 1681 read_escape (readcharfun, stringp) |
1511 register int c; | |
1512 Lisp_Object readcharfun; | |
1513 int *nbytes; | |
1514 { | |
1515 /* We need the actual character code of this multibyte | |
1516 characters. */ | |
1517 unsigned char str[MAX_MULTIBYTE_LENGTH]; | |
1518 int len = 0; | |
1519 int bytes = BYTES_BY_CHAR_HEAD (c); | |
1520 | |
1521 str[len++] = c; | |
1522 while (len < bytes) | |
1523 { | |
1524 c = READCHAR; | |
1525 if (CHAR_HEAD_P (c)) | |
1526 { | |
1527 UNREAD (c); | |
1528 break; | |
1529 } | |
1530 str[len++] = c; | |
1531 } | |
1532 | |
1533 if (len == bytes && MULTIBYTE_LENGTH_NO_CHECK (str) > 0) | |
1534 { | |
1535 *nbytes = len; | |
1536 return STRING_CHAR (str, len); | |
1537 } | |
1538 /* The byte sequence is not valid as multibyte. Unread all bytes | |
1539 but the first one, and return the first byte. */ | |
1540 while (--len > 0) | |
1541 UNREAD (str[len]); | |
1542 *nbytes = 1; | |
1543 return str[0]; | |
1544 } | |
1545 | |
1546 /* Read a \-escape sequence, assuming we already read the `\'. | |
1547 If the escape sequence forces unibyte, store 1 into *BYTEREP. | |
1548 If the escape sequence forces multibyte and the returned character | |
1549 is raw 8-bit char, store 2 into *BYTEREP. | |
1550 If the escape sequence forces multibyte and the returned character | |
1551 is not raw 8-bit char, store 3 into *BYTEREP. | |
1552 Otherwise store 0 into *BYTEREP. */ | |
1553 | |
1554 static int | |
1555 read_escape (readcharfun, stringp, byterep) | |
1556 Lisp_Object readcharfun; | 1682 Lisp_Object readcharfun; |
1557 int stringp; | 1683 int stringp; |
1558 int *byterep; | |
1559 { | 1684 { |
1560 register int c = READCHAR; | 1685 register int c = READCHAR; |
1561 | |
1562 *byterep = 0; | |
1563 | 1686 |
1564 switch (c) | 1687 switch (c) |
1565 { | 1688 { |
1566 case -1: | 1689 case -1: |
1567 end_of_file_error (); | 1690 end_of_file_error (); |
1595 c = READCHAR; | 1718 c = READCHAR; |
1596 if (c != '-') | 1719 if (c != '-') |
1597 error ("Invalid escape character syntax"); | 1720 error ("Invalid escape character syntax"); |
1598 c = READCHAR; | 1721 c = READCHAR; |
1599 if (c == '\\') | 1722 if (c == '\\') |
1600 c = read_escape (readcharfun, 0, byterep); | 1723 c = read_escape (readcharfun, 0); |
1601 return c | meta_modifier; | 1724 return c | meta_modifier; |
1602 | 1725 |
1603 case 'S': | 1726 case 'S': |
1604 c = READCHAR; | 1727 c = READCHAR; |
1605 if (c != '-') | 1728 if (c != '-') |
1606 error ("Invalid escape character syntax"); | 1729 error ("Invalid escape character syntax"); |
1607 c = READCHAR; | 1730 c = READCHAR; |
1608 if (c == '\\') | 1731 if (c == '\\') |
1609 c = read_escape (readcharfun, 0, byterep); | 1732 c = read_escape (readcharfun, 0); |
1610 return c | shift_modifier; | 1733 return c | shift_modifier; |
1611 | 1734 |
1612 case 'H': | 1735 case 'H': |
1613 c = READCHAR; | 1736 c = READCHAR; |
1614 if (c != '-') | 1737 if (c != '-') |
1615 error ("Invalid escape character syntax"); | 1738 error ("Invalid escape character syntax"); |
1616 c = READCHAR; | 1739 c = READCHAR; |
1617 if (c == '\\') | 1740 if (c == '\\') |
1618 c = read_escape (readcharfun, 0, byterep); | 1741 c = read_escape (readcharfun, 0); |
1619 return c | hyper_modifier; | 1742 return c | hyper_modifier; |
1620 | 1743 |
1621 case 'A': | 1744 case 'A': |
1622 c = READCHAR; | 1745 c = READCHAR; |
1623 if (c != '-') | 1746 if (c != '-') |
1624 error ("Invalid escape character syntax"); | 1747 error ("Invalid escape character syntax"); |
1625 c = READCHAR; | 1748 c = READCHAR; |
1626 if (c == '\\') | 1749 if (c == '\\') |
1627 c = read_escape (readcharfun, 0, byterep); | 1750 c = read_escape (readcharfun, 0); |
1628 return c | alt_modifier; | 1751 return c | alt_modifier; |
1629 | 1752 |
1630 case 's': | 1753 case 's': |
1631 c = READCHAR; | 1754 c = READCHAR; |
1632 if (c != '-') | 1755 if (c != '-') |
1633 error ("Invalid escape character syntax"); | 1756 error ("Invalid escape character syntax"); |
1634 c = READCHAR; | 1757 c = READCHAR; |
1635 if (c == '\\') | 1758 if (c == '\\') |
1636 c = read_escape (readcharfun, 0, byterep); | 1759 c = read_escape (readcharfun, 0); |
1637 return c | super_modifier; | 1760 return c | super_modifier; |
1638 | 1761 |
1639 case 'C': | 1762 case 'C': |
1640 c = READCHAR; | 1763 c = READCHAR; |
1641 if (c != '-') | 1764 if (c != '-') |
1642 error ("Invalid escape character syntax"); | 1765 error ("Invalid escape character syntax"); |
1643 case '^': | 1766 case '^': |
1644 c = READCHAR; | 1767 c = READCHAR; |
1645 if (c == '\\') | 1768 if (c == '\\') |
1646 c = read_escape (readcharfun, 0, byterep); | 1769 c = read_escape (readcharfun, 0); |
1647 if ((c & ~CHAR_MODIFIER_MASK) == '?') | 1770 if ((c & ~CHAR_MODIFIER_MASK) == '?') |
1648 return 0177 | (c & CHAR_MODIFIER_MASK); | 1771 return 0177 | (c & CHAR_MODIFIER_MASK); |
1649 else if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK))) | 1772 else if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK))) |
1650 return c | ctrl_modifier; | 1773 return c | ctrl_modifier; |
1651 /* ASCII control chars are made from letters (both cases), | 1774 /* ASCII control chars are made from letters (both cases), |
1681 UNREAD (c); | 1804 UNREAD (c); |
1682 break; | 1805 break; |
1683 } | 1806 } |
1684 } | 1807 } |
1685 | 1808 |
1686 if (c < 0x100) | 1809 if (! ASCII_BYTE_P (i)) |
1687 *byterep = 1; | 1810 i = BYTE8_TO_CHAR (i); |
1688 else | |
1689 *byterep = 3; | |
1690 return i; | 1811 return i; |
1691 } | 1812 } |
1692 | 1813 |
1693 case 'x': | 1814 case 'x': |
1694 /* A hex escape, as in ANSI C. */ | 1815 /* A hex escape, as in ANSI C. */ |
1719 } | 1840 } |
1720 count++; | 1841 count++; |
1721 } | 1842 } |
1722 | 1843 |
1723 if (count < 3 && i >= 0x80) | 1844 if (count < 3 && i >= 0x80) |
1724 *byterep = 2; | 1845 return BYTE8_TO_CHAR (i); |
1725 else | |
1726 *byterep = 3; | |
1727 return i; | 1846 return i; |
1728 } | 1847 } |
1729 | 1848 |
1730 default: | 1849 default: |
1731 if (EQ (readcharfun, Qget_file_char) | |
1732 && BASE_LEADING_CODE_P (c)) | |
1733 { | |
1734 int nbytes; | |
1735 | |
1736 c = read_multibyte (c, readcharfun, &nbytes); | |
1737 if (nbytes > 1) | |
1738 *byterep = 3; | |
1739 } | |
1740 return c; | 1850 return c; |
1741 } | 1851 } |
1742 } | 1852 } |
1743 | 1853 |
1744 | 1854 |
1822 { | 1932 { |
1823 register int c; | 1933 register int c; |
1824 int uninterned_symbol = 0; | 1934 int uninterned_symbol = 0; |
1825 | 1935 |
1826 *pch = 0; | 1936 *pch = 0; |
1937 load_each_byte = 0; | |
1827 | 1938 |
1828 retry: | 1939 retry: |
1829 | 1940 |
1830 c = READCHAR; | 1941 c = READCHAR; |
1831 if (c < 0) | 1942 if (c < 0) |
1896 int size_in_chars = ((XFASTINT (length) + BITS_PER_CHAR - 1) | 2007 int size_in_chars = ((XFASTINT (length) + BITS_PER_CHAR - 1) |
1897 / BITS_PER_CHAR); | 2008 / BITS_PER_CHAR); |
1898 | 2009 |
1899 UNREAD (c); | 2010 UNREAD (c); |
1900 tmp = read1 (readcharfun, pch, first_in_list); | 2011 tmp = read1 (readcharfun, pch, first_in_list); |
1901 if (size_in_chars != XSTRING (tmp)->size | 2012 if (STRING_MULTIBYTE (tmp) |
1902 /* We used to print 1 char too many | 2013 || (size_in_chars != XSTRING (tmp)->size |
1903 when the number of bits was a multiple of 8. | 2014 /* We used to print 1 char too many |
1904 Accept such input in case it came from an old version. */ | 2015 when the number of bits was a multiple of 8. |
1905 && ! (XFASTINT (length) | 2016 Accept such input in case it came from an old |
1906 == (XSTRING (tmp)->size - 1) * BITS_PER_CHAR)) | 2017 version. */ |
2018 && ! (XFASTINT (length) | |
2019 == (XSTRING (tmp)->size - 1) * BITS_PER_CHAR))) | |
1907 Fsignal (Qinvalid_read_syntax, | 2020 Fsignal (Qinvalid_read_syntax, |
1908 Fcons (make_string ("#&...", 5), Qnil)); | 2021 Fcons (make_string ("#&...", 5), Qnil)); |
1909 | 2022 |
1910 val = Fmake_bool_vector (length, Qnil); | 2023 val = Fmake_bool_vector (length, Qnil); |
1911 bcopy (XSTRING (tmp)->data, XBOOL_VECTOR (val)->data, | 2024 bcopy (XSTRING (tmp)->data, XBOOL_VECTOR (val)->data, |
1967 and function definitions. */ | 2080 and function definitions. */ |
1968 if (c == '@') | 2081 if (c == '@') |
1969 { | 2082 { |
1970 int i, nskip = 0; | 2083 int i, nskip = 0; |
1971 | 2084 |
2085 load_each_byte = 1; | |
1972 /* Read a decimal integer. */ | 2086 /* Read a decimal integer. */ |
1973 while ((c = READCHAR) >= 0 | 2087 while ((c = READCHAR) >= 0 |
1974 && c >= '0' && c <= '9') | 2088 && c >= '0' && c <= '9') |
1975 { | 2089 { |
1976 nskip *= 10; | 2090 nskip *= 10; |
1977 nskip += c - '0'; | 2091 nskip += c - '0'; |
1978 } | 2092 } |
1979 if (c >= 0) | 2093 if (c >= 0) |
1980 UNREAD (c); | 2094 UNREAD (c); |
1981 | 2095 |
1982 if (load_force_doc_strings && EQ (readcharfun, Qget_file_char)) | 2096 if (load_force_doc_strings |
2097 && (EQ (readcharfun, Qget_file_char) | |
2098 || EQ (readcharfun, Qget_emacs_mule_file_char))) | |
1983 { | 2099 { |
1984 /* If we are supposed to force doc strings into core right now, | 2100 /* If we are supposed to force doc strings into core right now, |
1985 record the last string that we skipped, | 2101 record the last string that we skipped, |
1986 and record where in the file it comes from. */ | 2102 and record where in the file it comes from. */ |
1987 | 2103 |
2029 /* Skip that many characters. */ | 2145 /* Skip that many characters. */ |
2030 for (i = 0; i < nskip && c >= 0; i++) | 2146 for (i = 0; i < nskip && c >= 0; i++) |
2031 c = READCHAR; | 2147 c = READCHAR; |
2032 } | 2148 } |
2033 | 2149 |
2150 load_each_byte = 0; | |
2034 goto retry; | 2151 goto retry; |
2035 } | 2152 } |
2036 if (c == '$') | 2153 if (c == '$') |
2037 return Vload_file_name; | 2154 return Vload_file_name; |
2038 if (c == '\'') | 2155 if (c == '\'') |
2150 else | 2267 else |
2151 goto default_label; | 2268 goto default_label; |
2152 | 2269 |
2153 case '?': | 2270 case '?': |
2154 { | 2271 { |
2155 int discard; | 2272 int modifiers; |
2156 | 2273 |
2157 c = READCHAR; | 2274 c = READCHAR; |
2158 if (c < 0) | 2275 if (c < 0) |
2159 end_of_file_error (); | 2276 end_of_file_error (); |
2160 | |
2161 if (c == '\\') | 2277 if (c == '\\') |
2162 c = read_escape (readcharfun, 0, &discard); | 2278 c = read_escape (readcharfun, 0); |
2163 else if (EQ (readcharfun, Qget_file_char) | 2279 modifiers = c & CHAR_MODIFIER_MASK; |
2164 && BASE_LEADING_CODE_P (c)) | 2280 c &= ~CHAR_MODIFIER_MASK; |
2165 c = read_multibyte (c, readcharfun, &discard); | 2281 if (CHAR_BYTE8_P (c)) |
2282 c = CHAR_TO_BYTE8 (c); | |
2283 c |= modifiers; | |
2166 | 2284 |
2167 return make_number (c); | 2285 return make_number (c); |
2168 } | 2286 } |
2169 | 2287 |
2170 case '"': | 2288 case '"': |
2194 } | 2312 } |
2195 | 2313 |
2196 if (c == '\\') | 2314 if (c == '\\') |
2197 { | 2315 { |
2198 int modifiers; | 2316 int modifiers; |
2199 int byterep; | 2317 |
2200 | 2318 c = read_escape (readcharfun, 1); |
2201 c = read_escape (readcharfun, 1, &byterep); | |
2202 | 2319 |
2203 /* C is -1 if \ newline has just been seen */ | 2320 /* C is -1 if \ newline has just been seen */ |
2204 if (c == -1) | 2321 if (c == -1) |
2205 { | 2322 { |
2206 if (p == read_buffer) | 2323 if (p == read_buffer) |
2209 } | 2326 } |
2210 | 2327 |
2211 modifiers = c & CHAR_MODIFIER_MASK; | 2328 modifiers = c & CHAR_MODIFIER_MASK; |
2212 c = c & ~CHAR_MODIFIER_MASK; | 2329 c = c & ~CHAR_MODIFIER_MASK; |
2213 | 2330 |
2214 if (byterep == 1) | 2331 if (CHAR_BYTE8_P (c)) |
2215 { | 2332 force_singlebyte = 1; |
2216 force_singlebyte = 1; | 2333 else if (! ASCII_CHAR_P (c)) |
2217 if (c >= 0x80) | 2334 force_multibyte = 1; |
2218 /* Raw 8-bit code */ | 2335 else /* i.e. ASCII_CHAR_P (c) */ |
2219 c = BYTE8_TO_CHAR (c); | |
2220 } | |
2221 else if (byterep > 1) | |
2222 { | |
2223 force_multibyte = 1; | |
2224 if (byterep == 2) | |
2225 c = BYTE8_TO_CHAR (c); | |
2226 } | |
2227 else if (c >= 0x80) | |
2228 { | |
2229 force_singlebyte = 1; | |
2230 c = BYTE8_TO_CHAR (c); | |
2231 } | |
2232 | |
2233 if (ASCII_CHAR_P (c)) | |
2234 { | 2336 { |
2235 /* Allow `\C- ' and `\C-?'. */ | 2337 /* Allow `\C- ' and `\C-?'. */ |
2236 if (modifiers == CHAR_CTL) | 2338 if (modifiers == CHAR_CTL) |
2237 { | 2339 { |
2238 if (c == ' ') | 2340 if (c == ' ') |
2262 /* Any modifiers remaining are invalid. */ | 2364 /* Any modifiers remaining are invalid. */ |
2263 if (modifiers) | 2365 if (modifiers) |
2264 error ("Invalid modifier in string"); | 2366 error ("Invalid modifier in string"); |
2265 p += CHAR_STRING (c, (unsigned char *) p); | 2367 p += CHAR_STRING (c, (unsigned char *) p); |
2266 } | 2368 } |
2267 else if (c >= 0x80) | 2369 else |
2268 { | 2370 { |
2269 if (EQ (readcharfun, Qget_file_char)) | |
2270 { | |
2271 if (BASE_LEADING_CODE_P (c)) | |
2272 { | |
2273 int nbytes; | |
2274 c = read_multibyte (c, readcharfun, &nbytes); | |
2275 if (nbytes > 1) | |
2276 force_multibyte = 1; | |
2277 else | |
2278 { | |
2279 force_singlebyte = 1; | |
2280 c = BYTE8_TO_CHAR (c); | |
2281 } | |
2282 } | |
2283 else | |
2284 { | |
2285 force_singlebyte = 1; | |
2286 c = BYTE8_TO_CHAR (c); | |
2287 } | |
2288 } | |
2289 else | |
2290 force_multibyte = 1; | |
2291 p += CHAR_STRING (c, (unsigned char *) p); | 2371 p += CHAR_STRING (c, (unsigned char *) p); |
2292 } | 2372 } |
2293 else | |
2294 *p++ = c; | |
2295 nchars++; | 2373 nchars++; |
2296 } | 2374 } |
2297 if (c < 0) | 2375 if (c < 0) |
2298 end_of_file_error (); | 2376 end_of_file_error (); |
2299 | 2377 |
2369 if (c == -1) | 2447 if (c == -1) |
2370 end_of_file_error (); | 2448 end_of_file_error (); |
2371 quoted = 1; | 2449 quoted = 1; |
2372 } | 2450 } |
2373 | 2451 |
2374 if (! SINGLE_BYTE_CHAR_P (c)) | 2452 p += CHAR_STRING (c, p); |
2375 p += CHAR_STRING (c, p); | |
2376 else | |
2377 *p++ = c; | |
2378 | |
2379 c = READCHAR; | 2453 c = READCHAR; |
2380 } | 2454 } |
2381 | 2455 |
2382 if (p == end) | 2456 if (p == end) |
2383 { | 2457 { |
2700 but without generating extra garbage and | 2774 but without generating extra garbage and |
2701 guaranteeing no change in the contents). */ | 2775 guaranteeing no change in the contents). */ |
2702 XSTRING (bytestr)->size = STRING_BYTES (XSTRING (bytestr)); | 2776 XSTRING (bytestr)->size = STRING_BYTES (XSTRING (bytestr)); |
2703 SET_STRING_BYTES (XSTRING (bytestr), -1); | 2777 SET_STRING_BYTES (XSTRING (bytestr), -1); |
2704 | 2778 |
2705 item = Fread (bytestr); | 2779 item = Fread (Fcons (bytestr, readcharfun)); |
2706 if (!CONSP (item)) | 2780 if (!CONSP (item)) |
2707 error ("invalid byte code"); | 2781 error ("invalid byte code"); |
2708 | 2782 |
2709 otem = XCONS (item); | 2783 otem = XCONS (item); |
2710 bytestr = XCAR (item); | 2784 bytestr = XCAR (item); |
2712 free_cons (otem); | 2786 free_cons (otem); |
2713 } | 2787 } |
2714 | 2788 |
2715 /* Now handle the bytecode slot. */ | 2789 /* Now handle the bytecode slot. */ |
2716 ptr[COMPILED_BYTECODE] = read_pure ? Fpurecopy (bytestr) : bytestr; | 2790 ptr[COMPILED_BYTECODE] = read_pure ? Fpurecopy (bytestr) : bytestr; |
2791 } | |
2792 else if (i == COMPILED_DOC_STRING | |
2793 && STRINGP (item) | |
2794 && ! STRING_MULTIBYTE (item)) | |
2795 { | |
2796 if (EQ (readcharfun, Qget_emacs_mule_file_char)) | |
2797 item = Fdecode_coding_string (item, Qemacs_mule, Qnil, Qnil); | |
2798 else | |
2799 item = Fstring_as_multibyte (item); | |
2717 } | 2800 } |
2718 } | 2801 } |
2719 ptr[i] = read_pure ? Fpurecopy (item) : item; | 2802 ptr[i] = read_pure ? Fpurecopy (item) : item; |
2720 otem = XCONS (tem); | 2803 otem = XCONS (tem); |
2721 tem = Fcdr (tem); | 2804 tem = Fcdr (tem); |
2810 if (doc_reference == 1) | 2893 if (doc_reference == 1) |
2811 return make_number (0); | 2894 return make_number (0); |
2812 if (doc_reference == 2) | 2895 if (doc_reference == 2) |
2813 { | 2896 { |
2814 /* Get a doc string from the file we are loading. | 2897 /* Get a doc string from the file we are loading. |
2815 If it's in saved_doc_string, get it from there. */ | 2898 If it's in saved_doc_string, get it from there. |
2899 | |
2900 Here, we don't know if the string is a | |
2901 bytecode string or a doc string. As a | |
2902 bytecode string must be unibyte, we always | |
2903 return a unibyte string. If it is actually a | |
2904 doc string, caller must make it | |
2905 multibyte. */ | |
2816 int pos = XINT (XCDR (val)); | 2906 int pos = XINT (XCDR (val)); |
2817 /* Position is negative for user variables. */ | 2907 /* Position is negative for user variables. */ |
2818 if (pos < 0) pos = -pos; | 2908 if (pos < 0) pos = -pos; |
2819 if (pos >= saved_doc_string_position | 2909 if (pos >= saved_doc_string_position |
2820 && pos < (saved_doc_string_position | 2910 && pos < (saved_doc_string_position |
2842 } | 2932 } |
2843 else | 2933 else |
2844 saved_doc_string[to++] = c; | 2934 saved_doc_string[to++] = c; |
2845 } | 2935 } |
2846 | 2936 |
2847 return make_string (saved_doc_string + start, | 2937 return make_unibyte_string (saved_doc_string + start, |
2848 to - start); | 2938 to - start); |
2849 } | 2939 } |
2850 /* Look in prev_saved_doc_string the same way. */ | 2940 /* Look in prev_saved_doc_string the same way. */ |
2851 else if (pos >= prev_saved_doc_string_position | 2941 else if (pos >= prev_saved_doc_string_position |
2852 && pos < (prev_saved_doc_string_position | 2942 && pos < (prev_saved_doc_string_position |
2853 + prev_saved_doc_string_length)) | 2943 + prev_saved_doc_string_length)) |
2874 } | 2964 } |
2875 else | 2965 else |
2876 prev_saved_doc_string[to++] = c; | 2966 prev_saved_doc_string[to++] = c; |
2877 } | 2967 } |
2878 | 2968 |
2879 return make_string (prev_saved_doc_string + start, | 2969 return make_unibyte_string (prev_saved_doc_string |
2880 to - start); | 2970 + start, |
2971 to - start); | |
2881 } | 2972 } |
2882 else | 2973 else |
2883 return get_doc_string (val, 0, 0); | 2974 return get_doc_string (val, 1, 0); |
2884 } | 2975 } |
2885 | 2976 |
2886 return val; | 2977 return val; |
2887 } | 2978 } |
2888 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (". in wrong context", 18), Qnil)); | 2979 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (". in wrong context", 18), Qnil)); |
3762 staticpro (&Qread_char); | 3853 staticpro (&Qread_char); |
3763 | 3854 |
3764 Qget_file_char = intern ("get-file-char"); | 3855 Qget_file_char = intern ("get-file-char"); |
3765 staticpro (&Qget_file_char); | 3856 staticpro (&Qget_file_char); |
3766 | 3857 |
3858 Qget_emacs_mule_file_char = intern ("get-emacs-mule-file-char"); | |
3859 staticpro (&Qget_emacs_mule_file_char); | |
3860 | |
3861 Qload_force_doc_strings = intern ("load-force-doc-strings"); | |
3862 staticpro (&Qload_force_doc_strings); | |
3863 | |
3767 Qbackquote = intern ("`"); | 3864 Qbackquote = intern ("`"); |
3768 staticpro (&Qbackquote); | 3865 staticpro (&Qbackquote); |
3769 Qcomma = intern (","); | 3866 Qcomma = intern (","); |
3770 staticpro (&Qcomma); | 3867 staticpro (&Qcomma); |
3771 Qcomma_at = intern (",@"); | 3868 Qcomma_at = intern (",@"); |