summaryrefslogtreecommitdiff
path: root/scripts/punify
blob: 699f3e2ff7486b39ca2b83aa95e0a262e1dfab10 (plain)
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
#!/bin/sh
# aside from this initial boilerplate, this is actually -*- scheme -*- code
main='(module-ref (resolve-module '\''(scripts punify)) '\'main')'
exec ${GUILE-guile} -l $0 -c "(apply $main (cdr (command-line)))" "$@"
!#
;;; punify --- Display Scheme code w/o unnecessary comments / whitespace

;; 	Copyright (C) 2001 Free Software Foundation, Inc.
;;
;; This program 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.
;;
;; This program 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 this software; see the file COPYING.  If not, write to
;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
;; Boston, MA 02111-1307 USA

;;; Author: Thien-Thi Nguyen

;;; Commentary:

;; Usage: punify FILE1 FILE2 ...
;;
;; Each file's forms are read and written to stdout.
;; The effect is to remove comments and much non-essential whitespace.
;; This is useful when installing Scheme source to space-limited media.
;;
;; Example:
;; $ wc ./punify ; ./punify ./punify | wc
;;     81     355    2622 ./punify
;;      0      34     694
;;
;; TODO: Read from stdin.
;;       Handle vectors.
;;       Identifier punification.

;;; Code:

(define-module (scripts punify)
  :export (punify))

(define (write-punily form)
  (if (and (list? form) (not (null? form)))
      (let ((first (car form)))
        (display "(")
        (write-punily first)
        (let loop ((ls (cdr form)) (last-was-list? (list? first)))
          (if (null? ls)
              (display ")")
              (let* ((new-first (car ls))
                     (this-is-list? (list? new-first)))
                (and (not last-was-list?)
                     (not this-is-list?)
                     (display " "))
                (write-punily new-first)
                (loop (cdr ls) this-is-list?)))))
      (write form)))

(define (punify-one file)
  (with-input-from-file file
    (lambda ()
      (let ((toke (lambda () (read (current-input-port)))))
        (let loop ((form (toke)))
          (or (eof-object? form)
              (begin
                (write-punily form)
                (loop (toke)))))))))

(define (punify . args)
  (for-each punify-one args))

(define main punify)

;;; punify ends here