diff options
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 84 |
1 files changed, 56 insertions, 28 deletions
diff --git a/src/buffer.c b/src/buffer.c index ffe6237db79..27e3cc0c44b 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -343,6 +343,11 @@ The value is never nil.") | |||
| 343 | BUF_BEGV (b) = 1; | 343 | BUF_BEGV (b) = 1; |
| 344 | BUF_ZV (b) = 1; | 344 | BUF_ZV (b) = 1; |
| 345 | BUF_Z (b) = 1; | 345 | BUF_Z (b) = 1; |
| 346 | BUF_PT_BYTE (b) = 1; | ||
| 347 | BUF_GPT_BYTE (b) = 1; | ||
| 348 | BUF_BEGV_BYTE (b) = 1; | ||
| 349 | BUF_ZV_BYTE (b) = 1; | ||
| 350 | BUF_Z_BYTE (b) = 1; | ||
| 346 | BUF_MODIFF (b) = 1; | 351 | BUF_MODIFF (b) = 1; |
| 347 | BUF_OVERLAY_MODIFF (b) = 1; | 352 | BUF_OVERLAY_MODIFF (b) = 1; |
| 348 | BUF_SAVE_MODIFF (b) = 1; | 353 | BUF_SAVE_MODIFF (b) = 1; |
| @@ -423,6 +428,9 @@ NAME should be a string which is not the name of an existing buffer.") | |||
| 423 | BUF_BEGV (b) = BUF_BEGV (b->base_buffer); | 428 | BUF_BEGV (b) = BUF_BEGV (b->base_buffer); |
| 424 | BUF_ZV (b) = BUF_ZV (b->base_buffer); | 429 | BUF_ZV (b) = BUF_ZV (b->base_buffer); |
| 425 | BUF_PT (b) = BUF_PT (b->base_buffer); | 430 | BUF_PT (b) = BUF_PT (b->base_buffer); |
| 431 | BUF_BEGV_BYTE (b) = BUF_BEGV_BYTE (b->base_buffer); | ||
| 432 | BUF_ZV_BYTE (b) = BUF_ZV_BYTE (b->base_buffer); | ||
| 433 | BUF_PT_BYTE (b) = BUF_PT_BYTE (b->base_buffer); | ||
| 426 | 434 | ||
| 427 | b->newline_cache = 0; | 435 | b->newline_cache = 0; |
| 428 | b->width_run_cache = 0; | 436 | b->width_run_cache = 0; |
| @@ -450,31 +458,33 @@ NAME should be a string which is not the name of an existing buffer.") | |||
| 450 | if (NILP (b->base_buffer->pt_marker)) | 458 | if (NILP (b->base_buffer->pt_marker)) |
| 451 | { | 459 | { |
| 452 | b->base_buffer->pt_marker = Fmake_marker (); | 460 | b->base_buffer->pt_marker = Fmake_marker (); |
| 453 | Fset_marker (b->base_buffer->pt_marker, | 461 | set_marker_both (b->base_buffer->pt_marker, base_buffer, |
| 454 | make_number (BUF_PT (b->base_buffer)), base_buffer); | 462 | BUF_PT (b->base_buffer), |
| 463 | BUF_PT_BYTE (b->base_buffer)); | ||
| 455 | } | 464 | } |
| 456 | if (NILP (b->base_buffer->begv_marker)) | 465 | if (NILP (b->base_buffer->begv_marker)) |
| 457 | { | 466 | { |
| 458 | b->base_buffer->begv_marker = Fmake_marker (); | 467 | b->base_buffer->begv_marker = Fmake_marker (); |
| 459 | Fset_marker (b->base_buffer->begv_marker, | 468 | set_marker_both (b->base_buffer->begv_marker, base_buffer, |
| 460 | make_number (BUF_BEGV (b->base_buffer)), base_buffer); | 469 | BUF_BEGV (b->base_buffer), |
| 470 | BUF_BEGV_BYTE (b->base_buffer)); | ||
| 461 | } | 471 | } |
| 462 | if (NILP (b->base_buffer->zv_marker)) | 472 | if (NILP (b->base_buffer->zv_marker)) |
| 463 | { | 473 | { |
| 464 | b->base_buffer->zv_marker = Fmake_marker (); | 474 | b->base_buffer->zv_marker = Fmake_marker (); |
| 465 | Fset_marker (b->base_buffer->zv_marker, | 475 | set_marker_both (b->base_buffer->zv_marker, base_buffer, |
| 466 | make_number (BUF_ZV (b->base_buffer)), base_buffer); | 476 | BUF_ZV (b->base_buffer), |
| 477 | BUF_ZV_BYTE (b->base_buffer)); | ||
| 467 | XMARKER (b->base_buffer->zv_marker)->insertion_type = 1; | 478 | XMARKER (b->base_buffer->zv_marker)->insertion_type = 1; |
| 468 | } | 479 | } |
| 469 | 480 | ||
| 470 | /* Give the indirect buffer markers for its narrowing. */ | 481 | /* Give the indirect buffer markers for its narrowing. */ |
| 471 | b->pt_marker = Fmake_marker (); | 482 | b->pt_marker = Fmake_marker (); |
| 472 | Fset_marker (b->pt_marker, make_number (BUF_PT (b)), buf); | 483 | set_marker_both (b->pt_marker, buf, BUF_PT (b), BUF_PT_BYTE (b)); |
| 473 | b->begv_marker = Fmake_marker (); | 484 | b->begv_marker = Fmake_marker (); |
| 474 | Fset_marker (b->begv_marker, make_number (BUF_BEGV (b)), buf); | 485 | set_marker_both (b->begv_marker, buf, BUF_BEGV (b), BUF_BEGV_BYTE (b)); |
| 475 | b->zv_marker = Fmake_marker (); | 486 | b->zv_marker = Fmake_marker (); |
| 476 | Fset_marker (b->zv_marker, make_number (BUF_ZV (b)), buf); | 487 | set_marker_both (b->zv_marker, buf, BUF_ZV (b), BUF_ZV_BYTE (b)); |
| 477 | |||
| 478 | XMARKER (b->zv_marker)->insertion_type = 1; | 488 | XMARKER (b->zv_marker)->insertion_type = 1; |
| 479 | 489 | ||
| 480 | return buf; | 490 | return buf; |
| @@ -1408,22 +1418,22 @@ set_buffer_internal_1 (b) | |||
| 1408 | { | 1418 | { |
| 1409 | Lisp_Object obuf; | 1419 | Lisp_Object obuf; |
| 1410 | XSETBUFFER (obuf, old_buf); | 1420 | XSETBUFFER (obuf, old_buf); |
| 1411 | Fset_marker (old_buf->pt_marker, make_number (BUF_PT (old_buf)), | 1421 | set_marker_both (old_buf->pt_marker, obuf, |
| 1412 | obuf); | 1422 | BUF_PT (old_buf), BUF_PT_BYTE (old_buf)); |
| 1413 | } | 1423 | } |
| 1414 | if (! NILP (old_buf->begv_marker)) | 1424 | if (! NILP (old_buf->begv_marker)) |
| 1415 | { | 1425 | { |
| 1416 | Lisp_Object obuf; | 1426 | Lisp_Object obuf; |
| 1417 | XSETBUFFER (obuf, old_buf); | 1427 | XSETBUFFER (obuf, old_buf); |
| 1418 | Fset_marker (old_buf->begv_marker, make_number (BUF_BEGV (old_buf)), | 1428 | set_marker_both (old_buf->begv_marker, obuf, |
| 1419 | obuf); | 1429 | BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf)); |
| 1420 | } | 1430 | } |
| 1421 | if (! NILP (old_buf->zv_marker)) | 1431 | if (! NILP (old_buf->zv_marker)) |
| 1422 | { | 1432 | { |
| 1423 | Lisp_Object obuf; | 1433 | Lisp_Object obuf; |
| 1424 | XSETBUFFER (obuf, old_buf); | 1434 | XSETBUFFER (obuf, old_buf); |
| 1425 | Fset_marker (old_buf->zv_marker, make_number (BUF_ZV (old_buf)), | 1435 | set_marker_both (old_buf->zv_marker, obuf, |
| 1426 | obuf); | 1436 | BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf)); |
| 1427 | } | 1437 | } |
| 1428 | } | 1438 | } |
| 1429 | 1439 | ||
| @@ -1435,11 +1445,20 @@ set_buffer_internal_1 (b) | |||
| 1435 | /* If the new current buffer has markers to record PT, BEGV and ZV | 1445 | /* If the new current buffer has markers to record PT, BEGV and ZV |
| 1436 | when it is not current, fetch them now. */ | 1446 | when it is not current, fetch them now. */ |
| 1437 | if (! NILP (b->pt_marker)) | 1447 | if (! NILP (b->pt_marker)) |
| 1438 | BUF_PT (b) = marker_position (b->pt_marker); | 1448 | { |
| 1449 | BUF_PT (b) = marker_position (b->pt_marker); | ||
| 1450 | BUF_PT_BYTE (b) = marker_byte_position (b->pt_marker); | ||
| 1451 | } | ||
| 1439 | if (! NILP (b->begv_marker)) | 1452 | if (! NILP (b->begv_marker)) |
| 1440 | BUF_BEGV (b) = marker_position (b->begv_marker); | 1453 | { |
| 1454 | BUF_BEGV (b) = marker_position (b->begv_marker); | ||
| 1455 | BUF_BEGV_BYTE (b) = marker_byte_position (b->begv_marker); | ||
| 1456 | } | ||
| 1441 | if (! NILP (b->zv_marker)) | 1457 | if (! NILP (b->zv_marker)) |
| 1442 | BUF_ZV (b) = marker_position (b->zv_marker); | 1458 | { |
| 1459 | BUF_ZV (b) = marker_position (b->zv_marker); | ||
| 1460 | BUF_ZV_BYTE (b) = marker_byte_position (b->zv_marker); | ||
| 1461 | } | ||
| 1443 | 1462 | ||
| 1444 | /* Look down buffer's list of local Lisp variables | 1463 | /* Look down buffer's list of local Lisp variables |
| 1445 | to find and update any that forward into C variables. */ | 1464 | to find and update any that forward into C variables. */ |
| @@ -1495,33 +1514,42 @@ set_buffer_temp (b) | |||
| 1495 | { | 1514 | { |
| 1496 | Lisp_Object obuf; | 1515 | Lisp_Object obuf; |
| 1497 | XSETBUFFER (obuf, old_buf); | 1516 | XSETBUFFER (obuf, old_buf); |
| 1498 | Fset_marker (old_buf->pt_marker, make_number (BUF_PT (old_buf)), | 1517 | set_marker_both (old_buf->pt_marker, obuf, |
| 1499 | obuf); | 1518 | BUF_PT (old_buf), BUF_PT_BYTE (old_buf)); |
| 1500 | } | 1519 | } |
| 1501 | if (! NILP (old_buf->begv_marker)) | 1520 | if (! NILP (old_buf->begv_marker)) |
| 1502 | { | 1521 | { |
| 1503 | Lisp_Object obuf; | 1522 | Lisp_Object obuf; |
| 1504 | XSETBUFFER (obuf, old_buf); | 1523 | XSETBUFFER (obuf, old_buf); |
| 1505 | Fset_marker (old_buf->begv_marker, make_number (BUF_BEGV (old_buf)), | 1524 | set_marker_both (old_buf->begv_marker, obuf, |
| 1506 | obuf); | 1525 | BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf)); |
| 1507 | } | 1526 | } |
| 1508 | if (! NILP (old_buf->zv_marker)) | 1527 | if (! NILP (old_buf->zv_marker)) |
| 1509 | { | 1528 | { |
| 1510 | Lisp_Object obuf; | 1529 | Lisp_Object obuf; |
| 1511 | XSETBUFFER (obuf, old_buf); | 1530 | XSETBUFFER (obuf, old_buf); |
| 1512 | Fset_marker (old_buf->zv_marker, make_number (BUF_ZV (old_buf)), | 1531 | set_marker_both (old_buf->zv_marker, obuf, |
| 1513 | obuf); | 1532 | BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf)); |
| 1514 | } | 1533 | } |
| 1515 | } | 1534 | } |
| 1516 | 1535 | ||
| 1517 | /* If the new current buffer has markers to record PT, BEGV and ZV | 1536 | /* If the new current buffer has markers to record PT, BEGV and ZV |
| 1518 | when it is not current, fetch them now. */ | 1537 | when it is not current, fetch them now. */ |
| 1519 | if (! NILP (b->pt_marker)) | 1538 | if (! NILP (b->pt_marker)) |
| 1520 | BUF_PT (b) = marker_position (b->pt_marker); | 1539 | { |
| 1540 | BUF_PT (b) = marker_position (b->pt_marker); | ||
| 1541 | BUF_PT_BYTE (b) = marker_byte_position (b->pt_marker); | ||
| 1542 | } | ||
| 1521 | if (! NILP (b->begv_marker)) | 1543 | if (! NILP (b->begv_marker)) |
| 1522 | BUF_BEGV (b) = marker_position (b->begv_marker); | 1544 | { |
| 1545 | BUF_BEGV (b) = marker_position (b->begv_marker); | ||
| 1546 | BUF_BEGV_BYTE (b) = marker_byte_position (b->begv_marker); | ||
| 1547 | } | ||
| 1523 | if (! NILP (b->zv_marker)) | 1548 | if (! NILP (b->zv_marker)) |
| 1524 | BUF_ZV (b) = marker_position (b->zv_marker); | 1549 | { |
| 1550 | BUF_ZV (b) = marker_position (b->zv_marker); | ||
| 1551 | BUF_ZV_BYTE (b) = marker_byte_position (b->zv_marker); | ||
| 1552 | } | ||
| 1525 | } | 1553 | } |
| 1526 | 1554 | ||
| 1527 | DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, | 1555 | DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, |