]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/graphviz.scm
Run `make grand-replace'.
[lilypond.git] / scm / graphviz.scm
index d361302fede7623a2164a8f90f7409d6fd34bb03..bc17f6185ebbfa79b8b8327504aba4dd345d6bcf 100644 (file)
@@ -2,51 +2,55 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2007 Joe Neeman <joeneeman@gmail.com>
+;;;; (c) 2007--2008 Joe Neeman <joeneeman@gmail.com>
 
 
 (define-module (scm graphviz)
   #:use-module (lily)
-  #:export (make-graph add-node add-edge add-cluster))
+  #:export
+  (make-empty-graph add-node add-edge add-cluster
+                   graph-write
+                   ))
 
-(define (make-graph filename)
-  (let ((empty-graph (list->vector (list filename '() '() '()))))
-    (ly:atexit write-graph (list empty-graph))
-    empty-graph))
+(define graph-type (make-record-type "graph" '(nodes edges clusters name)))
 
-(define (filename g) (vector-ref g 0))
-(define (nodes g) (vector-ref g 1))
-(define (edges g) (vector-ref g 2))
-(define (clusters g) (vector-ref g 3))
+(define make-graph (record-constructor graph-type))
+(define (make-empty-graph name) (make-graph '() '() '() name))
+
+(define nodes (record-accessor graph-type 'nodes))
+(define edges (record-accessor graph-type 'edges))
+(define clusters (record-accessor graph-type 'clusters))
+(define set-nodes! (record-modifier graph-type 'nodes))
+(define set-edges! (record-modifier graph-type 'edges))
+(define set-clusters! (record-modifier graph-type 'clusters))
 
 (define (add-cluster graph node-id cluster-name)
-  (let ((cs (clusters g))
-       (cluster (assq cluster-name cs))
-       (already-in-cluster (if cluster
-                               (cdr cluster)
-                               '())))
-    (vector-set! graph 3 (assq-set! cluster-name
-                                   (cons node-id already-in-cluster)
-                                   cs))))
+  (let* ((cs (clusters graph))
+        (cluster (assq cluster-name cs))
+        (already-in-cluster (if cluster
+                                (cdr cluster)
+                                '())))
+    (set-clusters! graph (assq-set! cs
+                                   cluster-name
+                                   (cons node-id already-in-cluster)))))
 
 (define (add-node graph label . cluster-name)
-  (let ((ns (nodes graph))
-        (id (length ns)))
-    (vector-set! graph 1 (cons `(,id . ,label) ns))
+  (let* ((ns (nodes graph))
+         (id (length ns)))
+    (set-nodes! graph (assq-set! ns id label))
     (if (and (not (null? cluster-name))
             (string? (car cluster-name)))
        (add-cluster graph id (car cluster-name)))
     id))
 
 (define (add-edge graph node1 node2)
-  (vector-set! graph 2 (cons `(,node1 . ,node2) (edges graph))))
+  (set-edges! graph (cons `(,node1 . ,node2) (edges graph))))
 
-(define (write-graph graph)
-  (let ((out (open-file (filename graph) "w"))
-       (ns (nodes graph))
+(define (graph-write graph out)
+  (let ((ns (nodes graph))
        (es (edges graph))
        (cs (clusters graph)))
-    (ly:message (format "writing graph ~s..." (filename graph)))
+    (ly:message (format (_ "Writing graph `~a'...") (port-filename out)))
     (display "digraph G {\nrankdir=\"LR\"\nnode [shape=rectangle]\n" out)
     (map (lambda (n) (display (format "~a [label=\"~a\"]\n" (car n) (cdr n)) out))
         ns)
@@ -54,7 +58,7 @@
         es)
     (map (lambda (c)
          (display (format "subgraph cluster_~a {\nlabel= \"~a\"\ncolor=blue\n"
-                          (string-filter char-alphabetic? (car c))
+                          (string-filter (car c) char-alphabetic?)
                           (car c))
                   out)
          (map (lambda (n) (display (format "~a\n" n) out)) (cdr c))