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);