diff options
| author | Kim F. Storm | 2005-04-08 23:33:28 +0000 |
|---|---|---|
| committer | Kim F. Storm | 2005-04-08 23:33:28 +0000 |
| commit | 4c03c46d5f8295b25d6583bd67c601a66f04e32e (patch) | |
| tree | 29165a831e104493930e1f7e0ca59f2b47ff8a64 /src | |
| parent | bfd93240604163598511253cc33cdc3632288352 (diff) | |
| download | emacs-4c03c46d5f8295b25d6583bd67c601a66f04e32e.tar.gz emacs-4c03c46d5f8295b25d6583bd67c601a66f04e32e.zip | |
(readevalloop): Add args START and END as region in
current buffer to read. Callers changed.
When specified, narrow to this region only when reading,
not during eval. Track next point to read from during eval.
Also restore point to "real" buffer position before eval.
(Feval_region): Don't save excursion and restriction here, and
don't narrow to region. Just pass region to readevalloop.
Note: Point is now preserved even when PRINTFLAG is nil.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lread.c | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/src/lread.c b/src/lread.c index 73a209c20ef..01782865271 100644 --- a/src/lread.c +++ b/src/lread.c | |||
| @@ -206,6 +206,7 @@ static Lisp_Object Vbytecomp_version_regexp; | |||
| 206 | static void to_multibyte P_ ((char **, char **, int *)); | 206 | static void to_multibyte P_ ((char **, char **, int *)); |
| 207 | static void readevalloop P_ ((Lisp_Object, FILE*, Lisp_Object, | 207 | static void readevalloop P_ ((Lisp_Object, FILE*, Lisp_Object, |
| 208 | Lisp_Object (*) (), int, | 208 | Lisp_Object (*) (), int, |
| 209 | Lisp_Object, Lisp_Object, | ||
| 209 | Lisp_Object, Lisp_Object)); | 210 | Lisp_Object, Lisp_Object)); |
| 210 | static Lisp_Object load_unwind P_ ((Lisp_Object)); | 211 | static Lisp_Object load_unwind P_ ((Lisp_Object)); |
| 211 | static Lisp_Object load_descriptor_unwind P_ ((Lisp_Object)); | 212 | static Lisp_Object load_descriptor_unwind P_ ((Lisp_Object)); |
| @@ -912,7 +913,8 @@ Return t if file exists. */) | |||
| 912 | load_descriptor_list | 913 | load_descriptor_list |
| 913 | = Fcons (make_number (fileno (stream)), load_descriptor_list); | 914 | = Fcons (make_number (fileno (stream)), load_descriptor_list); |
| 914 | load_in_progress++; | 915 | load_in_progress++; |
| 915 | readevalloop (Qget_file_char, stream, file, Feval, 0, Qnil, Qnil); | 916 | readevalloop (Qget_file_char, stream, file, Feval, |
| 917 | 0, Qnil, Qnil, Qnil, Qnil); | ||
| 916 | unbind_to (count, Qnil); | 918 | unbind_to (count, Qnil); |
| 917 | 919 | ||
| 918 | /* Run any load-hooks for this file. */ | 920 | /* Run any load-hooks for this file. */ |
| @@ -1290,16 +1292,19 @@ end_of_file_error () | |||
| 1290 | 1292 | ||
| 1291 | /* UNIBYTE specifies how to set load_convert_to_unibyte | 1293 | /* UNIBYTE specifies how to set load_convert_to_unibyte |
| 1292 | for this invocation. | 1294 | for this invocation. |
| 1293 | READFUN, if non-nil, is used instead of `read'. */ | 1295 | READFUN, if non-nil, is used instead of `read'. |
| 1296 | START, END is region in current buffer (from eval-region). */ | ||
| 1294 | 1297 | ||
| 1295 | static void | 1298 | static void |
| 1296 | readevalloop (readcharfun, stream, sourcename, evalfun, printflag, unibyte, readfun) | 1299 | readevalloop (readcharfun, stream, sourcename, evalfun, |
| 1300 | printflag, unibyte, readfun, start, end) | ||
| 1297 | Lisp_Object readcharfun; | 1301 | Lisp_Object readcharfun; |
| 1298 | FILE *stream; | 1302 | FILE *stream; |
| 1299 | Lisp_Object sourcename; | 1303 | Lisp_Object sourcename; |
| 1300 | Lisp_Object (*evalfun) (); | 1304 | Lisp_Object (*evalfun) (); |
| 1301 | int printflag; | 1305 | int printflag; |
| 1302 | Lisp_Object unibyte, readfun; | 1306 | Lisp_Object unibyte, readfun; |
| 1307 | Lisp_Object start, end; | ||
| 1303 | { | 1308 | { |
| 1304 | register int c; | 1309 | register int c; |
| 1305 | register Lisp_Object val; | 1310 | register Lisp_Object val; |
| @@ -1327,28 +1332,41 @@ readevalloop (readcharfun, stream, sourcename, evalfun, printflag, unibyte, read | |||
| 1327 | continue_reading_p = 1; | 1332 | continue_reading_p = 1; |
| 1328 | while (continue_reading_p) | 1333 | while (continue_reading_p) |
| 1329 | { | 1334 | { |
| 1335 | int count1 = SPECPDL_INDEX (); | ||
| 1336 | |||
| 1330 | if (b != 0 && NILP (b->name)) | 1337 | if (b != 0 && NILP (b->name)) |
| 1331 | error ("Reading from killed buffer"); | 1338 | error ("Reading from killed buffer"); |
| 1332 | 1339 | ||
| 1340 | if (!NILP (start)) | ||
| 1341 | { | ||
| 1342 | record_unwind_protect (save_excursion_restore, save_excursion_save ()); | ||
| 1343 | record_unwind_protect (save_restriction_restore, save_restriction_save ()); | ||
| 1344 | Fgoto_char (start); | ||
| 1345 | Fnarrow_to_region (make_number (BEGV), end); | ||
| 1346 | } | ||
| 1347 | |||
| 1333 | instream = stream; | 1348 | instream = stream; |
| 1349 | read_next: | ||
| 1334 | c = READCHAR; | 1350 | c = READCHAR; |
| 1335 | if (c == ';') | 1351 | if (c == ';') |
| 1336 | { | 1352 | { |
| 1337 | while ((c = READCHAR) != '\n' && c != -1); | 1353 | while ((c = READCHAR) != '\n' && c != -1); |
| 1338 | continue; | 1354 | goto read_next; |
| 1355 | } | ||
| 1356 | if (c < 0) | ||
| 1357 | { | ||
| 1358 | unbind_to (count1, Qnil); | ||
| 1359 | break; | ||
| 1339 | } | 1360 | } |
| 1340 | if (c < 0) break; | ||
| 1341 | 1361 | ||
| 1342 | /* Ignore whitespace here, so we can detect eof. */ | 1362 | /* Ignore whitespace here, so we can detect eof. */ |
| 1343 | if (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r') | 1363 | if (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r') |
| 1344 | continue; | 1364 | goto read_next; |
| 1345 | 1365 | ||
| 1346 | if (!NILP (Vpurify_flag) && c == '(') | 1366 | if (!NILP (Vpurify_flag) && c == '(') |
| 1347 | { | 1367 | { |
| 1348 | int count1 = SPECPDL_INDEX (); | ||
| 1349 | record_unwind_protect (unreadpure, Qnil); | 1368 | record_unwind_protect (unreadpure, Qnil); |
| 1350 | val = read_list (-1, readcharfun); | 1369 | val = read_list (-1, readcharfun); |
| 1351 | unbind_to (count1, Qnil); | ||
| 1352 | } | 1370 | } |
| 1353 | else | 1371 | else |
| 1354 | { | 1372 | { |
| @@ -1374,6 +1392,10 @@ readevalloop (readcharfun, stream, sourcename, evalfun, printflag, unibyte, read | |||
| 1374 | val = read_internal_start (readcharfun, Qnil, Qnil); | 1392 | val = read_internal_start (readcharfun, Qnil, Qnil); |
| 1375 | } | 1393 | } |
| 1376 | 1394 | ||
| 1395 | if (!NILP (start) && continue_reading_p) | ||
| 1396 | start = Fpoint_marker (); | ||
| 1397 | unbind_to (count1, Qnil); | ||
| 1398 | |||
| 1377 | val = (*evalfun) (val); | 1399 | val = (*evalfun) (val); |
| 1378 | 1400 | ||
| 1379 | if (printflag) | 1401 | if (printflag) |
| @@ -1432,7 +1454,8 @@ This function preserves the position of point. */) | |||
| 1432 | specbind (Qstandard_output, tem); | 1454 | specbind (Qstandard_output, tem); |
| 1433 | record_unwind_protect (save_excursion_restore, save_excursion_save ()); | 1455 | record_unwind_protect (save_excursion_restore, save_excursion_save ()); |
| 1434 | BUF_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf))); | 1456 | BUF_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf))); |
| 1435 | readevalloop (buf, 0, filename, Feval, !NILP (printflag), unibyte, Qnil); | 1457 | readevalloop (buf, 0, filename, Feval, |
| 1458 | !NILP (printflag), unibyte, Qnil, Qnil, Qnil); | ||
| 1436 | unbind_to (count, Qnil); | 1459 | unbind_to (count, Qnil); |
| 1437 | 1460 | ||
| 1438 | return Qnil; | 1461 | return Qnil; |
| @@ -1464,15 +1487,10 @@ This function does not move point. */) | |||
| 1464 | tem = printflag; | 1487 | tem = printflag; |
| 1465 | specbind (Qstandard_output, tem); | 1488 | specbind (Qstandard_output, tem); |
| 1466 | 1489 | ||
| 1467 | if (NILP (printflag)) | 1490 | /* readevalloop calls functions which check the type of start and end. */ |
| 1468 | record_unwind_protect (save_excursion_restore, save_excursion_save ()); | ||
| 1469 | record_unwind_protect (save_restriction_restore, save_restriction_save ()); | ||
| 1470 | |||
| 1471 | /* This both uses start and checks its type. */ | ||
| 1472 | Fgoto_char (start); | ||
| 1473 | Fnarrow_to_region (make_number (BEGV), end); | ||
| 1474 | readevalloop (cbuf, 0, XBUFFER (cbuf)->filename, Feval, | 1491 | readevalloop (cbuf, 0, XBUFFER (cbuf)->filename, Feval, |
| 1475 | !NILP (printflag), Qnil, read_function); | 1492 | !NILP (printflag), Qnil, read_function, |
| 1493 | start, end); | ||
| 1476 | 1494 | ||
| 1477 | return unbind_to (count, Qnil); | 1495 | return unbind_to (count, Qnil); |
| 1478 | } | 1496 | } |