r3357: remove load-compile-op from .asd file
[kmrcl.git] / genutils.lisp
index 09b14fa1be3382289f1ce0b1c88573794dfa879f..09d595d77c5304dd1153df418690f71260e8f8af 100644 (file)
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Apr 2000
 ;;;;
-;;;; $Id: genutils.lisp,v 1.5 2002/10/12 06:10:17 kevin Exp $
+;;;; $Id: genutils.lisp,v 1.10 2002/11/08 06:43:34 kevin Exp $
 ;;;;
 ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;;
          ((> ,var ,gstop))
        ,@body)))
 
-
+(defmacro with-each-stream-line ((var stream) &body body)
+  (let ((eof (gensym))
+       (eof-value (gensym))
+       (strm (gensym)))
+    `(let ((,strm ,stream)
+          (,eof ',eof-value))
+      (do ((,var (read-line ,strm nil ,eof) (read-line ,strm nil ,eof)))
+         ((eql ,var ,eof))
+       ,@body))))
+
+(defmacro with-each-file-line ((var file) &body body)
+  (let ((stream (gensym)))
+    `(with-open-file (,stream ,file :direction :input)
+      (with-each-stream-line (,var ,stream)
+       ,@body))))
+
+               
 ;;; Keyword functions
 
 (defun remove-keyword (key arglist)
 
 
 (defun mapcar-append-string-nontailrec (func v)
-"Concatenate results of mapcar lambda calls"  
+  "Concatenate results of mapcar lambda calls"  
   (aif (car v)
        (concatenate 'string (funcall func it)
                    (mapcar-append-string-nontailrec func (cdr v)))
 
 
 (defun mapcar-append-string (func v &optional (accum ""))
-"Concatenate results of mapcar lambda calls"  
+  "Concatenate results of mapcar lambda calls"  
   (aif (car v)
        (mapcar-append-string 
        func 
        (concatenate 'string accum (funcall func it)))
        accum))
 
-
 (defun mapcar2-append-string-nontailrec (func la lb)
-"Concatenate results of mapcar lambda call's over two lists"  
+  "Concatenate results of mapcar lambda call's over two lists"  
   (let ((a (car la))
        (b (car lb)))
     (if (and a b)
       "")))
   
 (defun mapcar2-append-string (func la lb &optional (accum ""))
-"Concatenate results of mapcar lambda call's over two lists"  
+  "Concatenate results of mapcar lambda call's over two lists"  
   (let ((a (car la))
        (b (car lb)))
     (if (and a b)
 
 (defun indent-spaces (n &optional (stream *standard-output*))
   "Indent n*2 spaces to output stream"
-  (let ((fmt (format nil "~~~DT" (+ n n))))
-    (format stream fmt)))
+  (when (numberp n)
+    (let ((fmt (format nil "~~~DT" (+ n n))))
+      (format stream fmt))))
 
 (defun print-list (l &optional (output *standard-output*))
-"Print a list to a stream"
+  "Print a list to a stream"
   (if (consp l)
     (progn
       (mapcar (lambda (x) (princ x output) (princ #\newline output)) l)
     nil))
 
 (defun print-rows (rows &optional (ostrm *standard-output*))
-"Print a list of list rows to a stream"  
+  "Print a list of list rows to a stream"  
   (dolist (r rows)
     (mapcar (lambda (a) (princ a ostrm) (princ #\space ostrm)) r)
     (terpri ostrm)))
 
 (defun file-subst (old new file1 file2)
   (with-open-file (in file1 :direction :input)
-     (with-open-file (out file2 :direction :output
-                                :if-exists :supersede)
-       (stream-subst old new in out))))
+    (with-open-file (out file2 :direction :output
+                        :if-exists :supersede)
+      (stream-subst old new in out))))
 
 (defun stream-subst (old new in out)
   (declare (string old new))
   "Opens a reads a file. Returns the contents as a single string"
   (when (probe-file file)
     (with-open-file (in file :direction :input)
-                   (do ((line (read-line in nil 'eof) 
-                              (read-line in nil 'eof)))
-                       ((eql line 'eof))
-                     (format strm "~A~%" line)))))
+      (let ((eof (gensym)))                
+       (do ((line (read-line in nil eof) 
+                  (read-line in nil eof)))
+           ((eq line eof))
+         (format strm "~A~%" line))))))
 
 (defun read-file-to-string (file)
   "Opens a reads a file. Returns the contents as a single string"
   (with-output-to-string (out)
     (with-open-file (in file :direction :input)
-      (do ((line (read-line in nil 'eof) 
-                (read-line in nil 'eof)))
-         ((eql line 'eof))
-       (format out "~A~%" line)))))
+      (let ((eof (gensym)))                
+       (do ((line (read-line in nil eof) 
+                  (read-line in nil eof)))
+           ((eq line eof))
+         (format out "~A~%" line))))))
 
 (defun read-file-to-strings (file)
   "Opens a reads a file. Returns the contents as a list of strings"
   (let ((lines '()))
     (with-open-file (in file :direction :input)
-      (do ((line (read-line in nil 'eof) 
-                (read-line in nil 'eof)))
-         ((eql line 'eof))
-       (push line lines)))
-    (nreverse lines)))
-
+      (let ((eof (gensym)))                
+       (do ((line (read-line in nil eof) 
+                  (read-line in nil eof)))
+           ((eq line eof))
+         (push line lines)))
+      (nreverse lines))))
 
 
 ;;; Formatting functions