diff src/debug.c @ 428:3ecd8885ac67 r21-2-22

Import from CVS: tag r21-2-22
author cvs
date Mon, 13 Aug 2007 11:28:15 +0200
parents
children 080151679be2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/debug.c	Mon Aug 13 11:28:15 2007 +0200
@@ -0,0 +1,220 @@
+/* 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.
+ */
+
+static Lisp_Object Qredisplay, Qbuffers, Qfaces, Qwindows, Qframes, Qdevices;
+
+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);	\
+      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, 1, 1, 0, /*
+Add a debug class to the list of active classes.
+*/
+       (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, 1, 1, 0, /*
+Delete a debug class from the list of active classes.
+*/
+       (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, 0, 0, 0, /*
+Return a list of active debug classes.
+*/
+       ())
+{
+  return (xemacs_debug_loop (ACTIVE, Qnil, Qnil));
+}
+
+DEFUN ("debug-classes-list", Fdebug_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, 1, 1, 0, /*
+Set which classes of debug statements should be active.
+CLASSES should be a list of debug classes.
+*/
+       (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, 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))
+{
+  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, 1, 1, 0, /*
+For the given CLASS, return the associated type value.
+*/
+       (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");
+
+  DEFSUBR (Fadd_debug_class_to_check);
+  DEFSUBR (Fdelete_debug_class_to_check);
+  DEFSUBR (Fdebug_classes_being_checked);
+  DEFSUBR (Fdebug_classes_list);
+  DEFSUBR (Fset_debug_classes_to_check);
+  DEFSUBR (Fset_debug_class_types_to_check);
+  DEFSUBR (Fdebug_types_being_checked);
+}
+
+void
+reinit_vars_of_debug (void)
+{
+  /* 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);
+}
+
+void
+vars_of_debug (void)
+{
+  reinit_vars_of_debug ();
+}