diff src/debug.c @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children 859a2309aef8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/debug.c	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,232 @@
+/* Debugging aids -- togglable assertions.
+   Copyright (C) 1994 Free Software Foundation, Inc.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Not in FSF. */
+
+/* This file has been Mule-ized. */
+
+/* Written by Chuck Thompson */
+
+#include <config.h>
+#include "lisp.h"
+#include "debug.h"
+#include "bytecode.h"
+
+/*
+ * To add a new debug class:
+ * 1.  Add a symbol definition for it here, if one doesn't exist
+ *     elsewhere.  If you add it here, make sure to add a defsymbol
+ *     line for it in syms_of_debug.
+ * 2.  Add an extern definition for the symbol to debug.h.
+ * 3.  Add entries for the class to struct debug_classes in debug.h.
+ * 4.  Add a FROB line for it in xemacs_debug_loop.
+ */
+
+Lisp_Object Qredisplay, Qbuffers, Qfaces;
+Lisp_Object Qwindows, Qframes, Qdevices;
+
+/* Lisp_Object Qbyte_code; in bytecode.c */
+
+struct debug_classes active_debug_classes;
+
+enum debug_loop
+{
+  ADD,
+  DELETE,
+  LIST,
+  ACTIVE,
+  INIT,
+  VALIDATE,
+  TYPE,
+  SETTYPE
+};
+
+static Lisp_Object
+xemacs_debug_loop (enum debug_loop op, Lisp_Object class, Lisp_Object type)
+{
+  int flag = ((op == ADD) ? 1 : 0);
+  Lisp_Object retval = Qnil;
+
+#define FROB(item)\
+  if (op == LIST || op == ACTIVE || op == INIT || EQ (class, Q##item))	\
+    {									\
+      if (op == ADD || op == DELETE || op == INIT)			\
+	active_debug_classes.item = flag;				\
+      else if (op == LIST						\
+	       || (op == ACTIVE && active_debug_classes.item))		\
+	retval = Fcons (Q##item, retval);				\
+      else if (op == VALIDATE)						\
+	return Qt;							\
+      else if (op == SETTYPE)						\
+        active_debug_classes.types_of_##item = XINT (type);		\
+      else if (op == TYPE)						\
+        retval = make_int (active_debug_classes.types_of_##item), Qnil; \
+      if (op == INIT) active_debug_classes.types_of_##item = VALBITS;	\
+    }
+
+  FROB (redisplay);
+  FROB (buffers);
+  FROB (extents);
+  FROB (faces);
+  FROB (windows);
+  FROB (frames);
+  FROB (devices);
+  FROB (byte_code);
+    
+  return retval;
+#undef FROB
+}
+
+DEFUN ("add-debug-class-to-check", Fadd_debug_class_to_check,
+       Sadd_debug_class_to_check, 1, 1, 0 /*
+Add a debug class to the list of active classes.
+*/ )
+     (class)
+     Lisp_Object class;
+{
+  if (NILP (xemacs_debug_loop (VALIDATE, class, Qnil)))
+    error ("No such debug class exists");
+  else
+    xemacs_debug_loop (ADD, class, Qnil);
+
+  return (xemacs_debug_loop (ACTIVE, Qnil, Qnil));
+}
+
+DEFUN ("delete-debug-class-to-check", Fdelete_debug_class_to_check,
+       Sdelete_debug_class_to_check, 1, 1, 0 /*
+Delete a debug class from the list of active classes.
+*/ )
+     (class)
+     Lisp_Object class;
+{
+  if (NILP (xemacs_debug_loop (VALIDATE, class, Qnil)))
+    error ("No such debug class exists");
+  else
+    xemacs_debug_loop (DELETE, class, Qnil);
+
+  return (xemacs_debug_loop (ACTIVE, Qnil, Qnil));
+}
+
+DEFUN ("debug-classes-being-checked", Fdebug_classes_being_checked,
+       Sdebug_classes_being_checked, 0, 0, 0 /*
+Return a list of active debug classes.
+*/ )
+     ()
+{
+  return (xemacs_debug_loop (ACTIVE, Qnil, Qnil));
+}
+
+DEFUN ("debug-classes-list", Fdebug_classes_list, Sdebug_classes_list, 0, 0, 0 /*
+Return a list of all defined debug classes.
+*/ )
+     ()
+{
+  return (xemacs_debug_loop (LIST, Qnil, Qnil));
+}
+
+DEFUN ("set-debug-classes-to-check", Fset_debug_classes_to_check,
+       Sset_debug_classes_to_check, 1, 1, 0 /*
+Set which classes of debug statements should be active.
+CLASSES should be a list of debug classes.
+*/ )
+     (classes)
+     Lisp_Object classes;
+{
+  Lisp_Object rest;
+
+  CHECK_LIST (classes);
+
+  /* Make sure all objects in the list are valid.  If anyone is not
+     valid, reject the entire list without doing anything. */
+  LIST_LOOP (rest, classes )
+    {
+      if (NILP (xemacs_debug_loop (VALIDATE, XCAR (rest), Qnil)))
+	error ("Invalid object in class list");
+    }
+
+  LIST_LOOP (rest, classes)
+    Fadd_debug_class_to_check (XCAR (rest));
+
+  return (xemacs_debug_loop (ACTIVE, Qnil, Qnil));
+}
+
+DEFUN ("set-debug-class-types-to-check", Fset_debug_class_types_to_check,
+       Sset_debug_class_types_to_check, 2, 2, 0 /*
+For the given debug CLASS, set which TYPES are actually interesting.
+TYPES should be an integer representing the or'd value of all desired types.
+Lists of defined types and their values are located in the source code.
+*/ )
+     (class, type)
+     Lisp_Object class, type;
+{
+  CHECK_INT (type);
+  if (NILP (xemacs_debug_loop (VALIDATE, class, Qnil)))
+    error ("Invalid debug class");
+
+  xemacs_debug_loop (SETTYPE, class, type);
+
+  return (xemacs_debug_loop (TYPE, class, Qnil));
+}
+
+DEFUN ("debug-types-being-checked", Fdebug_types_being_checked,
+       Sdebug_types_being_checked, 1, 1, 0 /*
+For the given CLASS, return the associated type value.
+*/ )
+     (class)
+     Lisp_Object class;
+{
+  if (NILP (xemacs_debug_loop (VALIDATE, class, Qnil)))
+    error ("Invalid debug class");
+
+  return (xemacs_debug_loop (TYPE, class, Qnil));
+}
+
+void
+syms_of_debug (void)
+{
+  defsymbol (&Qredisplay, "redisplay");
+  defsymbol (&Qbuffers, "buffers");
+  defsymbol (&Qfaces, "faces");
+  defsymbol (&Qwindows, "windows");
+  defsymbol (&Qframes, "frames");
+  defsymbol (&Qdevices, "devices");
+  /* defsymbol (&Qbyte_code, "byte-code"); in bytecode.c */
+
+  defsubr (&Sadd_debug_class_to_check);
+  defsubr (&Sdelete_debug_class_to_check);
+  defsubr (&Sdebug_classes_being_checked);
+  defsubr (&Sdebug_classes_list);
+  defsubr (&Sset_debug_classes_to_check);
+  defsubr (&Sset_debug_class_types_to_check);
+  defsubr (&Sdebug_types_being_checked);
+}
+
+void
+vars_of_debug (void)
+{
+  Fprovide (intern ("debug"));
+
+  /* If you need to have any classes active early on in startup, then
+     the flags should be set here.
+     All functions called by this function are "allowed" according
+     to emacs.c. */
+  xemacs_debug_loop (INIT, Qnil, Qnil);
+}
+