aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard M. Stallman1995-10-07 22:04:15 +0000
committerRichard M. Stallman1995-10-07 22:04:15 +0000
commit4d27698234834aa0c210b4f2f7cb196274abb7ee (patch)
treee25692d13a8a8da53945ced0480d42714112106a /src
parented2c35efdaaf6fe4a4e404047d7aa29a1d6b1626 (diff)
downloademacs-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')
-rw-r--r--src/data.c160
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;
74Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp; 74Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
75Lisp_Object Qbuffer_or_string_p; 75Lisp_Object Qbuffer_or_string_p;
76Lisp_Object Qboundp, Qfboundp; 76Lisp_Object Qboundp, Qfboundp;
77Lisp_Object Qchar_table_p;
77 78
78Lisp_Object Qcdr; 79Lisp_Object Qcdr;
79Lisp_Object Qad_advice_info, Qad_activate; 80Lisp_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
318DEFUN ("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
327DEFUN ("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
317DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0, "T if OBJECT is an array (string or vector).") 336DEFUN ("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
1481DEFUN ("aref", Faref, Saref, 2, 2, 0, 1501DEFUN ("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\
1483ARRAY may be a vector or a string, or a byte-code object. INDEX starts at 0.") 1503ARRAY may be a vector, a string, a char-table, a bool-vector,\n\
1504or 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);