diff lisp/psgml/psgml-debug.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children ac2d302a0011
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/psgml/psgml-debug.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,299 @@
+;;;;\filename dump.el
+;;;\Last edited: Fri Nov 25 18:30:01 1994 by lenst@dell (Lennart Staflin)
+;;;\RCS $Id: psgml-debug.el,v 1.1.1.1 1996/12/18 03:35:18 steve Exp $
+;;;\author {Lennart Staflin}
+;;;\maketitle
+
+;;\begin{codeseg}
+(provide 'psgml-debug)
+(require 'psgml)
+(require 'psgml-parse)
+(require 'psgml-edit)
+;;(require 'psgml-dtd)
+(autoload 'sgml-translate-model "psgml-dtd" "" nil)
+
+;;;; Debugging
+
+(define-key sgml-mode-map "\C-c," 'sgml-goto-cache)
+(define-key sgml-mode-map "\C-c\C-x" 'sgml-dump-tree)
+
+(defun sgml-this-element ()
+  (interactive)
+  (let ((tree (sgml-find-element-of (point))))
+    (sgml-dump-rec tree)))
+
+(defun sgml-goto-cache ()
+  (interactive)
+  (setq sgml-dtd-info (sgml-pstate-dtd sgml-buffer-parse-state)
+	sgml-top-tree (sgml-pstate-top-tree sgml-buffer-parse-state))
+  (sgml-find-start-point (point))
+  (message "%s" (sgml-element-context-string sgml-top-tree)))
+
+(defun sgml-dump-tree (arg)
+  (interactive "P")
+  (when arg
+    (sgml-parse-to-here))
+  (with-output-to-temp-buffer "*Dump*"
+    (sgml-dump-rec (sgml-pstate-top-tree sgml-buffer-parse-state))))
+
+(defun sgml-comepos (epos)
+  (if (sgml-strict-epos-p epos)
+      (format "%s:%s"
+	      (sgml-entity-name (sgml-eref-entity (sgml-epos-eref epos)))
+	      (sgml-epos-pos epos))
+    (format "%s" epos)))
+
+(defun sgml-dump-rec (u)
+  (while u
+    (princ
+     (format
+      "%s%s start:%s(%s) end:%s(%s) epos:%s/%s net:%s\n"
+      (make-string (sgml-tree-level u) ?. )
+      (sgml-element-gi u)
+      (sgml-element-start u) (sgml-tree-stag-len u)
+      (if (sgml-tree-etag-epos u) (sgml-tree-end u)) (sgml-tree-etag-len u)
+      (sgml-comepos (sgml-tree-stag-epos u))
+      (sgml-comepos (sgml-tree-etag-epos u))
+      (sgml-tree-net-enabled u)))
+    (sgml-dump-rec (sgml-tree-content u))
+    (setq u (sgml-tree-next u))))
+
+;;;; For edebug
+
+;;(put 'when 'edebug-form-hook t)
+;;(put 'unless 'edebug-form-hook t)
+;;(put 'push 'edebug-form-hook '(form sexp))
+;;(put 'setf 'edebug-form-hook '(sexp form))
+
+(eval-when (load)
+  (def-edebug-spec sgml-with-parser-syntax (&rest form))
+  (def-edebug-spec sgml-skip-upto (sexp))
+  (def-edebug-spec sgml-check-delim (sexp &optional sexp))
+  (def-edebug-spec sgml-parse-delim (sexp &optional sexp))
+  (def-edebug-spec sgml-is-delim (sexp &optional sexp sexp sexp)))
+
+;;;; dump
+
+(defun sgml-dump-dtd (&optional dtd)
+  (interactive )
+  (unless dtd
+    (setq dtd (sgml-pstate-dtd sgml-buffer-parse-state)))
+  (with-output-to-temp-buffer "*DTD dump*"
+    (princ (format "Dependencies: %S\n"
+		   (sgml-dtd-dependencies dtd)))
+    (loop for et being the symbols of (sgml-dtd-eltypes dtd)
+	  do (sgml-dp-element et))))
+
+(defun sgml-dump-element (el-name)
+  (interactive
+   (list (completing-read "Element: "
+			  (sgml-dtd-eltypes
+			   (sgml-pstate-dtd sgml-buffer-parse-state))
+			  nil t)))
+  (with-output-to-temp-buffer "*Element dump*"
+    (sgml-dp-element (sgml-lookup-eltype el-name))))
+
+
+(defun sgml-dp-element (el)
+  (cond
+   ((sgml-eltype-defined el)
+    (princ (format "Element %s %s %s%s:\n"
+		   (sgml-eltype-name el)
+		   (if (sgml-eltype-stag-optional el) "O" "-")
+		   (if (sgml-eltype-etag-optional el) "O" "-")
+		   (if (sgml-eltype-mixed el) " mixed" "")))
+    (cond
+     ((sgml-model-group-p (sgml-eltype-model el))
+      (sgml-dp-model (sgml-eltype-model el)))
+     (t
+      (prin1 (sgml-eltype-model el))
+      (terpri)))
+    (princ (format "Exeptions: +%S -%S\n"
+		   (sgml-eltype-includes el)
+		   (sgml-eltype-excludes el)))
+    (princ (format "Attlist: %S\n" (sgml-eltype-attlist el)))
+    (princ (format "Plist: %S\n" (symbol-plist el))))
+   (t
+    (princ (format "Undefined element %s\n" (sgml-eltype-name el)))))
+  (terpri))
+
+
+(defun sgml-dp-model (model &optional indent)
+  (or indent (setq indent 0))
+  (let ((sgml-code-xlate (sgml-translate-model model)))
+    (loop
+     for i from 0
+     for x in sgml-code-xlate do
+     (cond ((sgml-normal-state-p (car x))
+	    (princ (format "%s%d: opts=%s reqs=%s\n"
+			   (make-string indent ? ) i
+			   (sgml-untangel-moves (sgml-state-opts (car x)))
+			   (sgml-untangel-moves (sgml-state-reqs (car x))))))
+	   (t				; &node
+	    (princ (format "%s%d: &node next=%d\n"
+			   (make-string indent ? ) i
+			   (sgml-code-xlate (sgml-&node-next (car x)))))
+	    (loop for m in (sgml-&node-dfas (car x))
+		  do (sgml-dp-model m (+ indent 2))))))))
+
+(defun sgml-untangel-moves (moves)
+  (loop for m in moves
+	collect (list (sgml-move-token m)
+		      (sgml-code-xlate (sgml-move-dest m)))))
+
+
+;;;; Build autoloads for all interactive functions in psgml-parse
+
+(defun sgml-build-autoloads ()
+  (interactive)
+  (with-output-to-temp-buffer "*autoload*"
+    (loop
+     for file in '("psgml-parse" "psgml-edit" "psgml-dtd"
+		   "psgml-info" "psgml-charent")
+     do
+     (set-buffer (find-file-noselect (concat file ".el")))
+     (goto-char (point-min))
+     (while (and
+	     (not (eobp))
+	     (re-search-forward "^(defun +\\([^ ]+\\)" nil t))
+       (let ((name (buffer-substring (match-beginning 1)
+				     (match-end 1)))
+	     doc)
+	 (forward-sexp 1)		; skip argument list
+	 (skip-chars-forward " \n\t")
+	 (when (eq ?\" (following-char)) ; doc string
+	       (setq doc (buffer-substring (point)
+					   (progn (forward-sexp 1)
+						  (point)))))
+	 (skip-chars-forward " \n\t")
+	 (when (looking-at "(interactive")
+	       (if (null doc)
+		   (message "No doc for %s" name))
+	       (princ (format
+		       "(autoload '%s \"%s\" %s t)\n"
+		       name file doc))))))))
+
+;;;; Test psgml with sgmls test cases
+
+(defun test-sgml (start)
+  (interactive "p")
+  (let (file
+	(sgml-show-warnings t))
+    (with-output-to-temp-buffer "*Testing psgml*"
+      (while
+	  (progn
+	    (setq file (format "/usr/local/src/sgmls-1.1/test/test%03d.sgm"
+			       start))
+	    (file-exists-p file))
+	(princ (format "*** File test%03d ***\n" start))
+	(find-file file)
+	(condition-case errcode
+	    (progn
+	      (sgml-parse-prolog)
+	      ;;(sgml-next-trouble-spot)
+	      (sgml-parse-until-end-of nil)
+	      )
+	  (error
+	   (princ errcode)
+	   (terpri)))
+	(if (get-buffer sgml-log-buffer-name)
+	    (princ (save-excursion
+		     (set-buffer sgml-log-buffer-name)
+		     (buffer-string))))
+	(terpri)
+	(terpri)
+	(sit-for 0)
+	(kill-buffer (current-buffer))
+	(setq start (1+ start))))))
+
+
+;;;; Profiling
+
+(defun profile-sgml (&optional file)
+  (interactive)
+  (or file (setq file (expand-file-name "~/src/psgml/test/shortref.sgml")))
+  (find-file file)
+  (sgml-need-dtd)
+  (sgml-instrument-parser)
+  (elp-reset-all)
+  (dotimes (i 20)
+    (garbage-collect)
+    (sgml-reparse-buffer (function sgml-handle-shortref)))
+  (elp-results))
+
+(defun sgml-instrument-parser ()
+  (interactive)
+  (require 'elp)
+  (setq elp-function-list nil)
+  (elp-restore-all)
+  (setq elp-function-list
+	'(
+	  sgml-parse-to
+	  sgml-parser-loop
+	  sgml-parse-markup-declaration
+	  sgml-do-processing-instruction
+	  sgml-pop-entity
+	  sgml-tree-net-enabled
+	  sgml-do-end-tag
+	  sgml-do-data
+	  sgml-deref-shortmap
+	  sgml-handle-shortref
+	  sgml-do-start-tag
+	  sgml-do-general-entity-ref
+	  sgml-set-face-for
+	  sgml-pcdata-move
+	  sgml-shortmap-skipstring
+	  ;;
+	  ))
+  (elp-instrument-list))
+
+
+(defun sgml-instrument-dtd-parser ()
+  (interactive)
+  (require 'elp)
+  (setq elp-function-list nil)
+  (elp-restore-all)
+  (setq elp-function-list
+	'(
+	  sgml-parse-prolog
+	  sgml-skip-ds
+	  sgml-parse-markup-declaration
+	  sgml-check-doctype-body
+	  ;;
+	  sgml-check-dtd-subset
+	  sgml-parse-ds
+	  sgml-declare-attlist
+	  sgml-declare-entity
+	  sgml-declare-element
+	  sgml-declare-shortref
+	  ;;
+	  sgml-parse-parameter-literal
+	  sgml-check-element-type
+	  sgml-check-primitive-content-token
+	  sgml-check-model-group
+	  ;; In sgml-check-model-group
+	  sgml-parse-modifier
+	  sgml-make-pcdata
+	  sgml-skip-ts
+	  sgml-make-opt
+	  sgml-make-*
+	  sgml-make-+
+	  sgml-reduce-,
+	  sgml-reduce-|
+	  sgml-make-&
+	  sgml-make-conc
+	  sgml-copy-moves
+	  ;; is ps*
+	  sgml-do-parameter-entity-ref
+	  ;; 
+	  sgml-make-primitive-content-token
+	  sgml-push-to-entity
+	  sgml-lookup-entity
+	  sgml-lookup-eltype
+	  sgml-one-final-state
+	  sgml-remove-redundant-states-1
+	  ))
+  (elp-instrument-list))
+
+
+;¤¤\end{codeseg}