diff options
| author | Richard M. Stallman | 1995-10-07 22:04:15 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1995-10-07 22:04:15 +0000 |
| commit | 4d27698234834aa0c210b4f2f7cb196274abb7ee (patch) | |
| tree | e25692d13a8a8da53945ced0480d42714112106a /src/data.c | |
| parent | ed2c35efdaaf6fe4a4e404047d7aa29a1d6b1626 (diff) | |
| download | emacs-4d27698234834aa0c210b4f2f7cb196274abb7ee.tar.gz emacs-4d27698234834aa0c210b4f2f7cb196274abb7ee.zip | |
(Fchartablep, Fboolvectorp): New functions.
(syms_of_data): defsubr them.
(Faref, Faset, Fsequencep): Handle chartables and boolvectors.
Diffstat (limited to 'src/data.c')
| -rw-r--r-- | src/data.c | 160 |
1 files changed, 157 insertions, 3 deletions
diff --git a/src/data.c b/src/data.c index 3efa4af16cc..6892af5836d 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -74,6 +74,7 @@ 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; |
| @@ -314,6 +315,24 @@ DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0, "T if OBJECT is a string.") | |||
| 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; |
| @@ -328,7 +347,8 @@ DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0, | |||
| 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 | } |
| @@ -1480,7 +1500,8 @@ function chain of symbols.") | |||
| 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; |
| @@ -1497,6 +1518,75 @@ ARRAY may be a vector or a string, or a byte-code object. INDEX starts at 0.") | |||
| 1497 | XSETFASTINT (val, (unsigned char) XSTRING (array)->data[idxval]); | 1518 | XSETFASTINT (val, (unsigned char) XSTRING (array)->data[idxval]); |
| 1498 | return val; | 1519 | return val; |
| 1499 | } | 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 */ | ||
| 1589 | } | ||
| 1500 | else | 1590 | else |
| 1501 | { | 1591 | { |
| 1502 | int size; | 1592 | int size; |
| @@ -1524,7 +1614,8 @@ ARRAY may be a vector or a string. IDX starts at 0.") | |||
| 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 | ||
| @@ -1534,6 +1625,64 @@ ARRAY may be a vector or a string. IDX starts at 0.") | |||
| 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; |
| 1536 | } | 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 */ | ||
| 1685 | } | ||
| 1537 | else | 1686 | else |
| 1538 | { | 1687 | { |
| 1539 | if (idxval < 0 || idxval >= XSTRING (array)->size) | 1688 | if (idxval < 0 || idxval >= XSTRING (array)->size) |
| @@ -2232,6 +2381,8 @@ syms_of_data () | |||
| 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 */ |
| @@ -2416,6 +2567,7 @@ syms_of_data () | |||
| 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); |
| @@ -2474,6 +2626,8 @@ syms_of_data () | |||
| 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); |