aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorJim Blandy1993-04-10 07:57:57 +0000
committerJim Blandy1993-04-10 07:57:57 +0000
commit5c4f68f17963d401d0d05643c477a379139181ec (patch)
treeebbd84aa320b54dcf404eefaac3858636c52277e /src/buffer.c
parentb0846f520d496bcd9e8abd9e65e6587e933aedde (diff)
downloademacs-5c4f68f17963d401d0d05643c477a379139181ec.tar.gz
emacs-5c4f68f17963d401d0d05643c477a379139181ec.zip
* buffer.c (Fmake_overlay, Fmove_overlay): New optional BUFFER
arguments. (recenter_overlay_lists): New argument BUF, to use instead of the current buffer. (Foverlay_recenter): Pass the appropriate arguments to recenter_overlay_lists. * buffer.c (Fdelete_overlay): Don't assume that overlay is in the current buffer. Don't forget to declare the argument a Lisp_Object.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c135
1 files changed, 84 insertions, 51 deletions
diff --git a/src/buffer.c b/src/buffer.c
index e927a27088c..2192ac78b64 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1275,11 +1275,11 @@ overlays_at (pos, vec_ptr, len_ptr, next_ptr)
1275 return idx; 1275 return idx;
1276} 1276}
1277 1277
1278/* Shift overlays in the current buffer's overlay lists, 1278/* Shift overlays in BUF's overlay lists, to center the lists at POS. */
1279 to center the lists at POS. */
1280 1279
1281void 1280void
1282recenter_overlay_lists (pos) 1281recenter_overlay_lists (buf, pos)
1282 struct buffer *buf;
1283 int pos; 1283 int pos;
1284{ 1284{
1285 Lisp_Object overlay, tail, next, prev, beg, end; 1285 Lisp_Object overlay, tail, next, prev, beg, end;
@@ -1290,7 +1290,7 @@ recenter_overlay_lists (pos)
1290 But we use it for symmetry and in case that should cease to be true 1290 But we use it for symmetry and in case that should cease to be true
1291 with some future change. */ 1291 with some future change. */
1292 prev = Qnil; 1292 prev = Qnil;
1293 for (tail = current_buffer->overlays_before; 1293 for (tail = buf->overlays_before;
1294 CONSP (tail); 1294 CONSP (tail);
1295 prev = tail, tail = next) 1295 prev = tail, tail = next)
1296 { 1296 {
@@ -1304,7 +1304,7 @@ recenter_overlay_lists (pos)
1304 if (!NILP (prev)) 1304 if (!NILP (prev))
1305 XCONS (prev)->cdr = next; 1305 XCONS (prev)->cdr = next;
1306 else 1306 else
1307 current_buffer->overlays_before = next; 1307 buf->overlays_before = next;
1308 tail = prev; 1308 tail = prev;
1309 continue; 1309 continue;
1310 } 1310 }
@@ -1322,11 +1322,11 @@ recenter_overlay_lists (pos)
1322 if (!NILP (prev)) 1322 if (!NILP (prev))
1323 XCONS (prev)->cdr = next; 1323 XCONS (prev)->cdr = next;
1324 else 1324 else
1325 current_buffer->overlays_before = next; 1325 buf->overlays_before = next;
1326 1326
1327 /* Search thru overlays_after for where to put it. */ 1327 /* Search thru overlays_after for where to put it. */
1328 other_prev = Qnil; 1328 other_prev = Qnil;
1329 for (other = current_buffer->overlays_after; 1329 for (other = buf->overlays_after;
1330 CONSP (other); 1330 CONSP (other);
1331 other_prev = other, other = XCONS (other)->cdr) 1331 other_prev = other, other = XCONS (other)->cdr)
1332 { 1332 {
@@ -1347,7 +1347,7 @@ recenter_overlay_lists (pos)
1347 if (!NILP (other_prev)) 1347 if (!NILP (other_prev))
1348 XCONS (other_prev)->cdr = tail; 1348 XCONS (other_prev)->cdr = tail;
1349 else 1349 else
1350 current_buffer->overlays_after = tail; 1350 buf->overlays_after = tail;
1351 tail = prev; 1351 tail = prev;
1352 } 1352 }
1353 else 1353 else
@@ -1359,7 +1359,7 @@ recenter_overlay_lists (pos)
1359 1359
1360 /* See if anything in overlays_after should be in overlays_before. */ 1360 /* See if anything in overlays_after should be in overlays_before. */
1361 prev = Qnil; 1361 prev = Qnil;
1362 for (tail = current_buffer->overlays_after; 1362 for (tail = buf->overlays_after;
1363 CONSP (tail); 1363 CONSP (tail);
1364 prev = tail, tail = next) 1364 prev = tail, tail = next)
1365 { 1365 {
@@ -1373,7 +1373,7 @@ recenter_overlay_lists (pos)
1373 if (!NILP (prev)) 1373 if (!NILP (prev))
1374 XCONS (prev)->cdr = next; 1374 XCONS (prev)->cdr = next;
1375 else 1375 else
1376 current_buffer->overlays_after = next; 1376 buf->overlays_after = next;
1377 tail = prev; 1377 tail = prev;
1378 continue; 1378 continue;
1379 } 1379 }
@@ -1396,11 +1396,11 @@ recenter_overlay_lists (pos)
1396 if (!NILP (prev)) 1396 if (!NILP (prev))
1397 XCONS (prev)->cdr = next; 1397 XCONS (prev)->cdr = next;
1398 else 1398 else
1399 current_buffer->overlays_after = next; 1399 buf->overlays_after = next;
1400 1400
1401 /* Search thru overlays_before for where to put it. */ 1401 /* Search thru overlays_before for where to put it. */
1402 other_prev = Qnil; 1402 other_prev = Qnil;
1403 for (other = current_buffer->overlays_before; 1403 for (other = buf->overlays_before;
1404 CONSP (other); 1404 CONSP (other);
1405 other_prev = other, other = XCONS (other)->cdr) 1405 other_prev = other, other = XCONS (other)->cdr)
1406 { 1406 {
@@ -1421,83 +1421,116 @@ recenter_overlay_lists (pos)
1421 if (!NILP (other_prev)) 1421 if (!NILP (other_prev))
1422 XCONS (other_prev)->cdr = tail; 1422 XCONS (other_prev)->cdr = tail;
1423 else 1423 else
1424 current_buffer->overlays_before = tail; 1424 buf->overlays_before = tail;
1425 tail = prev; 1425 tail = prev;
1426 } 1426 }
1427 } 1427 }
1428 1428
1429 XFASTINT (current_buffer->overlay_center) = pos; 1429 XFASTINT (buf->overlay_center) = pos;
1430} 1430}
1431 1431
1432DEFUN ("make-overlay", Fmake_overlay, Smake_overlay, 2, 2, 0, 1432DEFUN ("make-overlay", Fmake_overlay, Smake_overlay, 2, 3, 0,
1433 "Create a new overlay in the current buffer, with range BEG to END.\n\ 1433 "Create a new overlay with range BEG to END in BUFFER.\n\
1434If omitted, BUFFER defaults to the current buffer.\n\
1434BEG and END may be integers or markers.") 1435BEG and END may be integers or markers.")
1435 (beg, end) 1436 (beg, end, buffer)
1436 Lisp_Object beg, end; 1437 Lisp_Object beg, end, buffer;
1437{ 1438{
1438 Lisp_Object overlay; 1439 Lisp_Object overlay;
1440 struct buffer *b;
1439 1441
1440 if (MARKERP (beg) && XBUFFER (Fmarker_buffer (beg)) != current_buffer) 1442 if (NILP (buffer))
1441 error ("Marker points into wrong buffer"); 1443 XSET (buffer, Lisp_Buffer, current_buffer);
1442 if (MARKERP (end) && XBUFFER (Fmarker_buffer (end)) != current_buffer) 1444 CHECK_BUFFER (buffer, 2);
1443 error ("Marker points into wrong buffer");
1444 1445
1445 overlay = Fcons (Fcons (Fcopy_marker (beg), Fcopy_marker (end)), Qnil); 1446 b = XBUFFER (buffer);
1447
1448 if (MARKERP (beg))
1449 {
1450 if (! EQ (Fmarker_buffer (beg), buffer))
1451 error ("Marker points into wrong buffer");
1452 else
1453 beg = Fcopy_marker (beg);
1454 }
1455 else
1456 beg = Fset_marker (Fmake_marker (), beg, buffer);
1457 if (MARKERP (end))
1458 {
1459 if (! EQ (Fmarker_buffer (end), buffer))
1460 error ("Marker points into wrong buffer");
1461 else
1462 end = Fcopy_marker (end);
1463 }
1464 else
1465 end = Fset_marker (Fmake_marker (), end, buffer);
1466
1467 overlay = Fcons (Fcons (beg, end), Qnil);
1446 1468
1447 /* Put the new overlay on the wrong list. */ 1469 /* Put the new overlay on the wrong list. */
1448 end = OVERLAY_END (overlay); 1470 end = OVERLAY_END (overlay);
1449 if (OVERLAY_POSITION (end) < XINT (current_buffer->overlay_center)) 1471 if (OVERLAY_POSITION (end) < XINT (b->overlay_center))
1450 current_buffer->overlays_after 1472 b->overlays_after = Fcons (overlay, b->overlays_after);
1451 = Fcons (overlay, current_buffer->overlays_after);
1452 else 1473 else
1453 current_buffer->overlays_before 1474 b->overlays_before = Fcons (overlay, b->overlays_before);
1454 = Fcons (overlay, current_buffer->overlays_before);
1455 1475
1456 /* This puts it in the right list, and in the right order. */ 1476 /* This puts it in the right list, and in the right order. */
1457 recenter_overlay_lists (XINT (current_buffer->overlay_center)); 1477 recenter_overlay_lists (b, XINT (b->overlay_center));
1458 1478
1459 return overlay; 1479 return overlay;
1460} 1480}
1461 1481
1462DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 3, 0, 1482DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 4, 0,
1463 "Set the endpoints of OVERLAY to BEG and END.") 1483 "Set the endpoints of OVERLAY to BEG and END in BUFFER.\n\
1464 (overlay, beg, end) 1484If omitted, don't change OVERLAY's buffer.")
1465 Lisp_Object overlay, beg, end; 1485 (overlay, beg, end, buffer)
1486 Lisp_Object overlay, beg, end, buffer;
1466{ 1487{
1488 struct buffer *b;
1489
1467 if (!OVERLAY_VALID (overlay)) 1490 if (!OVERLAY_VALID (overlay))
1468 error ("Invalid overlay object"); 1491 error ("Invalid overlay object");
1469 1492
1470 current_buffer->overlays_before 1493 if (NILP (buffer))
1471 = Fdelq (overlay, current_buffer->overlays_before); 1494 buffer = Fmarker_buffer (OVERLAY_START (overlay));
1472 current_buffer->overlays_after 1495 CHECK_BUFFER (buffer, 3);
1473 = Fdelq (overlay, current_buffer->overlays_after); 1496
1497 b = XBUFFER (buffer);
1474 1498
1475 Fset_marker (OVERLAY_START (overlay), beg, Qnil); 1499 b->overlays_before = Fdelq (overlay, b->overlays_before);
1476 Fset_marker (OVERLAY_END (overlay), end, Qnil); 1500 b->overlays_after = Fdelq (overlay, b->overlays_after);
1501
1502 Fset_marker (OVERLAY_START (overlay), beg, buffer);
1503 Fset_marker (OVERLAY_END (overlay), end, buffer);
1477 1504
1478 /* Put the overlay on the wrong list. */ 1505 /* Put the overlay on the wrong list. */
1479 end = OVERLAY_END (overlay); 1506 end = OVERLAY_END (overlay);
1480 if (OVERLAY_POSITION (end) < XINT (current_buffer->overlay_center)) 1507 if (OVERLAY_POSITION (end) < XINT (b->overlay_center))
1481 current_buffer->overlays_after 1508 b->overlays_after = Fcons (overlay, b->overlays_after);
1482 = Fcons (overlay, current_buffer->overlays_after);
1483 else 1509 else
1484 current_buffer->overlays_before 1510 b->overlays_before = Fcons (overlay, b->overlays_before);
1485 = Fcons (overlay, current_buffer->overlays_before);
1486 1511
1487 /* This puts it in the right list, and in the right order. */ 1512 /* This puts it in the right list, and in the right order. */
1488 recenter_overlay_lists (XINT (current_buffer->overlay_center)); 1513 recenter_overlay_lists (b, XINT (b->overlay_center));
1489 1514
1490 return overlay; 1515 return overlay;
1491} 1516}
1492 1517
1493DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0, 1518DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
1494 "Delete the overlay OVERLAY from the current buffer.") 1519 "Delete the overlay OVERLAY from its buffer.")
1495 (overlay) 1520 (overlay)
1521 Lisp_Object overlay;
1496{ 1522{
1497 current_buffer->overlays_before 1523 struct buffer *b;
1498 = Fdelq (overlay, current_buffer->overlays_before); 1524
1499 current_buffer->overlays_after 1525 if (OVERLAY_VALID (overlay))
1500 = Fdelq (overlay, current_buffer->overlays_after); 1526 b = XBUFFER (Fmarker_buffer (OVERLAY_START (overlay)));
1527 else
1528 /* Guess! */
1529 b = current_buffer;
1530
1531 b->overlays_before = Fdelq (overlay, b->overlays_before);
1532 b->overlays_after = Fdelq (overlay, b->overlays_after);
1533
1501 return Qnil; 1534 return Qnil;
1502} 1535}
1503 1536
@@ -1597,7 +1630,7 @@ DEFUN ("overlay-recenter", Foverlay_recenter, Soverlay_recenter, 1, 1, 0,
1597{ 1630{
1598 CHECK_NUMBER_COERCE_MARKER (pos, 0); 1631 CHECK_NUMBER_COERCE_MARKER (pos, 0);
1599 1632
1600 recenter_overlay_lists (XINT (pos)); 1633 recenter_overlay_lists (current_buffer, XINT (pos));
1601 return Qnil; 1634 return Qnil;
1602} 1635}
1603 1636