Mercurial > emacs
comparison src/data.c @ 13148:18b1b690defe
(Fchartablep, Fboolvectorp): New functions.
(syms_of_data): defsubr them.
(Faref, Faset, Fsequencep): Handle chartables and boolvectors.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 07 Oct 1995 22:04:15 +0000 |
parents | ed5b91dd829a |
children | 5fd4e8e4185a |
comparison
equal
deleted
inserted
replaced
13147:bd9ff4ee6cd4 | 13148:18b1b690defe |
---|---|
72 Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp; | 72 Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp; |
73 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp; | 73 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp; |
74 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp; | 74 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp; |
75 Lisp_Object Qbuffer_or_string_p; | 75 Lisp_Object Qbuffer_or_string_p; |
76 Lisp_Object Qboundp, Qfboundp; | 76 Lisp_Object Qboundp, Qfboundp; |
77 Lisp_Object Qchar_table_p; | |
77 | 78 |
78 Lisp_Object Qcdr; | 79 Lisp_Object Qcdr; |
79 Lisp_Object Qad_advice_info, Qad_activate; | 80 Lisp_Object Qad_advice_info, Qad_activate; |
80 | 81 |
81 Lisp_Object Qrange_error, Qdomain_error, Qsingularity_error; | 82 Lisp_Object Qrange_error, Qdomain_error, Qsingularity_error; |
312 if (STRINGP (object)) | 313 if (STRINGP (object)) |
313 return Qt; | 314 return Qt; |
314 return Qnil; | 315 return Qnil; |
315 } | 316 } |
316 | 317 |
318 DEFUN ("char-table-p", Fchar_table_p, Schar_table_p, 1, 1, 0, "T if OBJECT is a char-table.") | |
319 (object) | |
320 Lisp_Object object; | |
321 { | |
322 if (CHAR_TABLE_P (object)) | |
323 return Qt; | |
324 return Qnil; | |
325 } | |
326 | |
327 DEFUN ("bool-vector-p", Fbool_vector_p, Sbool_vector_p, 1, 1, 0, "T if OBJECT is a bool-vector.") | |
328 (object) | |
329 Lisp_Object object; | |
330 { | |
331 if (BOOL_VECTOR_P (object)) | |
332 return Qt; | |
333 return Qnil; | |
334 } | |
335 | |
317 DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0, "T if OBJECT is an array (string or vector).") | 336 DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0, "T if OBJECT is an array (string or vector).") |
318 (object) | 337 (object) |
319 Lisp_Object object; | 338 Lisp_Object object; |
320 { | 339 { |
321 if (VECTORP (object) || STRINGP (object)) | 340 if (VECTORP (object) || STRINGP (object)) |
326 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0, | 345 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0, |
327 "T if OBJECT is a sequence (list or array).") | 346 "T if OBJECT is a sequence (list or array).") |
328 (object) | 347 (object) |
329 register Lisp_Object object; | 348 register Lisp_Object object; |
330 { | 349 { |
331 if (CONSP (object) || NILP (object) || VECTORP (object) || STRINGP (object)) | 350 if (CONSP (object) || NILP (object) || VECTORP (object) || STRINGP (object) |
351 || CHAR_TABLE_P (object) || BOOL_VECTOR_P (object)) | |
332 return Qt; | 352 return Qt; |
333 return Qnil; | 353 return Qnil; |
334 } | 354 } |
335 | 355 |
336 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0, "T if OBJECT is an editor buffer.") | 356 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0, "T if OBJECT is an editor buffer.") |
1478 | 1498 |
1479 /* Extract and set vector and string elements */ | 1499 /* Extract and set vector and string elements */ |
1480 | 1500 |
1481 DEFUN ("aref", Faref, Saref, 2, 2, 0, | 1501 DEFUN ("aref", Faref, Saref, 2, 2, 0, |
1482 "Return the element of ARRAY at index INDEX.\n\ | 1502 "Return the element of ARRAY at index INDEX.\n\ |
1483 ARRAY may be a vector or a string, or a byte-code object. INDEX starts at 0.") | 1503 ARRAY may be a vector, a string, a char-table, a bool-vector,\n\ |
1504 or a byte-code object. INDEX starts at 0.") | |
1484 (array, idx) | 1505 (array, idx) |
1485 register Lisp_Object array; | 1506 register Lisp_Object array; |
1486 Lisp_Object idx; | 1507 Lisp_Object idx; |
1487 { | 1508 { |
1488 register int idxval; | 1509 register int idxval; |
1494 Lisp_Object val; | 1515 Lisp_Object val; |
1495 if (idxval < 0 || idxval >= XSTRING (array)->size) | 1516 if (idxval < 0 || idxval >= XSTRING (array)->size) |
1496 args_out_of_range (array, idx); | 1517 args_out_of_range (array, idx); |
1497 XSETFASTINT (val, (unsigned char) XSTRING (array)->data[idxval]); | 1518 XSETFASTINT (val, (unsigned char) XSTRING (array)->data[idxval]); |
1498 return val; | 1519 return val; |
1520 } | |
1521 else if (BOOL_VECTOR_P (array)) | |
1522 { | |
1523 int val; | |
1524 int bits_per_char = INTBITS / sizeof (int); | |
1525 | |
1526 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size) | |
1527 args_out_of_range (array, idx); | |
1528 | |
1529 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / bits_per_char]; | |
1530 return (val & (1 << (idxval % bits_per_char)) ? Qt : Qnil); | |
1531 } | |
1532 else if (CHAR_TABLE_P (array)) | |
1533 { | |
1534 Lisp_Object val; | |
1535 | |
1536 if (idxval < 0) | |
1537 args_out_of_range (array, idx); | |
1538 #if 1 | |
1539 if ((unsigned) idxval >= CHAR_TABLE_ORDINARY_SLOTS) | |
1540 args_out_of_range (array, idx); | |
1541 return val = XCHAR_TABLE (array)->contents[idxval]; | |
1542 #else /* 0 */ | |
1543 if ((unsigned) idxval < CHAR_TABLE_ORDINARY_SLOTS) | |
1544 val = XCHAR_TABLE (array)->data[idxval]; | |
1545 else | |
1546 { | |
1547 int charset; | |
1548 unsigned char c1, c2; | |
1549 Lisp_Object val, temp; | |
1550 | |
1551 BREAKUP_NON_ASCII_CHAR (idxval, charset, c1, c2); | |
1552 | |
1553 try_parent_char_table: | |
1554 val = XCHAR_TABLE (array)->contents[charset]; | |
1555 if (c1 == 0 || !CHAR_TABLE_P (val)) | |
1556 return val; | |
1557 | |
1558 temp = XCHAR_TABLE (val)->contents[c1]; | |
1559 if (NILP (temp)) | |
1560 val = XCHAR_TABLE (val)->defalt; | |
1561 else | |
1562 val = temp; | |
1563 | |
1564 if (NILP (val) && !NILP (XCHAR_TABLE (array)->parent)) | |
1565 { | |
1566 array = XCHAR_TABLE (array)->parent; | |
1567 goto try_parent_char_table; | |
1568 | |
1569 } | |
1570 | |
1571 if (c2 == 0 || !CHAR_TABLE_P (val)) | |
1572 return val; | |
1573 | |
1574 temp = XCHAR_TABLE (val)->contents[c2]; | |
1575 if (NILP (temp)) | |
1576 val = XCHAR_TABLE (val)->defalt; | |
1577 else | |
1578 val = temp; | |
1579 | |
1580 if (NILP (val) && !NILP (XCHAR_TABLE (array)->parent)) | |
1581 { | |
1582 array = XCHAR_TABLE (array)->parent; | |
1583 goto try_parent_char_table; | |
1584 } | |
1585 | |
1586 return val; | |
1587 } | |
1588 #endif /* 0 */ | |
1499 } | 1589 } |
1500 else | 1590 else |
1501 { | 1591 { |
1502 int size; | 1592 int size; |
1503 if (VECTORP (array)) | 1593 if (VECTORP (array)) |
1522 { | 1612 { |
1523 register int idxval; | 1613 register int idxval; |
1524 | 1614 |
1525 CHECK_NUMBER (idx, 1); | 1615 CHECK_NUMBER (idx, 1); |
1526 idxval = XINT (idx); | 1616 idxval = XINT (idx); |
1527 if (!VECTORP (array) && !STRINGP (array)) | 1617 if (!VECTORP (array) && !STRINGP (array) && !BOOL_VECTOR_P (array) |
1618 && ! CHAR_TABLE_P (array)) | |
1528 array = wrong_type_argument (Qarrayp, array); | 1619 array = wrong_type_argument (Qarrayp, array); |
1529 CHECK_IMPURE (array); | 1620 CHECK_IMPURE (array); |
1530 | 1621 |
1531 if (VECTORP (array)) | 1622 if (VECTORP (array)) |
1532 { | 1623 { |
1533 if (idxval < 0 || idxval >= XVECTOR (array)->size) | 1624 if (idxval < 0 || idxval >= XVECTOR (array)->size) |
1534 args_out_of_range (array, idx); | 1625 args_out_of_range (array, idx); |
1535 XVECTOR (array)->contents[idxval] = newelt; | 1626 XVECTOR (array)->contents[idxval] = newelt; |
1627 } | |
1628 else if (BOOL_VECTOR_P (array)) | |
1629 { | |
1630 int val; | |
1631 int bits_per_char = INTBITS / sizeof (int); | |
1632 | |
1633 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size) | |
1634 args_out_of_range (array, idx); | |
1635 | |
1636 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / bits_per_char]; | |
1637 | |
1638 if (! NILP (newelt)) | |
1639 val |= 1 << (idxval % bits_per_char); | |
1640 else | |
1641 val &= ~(1 << (idxval % bits_per_char)); | |
1642 XBOOL_VECTOR (array)->data[idxval / bits_per_char] = val; | |
1643 } | |
1644 else if (CHAR_TABLE_P (array)) | |
1645 { | |
1646 Lisp_Object val; | |
1647 | |
1648 if (idxval < 0) | |
1649 args_out_of_range (array, idx); | |
1650 #if 1 | |
1651 if (idxval >= CHAR_TABLE_ORDINARY_SLOTS) | |
1652 args_out_of_range (array, idx); | |
1653 XCHAR_TABLE (array)->contents[idxval] = newelt; | |
1654 return newelt; | |
1655 #else /* 0 */ | |
1656 if (idxval < CHAR_TABLE_ORDINARY_SLOTS) | |
1657 val = XCHAR_TABLE (array)->contents[idxval]; | |
1658 else | |
1659 { | |
1660 int charset; | |
1661 unsigned char c1, c2; | |
1662 Lisp_Object val, val2; | |
1663 | |
1664 BREAKUP_NON_ASCII_CHAR (idxval, charset, c1, c2); | |
1665 | |
1666 if (c1 == 0) | |
1667 return XCHAR_TABLE (array)->contents[charset] = newelt; | |
1668 | |
1669 val = XCHAR_TABLE (array)->contents[charset]; | |
1670 if (!CHAR_TABLE_P (val)) | |
1671 XCHAR_TABLE (array)->contents[charset] | |
1672 = val = Fmake_char_table (Qnil); | |
1673 | |
1674 if (c2 == 0) | |
1675 return XCHAR_TABLE (val)->contents[c1] = newelt; | |
1676 | |
1677 val2 = XCHAR_TABLE (val)->contents[c2]; | |
1678 if (!CHAR_TABLE_P (val2)) | |
1679 XCHAR_TABLE (val)->contents[charset] | |
1680 = val2 = Fmake_char_table (Qnil); | |
1681 | |
1682 return XCHAR_TABLE (val2)->contents[c2] = newelt; | |
1683 } | |
1684 #endif /* 0 */ | |
1536 } | 1685 } |
1537 else | 1686 else |
1538 { | 1687 { |
1539 if (idxval < 0 || idxval >= XSTRING (array)->size) | 1688 if (idxval < 0 || idxval >= XSTRING (array)->size) |
1540 args_out_of_range (array, idx); | 1689 args_out_of_range (array, idx); |
2230 Qfloatp = intern ("floatp"); | 2379 Qfloatp = intern ("floatp"); |
2231 Qnumberp = intern ("numberp"); | 2380 Qnumberp = intern ("numberp"); |
2232 Qnumber_or_marker_p = intern ("number-or-marker-p"); | 2381 Qnumber_or_marker_p = intern ("number-or-marker-p"); |
2233 #endif /* LISP_FLOAT_TYPE */ | 2382 #endif /* LISP_FLOAT_TYPE */ |
2234 | 2383 |
2384 Qchar_table_p = intern ("char-table-p"); | |
2385 | |
2235 Qcdr = intern ("cdr"); | 2386 Qcdr = intern ("cdr"); |
2236 | 2387 |
2237 /* Handle automatic advice activation */ | 2388 /* Handle automatic advice activation */ |
2238 Qad_advice_info = intern ("ad-advice-info"); | 2389 Qad_advice_info = intern ("ad-advice-info"); |
2239 Qad_activate = intern ("ad-activate"); | 2390 Qad_activate = intern ("ad-activate"); |
2414 #ifdef LISP_FLOAT_TYPE | 2565 #ifdef LISP_FLOAT_TYPE |
2415 staticpro (&Qfloatp); | 2566 staticpro (&Qfloatp); |
2416 staticpro (&Qnumberp); | 2567 staticpro (&Qnumberp); |
2417 staticpro (&Qnumber_or_marker_p); | 2568 staticpro (&Qnumber_or_marker_p); |
2418 #endif /* LISP_FLOAT_TYPE */ | 2569 #endif /* LISP_FLOAT_TYPE */ |
2570 staticpro (&Qchar_table_p); | |
2419 | 2571 |
2420 staticpro (&Qboundp); | 2572 staticpro (&Qboundp); |
2421 staticpro (&Qfboundp); | 2573 staticpro (&Qfboundp); |
2422 staticpro (&Qcdr); | 2574 staticpro (&Qcdr); |
2423 staticpro (&Qad_advice_info); | 2575 staticpro (&Qad_advice_info); |
2472 #endif /* LISP_FLOAT_TYPE */ | 2624 #endif /* LISP_FLOAT_TYPE */ |
2473 defsubr (&Snatnump); | 2625 defsubr (&Snatnump); |
2474 defsubr (&Ssymbolp); | 2626 defsubr (&Ssymbolp); |
2475 defsubr (&Sstringp); | 2627 defsubr (&Sstringp); |
2476 defsubr (&Svectorp); | 2628 defsubr (&Svectorp); |
2629 defsubr (&Schar_table_p); | |
2630 defsubr (&Sbool_vector_p); | |
2477 defsubr (&Sarrayp); | 2631 defsubr (&Sarrayp); |
2478 defsubr (&Ssequencep); | 2632 defsubr (&Ssequencep); |
2479 defsubr (&Sbufferp); | 2633 defsubr (&Sbufferp); |
2480 defsubr (&Smarkerp); | 2634 defsubr (&Smarkerp); |
2481 defsubr (&Ssubrp); | 2635 defsubr (&Ssubrp); |