1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
; XDOC Documentation System for ACL2
; Copyright (C) 2009-2015 Centaur Technology
;
; Contact:
; Centaur Technology Formal Verification Group
; 7600-C N. Capital of Texas Highway, Suite 300, Austin, TX 78731, USA.
; http://www.centtech.com/
;
; License: (An MIT/X11-style license)
;
; Permission is hereby granted, free of charge, to any person obtaining a
; copy of this software and associated documentation files (the "Software"),
; to deal in the Software without restriction, including without limitation
; the rights to use, copy, modify, merge, publish, distribute, sublicense,
; and/or sell copies of the Software, and to permit persons to whom the
; Software is furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
; DEALINGS IN THE SOFTWARE.
;
; Original author: Jared Davis <jared@centtech.com>
(in-package "XDOC")
(include-book "std/util/bstar" :dir :system)
(set-state-ok t)
(program)
; fmt-to-str-orig.lisp
;
; This file is merely a bootstrapping hack.
;
; We implement a bare-bones pretty printer, similar to ACL2's fmt-to-string or
; str::pretty. Unlike ACL2's fmt-to-string, we use narrower margins and print
; with downcased symbols.
;
; This function was historically used throughout XDOC in the pretty-printing of
; terms, e.g., to handle things like @(def ...). Today, XDOC's preprocessor
; instead uses str::pretty, which allows us to avoid nasty problems with using
; ACL2's formatting functions to print outside of the loop, e.g., for use with
; the ACL2 Sidekick.
;
; Why do we still need this file, then? Well, macros such as DEFINE and
; DEFAGGREGATE, which are used in the definition of str::pretty, have their own
; documentation-generation functionality. Historically these documentation
; producing routines made use of fmt-to-string. This leads to circular
; dependencies such as fmt-to-str -> str::pretty -> define -> fmt-to-str!
;
; To break this circularity, we keep the original implementation of fmt-to-str,
; renaming it to fmt-to-str-orig. We use the orig version in macros such as
; DEFINE to minimize dependencies and avoid these loops. When these macros
; call fmt-to-str-orig, they're running in the real ACL2 loop, so we don't have
; these outside-the-loop problems. Meanwhile, we avoid the fmt functions in
; the real preprocessor code.
(defun fmt-to-str-orig-aux (string alist base-pkg state)
;; Use ACL2's fancy new string-printing stuff to do pretty-printing
(b* ((hard-right-margin (f-get-global 'acl2::fmt-hard-right-margin state))
(soft-right-margin (f-get-global 'acl2::fmt-soft-right-margin state))
(print-case (f-get-global 'acl2::print-case state))
(pkg (current-package state))
(base-pkg-name (symbol-package-name base-pkg))
((mv er ?val state) (acl2::in-package-fn base-pkg-name state))
((when er)
(er hard? 'fmt-to-str-orig-aux "Error switching to package ~x0" base-pkg-name)
(mv "" state))
(state (set-fmt-hard-right-margin 68 state))
(state (set-fmt-soft-right-margin 62 state))
(state (set-print-case :downcase state))
((mv channel state) (open-output-channel :string :character state))
((mv ?col state) (fmt1 string alist 0 channel state nil))
((mv er1 str state) (get-output-stream-string$ channel state))
((mv er2 ?val state) (acl2::in-package-fn pkg state))
(state (set-fmt-hard-right-margin hard-right-margin state))
(state (set-fmt-soft-right-margin soft-right-margin state))
(state (set-print-case print-case state))
((when er1)
(er hard? 'fmt-to-str-orig-aux "Error with get-output-stream-string$?")
(mv "" state))
((when er2)
(er hard? 'fmt-to-str-orig-aux "Error switching back to package ~x0" pkg)
(mv "" state)))
(mv str state)))
(defun fmt-to-str-orig (x base-pkg state)
;; Basic formatting of sexprs, no encoding or autolinking
(fmt-to-str-orig-aux "~x0" (list (cons #\0 x)) base-pkg state))
|