Samuel W. Flint 10 лет назад
Родитель
Сommit
de3edd4a9e
1 измененных файлов с 51 добавлено и 4 удалено
  1. 51 4
      config-parser.lisp

+ 51 - 4
config-parser.lisp

@@ -1,10 +1,14 @@
 ;;;; config-parser.lisp
 
+#+quicklisp (ql:quickload :parse-number)
+
 (defpackage #:config-parser
   (:use :esrap
         :cl)
   (:import-from #:parse-number
-                #:parse-number))
+                #:parse-number)
+  (:export open-configuration-file
+           write-configuration-file))
 
 (in-package #:config-parser)
 
@@ -81,6 +85,49 @@
     (loop for block in blocks
        append block)))
 
-(defun open-configuration-file (filename))
-
-(defun write-configuration-file (filename))
+(defun open-configuration-file (filename)
+  (parse 'file
+         (concatenate 'string
+                      (with-open-file (input-file filename)
+                        (loop for char = (read-char input-file nil 'foo)
+                           until (eq char 'foo)
+                           collect char)))))
+
+(defun write-identifier (identifier alist stream)
+  (format stream "~a" (getf alist identifier)))
+
+(defun write-string-out (string stream)
+  (format stream "\"~a\"" string))
+
+(defun write-block-title (identifier alist stream)
+  (format stream "~%[")
+  (write-identifier identifier alist stream)
+  (format stream "]~&"))
+
+(defun write-path (id1 id2 alist stream)
+  (write-identifier id1 alist stream)
+  (format stream "/")
+  (write-identifier id2 alist stream))
+
+(defun write-expression (lhs rhs alist stream)
+  (format stream "~&")
+  (write-identifier lhs alist stream)
+  (format stream " = ")
+  (if (typep rhs 'string)
+      (write-string-out rhs stream)
+      (if (typep rhs 'list)
+          (write-path (car rhs) (cadr rhs) alist stream)
+          (format stream "~a" rhs)))
+  (format stream "~&"))
+
+(defun write-correct (stream alist toplevel-p config-list)
+  (if toplevel-p
+      (if (listp (car config-list))
+          (write-correct stream alist nil (cdr config-list))
+          (write-block-title (car config) alist stream))
+      (loop for (lhs rhs) in config-list
+           do (write-expression lhs rhs alist config-list))))
+
+(defun write-configuration-file (filename config key-to-text-alist)
+  (with-open-file (output-file filename :direction :output :if-exists :overwrite :if-does-not-exist :create)
+      (write-correct output-file key-to-text-alist t config)))