⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -