Mercurial > hg > xemacs-beta
diff lisp/mule/mule-debug.el @ 70:131b0175ea99 r20-0b30
Import from CVS: tag r20-0b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:02:59 +0200 |
parents | |
children | a145efe76779 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/mule/mule-debug.el Mon Aug 13 09:02:59 2007 +0200 @@ -0,0 +1,521 @@ +;;; mule-diag.el --- debugging functions for Mule. + +;; Copyright (C) 1992 Free Software Foundation, Inc. +;; Copyright (C) 1995 Sun Microsystems. + +;; 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. + +;;; 93.7.28 created for Mule Ver.0.9.8 by K.Handa <handa@etl.go.jp> + +;;; General utility function + +(defun mule-debug-princ-list (&rest args) + (while (cdr args) + (if (car args) + (progn (princ (car args)) (princ " "))) + (setq args (cdr args))) + (princ (car args)) + (princ "\n")) + +;;; character sets + +;;;###autoload +(defun list-charsets () + "Display a list of existing character sets." + (interactive) + (with-output-to-temp-buffer "*Charset List*" + (princ "## LIST OF CHARACTER SETS\n") + (princ + "NAME REGISTRY BYTES CHARS FINAL GRAPHIC DIR\n") + (princ + "--------------------------------------------------------------------") + (mapcar + (lambda (name) + (let ((charset (get-charset name))) + (princ (format + "%20s %15s %5d %5d %5d %7d %s\n" + name + (charset-registry charset) + (charset-dimension charset) + (charset-chars charset) + (charset-final charset) + (charset-graphic charset) + (charset-direction charset))) + (princ " ") + (princ "%s\n" (charset-doc-string charset)))) + (charset-list)) + + (princ "## CCL PROGRAM TO CONVERT INTERNAL TO EXTERNAL CODE\n") + (princ "NAME CCL-PROGRAMS\n") + (mapcar + (lambda (name) + (let ((ccl (charset-ccl-program name))) + (if ccl + (let ((i 0) (len (length ccl))) + (princ (format "%20s " name)) + (while (< i len) + (princ (format " %x" (aref ccl i))) + (setq i (1+ i))) + (princ "\n"))))) + (charset-list)) + )) + +(defun describe-designation (flags graphic) + (let ((lc (aref flags graphic)) + lc1) + (if (integerp lc) (setq lc1 (if (> lc 0) lc (- lc)))) + (princ (format " G%d -- %s" + graphic + (or (and lc1 (char-description lc1)) + (and (eq lc t) "never used") + "none"))) + (princ (if (and lc1 (< lc 0)) + " (explicit designation required)\n" + "\n")))) +;; end of patch + +;;;###autoload +(defun describe-coding-system (cs) + "Display documentation of the coding-system CS." + (interactive "zCoding-system: ") + (get-coding-system cs);; correctness check + (with-output-to-temp-buffer "*Help*" + (princ "Coding-system ") + (princ cs) + (princ " [") + (princ (coding-system-mnemonic cs)) + (princ "]: \n") + (if (not cs) nil + (princ " ") + (princ (coding-system-doc-string cs)) + (princ "\nType: ") + (let ((type (coding-system-type cs))) + (princ type) + (cond ((eq type 'iso2022) + (princ "ISO-2022]\n") + (princ "Initial designations:\n") + (describe-designation coding-system 0) + (describe-designation coding-system 1) + (describe-designation coding-system 2) + (describe-designation coding-system 3) + (princ "Other Form: \n") + (princ (if (aref flags 4) "ShortForm" "LongForm")) + (if (aref flags 5) (princ ", ASCII@EOL")) + (if (aref flags 6) (princ ", ASCII@CNTL")) + (princ (if (aref flags 7) ", 7bit" ", 8bit")) + (if (aref flags 8) (princ ", UseLockingShift")) + (if (aref flags 9) (princ ", UseRoman")) + (if (aref flags 10) (princ ", UseOldJIS")) + (if (aref flags 11) (princ ", No ISO6429")) + (princ ".\n")) + ((eq type 'big5) + (princ (if flags "Big-ETen\n" "Big-HKU\n"))) + )) + (princ "\nEOL-Type: ") + (let ((eol-type (coding-system-eol-type cs))) + (cond ((null eol-type) + (princ "null (= LF)\n")) + ((vectorp eol-type) + (princ "Automatic selection from ") + (princ eol-type) + (princ "\n")) + ((eq eol-type 1) (princ "LF\n")) + ((eq eol-type 2) (princ "CRLF\n")) + ((eq eol-type 3) (princ "CR\n")) + (t (princ "invalid\n")))) + ))) + +;;;###autoload +(defun list-coding-system-briefly () + "Display coding-systems currently used with a brief format in mini-buffer." + (interactive) + (let ((cs (and (fboundp 'process-coding-system) (process-coding-system))) + eol-type) + (message + "current: [FKDPp=%c%c%c%c%c%c%c%c] default: [FPp=%c%c%c%c%c%c]" + (coding-system-mnemonic file-coding-system) + (coding-system-eol-mnemonic file-coding-system) + (coding-system-mnemonic keyboard-coding-system) + (coding-system-mnemonic terminal-coding-system) + (coding-system-mnemonic (car cs)) + (coding-system-eol-mnemonic (car cs)) + (coding-system-mnemonic (cdr cs)) + (coding-system-eol-mnemonic (cdr cs)) + (coding-system-mnemonic (default-value 'file-coding-system)) + (coding-system-eol-mnemonic (default-value 'file-coding-system)) + (coding-system-mnemonic (car default-process-coding-system)) + (coding-system-eol-mnemonic (car default-process-coding-system)) + (coding-system-mnemonic (cdr default-process-coding-system)) + (coding-system-eol-mnemonic (cdr default-process-coding-system)) + ))) + +(defun princ-coding-system (code) + (princ ": ") + (princ code) + (princ " [") + (princ (char-to-string (coding-system-mnemonic code))) + (princ (char-to-string (coding-system-eol-mnemonic code))) + (princ "]\n")) + +(defun todigit (flags idx &optional default-value) + (if (aref flags idx) + (if (numberp (aref flags idx)) (aref flags idx) 1) + (or default-value 0))) + +(defun print-coding-system-description (code) + (let ((type (get-code-type code)) + (eol (or (get-code-eol code) 1)) + (flags (get-code-flags code)) + line) + (setq type + (cond ((null type) 0) + ((eq type t) 2) + ((eq type 0) 1) + ((eq type 1) 3) + ((eq type 2) 4) + ((eq type 3) 5) + ((eq type 4) 6) + (t nil))) + (if (or (null type) + (get code 'post-read-conversion) + (get (get-base-code code) 'post-read-conversion) + (get code 'pre-write-conversion) + (get (get-base-code code) 'pre-write-conversion) + (eq code '*noconv*)) + nil + (princ + (format "%s:%d:%c:" + code type (coding-system-mnemonic code))) + (princ (format "%d" (if (numberp eol) eol 0))) + (cond ((= type 4) + (princ + (format + ":%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d" + (todigit flags 0 -1) + (todigit flags 1 -1) + (todigit flags 2 -1) + (todigit flags 3 -1) + (todigit flags 4) + (todigit flags 5) + (todigit flags 6) + (todigit flags 7) + (todigit flags 8) + (todigit flags 9) + (todigit flags 10) + (todigit flags 11)))) + ((= type 5) + (princ ":0")) + ((= type 6) + (if (and (vectorp (car flags)) (vectorp (cdr flags))) + (let (i len) + (princ ":") + (setq i 0 len (length (car flags))) + (while (< i len) + (princ (format " %x" (aref (car flags) i))) + (setq i (1+ i))) + (princ ",") + (setq i 0 len (length (cdr flags))) + (while (< i len) + (princ (format " %x" (aref (cdr flags) i))) + (setq i (1+ i)))))) + (t (princ ":0"))) + (princ ":") + (princ (get-code-document code)) + (princ "\n")) + )) + +;;;###autoload +(defun list-coding-system (&optional all) + "Describe coding-systems currently used with a detailed format. +If optional arg ALL is non-nil, all coding-systems are listed in +machine readable simple format." + (interactive "P") + (with-output-to-temp-buffer "*Help*" + (if (null all) + (let ((cs (and (fboundp 'process-coding-system) + (process-coding-system)))) + (princ "Current:\n file-coding-system") + (princ-coding-system file-coding-system) + (princ " keyboard-coding-system") + (princ-coding-system keyboard-coding-system) + (princ " terminal-coding-system") + (princ-coding-system terminal-coding-system) + (when cs + (princ " process-coding-system (input)") + (princ-coding-system (car cs)) + (princ " process-coding-system (output)") + (princ-coding-system (cdr cs))) + (princ "Default:\n file-coding-system") + (princ-coding-system (default-value 'file-coding-system)) + (princ " process-coding-system (input)") + (princ-coding-system (car default-process-coding-system)) + (princ " process-coding-system (output)") + (princ-coding-system (cdr default-process-coding-system)) + (princ "Others:\n file-coding-system-for-read") + (princ-coding-system file-coding-system-for-read) + (princ "Coding categories by priority:\n") + (princ (coding-priority-list))) + (princ "########################\n") + (princ "## LIST OF CODING SYSTEM\n") + (princ "## NAME(str):TYPE(int):MNEMONIC(char):EOL(int):FLAGS:DOC(str)\n") + (princ "## TYPE = 0(no conversion),1(auto conversion),\n") + (princ "## 2(Mule internal),3(SJIS),4(ISO2022),5(BIG5),6(CCL)\n") + (princ "## EOL = 0(AUTO), 1(LF), 2(CRLF), 3(CR)\n") + (princ "## FLAGS =\n") + (princ "## if TYPE = 4 then\n") + (princ "## G0,G1,G2,G3,SHORT,ASCII-EOL,ASCII-CNTL,SEVEN,\n") + (princ "## LOCK-SHIFT,USE-ROMAN,USE-OLDJIS\n") + (princ "## else if TYPE = 6 then\n") + (princ "## CCL_PROGRAM_FOR_READ,CCL_PROGRAM_FOR_WRITE\n") + (princ "## else\n") + (princ "## 0\n") + (princ "##\n") + (let ((codings nil)) + (mapatoms + (function + (lambda (arg) + (if (eq arg '*noconv*) + nil + (if (and (or (vectorp (get arg 'coding-system)) + (vectorp (get arg 'eol-type))) + (null (get arg 'pre-write-conversion)) + (null (get arg 'post-read-conversion))) + (setq codings (cons arg codings))))))) + (while codings + (print-coding-system-description (car codings)) + (setq codings (cdr codings)))) + (princ "############################\n") + (princ "## LIST OF CODING CATEGORIES (ordered by priority)\n") + (princ "## CATEGORY(str):CODING-SYSTEM(str)\n") + (princ "##\n") + (princ (coding-priority-list)) + ))) + +;;; FONT +(defun describe-font-internal (fontinfo &optional verbose) + (let ((cs (character-set (aref fontinfo 3)))) + (mule-debug-princ-list (format "Font #%02d for" (aref fontinfo 0)) + (nth 6 cs) (nth 7 cs) "--" + (cond ((= (aref fontinfo 4) 0) "NOT YET OPENED") + ((= (aref fontinfo 4) 1) "OPENED") + (t "NOT FOUND"))) + (mule-debug-princ-list " request:" (aref fontinfo 1)) + (if (= (aref fontinfo 4) 1) + (mule-debug-princ-list " opened:" (aref fontinfo 2))) + (if (and verbose (= (aref fontinfo 4) 1)) + (progn + (mule-debug-princ-list " size:" (format "%d" (aref fontinfo 5))) + (mule-debug-princ-list " encoding:" (if (= (aref fontinfo 6) 0) "low" "high")) + (mule-debug-princ-list " yoffset:" (format "%d" (aref fontinfo 7))) + (mule-debug-princ-list " rel-cmp:" (format "%d" (aref fontinfo 8))))) + )) + +;;;###autoload +(defun describe-font (fontname) + "Display information about fonts which partially match FONTNAME." + (interactive "sFontname: ") + (setq fontname (regexp-quote fontname)) + (with-output-to-temp-buffer "*Help*" + (let ((fontlist (font-list)) fontinfo) + (while fontlist + (setq fontinfo (car fontlist)) + (if (or (string-match fontname (aref fontinfo 1)) + (and (aref fontinfo 2) + (string-match fontname (aref fontinfo 2)))) + (describe-font-internal fontinfo 'verbose)) + (setq fontlist (cdr fontlist)))))) + +;;;###autoload +(defun list-font () + "Display a list of fonts." + (interactive) + (with-output-to-temp-buffer "*Help*" + (let ((fontlist (font-list))) + (while fontlist + (describe-font-internal (car fontlist)) + (setq fontlist (cdr fontlist)))))) + +;;; FONTSET +(defun describe-fontset-internal (fontset-info) + (mule-debug-princ-list "### Fontset-name:" (car fontset-info) "###") + (let ((i 0) font) + (while (< i 128) + (if (>= (setq font (aref (cdr fontset-info) i)) 0) + (describe-font-internal (get-font-info font))) + (setq i (1+ i))))) + +;;;###autoload +(defun describe-fontset (fontset) + "Display information about FONTSET." + (interactive + (let ((fontset-list (mapcar '(lambda (x) (list x)) (fontset-list)))) + (list (completing-read "Fontset: " fontset-list nil 'match)))) + (let ((fontset-info (get-fontset-info fontset))) + (if fontset-info + (with-output-to-temp-buffer "*Help*" + (describe-fontset-internal fontset-info)) + (error "No such fontset: %s" fontset)))) + +;;;###autoload +(defun list-fontset () + "Display a list of fontsets." + (interactive) + (with-output-to-temp-buffer "*Help*" + (let ((fontsetlist (fontset-list 'all))) + (while fontsetlist + (describe-fontset-internal (car fontsetlist)) + (setq fontsetlist (cdr fontsetlist)))))) + +;;; DIAGNOSIS + +(defun insert-list (args) + (while (cdr args) + (insert (or (car args) "nil") " ") + (setq args (cdr args))) + (if args (insert (or (car args) "nil"))) + (insert "\n")) + +(defun insert-section (sec title) + (insert "########################################\n" + "# Section " (format "%d" sec) ". " title "\n" + "########################################\n\n")) + +;;;###autoload +(defun mule-diag () + "Show diagnosis of the current running Mule." + (interactive) + (let ((buf (get-buffer-create "*Diagnosis*"))) + (save-excursion + (set-buffer buf) + (erase-buffer) + (insert "\t##############################\n" + "\t### DIAGNOSIS OF YOUR MULE ###\n" + "\t##############################\n\n" + "CONTENTS: Section 0. General information\n" + " Section 1. Display\n" + " Section 2. Input methods\n" + " Section 3. Coding-systems\n" + " Section 4. Character sets\n") + (if window-system + (insert " Section 5. Fontset list\n")) + (insert "\n") + + (insert-section 0 "General information") + (insert "Mule's version: " mule-version " of " mule-version-date "\n") + (if window-system + (insert "Window-system: " + (symbol-name window-system) + (format "%s" window-system-version)) + (insert "Terminal: " (getenv "TERM"))) + (insert "\n\n") + + (insert-section 1 "Display") + (if (eq window-system 'x) + (let* ((alist (nth 1 (assq (selected-frame) + (current-frame-configuration)))) + (fontset (cdr (assq 'font alist)))) + (insert-list (cons "Defined fontsets:" (fontset-list))) + (insert "Current frame's fontset: " fontset "\n" + "See Section 5 for more detail.\n\n")) + (insert "Coding system for output to terminal: " + (symbol-name terminal-coding-system) + "\n\n")) + (insert-section 2 "Input methods") + (if (featurep 'egg) + (let (temp) + (insert "EGG (Version " egg-version ")\n") + (insert " jserver host list: ") + (insert-list (if (boundp 'jserver-list) jserver-list + (if (setq temp (getenv "JSERVER")) + (list temp)))) + (insert " cserver host list: ") + (insert-list (if (boundp 'cserver-list) cserver-list + (if (setq temp (getenv "CSERVER")) + (list temp)))) + (insert " loaded ITS mode:\n\t") + (insert-list (mapcar 'car its:*mode-alist*)) + (insert " current server:" (symbol-name wnn-server-type) "\n" + " current ITS mode:" + (let ((mode its:*mode-alist*)) + (while (not (eq (cdr (car mode)) its:*current-map*)) + (setq mode (cdr mode))) + (car (car mode)))) + (insert "\n"))) + (insert "QUAIL (Version " quail-version ")\n") + (insert " Quail packages: (not-yet-loaded) [current]\n\t") + (let ((l quail-package-alist) + (current (or (car quail-current-package) ""))) + (while l + (cond ((string= current (car (car l))) + (insert "[" (car (car l)) "]")) + ((nth 2 (car l)) + (insert (car (car l)))) + (t + (insert "(" (car (car l)) ")"))) + (if (setq l (cdr l)) (insert " ") (insert "\n")))) + (if (featurep 'canna) + (insert "CANNA (Version " canna-rcs-version ")\n" + " server:" (or canna-server "Not specified") "\n")) + (if (featurep 'sj3-egg) + (insert "SJ3 (Version" sj3-egg-version ")\n" + " server:" (get-sj3-host-name) "\n")) + (insert "\n") + + (insert-section 3 "Coding systems") + (save-excursion (list-coding-systems)) + (insert-buffer "*Help*") + (goto-char (point-max)) + (insert "\n") + + (insert-section 4 "Character sets") + (save-excursion (list-charsets)) + (insert-buffer "*Help*") + (goto-char (point-max)) + (insert "\n") + + (if window-system + (progn + (insert-section 5 "Fontset list") + (save-excursion (list-fontset)) + (insert-buffer "*Help*"))) + + (set-buffer-modified-p nil) + ) + (let ((win (display-buffer buf))) + (set-window-point win 1) + (set-window-start win 1)) + )) + +;;; DUMP DATA FILE + +;;;###autoload +(defun dump-charsets () + (list-charsets) + (set-buffer (get-buffer "*Help*")) + (let (make-backup-files) + (write-region (point-min) (point-max) "charsets.lst")) + (kill-emacs)) + +;;;###autoload +(defun dump-coding-systems () + (list-coding-systems 'all) + (set-buffer (get-buffer "*Help*")) + (let (make-backup-files) + (write-region (point-min) (point-max) "coding-systems.lst")) + (kill-emacs)) +