📄 data.c
字号:
DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0, "Return SYMBOL's value.") (sym) Lisp_Object sym;{ register Lisp_Object valcontents, tem1; register Lisp_Object val; CHECK_SYMBOL (sym, 0); valcontents = XSYMBOL (sym)->value; retry:#ifdef SWITCH_ENUM_BUG switch ((int) XTYPE (valcontents))#else switch (XTYPE (valcontents))#endif { case Lisp_Buffer_Local_Value: case Lisp_Some_Buffer_Local_Value: /* valcontents is a list (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)). CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's local_var_alist, that being the element whose car is this variable. Or it can be a pointer to the (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not have an element in its alist for this variable. If the current buffer is not BUFFER, we store the current REALVALUE value into CURRENT-ALIST-ELEMENT, then find the appropriate alist element for the buffer now current and set up CURRENT-ALIST-ELEMENT. Then we set REALVALUE out of that element, and store into BUFFER. Note that REALVALUE can be a forwarding pointer. */ tem1 = XCONS (XCONS (valcontents)->cdr)->car; if (NULL (tem1) || current_buffer != XBUFFER (tem1)) { tem1 = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car; Fsetcdr (tem1, do_symval_forwarding (XCONS (valcontents)->car)); tem1 = assq_no_quit (sym, current_buffer->local_var_alist); if (NULL (tem1)) tem1 = XCONS (XCONS (valcontents)->cdr)->cdr; XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car = tem1; XSET (XCONS (XCONS (valcontents)->cdr)->car, Lisp_Buffer, current_buffer); store_symval_forwarding (sym, XCONS (valcontents)->car, Fcdr (tem1)); } valcontents = XCONS (valcontents)->car; goto retry; case Lisp_Intfwd: XSET (val, Lisp_Int, *XINTPTR (valcontents)); return val; case Lisp_Boolfwd: if (*XINTPTR (valcontents)) return Qt; return Qnil; case Lisp_Objfwd: return *XOBJFWD (valcontents); case Lisp_Buffer_Objfwd: return *(Lisp_Object *)(XUINT (valcontents) + (char *)current_buffer); case Lisp_Symbol: /* For a symbol, check whether it is 'unbound. */ if (!EQ (valcontents, Qunbound)) break; /* drops through! */ case Lisp_Void: return Fsignal (Qvoid_variable, Fcons (sym, Qnil)); } return valcontents;}DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0, "Return SYMBOL's default value.\n\This is the value that is seen in buffers that do not have their own values\n\for this variable.") (sym) Lisp_Object sym;{ register Lisp_Object valcontents; CHECK_SYMBOL (sym, 0); valcontents = XSYMBOL (sym)->value; if (XTYPE (valcontents) == Lisp_Buffer_Objfwd) { register int idx = XUINT (valcontents); if (*(int *) (idx + (char *) &buffer_local_flags) != 0) return *(Lisp_Object *)(idx + (char *) &buffer_defaults); } if (XTYPE (valcontents) == Lisp_Buffer_Local_Value || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value) return XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->cdr; return Fsymbol_value (sym);}DEFUN ("set", Fset, Sset, 2, 2, 0, "Set SYMBOL's value to NEWVAL, and return NEWVAL.") (sym, newval) register Lisp_Object sym, newval;{#ifndef RTPC_REGISTER_BUG register Lisp_Object valcontents, tem1, current_alist_element;#else /* RTPC_REGISTER_BUG */ register Lisp_Object tem1; Lisp_Object valcontents, current_alist_element;#endif /* RTPC_REGISTER_BUG */ CHECK_SYMBOL (sym, 0); if (NULL (sym) || EQ (sym, Qt)) return Fsignal (Qsetting_constant, Fcons (sym, Qnil)); valcontents = XSYMBOL (sym)->value; if (XTYPE (valcontents) == Lisp_Buffer_Objfwd) { register int idx = XUINT (valcontents); register int mask = *(int *)(idx + (char *) &buffer_local_flags); if (mask > 0) current_buffer->local_var_flags |= mask; } if (XTYPE (valcontents) == Lisp_Buffer_Local_Value || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value) { /* valcontents is a list (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)). CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's local_var_alist, that being the element whose car is this variable. Or it can be a pointer to the (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not have an element in its alist for this variable. If the current buffer is not BUFFER, we store the current REALVALUE value into CURRENT-ALIST-ELEMENT, then find the appropriate alist element for the buffer now current and set up CURRENT-ALIST-ELEMENT. Then we set REALVALUE out of that element, and store into BUFFER. Note that REALVALUE can be a forwarding pointer. */ current_alist_element = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car; if (current_buffer != ((XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value) ? XBUFFER (XCONS (XCONS (valcontents)->cdr)->car) : XBUFFER (XCONS (current_alist_element)->car))) { Fsetcdr (current_alist_element, do_symval_forwarding (XCONS (valcontents)->car)); tem1 = Fassq (sym, current_buffer->local_var_alist); if (NULL (tem1)) /* This buffer sees the default value still. If type is Lisp_Some_Buffer_Local_Value, set the default value. If type is Lisp_Buffer_Local_Value, give this buffer a local value and set that. */ if (XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value) tem1 = XCONS (XCONS (valcontents)->cdr)->cdr; else { tem1 = Fcons (sym, Fcdr (current_alist_element)); current_buffer->local_var_alist = Fcons (tem1, current_buffer->local_var_alist); } XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car = tem1; XSET (XCONS (XCONS (valcontents)->cdr)->car, Lisp_Buffer, current_buffer); } valcontents = XCONS (valcontents)->car; } store_symval_forwarding (sym, valcontents, newval); return newval;}DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0, "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\The default value is seen in buffers that do not have their own values\n\for this variable.") (sym, value) Lisp_Object sym, value;{ register Lisp_Object valcontents, current_alist_element, alist_element_buffer; CHECK_SYMBOL (sym, 0); valcontents = XSYMBOL (sym)->value; /* Handle variables like case-fold-search that have special slots in the buffer. Make them work apparently like Lisp_Buffer_Local_Value variables. */ if (XTYPE (valcontents) == Lisp_Buffer_Objfwd) { register int idx = XUINT (valcontents);#ifndef RTPC_REGISTER_BUG register struct buffer *b;#else struct buffer *b;#endif register int mask = *(int *) (idx + (char *) &buffer_local_flags); if (mask > 0) { *(Lisp_Object *)(idx + (char *) &buffer_defaults) = value; for (b = all_buffers; b; b = b->next) if (!(b->local_var_flags & mask)) *(Lisp_Object *)(idx + (char *) b) = value; } return value; } if (XTYPE (valcontents) != Lisp_Buffer_Local_Value && XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value) return Fset (sym, value); /* Store new value into the DEFAULT-VALUE slot */ XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->cdr = value; /* If that slot is current, we must set the REALVALUE slot too */ current_alist_element = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car; alist_element_buffer = Fcar (current_alist_element); if (EQ (alist_element_buffer, current_alist_element)) store_symval_forwarding (sym, XCONS (valcontents)->car, value); return value;}DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0, "Set SYMBOL's default value to VAL. VAL is evaluated; SYMBOL is not.\n\The default value is seen in buffers that do not have their own values\n\for this variable.") (args) Lisp_Object args;{ register Lisp_Object val; struct gcpro gcpro1; GCPRO1 (args); val = Feval (Fcar (Fcdr (args))); UNGCPRO; return Fset_default (Fcar (args), val);}DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local, 1, 1, "vMake Variable Buffer Local: ", "Make VARIABLE have a separate value for each buffer.\n\At any time, the value for the current buffer is in effect.\n\There is also a default value which is seen in any buffer which has not yet\n\set its own value.\n\The function `default-value' gets the default value and `set-default' sets it.\n\Using `set' or `setq' to set the variable causes it to have a separate value\n\for the current buffer if it was previously using the default value.") (sym) register Lisp_Object sym;{ register Lisp_Object tem, valcontents; CHECK_SYMBOL (sym, 0); if (EQ (sym, Qnil) || EQ (sym, Qt)) error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data); valcontents = XSYMBOL (sym)->value; if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value) || (XTYPE (valcontents) == Lisp_Buffer_Objfwd)) return sym; if (XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value) { XSETTYPE (XSYMBOL (sym)->value, Lisp_Buffer_Local_Value); return sym; } if (EQ (valcontents, Qunbound)) XSYMBOL (sym)->value = Qnil; tem = Fcons (Qnil, Fsymbol_value (sym)); XCONS (tem)->car = tem; XSYMBOL (sym)->value = Fcons (XSYMBOL (sym)->value, Fcons (Fcurrent_buffer (), tem)); XSETTYPE (XSYMBOL (sym)->value, Lisp_Buffer_Local_Value); return sym;}DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable, 1, 1, "vMake Local Variable: ", "Make VARIABLE have a separate value in the current buffer.\n\Other buffers will continue to share a common default value.\n\See also `make-variable-buffer-local'.") (sym) register Lisp_Object sym;{ register Lisp_Object tem, valcontents; CHECK_SYMBOL (sym, 0); if (EQ (sym, Qnil) || EQ (sym, Qt)) error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data); valcontents = XSYMBOL (sym)->value; if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value) || (XTYPE (valcontents) == Lisp_Buffer_Objfwd)) return sym; /* Make sure sym is set up to hold per-buffer values */ if (XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value) { if (EQ (valcontents, Qunbound)) XSYMBOL (sym)->value = Qnil; tem = Fcons (Qnil, Fsymbol_value (sym)); XCONS (tem)->car = tem; XSYMBOL (sym)->value = Fcons (XSYMBOL (sym)->value, Fcons (Qnil, tem)); XSETTYPE (XSYMBOL (sym)->value, Lisp_Some_Buffer_Local_Value); } /* Make sure this buffer has its own value of sym */ tem = Fassq (sym, current_buffer->local_var_alist); if (NULL (tem)) { current_buffer->local_var_alist = Fcons (Fcons (sym, XCONS (XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->cdr)->cdr), current_buffer->local_var_alist); /* Make sure symbol does not think it is set up for this buffer; force it to look once again for this buffer's value */ { /* This local variable avoids "expression to complex" on IBM RT. */ Lisp_Object xs; xs = XSYMBOL (sym)->value; if (current_buffer == XBUFFER (XCONS (XCONS (xs)->cdr)->car)) XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Qnil; } } return sym;}DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable, 1, 1, "vKill Local Variable: ", "Make VARIABLE no longer have a separate value in the current buffer.\n\From now on the default value will apply in this buffer.") (sym) register Lisp_Object sym;{ register Lisp_Object tem, valcontents; CHECK_SYMBOL (sym, 0); valcontents = XSYMBOL (sym)->value; if (XTYPE (valcontents) == Lisp_Buffer_Objfwd) { register int idx = XUINT (valcontents); register int mask = *(int *) (idx + (char *) &buffer_local_flags); if (mask > 0) { *(Lisp_Object *)(idx + (char *) current_buffer) = *(Lisp_Object *)(idx + (char *) &buffer_defaults); current_buffer->local_var_flags &= ~mask; } return sym; } if (XTYPE (valcontents) != Lisp_Buffer_Local_Value && XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value) return sym; /* Get rid of this buffer's alist element, if any */ tem = Fassq (sym, current_buffer->local_var_alist); if (!NULL (tem)) current_buffer->local_var_alist = Fdelq (tem, current_buffer->local_var_alist); /* Make sure symbol does not think it is set up for this buffer; force it to look once again for this buffer's value */ { Lisp_Object sv; sv = XSYMBOL (sym)->value; if (current_buffer == XBUFFER (XCONS (XCONS (sv)->cdr)->car)) XCONS (XCONS (sv)->cdr)->car = Qnil; } return sym;}/* Extract and set vector and string elements */DEFUN ("aref", Faref, Saref, 2, 2, 0, "Return the element of ARRAY at index INDEX.\n\ARRAY may be a vector or a string. INDEX starts at 0.") (vector, idx) register Lisp_Object vector; Lisp_Object idx;{ register int idxval; CHECK_NUMBER (idx, 1); idxval = XINT (idx); if (XTYPE (vector) != Lisp_Vector && XTYPE (vector) != Lisp_String) vector = wrong_type_argument (Qarrayp, vector); if (idxval < 0 || idxval >= XVECTOR (vector)->size) args_out_of_range (vector, idx); if (XTYPE (vector) == Lisp_Vector) return XVECTOR (vector)->contents[idxval]; else { Lisp_Object val; XFASTINT (val) = (unsigned char) XSTRING (vector)->data[idxval]; return val; }}DEFUN ("aset", Faset, Saset, 3, 3, 0, "Store into the element of ARRAY at index INDEX the value NEWVAL.\n\ARRAY may be a vector or a string. INDEX starts at 0.") (vector, idx, newelt) register Lisp_Object vector; Lisp_Object idx, newelt;{ register int idxval; CHECK_NUMBER (idx, 1); idxval = XINT (idx); if (XTYPE (vector) != Lisp_Vector && XTYPE (vector) != Lisp_String) vector = wrong_type_argument (Qarrayp, vector); if (idxval < 0 || idxval >= XVECTOR (vector)->size) args_out_of_range (vector, idx); CHECK_IMPURE (vector); if (XTYPE (vector) == Lisp_Vector) XVECTOR (vector)->contents[idxval] = newelt; else XSTRING (vector)->data[idxval] = XINT (newelt); return newelt;}Lisp_ObjectFarray_length (vector) register Lisp_Object vector;{ register Lisp_Object size; if (XTYPE (vector) != Lisp_Vector && XTYPE (vector) != Lisp_String) vector = wrong_type_argument (Qarrayp, vector); XFASTINT (size) = XVECTOR (vector)->size; return size;}/* Arithmetic functions */DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0, "T if two args, both numbers, are equal.") (num1, num2) register Lisp_Object num1, num2;{ CHECK_NUMBER_COERCE_MARKER (num1, 0); CHECK_NUMBER_COERCE_MARKER (num2, 0); if (XINT (num1) == XINT (num2)) return Qt; return Qnil;}DEFUN ("<", Flss, Slss, 2, 2, 0, "T if first arg is less than second arg. Both must be numbers.") (num1, num2) register Lisp_Object num1, num2;{ CHECK_NUMBER_COERCE_MARKER (num1, 0); CHECK_NUMBER_COERCE_MARKER (num2, 0); if (XINT (num1) < XINT (num2)) return Qt; return Qnil;}DEFUN (">", Fgtr, Sgtr, 2, 2, 0, "T if first arg is greater than second arg. Both must be numbers.") (num1, num2) register Lisp_Object num1, num2;{ CHECK_NUMBER_COERCE_MARKER (num1, 0); CHECK_NUMBER_COERCE_MARKER (num2, 0); if (XINT (num1) > XINT (num2)) return Qt; return Qnil;}DEFUN ("<=", Fleq, Sleq, 2, 2, 0, "T if first arg is less than or equal to second arg. Both must be numbers.") (num1, num2) register Lisp_Object num1, num2;{ CHECK_NUMBER_COERCE_MARKER (num1, 0); CHECK_NUMBER_COERCE_MARKER (num2, 0); if (XINT (num1) <= XINT (num2)) return Qt; return Qnil;}DEFUN (">=", Fgeq, Sgeq, 2, 2, 0, "T if first arg is greater than or equal to second arg. Both must be numbers.") (num1, num2) register Lisp_Object num1, num2;{ CHECK_NUMBER_COERCE_MARKER (num1, 0); CHECK_NUMBER_COERCE_MARKER (num2, 0); if (XINT (num1) >= XINT (num2)) return Qt; return Qnil;}DEFUN ("/=", Fneq, Sneq, 2, 2, 0, "T if first arg is not equal to second arg. Both must be numbers.") (num1, num2) register Lisp_Object num1, num2;{ CHECK_NUMBER_COERCE_MARKER (num1, 0); CHECK_NUMBER_COERCE_MARKER (num2, 0); if (XINT (num1) != XINT (num2)) return Qt; return Qnil;}DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "T if NUMBER is zero.") (num) register Lisp_Object num;{ CHECK_NUMBER (num, 0); if (!XINT (num)) return Qt; return Qnil;}DEFUN ("int-to-string", Fint_to_string, Sint_to_string, 1, 1, 0, "Convert INT to a string by printing it in decimal, with minus sign if negative.") (num)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -