;;; begincopyright ;;; Copyright (c) 1993 Xerox Corporation. All rights reserved. ;;; Use and copying of this software and preparation of derivative works based ;;; upon this software are permitted. Any distribution of this software or ;;; derivative works must comply with all applicable United States export ;;; control laws. This software is made available AS IS, and Xerox Corporation ;;; makes no warranty about the software, its performance or its conformity to ;;; any specification. Any person obtaining a copy of this software is requested ;;; to send their name and post office or electronic mail address to: ;;; PCR Coordinator ;;; Xerox PARC ;;; 3333 Coyote Hill Rd. ;;; Palo Alto, CA 94304 ;;; or pcrcoordinator@parc.xerox.com ;;; endcopyright */ ;;; ---------------------------------------------------------------- ;;; Assume the current buffer holds a file of scheme code in tioga format, ;;; convert it into plain ASCII. (require 'tioga) (defvar tscheme-indent-stack) ;;; ---------------- Tioga walk handlers (defun tscheme-start-node (format-name level) (if (< level 2) (setq tscheme-indent-stack (cons 0 tscheme-indent-stack)) (let ((parent-indent (car tscheme-indent-stack))) (setq tscheme-indent-stack (cons (+ parent-indent (if (string-match "↑scheme\\([0-9]+\\)$" format-name) (string-to-int (substring format-name 6)) 3)) tscheme-indent-stack))))) (defun tscheme-handle-prop (prop-name str) (if (and (string= prop-name "postfix") (string-match "\\([-0-9]+\\) sp bigger leftIndent" str)) (let ((old-indent (car tscheme-indent-stack)) (increment (string-to-int (substring str 0 (match-end 1))))) (setq tscheme-indent-stack (cons (+ old-indent increment) (cdr tscheme-indent-stack)))))) (defun tscheme-add-looks (looks start len) ;; LOOKS is a 32 bit integer represented as a string ;; MSB is high bit of the character at index 0. ;; For Scheme, ignore it. ) (defun tscheme-insert-text (text commentp level) (if (> level 0) (let* ((indent (car tscheme-indent-stack)) (space (make-string indent ?\ ))) (tscheme-outs space) (if (and commentp (/= (aref text 0) ?\;)) (tscheme-outs ";; ")) (tscheme-outs text)))) (defun tscheme-end-node (level) (setq tscheme-indent-stack (cdr tscheme-indent-stack))) ;;; ---------------- Main (defvar tscheme-output-buffer nil) (defun tscheme-convert-buffer () (interactive) (if (buffer-modified-p) (error "I refuse to Tioga-Convert a modified buffer...")) (barf-if-buffer-read-only) (setq tscheme-output-buffer (generate-new-buffer (buffer-name))) (let ((tscheme-indent-stack '())) (unwind-protect (progn (tioga-walk-buffer 'tscheme-start-node 'tscheme-handle-prop 'tscheme-add-looks 'tscheme-insert-text 'tscheme-end-node) (save-excursion (set-buffer tscheme-output-buffer) (subst-char-in-region (point-min) (point-max) ?\r ?\n)) (erase-buffer) (insert-buffer tscheme-output-buffer) (goto-char (point-min)) (while (search-forward "\323" nil t) ; Fix up copyright symbol... (replace-match "(C)" t)) (goto-char (point-min))) (kill-buffer tscheme-output-buffer) (setq tscheme-output-buffer nil)))) ;;; ---------------- Utilities (defun tscheme-outs (str) (save-excursion (set-buffer tscheme-output-buffer) (insert str)))