aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGerd Moellmann1999-10-28 12:12:47 +0000
committerGerd Moellmann1999-10-28 12:12:47 +0000
commitf2be36717160ed8f947c720cbacc8fea7f80a514 (patch)
tree968118d3e26c287fb6f14adf4620085746fee106 /src
parent40d63d1feee77cd064dba63ee9dd3b39f51bb2e0 (diff)
downloademacs-f2be36717160ed8f947c720cbacc8fea7f80a514.tar.gz
emacs-f2be36717160ed8f947c720cbacc8fea7f80a514.zip
(Fmemq, Fassq, Frassq, assq_no_quit, Fassoc)
(Frassoc): Rewritten.
Diffstat (limited to 'src')
-rw-r--r--src/fns.c234
1 files changed, 168 insertions, 66 deletions
diff --git a/src/fns.c b/src/fns.c
index e5c3a2be428..148c03dca5f 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -148,13 +148,17 @@ To get the number of bytes, use `string-bytes'")
148 XSETFASTINT (val, XVECTOR (sequence)->size & PSEUDOVECTOR_SIZE_MASK); 148 XSETFASTINT (val, XVECTOR (sequence)->size & PSEUDOVECTOR_SIZE_MASK);
149 else if (CONSP (sequence)) 149 else if (CONSP (sequence))
150 { 150 {
151 for (i = 0, tail = sequence; !NILP (tail); i++) 151 for (i = 0; CONSP (sequence); ++i)
152 { 152 {
153 QUIT; 153 if ((i & 0xff) == 0)
154 tail = Fcdr (tail); 154 QUIT;
155 sequence = XCDR (sequence);
155 } 156 }
156 157
157 XSETFASTINT (val, i); 158 if (!NILP (sequence))
159 wrong_type_argument (Qlistp, sequence);
160
161 val = make_number (i);
158 } 162 }
159 else if (NILP (sequence)) 163 else if (NILP (sequence))
160 XSETFASTINT (val, 0); 164 XSETFASTINT (val, 0);
@@ -1314,21 +1318,33 @@ The value is actually the tail of LIST whose car is ELT.")
1314} 1318}
1315 1319
1316DEFUN ("memq", Fmemq, Smemq, 2, 2, 0, 1320DEFUN ("memq", Fmemq, Smemq, 2, 2, 0,
1317 "Return non-nil if ELT is an element of LIST. Comparison done with EQ.\n\ 1321 "Return non-nil if ELT is an element of LIST.\n\
1318The value is actually the tail of LIST whose car is ELT.") 1322Comparison done with EQ. The value is actually the tail of LIST\n\
1323whose car is ELT.")
1319 (elt, list) 1324 (elt, list)
1320 register Lisp_Object elt; 1325 Lisp_Object elt, list;
1321 Lisp_Object list;
1322{ 1326{
1323 register Lisp_Object tail; 1327 while (1)
1324 for (tail = list; !NILP (tail); tail = XCDR (tail))
1325 { 1328 {
1326 register Lisp_Object tem; 1329 if (!CONSP (list) || EQ (XCAR (list), elt))
1327 tem = Fcar (tail); 1330 break;
1328 if (EQ (elt, tem)) return tail; 1331
1332 list = XCDR (list);
1333 if (!CONSP (list) || EQ (XCAR (list), elt))
1334 break;
1335
1336 list = XCDR (list);
1337 if (!CONSP (list) || EQ (XCAR (list), elt))
1338 break;
1339
1340 list = XCDR (list);
1329 QUIT; 1341 QUIT;
1330 } 1342 }
1331 return Qnil; 1343
1344 if (!CONSP (list) && !NILP (list))
1345 list = wrong_type_argument (Qlistp, list);
1346
1347 return list;
1332} 1348}
1333 1349
1334DEFUN ("assq", Fassq, Sassq, 2, 2, 0, 1350DEFUN ("assq", Fassq, Sassq, 2, 2, 0,
@@ -1336,20 +1352,41 @@ DEFUN ("assq", Fassq, Sassq, 2, 2, 0,
1336The value is actually the element of LIST whose car is KEY.\n\ 1352The value is actually the element of LIST whose car is KEY.\n\
1337Elements of LIST that are not conses are ignored.") 1353Elements of LIST that are not conses are ignored.")
1338 (key, list) 1354 (key, list)
1339 register Lisp_Object key; 1355 Lisp_Object key, list;
1340 Lisp_Object list;
1341{ 1356{
1342 register Lisp_Object tail; 1357 Lisp_Object result;
1343 for (tail = list; !NILP (tail); tail = XCDR (tail)) 1358
1359 while (1)
1344 { 1360 {
1345 register Lisp_Object elt, tem; 1361 if (!CONSP (list)
1346 elt = Fcar (tail); 1362 || (CONSP (XCAR (list))
1347 if (!CONSP (elt)) continue; 1363 && EQ (XCAR (XCAR (list)), key)))
1348 tem = XCAR (elt); 1364 break;
1349 if (EQ (key, tem)) return elt; 1365
1366 list = XCDR (list);
1367 if (!CONSP (list)
1368 || (CONSP (XCAR (list))
1369 && EQ (XCAR (XCAR (list)), key)))
1370 break;
1371
1372 list = XCDR (list);
1373 if (!CONSP (list)
1374 || (CONSP (XCAR (list))
1375 && EQ (XCAR (XCAR (list)), key)))
1376 break;
1377
1378 list = XCDR (list);
1350 QUIT; 1379 QUIT;
1351 } 1380 }
1352 return Qnil; 1381
1382 if (CONSP (list))
1383 result = XCAR (list);
1384 else if (NILP (list))
1385 result = Qnil;
1386 else
1387 result = wrong_type_argument (Qlistp, list);
1388
1389 return result;
1353} 1390}
1354 1391
1355/* Like Fassq but never report an error and do not allow quits. 1392/* Like Fassq but never report an error and do not allow quits.
@@ -1357,79 +1394,144 @@ Elements of LIST that are not conses are ignored.")
1357 1394
1358Lisp_Object 1395Lisp_Object
1359assq_no_quit (key, list) 1396assq_no_quit (key, list)
1360 register Lisp_Object key; 1397 Lisp_Object key, list;
1361 Lisp_Object list;
1362{ 1398{
1363 register Lisp_Object tail; 1399 while (CONSP (list)
1364 for (tail = list; CONSP (tail); tail = XCDR (tail)) 1400 && (!CONSP (XCAR (list))
1365 { 1401 || !EQ (XCAR (XCAR (list)), key)))
1366 register Lisp_Object elt, tem; 1402 list = XCDR (list);
1367 elt = Fcar (tail); 1403
1368 if (!CONSP (elt)) continue; 1404 return CONSP (list) ? XCAR (list) : Qnil;
1369 tem = XCAR (elt);
1370 if (EQ (key, tem)) return elt;
1371 }
1372 return Qnil;
1373} 1405}
1374 1406
1375DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0, 1407DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0,
1376 "Return non-nil if KEY is `equal' to the car of an element of LIST.\n\ 1408 "Return non-nil if KEY is `equal' to the car of an element of LIST.\n\
1377The value is actually the element of LIST whose car equals KEY.") 1409The value is actually the element of LIST whose car equals KEY.")
1378 (key, list) 1410 (key, list)
1379 register Lisp_Object key; 1411 Lisp_Object key, list;
1380 Lisp_Object list;
1381{ 1412{
1382 register Lisp_Object tail; 1413 Lisp_Object result, car;
1383 for (tail = list; !NILP (tail); tail = XCDR (tail)) 1414
1415 while (1)
1384 { 1416 {
1385 register Lisp_Object elt, tem; 1417 if (!CONSP (list)
1386 elt = Fcar (tail); 1418 || (CONSP (XCAR (list))
1387 if (!CONSP (elt)) continue; 1419 && (car = XCAR (XCAR (list)),
1388 tem = Fequal (XCAR (elt), key); 1420 EQ (car, key) || !NILP (Fequal (car, key)))))
1389 if (!NILP (tem)) return elt; 1421 break;
1422
1423 list = XCDR (list);
1424 if (!CONSP (list)
1425 || (CONSP (XCAR (list))
1426 && (car = XCAR (XCAR (list)),
1427 EQ (car, key) || !NILP (Fequal (car, key)))))
1428 break;
1429
1430 list = XCDR (list);
1431 if (!CONSP (list)
1432 || (CONSP (XCAR (list))
1433 && (car = XCAR (XCAR (list)),
1434 EQ (car, key) || !NILP (Fequal (car, key)))))
1435 break;
1436
1437 list = XCDR (list);
1390 QUIT; 1438 QUIT;
1391 } 1439 }
1392 return Qnil; 1440
1441 if (CONSP (list))
1442 result = XCAR (list);
1443 else if (NILP (list))
1444 result = Qnil;
1445 else
1446 result = wrong_type_argument (Qlistp, list);
1447
1448 return result;
1393} 1449}
1394 1450
1395DEFUN ("rassq", Frassq, Srassq, 2, 2, 0, 1451DEFUN ("rassq", Frassq, Srassq, 2, 2, 0,
1396 "Return non-nil if ELT is `eq' to the cdr of an element of LIST.\n\ 1452 "Return non-nil if KEY is `eq' to the cdr of an element of LIST.\n\
1397The value is actually the element of LIST whose cdr is ELT.") 1453The value is actually the element of LIST whose cdr is KEY.")
1398 (key, list) 1454 (key, list)
1399 register Lisp_Object key; 1455 register Lisp_Object key;
1400 Lisp_Object list; 1456 Lisp_Object list;
1401{ 1457{
1402 register Lisp_Object tail; 1458 Lisp_Object result;
1403 for (tail = list; !NILP (tail); tail = XCDR (tail)) 1459
1460 while (1)
1404 { 1461 {
1405 register Lisp_Object elt, tem; 1462 if (!CONSP (list)
1406 elt = Fcar (tail); 1463 || (CONSP (XCAR (list))
1407 if (!CONSP (elt)) continue; 1464 && EQ (XCDR (XCAR (list)), key)))
1408 tem = XCDR (elt); 1465 break;
1409 if (EQ (key, tem)) return elt; 1466
1467 list = XCDR (list);
1468 if (!CONSP (list)
1469 || (CONSP (XCAR (list))
1470 && EQ (XCDR (XCAR (list)), key)))
1471 break;
1472
1473 list = XCDR (list);
1474 if (!CONSP (list)
1475 || (CONSP (XCAR (list))
1476 && EQ (XCDR (XCAR (list)), key)))
1477 break;
1478
1479 list = XCDR (list);
1410 QUIT; 1480 QUIT;
1411 } 1481 }
1412 return Qnil; 1482
1483 if (NILP (list))
1484 result = Qnil;
1485 else if (CONSP (list))
1486 result = XCAR (list);
1487 else
1488 result = wrong_type_argument (Qlistp, list);
1489
1490 return result;
1413} 1491}
1414 1492
1415DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0, 1493DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0,
1416 "Return non-nil if KEY is `equal' to the cdr of an element of LIST.\n\ 1494 "Return non-nil if KEY is `equal' to the cdr of an element of LIST.\n\
1417The value is actually the element of LIST whose cdr equals KEY.") 1495The value is actually the element of LIST whose cdr equals KEY.")
1418 (key, list) 1496 (key, list)
1419 register Lisp_Object key; 1497 Lisp_Object key, list;
1420 Lisp_Object list;
1421{ 1498{
1422 register Lisp_Object tail; 1499 Lisp_Object result, cdr;
1423 for (tail = list; !NILP (tail); tail = XCDR (tail)) 1500
1501 while (1)
1424 { 1502 {
1425 register Lisp_Object elt, tem; 1503 if (!CONSP (list)
1426 elt = Fcar (tail); 1504 || (CONSP (XCAR (list))
1427 if (!CONSP (elt)) continue; 1505 && (cdr = XCDR (XCAR (list)),
1428 tem = Fequal (XCDR (elt), key); 1506 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1429 if (!NILP (tem)) return elt; 1507 break;
1508
1509 list = XCDR (list);
1510 if (!CONSP (list)
1511 || (CONSP (XCAR (list))
1512 && (cdr = XCDR (XCAR (list)),
1513 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1514 break;
1515
1516 list = XCDR (list);
1517 if (!CONSP (list)
1518 || (CONSP (XCAR (list))
1519 && (cdr = XCDR (XCAR (list)),
1520 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1521 break;
1522
1523 list = XCDR (list);
1430 QUIT; 1524 QUIT;
1431 } 1525 }
1432 return Qnil; 1526
1527 if (CONSP (list))
1528 result = XCAR (list);
1529 else if (NILP (list))
1530 result = Qnil;
1531 else
1532 result = wrong_type_argument (Qlistp, list);
1533
1534 return result;
1433} 1535}
1434 1536
1435DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0, 1537DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0,