Mercurial > emacs
comparison src/data.c @ 88155:d7ddb3e565de
sync with trunk
| author | Henrik Enberg <henrik.enberg@telia.com> |
|---|---|
| date | Mon, 16 Jan 2006 00:03:54 +0000 |
| parents | 7931f73b31db |
| children |
comparison
equal
deleted
inserted
replaced
| 88154:8ce476d3ba36 | 88155:d7ddb3e565de |
|---|---|
| 1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter. | 1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter. |
| 2 Copyright (C) 1985,86,88,93,94,95,97,98,99, 2000, 2001 | 2 Copyright (C) 1985, 1986, 1988, 1993, 1994, 1995, 1997, 1998, 1999, 2000, |
| 3 Free Software Foundation, Inc. | 3 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. |
| 4 | 4 |
| 5 This file is part of GNU Emacs. | 5 This file is part of GNU Emacs. |
| 6 | 6 |
| 7 GNU Emacs is free software; you can redistribute it and/or modify | 7 GNU Emacs is free software; you can redistribute it and/or modify |
| 8 it under the terms of the GNU General Public License as published by | 8 it under the terms of the GNU General Public License as published by |
| 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 GNU General Public License for more details. | 15 GNU General Public License for more details. |
| 16 | 16 |
| 17 You should have received a copy of the GNU General Public License | 17 You should have received a copy of the GNU General Public License |
| 18 along with GNU Emacs; see the file COPYING. If not, write to | 18 along with GNU Emacs; see the file COPYING. If not, write to |
| 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 20 Boston, MA 02111-1307, USA. */ | 20 Boston, MA 02110-1301, USA. */ |
| 21 | 21 |
| 22 | 22 |
| 23 #include <config.h> | 23 #include <config.h> |
| 24 #include <signal.h> | 24 #include <signal.h> |
| 25 #include <stdio.h> | 25 #include <stdio.h> |
| 69 Lisp_Object Qsetting_constant, Qinvalid_read_syntax; | 69 Lisp_Object Qsetting_constant, Qinvalid_read_syntax; |
| 70 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch; | 70 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch; |
| 71 Lisp_Object Qend_of_file, Qarith_error, Qmark_inactive; | 71 Lisp_Object Qend_of_file, Qarith_error, Qmark_inactive; |
| 72 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only; | 72 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only; |
| 73 Lisp_Object Qtext_read_only; | 73 Lisp_Object Qtext_read_only; |
| 74 | |
| 74 Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp; | 75 Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp; |
| 75 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp; | 76 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp; |
| 76 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp; | 77 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp; |
| 77 Lisp_Object Qbuffer_or_string_p, Qkeywordp; | 78 Lisp_Object Qbuffer_or_string_p, Qkeywordp; |
| 78 Lisp_Object Qboundp, Qfboundp; | 79 Lisp_Object Qboundp, Qfboundp; |
| 85 Lisp_Object Qoverflow_error, Qunderflow_error; | 86 Lisp_Object Qoverflow_error, Qunderflow_error; |
| 86 | 87 |
| 87 Lisp_Object Qfloatp; | 88 Lisp_Object Qfloatp; |
| 88 Lisp_Object Qnumberp, Qnumber_or_marker_p; | 89 Lisp_Object Qnumberp, Qnumber_or_marker_p; |
| 89 | 90 |
| 90 static Lisp_Object Qinteger, Qsymbol, Qstring, Qcons, Qmarker, Qoverlay; | 91 Lisp_Object Qinteger; |
| 92 static Lisp_Object Qsymbol, Qstring, Qcons, Qmarker, Qoverlay; | |
| 91 static Lisp_Object Qfloat, Qwindow_configuration, Qwindow; | 93 static Lisp_Object Qfloat, Qwindow_configuration, Qwindow; |
| 92 Lisp_Object Qprocess; | 94 Lisp_Object Qprocess; |
| 93 static Lisp_Object Qcompiled_function, Qbuffer, Qframe, Qvector; | 95 static Lisp_Object Qcompiled_function, Qbuffer, Qframe, Qvector; |
| 94 static Lisp_Object Qchar_table, Qbool_vector, Qhash_table; | 96 static Lisp_Object Qchar_table, Qbool_vector, Qhash_table; |
| 95 static Lisp_Object Qsubrp, Qmany, Qunevalled; | 97 static Lisp_Object Qsubrp, Qmany, Qunevalled; |
| 715 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string | 717 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string |
| 716 determined by DEFINITION. */) | 718 determined by DEFINITION. */) |
| 717 (symbol, definition, docstring) | 719 (symbol, definition, docstring) |
| 718 register Lisp_Object symbol, definition, docstring; | 720 register Lisp_Object symbol, definition, docstring; |
| 719 { | 721 { |
| 722 CHECK_SYMBOL (symbol); | |
| 720 if (CONSP (XSYMBOL (symbol)->function) | 723 if (CONSP (XSYMBOL (symbol)->function) |
| 721 && EQ (XCAR (XSYMBOL (symbol)->function), Qautoload)) | 724 && EQ (XCAR (XSYMBOL (symbol)->function), Qautoload)) |
| 722 LOADHIST_ATTACH (Fcons (Qt, symbol)); | 725 LOADHIST_ATTACH (Fcons (Qt, symbol)); |
| 723 definition = Ffset (symbol, definition); | 726 definition = Ffset (symbol, definition); |
| 724 LOADHIST_ATTACH (symbol); | 727 LOADHIST_ATTACH (Fcons (Qdefun, symbol)); |
| 725 if (!NILP (docstring)) | 728 if (!NILP (docstring)) |
| 726 Fput (symbol, Qfunction_documentation, docstring); | 729 Fput (symbol, Qfunction_documentation, docstring); |
| 727 return definition; | 730 return definition; |
| 728 } | 731 } |
| 729 | 732 |
| 730 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0, | 733 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0, |
| 731 doc: /* Set SYMBOL's property list to NEWVAL, and return NEWVAL. */) | 734 doc: /* Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. */) |
| 732 (symbol, newplist) | 735 (symbol, newplist) |
| 733 register Lisp_Object symbol, newplist; | 736 register Lisp_Object symbol, newplist; |
| 734 { | 737 { |
| 735 CHECK_SYMBOL (symbol); | 738 CHECK_SYMBOL (symbol); |
| 736 XSYMBOL (symbol)->plist = newplist; | 739 XSYMBOL (symbol)->plist = newplist; |
| 757 return Fcons (make_number (minargs), Qunevalled); | 760 return Fcons (make_number (minargs), Qunevalled); |
| 758 else | 761 else |
| 759 return Fcons (make_number (minargs), make_number (maxargs)); | 762 return Fcons (make_number (minargs), make_number (maxargs)); |
| 760 } | 763 } |
| 761 | 764 |
| 762 DEFUN ("subr-interactive-form", Fsubr_interactive_form, Ssubr_interactive_form, 1, 1, 0, | 765 DEFUN ("subr-name", Fsubr_name, Ssubr_name, 1, 1, 0, |
| 763 doc: /* Return the interactive form of SUBR or nil if none. | 766 doc: /* Return name of subroutine SUBR. |
| 764 SUBR must be a built-in function. Value, if non-nil, is a list | 767 SUBR must be a built-in function. */) |
| 765 \(interactive SPEC). */) | |
| 766 (subr) | 768 (subr) |
| 767 Lisp_Object subr; | 769 Lisp_Object subr; |
| 768 { | 770 { |
| 771 const char *name; | |
| 769 if (!SUBRP (subr)) | 772 if (!SUBRP (subr)) |
| 770 wrong_type_argument (Qsubrp, subr); | 773 wrong_type_argument (Qsubrp, subr); |
| 771 if (XSUBR (subr)->prompt) | 774 name = XSUBR (subr)->symbol_name; |
| 772 return list2 (Qinteractive, build_string (XSUBR (subr)->prompt)); | 775 return make_string (name, strlen (name)); |
| 776 } | |
| 777 | |
| 778 DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 1, 0, | |
| 779 doc: /* Return the interactive form of CMD or nil if none. | |
| 780 If CMD is not a command, the return value is nil. | |
| 781 Value, if non-nil, is a list \(interactive SPEC). */) | |
| 782 (cmd) | |
| 783 Lisp_Object cmd; | |
| 784 { | |
| 785 Lisp_Object fun = indirect_function (cmd); | |
| 786 | |
| 787 if (SUBRP (fun)) | |
| 788 { | |
| 789 if (XSUBR (fun)->prompt) | |
| 790 return list2 (Qinteractive, build_string (XSUBR (fun)->prompt)); | |
| 791 } | |
| 792 else if (COMPILEDP (fun)) | |
| 793 { | |
| 794 if ((ASIZE (fun) & PSEUDOVECTOR_SIZE_MASK) > COMPILED_INTERACTIVE) | |
| 795 return list2 (Qinteractive, AREF (fun, COMPILED_INTERACTIVE)); | |
| 796 } | |
| 797 else if (CONSP (fun)) | |
| 798 { | |
| 799 Lisp_Object funcar = XCAR (fun); | |
| 800 if (EQ (funcar, Qlambda)) | |
| 801 return Fassq (Qinteractive, Fcdr (XCDR (fun))); | |
| 802 else if (EQ (funcar, Qautoload)) | |
| 803 { | |
| 804 struct gcpro gcpro1; | |
| 805 GCPRO1 (cmd); | |
| 806 do_autoload (fun, cmd); | |
| 807 UNGCPRO; | |
| 808 return Finteractive_form (cmd); | |
| 809 } | |
| 810 } | |
| 773 return Qnil; | 811 return Qnil; |
| 774 } | 812 } |
| 775 | 813 |
| 776 | 814 |
| 777 /*********************************************************************** | 815 /*********************************************************************** |
| 888 *XBOOLFWD (valcontents)->boolvar = NILP (newval) ? 0 : 1; | 926 *XBOOLFWD (valcontents)->boolvar = NILP (newval) ? 0 : 1; |
| 889 break; | 927 break; |
| 890 | 928 |
| 891 case Lisp_Misc_Objfwd: | 929 case Lisp_Misc_Objfwd: |
| 892 *XOBJFWD (valcontents)->objvar = newval; | 930 *XOBJFWD (valcontents)->objvar = newval; |
| 931 | |
| 932 /* If this variable is a default for something stored | |
| 933 in the buffer itself, such as default-fill-column, | |
| 934 find the buffers that don't have local values for it | |
| 935 and update them. */ | |
| 936 if (XOBJFWD (valcontents)->objvar > (Lisp_Object *) &buffer_defaults | |
| 937 && XOBJFWD (valcontents)->objvar < (Lisp_Object *) (&buffer_defaults + 1)) | |
| 938 { | |
| 939 int offset = ((char *) XOBJFWD (valcontents)->objvar | |
| 940 - (char *) &buffer_defaults); | |
| 941 int idx = PER_BUFFER_IDX (offset); | |
| 942 | |
| 943 Lisp_Object tail; | |
| 944 | |
| 945 if (idx <= 0) | |
| 946 break; | |
| 947 | |
| 948 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail)) | |
| 949 { | |
| 950 Lisp_Object buf; | |
| 951 struct buffer *b; | |
| 952 | |
| 953 buf = Fcdr (XCAR (tail)); | |
| 954 if (!BUFFERP (buf)) continue; | |
| 955 b = XBUFFER (buf); | |
| 956 | |
| 957 if (! PER_BUFFER_VALUE_P (b, idx)) | |
| 958 PER_BUFFER_VALUE (b, offset) = newval; | |
| 959 } | |
| 960 } | |
| 893 break; | 961 break; |
| 894 | 962 |
| 895 case Lisp_Misc_Buffer_Objfwd: | 963 case Lisp_Misc_Buffer_Objfwd: |
| 896 { | 964 { |
| 897 int offset = XBUFFER_OBJFWD (valcontents)->offset; | 965 int offset = XBUFFER_OBJFWD (valcontents)->offset; |
| 898 Lisp_Object type; | 966 Lisp_Object type; |
| 899 | 967 |
| 900 type = PER_BUFFER_TYPE (offset); | 968 type = PER_BUFFER_TYPE (offset); |
| 901 if (XINT (type) == -1) | |
| 902 error ("Variable %s is read-only", SDATA (SYMBOL_NAME (symbol))); | |
| 903 | |
| 904 if (! NILP (type) && ! NILP (newval) | 969 if (! NILP (type) && ! NILP (newval) |
| 905 && XTYPE (newval) != XINT (type)) | 970 && XTYPE (newval) != XINT (type)) |
| 906 buffer_slot_type_mismatch (offset); | 971 buffer_slot_type_mismatch (offset); |
| 907 | 972 |
| 908 if (buf == NULL) | 973 if (buf == NULL) |
| 1093 | 1158 |
| 1094 static int | 1159 static int |
| 1095 let_shadows_buffer_binding_p (symbol) | 1160 let_shadows_buffer_binding_p (symbol) |
| 1096 Lisp_Object symbol; | 1161 Lisp_Object symbol; |
| 1097 { | 1162 { |
| 1098 struct specbinding *p; | 1163 volatile struct specbinding *p; |
| 1099 | 1164 |
| 1100 for (p = specpdl_ptr - 1; p >= specpdl; p--) | 1165 for (p = specpdl_ptr - 1; p >= specpdl; p--) |
| 1101 if (p->func == NULL | 1166 if (p->func == NULL |
| 1102 && CONSP (p->symbol)) | 1167 && CONSP (p->symbol)) |
| 1103 { | 1168 { |
| 1339 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil)); | 1404 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil)); |
| 1340 return value; | 1405 return value; |
| 1341 } | 1406 } |
| 1342 | 1407 |
| 1343 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0, | 1408 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0, |
| 1344 doc: /* Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated. | 1409 doc: /* Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated. |
| 1345 The default value is seen in buffers that do not have their own values | 1410 The default value is seen in buffers that do not have their own values |
| 1346 for this variable. */) | 1411 for this variable. */) |
| 1347 (symbol, value) | 1412 (symbol, value) |
| 1348 Lisp_Object symbol, value; | 1413 Lisp_Object symbol, value; |
| 1349 { | 1414 { |
| 1392 value, NULL); | 1457 value, NULL); |
| 1393 | 1458 |
| 1394 return value; | 1459 return value; |
| 1395 } | 1460 } |
| 1396 | 1461 |
| 1397 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0, | 1462 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 0, UNEVALLED, 0, |
| 1398 doc: /* Set the default value of variable VAR to VALUE. | 1463 doc: /* Set the default value of variable VAR to VALUE. |
| 1399 VAR, the variable name, is literal (not evaluated); | 1464 VAR, the variable name, is literal (not evaluated); |
| 1400 VALUE is an expression: it is evaluated and its value returned. | 1465 VALUE is an expression: it is evaluated and its value returned. |
| 1401 The default value of a variable is seen in buffers | 1466 The default value of a variable is seen in buffers |
| 1402 that do not have their own values for the variable. | 1467 that do not have their own values for the variable. |
| 1403 | 1468 |
| 1404 More generally, you can use multiple variables and values, as in | 1469 More generally, you can use multiple variables and values, as in |
| 1405 (setq-default SYMBOL VALUE SYMBOL VALUE...) | 1470 (setq-default VAR VALUE VAR VALUE...) |
| 1406 This sets each SYMBOL's default value to the corresponding VALUE. | 1471 This sets each VAR's default value to the corresponding VALUE. |
| 1407 The VALUE for the Nth SYMBOL can refer to the new default values | 1472 The VALUE for the Nth VAR can refer to the new default values |
| 1408 of previous SYMs. | 1473 of previous VARs. |
| 1409 usage: (setq-default SYMBOL VALUE [SYMBOL VALUE...]) */) | 1474 usage: (setq-default [VAR VALUE...]) */) |
| 1410 (args) | 1475 (args) |
| 1411 Lisp_Object args; | 1476 Lisp_Object args; |
| 1412 { | 1477 { |
| 1413 register Lisp_Object args_left; | 1478 register Lisp_Object args_left; |
| 1414 register Lisp_Object val, symbol; | 1479 register Lisp_Object val, symbol; |
| 1443 in which case the default value is in effect. | 1508 in which case the default value is in effect. |
| 1444 Note that binding the variable with `let', or setting it while | 1509 Note that binding the variable with `let', or setting it while |
| 1445 a `let'-style binding made in this buffer is in effect, | 1510 a `let'-style binding made in this buffer is in effect, |
| 1446 does not make the variable buffer-local. Return VARIABLE. | 1511 does not make the variable buffer-local. Return VARIABLE. |
| 1447 | 1512 |
| 1513 In most cases it is better to use `make-local-variable', | |
| 1514 which makes a variable local in just one buffer. | |
| 1515 | |
| 1448 The function `default-value' gets the default value and `set-default' sets it. */) | 1516 The function `default-value' gets the default value and `set-default' sets it. */) |
| 1449 (variable) | 1517 (variable) |
| 1450 register Lisp_Object variable; | 1518 register Lisp_Object variable; |
| 1451 { | 1519 { |
| 1452 register Lisp_Object tem, valcontents, newval; | 1520 register Lisp_Object tem, valcontents, newval; |
| 1453 | 1521 |
| 1454 CHECK_SYMBOL (variable); | 1522 CHECK_SYMBOL (variable); |
| 1523 variable = indirect_variable (variable); | |
| 1455 | 1524 |
| 1456 valcontents = SYMBOL_VALUE (variable); | 1525 valcontents = SYMBOL_VALUE (variable); |
| 1457 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)) | 1526 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)) |
| 1458 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable))); | 1527 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable))); |
| 1459 | 1528 |
| 1485 1, 1, "vMake Local Variable: ", | 1554 1, 1, "vMake Local Variable: ", |
| 1486 doc: /* Make VARIABLE have a separate value in the current buffer. | 1555 doc: /* Make VARIABLE have a separate value in the current buffer. |
| 1487 Other buffers will continue to share a common default value. | 1556 Other buffers will continue to share a common default value. |
| 1488 \(The buffer-local value of VARIABLE starts out as the same value | 1557 \(The buffer-local value of VARIABLE starts out as the same value |
| 1489 VARIABLE previously had. If VARIABLE was void, it remains void.\) | 1558 VARIABLE previously had. If VARIABLE was void, it remains void.\) |
| 1490 See also `make-variable-buffer-local'. Return VARIABLE. | 1559 Return VARIABLE. |
| 1491 | 1560 |
| 1492 If the variable is already arranged to become local when set, | 1561 If the variable is already arranged to become local when set, |
| 1493 this function causes a local value to exist for this buffer, | 1562 this function causes a local value to exist for this buffer, |
| 1494 just as setting the variable would do. | 1563 just as setting the variable would do. |
| 1495 | 1564 |
| 1496 This function returns VARIABLE, and therefore | 1565 This function returns VARIABLE, and therefore |
| 1497 (set (make-local-variable 'VARIABLE) VALUE-EXP) | 1566 (set (make-local-variable 'VARIABLE) VALUE-EXP) |
| 1498 works. | 1567 works. |
| 1568 | |
| 1569 See also `make-variable-buffer-local'. | |
| 1499 | 1570 |
| 1500 Do not use `make-local-variable' to make a hook variable buffer-local. | 1571 Do not use `make-local-variable' to make a hook variable buffer-local. |
| 1501 Instead, use `add-hook' and specify t for the LOCAL argument. */) | 1572 Instead, use `add-hook' and specify t for the LOCAL argument. */) |
| 1502 (variable) | 1573 (variable) |
| 1503 register Lisp_Object variable; | 1574 register Lisp_Object variable; |
| 1504 { | 1575 { |
| 1505 register Lisp_Object tem, valcontents; | 1576 register Lisp_Object tem, valcontents; |
| 1506 | 1577 |
| 1507 CHECK_SYMBOL (variable); | 1578 CHECK_SYMBOL (variable); |
| 1579 variable = indirect_variable (variable); | |
| 1508 | 1580 |
| 1509 valcontents = SYMBOL_VALUE (variable); | 1581 valcontents = SYMBOL_VALUE (variable); |
| 1510 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)) | 1582 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)) |
| 1511 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable))); | 1583 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable))); |
| 1512 | 1584 |
| 1582 register Lisp_Object variable; | 1654 register Lisp_Object variable; |
| 1583 { | 1655 { |
| 1584 register Lisp_Object tem, valcontents; | 1656 register Lisp_Object tem, valcontents; |
| 1585 | 1657 |
| 1586 CHECK_SYMBOL (variable); | 1658 CHECK_SYMBOL (variable); |
| 1659 variable = indirect_variable (variable); | |
| 1587 | 1660 |
| 1588 valcontents = SYMBOL_VALUE (variable); | 1661 valcontents = SYMBOL_VALUE (variable); |
| 1589 | 1662 |
| 1590 if (BUFFER_OBJFWDP (valcontents)) | 1663 if (BUFFER_OBJFWDP (valcontents)) |
| 1591 { | 1664 { |
| 1614 | 1687 |
| 1615 /* If the symbol is set up with the current buffer's binding | 1688 /* If the symbol is set up with the current buffer's binding |
| 1616 loaded, recompute its value. We have to do it now, or else | 1689 loaded, recompute its value. We have to do it now, or else |
| 1617 forwarded objects won't work right. */ | 1690 forwarded objects won't work right. */ |
| 1618 { | 1691 { |
| 1619 Lisp_Object *pvalbuf; | 1692 Lisp_Object *pvalbuf, buf; |
| 1620 valcontents = SYMBOL_VALUE (variable); | 1693 valcontents = SYMBOL_VALUE (variable); |
| 1621 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer; | 1694 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer; |
| 1622 if (current_buffer == XBUFFER (*pvalbuf)) | 1695 XSETBUFFER (buf, current_buffer); |
| 1696 if (EQ (buf, *pvalbuf)) | |
| 1623 { | 1697 { |
| 1624 *pvalbuf = Qnil; | 1698 *pvalbuf = Qnil; |
| 1625 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0; | 1699 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0; |
| 1626 find_symbol_value (variable); | 1700 find_symbol_value (variable); |
| 1627 } | 1701 } |
| 1633 /* Lisp functions for creating and removing buffer-local variables. */ | 1707 /* Lisp functions for creating and removing buffer-local variables. */ |
| 1634 | 1708 |
| 1635 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local, | 1709 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local, |
| 1636 1, 1, "vMake Variable Frame Local: ", | 1710 1, 1, "vMake Variable Frame Local: ", |
| 1637 doc: /* Enable VARIABLE to have frame-local bindings. | 1711 doc: /* Enable VARIABLE to have frame-local bindings. |
| 1638 When a frame-local binding exists in the current frame, | 1712 This does not create any frame-local bindings for VARIABLE, |
| 1639 it is in effect whenever the current buffer has no buffer-local binding. | 1713 it just makes them possible. |
| 1640 A frame-local binding is actually a frame parameter value; | 1714 |
| 1641 thus, any given frame has a local binding for VARIABLE if it has | 1715 A frame-local binding is actually a frame parameter value. |
| 1642 a value for the frame parameter named VARIABLE. Return VARIABLE. | 1716 If a frame F has a value for the frame parameter named VARIABLE, |
| 1643 See `modify-frame-parameters' for how to set frame parameters. */) | 1717 that also acts as a frame-local binding for VARIABLE in F-- |
| 1718 provided this function has been called to enable VARIABLE | |
| 1719 to have frame-local bindings at all. | |
| 1720 | |
| 1721 The only way to create a frame-local binding for VARIABLE in a frame | |
| 1722 is to set the VARIABLE frame parameter of that frame. See | |
| 1723 `modify-frame-parameters' for how to set frame parameters. | |
| 1724 | |
| 1725 Buffer-local bindings take precedence over frame-local bindings. */) | |
| 1644 (variable) | 1726 (variable) |
| 1645 register Lisp_Object variable; | 1727 register Lisp_Object variable; |
| 1646 { | 1728 { |
| 1647 register Lisp_Object tem, valcontents, newval; | 1729 register Lisp_Object tem, valcontents, newval; |
| 1648 | 1730 |
| 1649 CHECK_SYMBOL (variable); | 1731 CHECK_SYMBOL (variable); |
| 1732 variable = indirect_variable (variable); | |
| 1650 | 1733 |
| 1651 valcontents = SYMBOL_VALUE (variable); | 1734 valcontents = SYMBOL_VALUE (variable); |
| 1652 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents) | 1735 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents) |
| 1653 || BUFFER_OBJFWDP (valcontents)) | 1736 || BUFFER_OBJFWDP (valcontents)) |
| 1654 error ("Symbol %s may not be frame-local", SDATA (SYMBOL_NAME (variable))); | 1737 error ("Symbol %s may not be frame-local", SDATA (SYMBOL_NAME (variable))); |
| 1694 CHECK_BUFFER (buffer); | 1777 CHECK_BUFFER (buffer); |
| 1695 buf = XBUFFER (buffer); | 1778 buf = XBUFFER (buffer); |
| 1696 } | 1779 } |
| 1697 | 1780 |
| 1698 CHECK_SYMBOL (variable); | 1781 CHECK_SYMBOL (variable); |
| 1782 variable = indirect_variable (variable); | |
| 1699 | 1783 |
| 1700 valcontents = SYMBOL_VALUE (variable); | 1784 valcontents = SYMBOL_VALUE (variable); |
| 1701 if (BUFFER_LOCAL_VALUEP (valcontents) | 1785 if (BUFFER_LOCAL_VALUEP (valcontents) |
| 1702 || SOME_BUFFER_LOCAL_VALUEP (valcontents)) | 1786 || SOME_BUFFER_LOCAL_VALUEP (valcontents)) |
| 1703 { | 1787 { |
| 1704 Lisp_Object tail, elt; | 1788 Lisp_Object tail, elt; |
| 1705 | 1789 |
| 1706 variable = indirect_variable (variable); | |
| 1707 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail)) | 1790 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail)) |
| 1708 { | 1791 { |
| 1709 elt = XCAR (tail); | 1792 elt = XCAR (tail); |
| 1710 if (EQ (variable, XCAR (elt))) | 1793 if (EQ (variable, XCAR (elt))) |
| 1711 return Qt; | 1794 return Qt; |
| 1721 return Qnil; | 1804 return Qnil; |
| 1722 } | 1805 } |
| 1723 | 1806 |
| 1724 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p, | 1807 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p, |
| 1725 1, 2, 0, | 1808 1, 2, 0, |
| 1726 doc: /* Non-nil if VARIABLE will be local in buffer BUFFER if it is set there. | 1809 doc: /* Non-nil if VARIABLE will be local in buffer BUFFER when set there. |
| 1810 More precisely, this means that setting the variable \(with `set' or`setq'), | |
| 1811 while it does not have a `let'-style binding that was made in BUFFER, | |
| 1812 will produce a buffer local binding. See Info node | |
| 1813 `(elisp)Creating Buffer-Local'. | |
| 1727 BUFFER defaults to the current buffer. */) | 1814 BUFFER defaults to the current buffer. */) |
| 1728 (variable, buffer) | 1815 (variable, buffer) |
| 1729 register Lisp_Object variable, buffer; | 1816 register Lisp_Object variable, buffer; |
| 1730 { | 1817 { |
| 1731 Lisp_Object valcontents; | 1818 Lisp_Object valcontents; |
| 1738 CHECK_BUFFER (buffer); | 1825 CHECK_BUFFER (buffer); |
| 1739 buf = XBUFFER (buffer); | 1826 buf = XBUFFER (buffer); |
| 1740 } | 1827 } |
| 1741 | 1828 |
| 1742 CHECK_SYMBOL (variable); | 1829 CHECK_SYMBOL (variable); |
| 1830 variable = indirect_variable (variable); | |
| 1743 | 1831 |
| 1744 valcontents = SYMBOL_VALUE (variable); | 1832 valcontents = SYMBOL_VALUE (variable); |
| 1745 | 1833 |
| 1746 /* This means that make-variable-buffer-local was done. */ | 1834 /* This means that make-variable-buffer-local was done. */ |
| 1747 if (BUFFER_LOCAL_VALUEP (valcontents)) | 1835 if (BUFFER_LOCAL_VALUEP (valcontents)) |
| 1757 elt = XCAR (tail); | 1845 elt = XCAR (tail); |
| 1758 if (EQ (variable, XCAR (elt))) | 1846 if (EQ (variable, XCAR (elt))) |
| 1759 return Qt; | 1847 return Qt; |
| 1760 } | 1848 } |
| 1761 } | 1849 } |
| 1850 return Qnil; | |
| 1851 } | |
| 1852 | |
| 1853 DEFUN ("variable-binding-locus", Fvariable_binding_locus, Svariable_binding_locus, | |
| 1854 1, 1, 0, | |
| 1855 doc: /* Return a value indicating where VARIABLE's current binding comes from. | |
| 1856 If the current binding is buffer-local, the value is the current buffer. | |
| 1857 If the current binding is frame-local, the value is the selected frame. | |
| 1858 If the current binding is global (the default), the value is nil. */) | |
| 1859 (variable) | |
| 1860 register Lisp_Object variable; | |
| 1861 { | |
| 1862 Lisp_Object valcontents; | |
| 1863 | |
| 1864 CHECK_SYMBOL (variable); | |
| 1865 variable = indirect_variable (variable); | |
| 1866 | |
| 1867 /* Make sure the current binding is actually swapped in. */ | |
| 1868 find_symbol_value (variable); | |
| 1869 | |
| 1870 valcontents = XSYMBOL (variable)->value; | |
| 1871 | |
| 1872 if (BUFFER_LOCAL_VALUEP (valcontents) | |
| 1873 || SOME_BUFFER_LOCAL_VALUEP (valcontents) | |
| 1874 || BUFFER_OBJFWDP (valcontents)) | |
| 1875 { | |
| 1876 /* For a local variable, record both the symbol and which | |
| 1877 buffer's or frame's value we are saving. */ | |
| 1878 if (!NILP (Flocal_variable_p (variable, Qnil))) | |
| 1879 return Fcurrent_buffer (); | |
| 1880 else if (!BUFFER_OBJFWDP (valcontents) | |
| 1881 && XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame) | |
| 1882 return XBUFFER_LOCAL_VALUE (valcontents)->frame; | |
| 1883 } | |
| 1884 | |
| 1762 return Qnil; | 1885 return Qnil; |
| 1763 } | 1886 } |
| 1764 | 1887 |
| 1765 /* Find the function at the end of a chain of symbol function indirections. */ | 1888 /* Find the function at the end of a chain of symbol function indirections. */ |
| 1766 | 1889 |
| 1850 int val; | 1973 int val; |
| 1851 | 1974 |
| 1852 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size) | 1975 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size) |
| 1853 args_out_of_range (array, idx); | 1976 args_out_of_range (array, idx); |
| 1854 | 1977 |
| 1855 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR]; | 1978 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR]; |
| 1856 return (val & (1 << (idxval % BITS_PER_CHAR)) ? Qt : Qnil); | 1979 return (val & (1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR)) ? Qt : Qnil); |
| 1857 } | 1980 } |
| 1858 else if (CHAR_TABLE_P (array)) | 1981 else if (CHAR_TABLE_P (array)) |
| 1859 { | 1982 { |
| 1860 Lisp_Object val; | 1983 Lisp_Object val; |
| 1861 | 1984 |
| 1863 | 1986 |
| 1864 if (idxval < 0) | 1987 if (idxval < 0) |
| 1865 args_out_of_range (array, idx); | 1988 args_out_of_range (array, idx); |
| 1866 if (idxval < CHAR_TABLE_ORDINARY_SLOTS) | 1989 if (idxval < CHAR_TABLE_ORDINARY_SLOTS) |
| 1867 { | 1990 { |
| 1991 if (! SINGLE_BYTE_CHAR_P (idxval)) | |
| 1992 args_out_of_range (array, idx); | |
| 1868 /* For ASCII and 8-bit European characters, the element is | 1993 /* For ASCII and 8-bit European characters, the element is |
| 1869 stored in the top table. */ | 1994 stored in the top table. */ |
| 1870 val = XCHAR_TABLE (array)->contents[idxval]; | 1995 val = XCHAR_TABLE (array)->contents[idxval]; |
| 1996 if (NILP (val)) | |
| 1997 { | |
| 1998 int default_slot | |
| 1999 = (idxval < 0x80 ? CHAR_TABLE_DEFAULT_SLOT_ASCII | |
| 2000 : idxval < 0xA0 ? CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL | |
| 2001 : CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC); | |
| 2002 val = XCHAR_TABLE (array)->contents[default_slot]; | |
| 2003 } | |
| 1871 if (NILP (val)) | 2004 if (NILP (val)) |
| 1872 val = XCHAR_TABLE (array)->defalt; | 2005 val = XCHAR_TABLE (array)->defalt; |
| 1873 while (NILP (val)) /* Follow parents until we find some value. */ | 2006 while (NILP (val)) /* Follow parents until we find some value. */ |
| 1874 { | 2007 { |
| 1875 array = XCHAR_TABLE (array)->parent; | 2008 array = XCHAR_TABLE (array)->parent; |
| 1883 } | 2016 } |
| 1884 else | 2017 else |
| 1885 { | 2018 { |
| 1886 int code[4], i; | 2019 int code[4], i; |
| 1887 Lisp_Object sub_table; | 2020 Lisp_Object sub_table; |
| 2021 Lisp_Object current_default; | |
| 1888 | 2022 |
| 1889 SPLIT_CHAR (idxval, code[0], code[1], code[2]); | 2023 SPLIT_CHAR (idxval, code[0], code[1], code[2]); |
| 1890 if (code[1] < 32) code[1] = -1; | 2024 if (code[1] < 32) code[1] = -1; |
| 1891 else if (code[2] < 32) code[2] = -1; | 2025 else if (code[2] < 32) code[2] = -1; |
| 1892 | 2026 |
| 1896 increment CODE[0] by 128 to get a correct index. */ | 2030 increment CODE[0] by 128 to get a correct index. */ |
| 1897 code[0] += 128; | 2031 code[0] += 128; |
| 1898 code[3] = -1; /* anchor */ | 2032 code[3] = -1; /* anchor */ |
| 1899 | 2033 |
| 1900 try_parent_char_table: | 2034 try_parent_char_table: |
| 2035 current_default = XCHAR_TABLE (array)->defalt; | |
| 1901 sub_table = array; | 2036 sub_table = array; |
| 1902 for (i = 0; code[i] >= 0; i++) | 2037 for (i = 0; code[i] >= 0; i++) |
| 1903 { | 2038 { |
| 1904 val = XCHAR_TABLE (sub_table)->contents[code[i]]; | 2039 val = XCHAR_TABLE (sub_table)->contents[code[i]]; |
| 1905 if (SUB_CHAR_TABLE_P (val)) | 2040 if (SUB_CHAR_TABLE_P (val)) |
| 1906 sub_table = val; | 2041 { |
| 2042 sub_table = val; | |
| 2043 if (! NILP (XCHAR_TABLE (sub_table)->defalt)) | |
| 2044 current_default = XCHAR_TABLE (sub_table)->defalt; | |
| 2045 } | |
| 1907 else | 2046 else |
| 1908 { | 2047 { |
| 1909 if (NILP (val)) | 2048 if (NILP (val)) |
| 1910 val = XCHAR_TABLE (sub_table)->defalt; | 2049 val = current_default; |
| 1911 if (NILP (val)) | 2050 if (NILP (val)) |
| 1912 { | 2051 { |
| 1913 array = XCHAR_TABLE (array)->parent; | 2052 array = XCHAR_TABLE (array)->parent; |
| 1914 if (!NILP (array)) | 2053 if (!NILP (array)) |
| 1915 goto try_parent_char_table; | 2054 goto try_parent_char_table; |
| 1916 } | 2055 } |
| 1917 return val; | 2056 return val; |
| 1918 } | 2057 } |
| 1919 } | 2058 } |
| 1920 /* Here, VAL is a sub char table. We try the default value | 2059 /* Reaching here means IDXVAL is a generic character in |
| 1921 and parent. */ | 2060 which each character or a group has independent value. |
| 1922 val = XCHAR_TABLE (val)->defalt; | 2061 Essentially it's nonsense to get a value for such a |
| 2062 generic character, but for backward compatibility, we try | |
| 2063 the default value and parent. */ | |
| 2064 val = current_default; | |
| 1923 if (NILP (val)) | 2065 if (NILP (val)) |
| 1924 { | 2066 { |
| 1925 array = XCHAR_TABLE (array)->parent; | 2067 array = XCHAR_TABLE (array)->parent; |
| 1926 if (!NILP (array)) | 2068 if (!NILP (array)) |
| 1927 goto try_parent_char_table; | 2069 goto try_parent_char_table; |
| 1943 args_out_of_range (array, idx); | 2085 args_out_of_range (array, idx); |
| 1944 return XVECTOR (array)->contents[idxval]; | 2086 return XVECTOR (array)->contents[idxval]; |
| 1945 } | 2087 } |
| 1946 } | 2088 } |
| 1947 | 2089 |
| 1948 /* Don't use alloca for relocating string data larger than this, lest | |
| 1949 we overflow their stack. The value is the same as what used in | |
| 1950 fns.c for base64 handling. */ | |
| 1951 #define MAX_ALLOCA 16*1024 | |
| 1952 | |
| 1953 DEFUN ("aset", Faset, Saset, 3, 3, 0, | 2090 DEFUN ("aset", Faset, Saset, 3, 3, 0, |
| 1954 doc: /* Store into the element of ARRAY at index IDX the value NEWELT. | 2091 doc: /* Store into the element of ARRAY at index IDX the value NEWELT. |
| 1955 Return NEWELT. ARRAY may be a vector, a string, a char-table or a | 2092 Return NEWELT. ARRAY may be a vector, a string, a char-table or a |
| 1956 bool-vector. IDX starts at 0. */) | 2093 bool-vector. IDX starts at 0. */) |
| 1957 (array, idx, newelt) | 2094 (array, idx, newelt) |
| 1978 int val; | 2115 int val; |
| 1979 | 2116 |
| 1980 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size) | 2117 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size) |
| 1981 args_out_of_range (array, idx); | 2118 args_out_of_range (array, idx); |
| 1982 | 2119 |
| 1983 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR]; | 2120 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR]; |
| 1984 | 2121 |
| 1985 if (! NILP (newelt)) | 2122 if (! NILP (newelt)) |
| 1986 val |= 1 << (idxval % BITS_PER_CHAR); | 2123 val |= 1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR); |
| 1987 else | 2124 else |
| 1988 val &= ~(1 << (idxval % BITS_PER_CHAR)); | 2125 val &= ~(1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR)); |
| 1989 XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR] = val; | 2126 XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR] = val; |
| 1990 } | 2127 } |
| 1991 else if (CHAR_TABLE_P (array)) | 2128 else if (CHAR_TABLE_P (array)) |
| 1992 { | 2129 { |
| 1993 if (idxval < 0) | 2130 if (idxval < 0) |
| 1994 args_out_of_range (array, idx); | 2131 args_out_of_range (array, idx); |
| 1995 if (idxval < CHAR_TABLE_ORDINARY_SLOTS) | 2132 if (idxval < CHAR_TABLE_ORDINARY_SLOTS) |
| 1996 XCHAR_TABLE (array)->contents[idxval] = newelt; | 2133 { |
| 2134 if (! SINGLE_BYTE_CHAR_P (idxval)) | |
| 2135 args_out_of_range (array, idx); | |
| 2136 XCHAR_TABLE (array)->contents[idxval] = newelt; | |
| 2137 } | |
| 1997 else | 2138 else |
| 1998 { | 2139 { |
| 1999 int code[4], i; | 2140 int code[4], i; |
| 2000 Lisp_Object val; | 2141 Lisp_Object val; |
| 2001 | 2142 |
| 2014 else | 2155 else |
| 2015 { | 2156 { |
| 2016 Lisp_Object temp; | 2157 Lisp_Object temp; |
| 2017 | 2158 |
| 2018 /* VAL is a leaf. Create a sub char table with the | 2159 /* VAL is a leaf. Create a sub char table with the |
| 2019 default value VAL or XCHAR_TABLE (array)->defalt | 2160 initial value VAL and look into it. */ |
| 2020 and look into it. */ | 2161 |
| 2021 | 2162 temp = make_sub_char_table (val); |
| 2022 temp = make_sub_char_table (NILP (val) | |
| 2023 ? XCHAR_TABLE (array)->defalt | |
| 2024 : val); | |
| 2025 XCHAR_TABLE (array)->contents[code[i]] = temp; | 2163 XCHAR_TABLE (array)->contents[code[i]] = temp; |
| 2026 array = temp; | 2164 array = temp; |
| 2027 } | 2165 } |
| 2028 } | 2166 } |
| 2029 XCHAR_TABLE (array)->contents[code[i]] = newelt; | 2167 XCHAR_TABLE (array)->contents[code[i]] = newelt; |
| 2030 } | 2168 } |
| 2031 } | 2169 } |
| 2032 else if (STRING_MULTIBYTE (array)) | 2170 else if (STRING_MULTIBYTE (array)) |
| 2033 { | 2171 { |
| 2034 int idxval_byte, prev_bytes, new_bytes; | 2172 int idxval_byte, prev_bytes, new_bytes, nbytes; |
| 2035 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1; | 2173 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1; |
| 2036 | 2174 |
| 2037 if (idxval < 0 || idxval >= SCHARS (array)) | 2175 if (idxval < 0 || idxval >= SCHARS (array)) |
| 2038 args_out_of_range (array, idx); | 2176 args_out_of_range (array, idx); |
| 2039 CHECK_NUMBER (newelt); | 2177 CHECK_NUMBER (newelt); |
| 2178 | |
| 2179 nbytes = SBYTES (array); | |
| 2040 | 2180 |
| 2041 idxval_byte = string_char_to_byte (array, idxval); | 2181 idxval_byte = string_char_to_byte (array, idxval); |
| 2042 p1 = SDATA (array) + idxval_byte; | 2182 p1 = SDATA (array) + idxval_byte; |
| 2043 PARSE_MULTIBYTE_SEQ (p1, nbytes - idxval_byte, prev_bytes); | 2183 PARSE_MULTIBYTE_SEQ (p1, nbytes - idxval_byte, prev_bytes); |
| 2044 new_bytes = CHAR_STRING (XINT (newelt), p0); | 2184 new_bytes = CHAR_STRING (XINT (newelt), p0); |
| 2045 if (prev_bytes != new_bytes) | 2185 if (prev_bytes != new_bytes) |
| 2046 { | 2186 { |
| 2047 /* We must relocate the string data. */ | 2187 /* We must relocate the string data. */ |
| 2048 int nchars = SCHARS (array); | 2188 int nchars = SCHARS (array); |
| 2049 int nbytes = SBYTES (array); | |
| 2050 unsigned char *str; | 2189 unsigned char *str; |
| 2051 | 2190 USE_SAFE_ALLOCA; |
| 2052 str = (nbytes <= MAX_ALLOCA | 2191 |
| 2053 ? (unsigned char *) alloca (nbytes) | 2192 SAFE_ALLOCA (str, unsigned char *, nbytes); |
| 2054 : (unsigned char *) xmalloc (nbytes)); | |
| 2055 bcopy (SDATA (array), str, nbytes); | 2193 bcopy (SDATA (array), str, nbytes); |
| 2056 allocate_string_data (XSTRING (array), nchars, | 2194 allocate_string_data (XSTRING (array), nchars, |
| 2057 nbytes + new_bytes - prev_bytes); | 2195 nbytes + new_bytes - prev_bytes); |
| 2058 bcopy (str, SDATA (array), idxval_byte); | 2196 bcopy (str, SDATA (array), idxval_byte); |
| 2059 p1 = SDATA (array) + idxval_byte; | 2197 p1 = SDATA (array) + idxval_byte; |
| 2060 bcopy (str + idxval_byte + prev_bytes, p1 + new_bytes, | 2198 bcopy (str + idxval_byte + prev_bytes, p1 + new_bytes, |
| 2061 nbytes - (idxval_byte + prev_bytes)); | 2199 nbytes - (idxval_byte + prev_bytes)); |
| 2062 if (nbytes > MAX_ALLOCA) | 2200 SAFE_FREE (); |
| 2063 xfree (str); | |
| 2064 clear_string_char_byte_cache (); | 2201 clear_string_char_byte_cache (); |
| 2065 } | 2202 } |
| 2066 while (new_bytes--) | 2203 while (new_bytes--) |
| 2067 *p1++ = *p0++; | 2204 *p1++ = *p0++; |
| 2068 } | 2205 } |
| 2080 multibyte. */ | 2217 multibyte. */ |
| 2081 int idxval_byte, prev_bytes, new_bytes; | 2218 int idxval_byte, prev_bytes, new_bytes; |
| 2082 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1; | 2219 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1; |
| 2083 unsigned char *origstr = SDATA (array), *str; | 2220 unsigned char *origstr = SDATA (array), *str; |
| 2084 int nchars, nbytes; | 2221 int nchars, nbytes; |
| 2222 USE_SAFE_ALLOCA; | |
| 2085 | 2223 |
| 2086 nchars = SCHARS (array); | 2224 nchars = SCHARS (array); |
| 2087 nbytes = idxval_byte = count_size_as_multibyte (origstr, idxval); | 2225 nbytes = idxval_byte = count_size_as_multibyte (origstr, idxval); |
| 2088 nbytes += count_size_as_multibyte (origstr + idxval, | 2226 nbytes += count_size_as_multibyte (origstr + idxval, |
| 2089 nchars - idxval); | 2227 nchars - idxval); |
| 2090 str = (nbytes <= MAX_ALLOCA | 2228 SAFE_ALLOCA (str, unsigned char *, nbytes); |
| 2091 ? (unsigned char *) alloca (nbytes) | |
| 2092 : (unsigned char *) xmalloc (nbytes)); | |
| 2093 copy_text (SDATA (array), str, nchars, 0, 1); | 2229 copy_text (SDATA (array), str, nchars, 0, 1); |
| 2094 PARSE_MULTIBYTE_SEQ (str + idxval_byte, nbytes - idxval_byte, | 2230 PARSE_MULTIBYTE_SEQ (str + idxval_byte, nbytes - idxval_byte, |
| 2095 prev_bytes); | 2231 prev_bytes); |
| 2096 new_bytes = CHAR_STRING (XINT (newelt), p0); | 2232 new_bytes = CHAR_STRING (XINT (newelt), p0); |
| 2097 allocate_string_data (XSTRING (array), nchars, | 2233 allocate_string_data (XSTRING (array), nchars, |
| 2100 p1 = SDATA (array) + idxval_byte; | 2236 p1 = SDATA (array) + idxval_byte; |
| 2101 while (new_bytes--) | 2237 while (new_bytes--) |
| 2102 *p1++ = *p0++; | 2238 *p1++ = *p0++; |
| 2103 bcopy (str + idxval_byte + prev_bytes, p1, | 2239 bcopy (str + idxval_byte + prev_bytes, p1, |
| 2104 nbytes - (idxval_byte + prev_bytes)); | 2240 nbytes - (idxval_byte + prev_bytes)); |
| 2105 if (nbytes > MAX_ALLOCA) | 2241 SAFE_FREE (); |
| 2106 xfree (str); | |
| 2107 clear_string_char_byte_cache (); | 2242 clear_string_char_byte_cache (); |
| 2108 } | 2243 } |
| 2109 } | 2244 } |
| 2110 | 2245 |
| 2111 return newelt; | 2246 return newelt; |
| 2243 | 2378 |
| 2244 Lisp_Object | 2379 Lisp_Object |
| 2245 long_to_cons (i) | 2380 long_to_cons (i) |
| 2246 unsigned long i; | 2381 unsigned long i; |
| 2247 { | 2382 { |
| 2248 unsigned int top = i >> 16; | 2383 unsigned long top = i >> 16; |
| 2249 unsigned int bot = i & 0xFFFF; | 2384 unsigned int bot = i & 0xFFFF; |
| 2250 if (top == 0) | 2385 if (top == 0) |
| 2251 return make_number (bot); | 2386 return make_number (bot); |
| 2252 if (top == (unsigned long)-1 >> 16) | 2387 if (top == (unsigned long)-1 >> 16) |
| 2253 return Fcons (make_number (-1), make_number (bot)); | 2388 return Fcons (make_number (-1), make_number (bot)); |
| 2588 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */) | 2723 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */) |
| 2589 (nargs, args) | 2724 (nargs, args) |
| 2590 int nargs; | 2725 int nargs; |
| 2591 Lisp_Object *args; | 2726 Lisp_Object *args; |
| 2592 { | 2727 { |
| 2728 int argnum; | |
| 2729 for (argnum = 2; argnum < nargs; argnum++) | |
| 2730 if (FLOATP (args[argnum])) | |
| 2731 return float_arith_driver (0, 0, Adiv, nargs, args); | |
| 2593 return arith_driver (Adiv, nargs, args); | 2732 return arith_driver (Adiv, nargs, args); |
| 2594 } | 2733 } |
| 2595 | 2734 |
| 2596 DEFUN ("%", Frem, Srem, 2, 2, 0, | 2735 DEFUN ("%", Frem, Srem, 2, 2, 0, |
| 2597 doc: /* Return remainder of X divided by Y. | 2736 doc: /* Return remainder of X divided by Y. |
| 2804 { | 2943 { |
| 2805 CHECK_NUMBER (number); | 2944 CHECK_NUMBER (number); |
| 2806 XSETINT (number, ~XINT (number)); | 2945 XSETINT (number, ~XINT (number)); |
| 2807 return number; | 2946 return number; |
| 2808 } | 2947 } |
| 2948 | |
| 2949 DEFUN ("byteorder", Fbyteorder, Sbyteorder, 0, 0, 0, | |
| 2950 doc: /* Return the byteorder for the machine. | |
| 2951 Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII | |
| 2952 lowercase l) for small endian machines. */) | |
| 2953 () | |
| 2954 { | |
| 2955 unsigned i = 0x04030201; | |
| 2956 int order = *(char *)&i == 1 ? 108 : 66; | |
| 2957 | |
| 2958 return make_number (order); | |
| 2959 } | |
| 2960 | |
| 2961 | |
| 2809 | 2962 |
| 2810 void | 2963 void |
| 2811 syms_of_data () | 2964 syms_of_data () |
| 2812 { | 2965 { |
| 2813 Lisp_Object error_tail, arith_tail; | 2966 Lisp_Object error_tail, arith_tail; |
| 3035 staticpro (&Qquit); | 3188 staticpro (&Qquit); |
| 3036 staticpro (&Qwrong_type_argument); | 3189 staticpro (&Qwrong_type_argument); |
| 3037 staticpro (&Qargs_out_of_range); | 3190 staticpro (&Qargs_out_of_range); |
| 3038 staticpro (&Qvoid_function); | 3191 staticpro (&Qvoid_function); |
| 3039 staticpro (&Qcyclic_function_indirection); | 3192 staticpro (&Qcyclic_function_indirection); |
| 3193 staticpro (&Qcyclic_variable_indirection); | |
| 3040 staticpro (&Qvoid_variable); | 3194 staticpro (&Qvoid_variable); |
| 3041 staticpro (&Qsetting_constant); | 3195 staticpro (&Qsetting_constant); |
| 3042 staticpro (&Qinvalid_read_syntax); | 3196 staticpro (&Qinvalid_read_syntax); |
| 3043 staticpro (&Qwrong_number_of_arguments); | 3197 staticpro (&Qwrong_number_of_arguments); |
| 3044 staticpro (&Qinvalid_function); | 3198 staticpro (&Qinvalid_function); |
| 3120 staticpro (&Qchar_table); | 3274 staticpro (&Qchar_table); |
| 3121 staticpro (&Qbool_vector); | 3275 staticpro (&Qbool_vector); |
| 3122 staticpro (&Qhash_table); | 3276 staticpro (&Qhash_table); |
| 3123 | 3277 |
| 3124 defsubr (&Sindirect_variable); | 3278 defsubr (&Sindirect_variable); |
| 3125 defsubr (&Ssubr_interactive_form); | 3279 defsubr (&Sinteractive_form); |
| 3126 defsubr (&Seq); | 3280 defsubr (&Seq); |
| 3127 defsubr (&Snull); | 3281 defsubr (&Snull); |
| 3128 defsubr (&Stype_of); | 3282 defsubr (&Stype_of); |
| 3129 defsubr (&Slistp); | 3283 defsubr (&Slistp); |
| 3130 defsubr (&Snlistp); | 3284 defsubr (&Snlistp); |
| 3178 defsubr (&Smake_local_variable); | 3332 defsubr (&Smake_local_variable); |
| 3179 defsubr (&Skill_local_variable); | 3333 defsubr (&Skill_local_variable); |
| 3180 defsubr (&Smake_variable_frame_local); | 3334 defsubr (&Smake_variable_frame_local); |
| 3181 defsubr (&Slocal_variable_p); | 3335 defsubr (&Slocal_variable_p); |
| 3182 defsubr (&Slocal_variable_if_set_p); | 3336 defsubr (&Slocal_variable_if_set_p); |
| 3337 defsubr (&Svariable_binding_locus); | |
| 3183 defsubr (&Saref); | 3338 defsubr (&Saref); |
| 3184 defsubr (&Saset); | 3339 defsubr (&Saset); |
| 3185 defsubr (&Snumber_to_string); | 3340 defsubr (&Snumber_to_string); |
| 3186 defsubr (&Sstring_to_number); | 3341 defsubr (&Sstring_to_number); |
| 3187 defsubr (&Seqlsign); | 3342 defsubr (&Seqlsign); |
| 3205 defsubr (&Slsh); | 3360 defsubr (&Slsh); |
| 3206 defsubr (&Sash); | 3361 defsubr (&Sash); |
| 3207 defsubr (&Sadd1); | 3362 defsubr (&Sadd1); |
| 3208 defsubr (&Ssub1); | 3363 defsubr (&Ssub1); |
| 3209 defsubr (&Slognot); | 3364 defsubr (&Slognot); |
| 3365 defsubr (&Sbyteorder); | |
| 3210 defsubr (&Ssubr_arity); | 3366 defsubr (&Ssubr_arity); |
| 3367 defsubr (&Ssubr_name); | |
| 3211 | 3368 |
| 3212 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function; | 3369 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function; |
| 3213 | 3370 |
| 3214 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum, | 3371 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum, |
| 3215 doc: /* The largest value that is representable in a Lisp integer. */); | 3372 doc: /* The largest value that is representable in a Lisp integer. */); |
| 3237 sigrelse (SIGFPE); | 3394 sigrelse (SIGFPE); |
| 3238 #else /* not BSD4_1 */ | 3395 #else /* not BSD4_1 */ |
| 3239 sigsetmask (SIGEMPTYMASK); | 3396 sigsetmask (SIGEMPTYMASK); |
| 3240 #endif /* not BSD4_1 */ | 3397 #endif /* not BSD4_1 */ |
| 3241 | 3398 |
| 3399 SIGNAL_THREAD_CHECK (signo); | |
| 3242 Fsignal (Qarith_error, Qnil); | 3400 Fsignal (Qarith_error, Qnil); |
| 3243 } | 3401 } |
| 3244 | 3402 |
| 3245 void | 3403 void |
| 3246 init_data () | 3404 init_data () |
| 3257 | 3415 |
| 3258 #ifdef uts | 3416 #ifdef uts |
| 3259 signal (SIGEMT, arith_error); | 3417 signal (SIGEMT, arith_error); |
| 3260 #endif /* uts */ | 3418 #endif /* uts */ |
| 3261 } | 3419 } |
| 3420 | |
| 3421 /* arch-tag: 25879798-b84d-479a-9c89-7d148e2109f7 | |
| 3422 (do not change this comment) */ |
