update.
[chise/xemacs-chise.git.1] / src / symbols.c
index ae1dc92..db4fbe4 100644 (file)
@@ -735,7 +735,7 @@ Set SYMBOL's property list to NEWPLIST, and return NEWPLIST.
 #if 0 /* Inserted for debugging 6/28/1997 -slb */
   /* Somebody is setting a property list of integer 0, who? */
   /* Not this way apparently. */
-  if (EQ(newplist, Qzero)) abort();
+  if (EQ(newplist, Qzero)) ABORT();
 #endif
 
   XSYMBOL (symbol)->plist = newplist;
@@ -1118,7 +1118,7 @@ do_symval_forwarding (Lisp_Object valcontents, struct buffer *buffer,
       return valcontents;
 
     default:
-      abort ();
+      ABORT ();
     }
   return Qnil; /* suppress compiler warning */
 }
@@ -1294,7 +1294,7 @@ store_symval_forwarding (Lisp_Object sym, Lisp_Object ovalue,
          return;
 
        default:
-         abort ();
+         ABORT ();
        }
     }
 }
@@ -1890,7 +1890,7 @@ Set SYMBOL's value to NEWVAL, and return NEWVAL.
        break;
       }
     default:
-      abort ();
+      ABORT ();
     }
   store_symval_forwarding (symbol, valcontents, newval);
 
@@ -2159,7 +2159,7 @@ sets it.
          return variable;
 
        default:
-         abort ();
+         ABORT ();
        }
     }
 
@@ -2269,7 +2269,7 @@ Use `make-local-hook' instead.
          }
 
        default:
-         abort ();
+         ABORT ();
        }
     }
 
@@ -2344,7 +2344,7 @@ Use `make-local-hook' instead.
          break;
 
        default:
-         abort ();
+         ABORT ();
        }
     }
 
@@ -2662,7 +2662,7 @@ The returned info will be a symbol, one of
     case SYMVAL_UNBOUND_MARKER:                        return Qnil;
 
     default:
-      abort (); return Qnil;
+      ABORT (); return Qnil;
     }
 }
 
@@ -2860,7 +2860,7 @@ decode_magic_handler_type (Lisp_Object symbol)
   if (EQ (symbol, Qmake_local))      return MAGIC_HANDLER_MAKE_LOCAL;
 
   signal_simple_error ("Unrecognized symbol value handler type", symbol);
-  abort ();
+  ABORT ();
   return MAGIC_HANDLER_MAX;
 }
 
@@ -2893,7 +2893,7 @@ handler_type_from_function_symbol (Lisp_Object funsym, int abort_if_not_found)
     return MAGIC_HANDLER_MAKE_LOCAL;
 
   if (abort_if_not_found)
-    abort ();
+    ABORT ();
   signal_simple_error ("Unrecognized symbol-value function", funsym);
   return MAGIC_HANDLER_MAX;
 }
@@ -3192,6 +3192,31 @@ variable chain of symbols.
   return follow_varalias_pointers (object, follow_past_lisp_magic);
 }
 
+DEFUN ("variable-binding-locus", Fvariable_binding_locus, 1, 1, 0, /*
+Return a value indicating where VARIABLE's current binding comes from.
+If the current binding is buffer-local, the value is the current buffer.
+If the current binding is global (the default), the value is nil. 
+*/
+       (variable))
+{
+  Lisp_Object valcontents;
+
+  CHECK_SYMBOL (variable);
+  variable = Findirect_variable (variable, Qnil);
+
+  /* Make sure the current binding is actually swapped in.  */
+  find_symbol_value (variable);
+
+  valcontents = XSYMBOL (variable)->value;
+
+  if (SYMBOL_VALUE_MAGIC_P (valcontents)
+      && ((XSYMBOL_VALUE_MAGIC_TYPE (valcontents) == SYMVAL_BUFFER_LOCAL)
+         || (XSYMBOL_VALUE_MAGIC_TYPE (valcontents) == SYMVAL_SOME_BUFFER_LOCAL))
+      && (!NILP (Flocal_variable_p (variable, Fcurrent_buffer (), Qnil))))
+    return Fcurrent_buffer ();
+  else
+    return Qnil;
+}
 \f
 /************************************************************************/
 /*                            initialization                            */
@@ -3264,6 +3289,11 @@ init_symbols_once_early (void)
 
   XSYMBOL (Qnil)->function = Qunbound;
 
+#ifdef UTF2000
+  /* [tomo:2002-01-22] We should not define Qunloaded as a normal symbol */
+  defsymbol (&Qunloaded, "#<unloaded>");
+#endif
+
   defsymbol (&Qt, "t");
   XSYMBOL (Qt)->value = Qt;    /* Veritas aeterna */
   Vquit_flag = Qnil;
@@ -3292,8 +3322,8 @@ defsymbol_massage_name_1 (Lisp_Object *location, const char *name, int dump_p,
                          int multiword_predicate_p)
 {
   char temp[500];
-  int len = strlen (name) - 1;
-  int i;
+  size_t len = strlen (name) - 1;
+  size_t i;
 
   if (multiword_predicate_p)
     assert (len + 1 < sizeof (temp));
@@ -3369,7 +3399,7 @@ void
 defkeyword_massage_name (Lisp_Object *location, const char *name)
 {
   char temp[500];
-  int len = strlen (name);
+  size_t len = strlen (name);
 
   assert (len < sizeof (temp));
   strcpy (temp, name);
@@ -3504,8 +3534,8 @@ deferror_massage_name_and_message (Lisp_Object *symbol, const char *name,
                                   Lisp_Object inherits_from)
 {
   char temp[500];
-  int i;
-  int len = strlen (name) - 1;
+  size_t i;
+  size_t len = strlen (name) - 1;
 
   assert (len < sizeof (temp));
   strcpy (temp, name + 1); /* Remove initial Q */
@@ -3548,7 +3578,6 @@ syms_of_symbols (void)
   DEFSYMBOL (Qsymbol_value_in_buffer);
   DEFSYMBOL (Qsymbol_value_in_console);
   DEFSYMBOL (Qlocal_variable_p);
-
   DEFSYMBOL (Qconst_integer);
   DEFSYMBOL (Qconst_boolean);
   DEFSYMBOL (Qconst_object);
@@ -3595,6 +3624,7 @@ syms_of_symbols (void)
   DEFSUBR (Fdefvaralias);
   DEFSUBR (Fvariable_alias);
   DEFSUBR (Findirect_variable);
+  DEFSUBR (Fvariable_binding_locus);
   DEFSUBR (Fdontusethis_set_symbol_value_handler);
 }