Mercurial > emacs
changeset 733:62dd28940dc6
entered into RCS
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Tue, 30 Jun 1992 13:55:35 +0000 |
parents | a8d94735277e |
children | 64e152d639af |
files | lib-src/movemail.c src/data.c src/filelock.c |
diffstat | 3 files changed, 76 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/lib-src/movemail.c Tue Jun 30 13:54:21 1992 +0000 +++ b/lib-src/movemail.c Tue Jun 30 13:55:35 1992 +0000 @@ -81,6 +81,7 @@ #undef close char *malloc (); +char *strcpy (); char *concat (); char *xmalloc (); #ifndef errno
--- a/src/data.c Tue Jun 30 13:54:21 1992 +0000 +++ b/src/data.c Tue Jun 30 13:55:35 1992 +0000 @@ -745,54 +745,94 @@ current_buffer->local_var_flags |= mask; } - if (XTYPE (valcontents) == Lisp_Buffer_Local_Value - || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value) + else 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)). + /* valcontents is actually a pointer to a cons heading something like: + (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE). + + BUFFER is the last buffer for which this symbol's value was + made up to date. - 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. + 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 (that is, if + BUFFER sees the default value of this variable). + + If we want to examine or set the value and BUFFER is current, + we just examine or set REALVALUE. If BUFFER is not current, 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. - 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. */ + If we are setting the variable and the current buffer does + not have an alist entry for this variable, an alist entry is + created. + + Note that REALVALUE can be a forwarding pointer. Each time + it is examined or set, forwarding must be done. */ + + /* What value are we caching right now? */ + current_alist_element = + XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car; - 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))) + /* If the current buffer is not the buffer whose binding is + currently cached, or if it's a Lisp_Buffer_Local_Value and + we're looking at the default value, the cache is invalid; we + need to write it out, and find the new CURRENT-ALIST-ELEMENT. */ + if ((current_buffer + != XBUFFER (XCONS (XCONS (valcontents)->cdr)->car)) + || (XTYPE (valcontents) == Lisp_Buffer_Local_Value + && XCONS (current_alist_element)->car == current_alist_element)) { - Fsetcdr (current_alist_element, do_symval_forwarding (XCONS (valcontents)->car)); + /* Write out the cached value for the old buffer; copy it + back to its alist element. This works if the current + buffer only sees the default value, too. */ + Fsetcdr (current_alist_element, + do_symval_forwarding (XCONS (valcontents)->car)); + /* Find the new value for CURRENT-ALIST-ELEMENT. */ tem1 = Fassq (sym, current_buffer->local_var_alist); if (NILP (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); - } + { + /* This buffer still sees the default value. */ + + /* If the variable is a Lisp_Some_Buffer_Local_Value, + make CURRENT-ALIST-ELEMENT point to itself, + indicating that we're seeing the default value. */ + if (XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value) + tem1 = XCONS (XCONS (valcontents)->cdr)->cdr; + + /* If it's a Lisp_Buffer_Local_Value, give this buffer a + new assoc for a local value and set + CURRENT-ALIST-ELEMENT to point to that. */ + else + { + tem1 = Fcons (sym, Fcdr (current_alist_element)); + current_buffer->local_var_alist = + Fcons (tem1, current_buffer->local_var_alist); + } + } + /* Cache the new buffer's assoc in CURRENT-ALIST-ELEMENT. */ XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car = tem1; - XSET (XCONS (XCONS (valcontents)->cdr)->car, Lisp_Buffer, current_buffer); + + /* Set BUFFER, now that CURRENT-ALIST-ELEMENT is accurate. */ + XSET (XCONS (XCONS (valcontents)->cdr)->car, + Lisp_Buffer, current_buffer); } valcontents = XCONS (valcontents)->car; } + /* If storing void (making the symbol void), forward only through buffer-local indicator, not through Lisp_Objfwd, etc. */ if (voide) store_symval_forwarding (sym, Qnil, newval); else store_symval_forwarding (sym, valcontents, newval); + return newval; } @@ -1598,7 +1638,10 @@ f1 = XTYPE (num1) == Lisp_Float ? XFLOAT (num1)->data : XINT (num1); f2 = XTYPE (num2) == Lisp_Float ? XFLOAT (num2)->data : XINT (num2); - return (make_float (drem (f1,f2))); + f1 = drem (f1, f2); + if (f1 < 0) + f1 += f2; + return (make_float (f1)); } #else /* not LISP_FLOAT_TYPE */ CHECK_NUMBER_COERCE_MARKER (num1, 0);