Description: <short summary of the patch>
TODO: Put a short summary on the line above and replace this paragraph
with a longer explanation of this change. Complete the meta-information
with other relevant fields (see below for details). To make it easier, the
information below has been extracted from the changelog. Adjust it or drop
it.
.
gcl (2.6.12-38) unstable; urgency=medium
.
* Version_2_6_13pre50
Author: Camm Maguire <camm@debian.org>
---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:
Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: https://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: 2016-10-11
--- gcl-2.6.12.orig/ansi-tests/ansi-aux.lsp
+++ gcl-2.6.12/ansi-tests/ansi-aux.lsp
@@ -80,6 +80,10 @@ Results: ~A~%" expected-number form n re
"Like EQUALP, but guaranteed to return T for true."
(apply #'values (mapcar #'notnot (multiple-value-list (equalp x y)))))
+(defun equalpt-or-report (x y)
+ "Like EQUALPT, but return either T or a list of the arguments."
+ (or (equalpt x y) (list x y)))
+
(defun =t (x &rest args)
"Like =, but guaranteed to return T for true."
(apply #'values (mapcar #'notnot (multiple-value-list (apply #'= x args)))))
@@ -223,6 +227,13 @@ Results: ~A~%" expected-number form n re
P x p1 x TYPE p2)
t)))))
+(defun check-predicate (predicate &optional guard (universe *universe*))
+ "Return all elements of UNIVERSE for which the guard (if present) is false
+ and for which PREDICATE is false."
+ (remove-if #'(lambda (e) (or (and guard (funcall guard e))
+ (funcall predicate e)))
+ universe))
+
(declaim (special *catch-error-type*))
(defun catch-continue-debugger-hook (condition dbh)
@@ -296,7 +307,167 @@ the condition to go uncaught if it canno
(defmacro classify-error (form)
`(classify-error** ',form))
+(defun sequencep (x) (typep x 'sequence))
+
;;;
+(defun typef (type) #'(lambda (x) (typep x type)))
+
+(defmacro signals-error (form error-name &key (safety 3) (name nil name-p) (inline nil))
+ `(handler-bind
+ ((warning #'(lambda (c) (declare (ignore c))
+ (muffle-warning))))
+ (proclaim '(optimize (safety 3)))
+ (handler-case
+ (apply #'values
+ nil
+ (multiple-value-list
+ ,(cond
+ (inline form)
+ (regression-test::*compile-tests*
+ `(funcall (compile nil '(lambda ()
+ (declare (optimize (safety ,safety)))
+ ,form))))
+ (t `(eval ',form)))))
+ (,error-name (c)
+ (cond
+ ,@(case error-name
+ (type-error
+ `(((typep (type-error-datum c)
+ (type-error-expected-type c))
+ (values
+ nil
+ (list (list 'typep (list 'quote
+ (type-error-datum c))
+ (list 'quote
+ (type-error-expected-type c)))
+ "==> true")))))
+ ((undefined-function unbound-variable)
+ (and name-p
+ `(((not (eq (cell-error-name c) ',name))
+ (values
+ nil
+ (list 'cell-error-name "==>"
+ (cell-error-name c)))))))
+ ((stream-error end-of-file reader-error)
+ `(((not (streamp (stream-error-stream c)))
+ (values
+ nil
+ (list 'stream-error-stream "==>"
+ (stream-error-stream c))))))
+ (file-error
+ `(((not (pathnamep (pathname (file-error-pathname c))))
+ (values
+ nil
+ (list 'file-error-pathname "==>"
+ (file-error-pathname c))))))
+ (t nil))
+ (t (printable-p c)))))))
+
+(defmacro signals-error-always (form error-name)
+ `(values
+ (signals-error ,form ,error-name)
+ (signals-error ,form ,error-name :safety 0)))
+
+(defmacro signals-type-error (var datum-form form &key (safety 3) (inline nil))
+ (let ((lambda-form
+ `(lambda (,var)
+ (declare (optimize (safety ,safety)))
+ ,form)))
+ `(let ((,var ,datum-form))
+ (declare (optimize safety))
+ (handler-bind
+ ((warning #'(lambda (c) (declare (ignore c))
+ (muffle-warning))))
+ ; (proclaim '(optimize (safety 3)))
+ (handler-case
+ (apply #'values
+ nil
+ (multiple-value-list
+ (funcall
+ ,(cond
+ (inline `(function ,lambda-form))
+ (regression-test::*compile-tests*
+ `(compile nil ',lambda-form))
+ (t `(eval ',lambda-form)))
+ ,var)))
+ (type-error
+ (c)
+ (let ((datum (type-error-datum c))
+ (expected-type (type-error-expected-type c)))
+ (cond
+ ((not (eql ,var datum))
+ (list :datum-mismatch ,var datum))
+ ((typep datum expected-type)
+ (list :is-typep datum expected-type))
+ (t (printable-p c))))))))))
+
+(declaim (special *mini-universe*))
+
+(defun check-type-error* (pred-fn guard-fn &optional (universe *mini-universe*))
+ "Check that for all elements in some set, either guard-fn is true or
+ pred-fn signals a type error."
+ (let (val)
+ (loop for e in universe
+ unless (or (funcall guard-fn e)
+ (equal
+ (setf val (multiple-value-list
+ (signals-type-error x e (funcall pred-fn x) :inline t)))
+ '(t)))
+ collect (list e val))))
+
+(defmacro check-type-error (&body args)
+ `(locally (declare (optimize safety)) (check-type-error* ,@args)))
+
+(defun printable-p (obj)
+ "Returns T iff obj can be printed to a string."
+ (with-standard-io-syntax
+ (let ((*print-readably* nil)
+ (*print-escape* nil))
+ (declare (optimize safety))
+ (handler-case (and (stringp (write-to-string obj)) t)
+ (condition (c) (declare (ignore c)) nil)))))
+
+(defun make-special-string (string &key fill adjust displace base)
+ (let* ((len (length string))
+ (len2 (if fill (+ len 4) len))
+ (etype (if base 'base-char 'character)))
+ (if displace
+ (let ((s0 (make-array (+ len2 5)
+ :initial-contents
+ (concatenate 'string
+ (make-string 2 :initial-element #\X)
+ string
+ (make-string (if fill 7 3)
+ :initial-element #\Y))
+ :element-type etype)))
+ (make-array len2 :element-type etype
+ :adjustable adjust
+ :fill-pointer (if fill len nil)
+ :displaced-to s0
+ :displaced-index-offset 2))
+ (make-array len2 :element-type etype
+ :initial-contents
+ (if fill (concatenate 'string string "ZZZZ") string)
+ :fill-pointer (if fill len nil)
+ :adjustable adjust))))
+
+(defmacro do-special-strings ((var string-form &optional ret-form) &body forms)
+ (let ((string (gensym))
+ (fill (gensym "FILL"))
+ (adjust (gensym "ADJUST"))
+ (base (gensym "BASE"))
+ (displace (gensym "DISPLACE")))
+ `(let ((,string ,string-form))
+ (dolist (,fill '(nil t) ,ret-form)
+ (dolist (,adjust '(nil t))
+ (dolist (,base '(nil t))
+ (dolist (,displace '(nil t))
+ (let ((,var (make-special-string
+ ,string
+ :fill ,fill :adjust ,adjust
+ :base ,base :displace ,displace)))
+ ,@forms))))))))
+
;;; A scaffold is a structure that is used to remember the object
;;; identities of the cons cells in a (noncircular) data structure.
;;; This lets us check if the data structure has been changed by
@@ -1307,6 +1478,13 @@ the condition to go uncaught if it canno
(unuse-package package using-package)))
(delete-package package))))
+(defun delete-all-versions (pathspec)
+ "Replace the versions field of the pathname specified by pathspec with
+ :wild, and delete all the files this refers to."
+ (let* ((wild-pathname (make-pathname :version :wild :defaults (pathname pathspec)))
+ (truenames (directory wild-pathname)))
+ (mapc #'delete-file truenames)))
+
(defconstant +fail-count-limit+ 20)
(defmacro test-with-package-iterator (package-list-expr &rest symbol-types)
@@ -1455,3 +1633,5 @@ the condition to go uncaught if it canno
(list n1)
(random-partition n3 (- p 1 r))))))))))
+(defmacro expand-in-current-env (macro-form &environment env)
+ (macroexpand macro-form env))
--- /dev/null
+++ gcl-2.6.12/ansi-tests/broadcast-stream-streams.lsp
@@ -0,0 +1,30 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Jan 29 22:06:28 2004
+;;;; Contains: Tests of BROADCAST-STREAM-STREAMS
+
+(in-package :cl-test)
+
+(deftest broadcast-stream-streams.1
+ (broadcast-stream-streams (make-broadcast-stream))
+ nil)
+
+(deftest broadcast-stream-streams.2
+ (equalt
+ (broadcast-stream-streams (make-broadcast-stream *standard-output*))
+ (list *standard-output*))
+ t)
+
+(deftest broadcast-stream-streams.error.1
+ (signals-error (broadcast-stream-streams) program-error)
+ t)
+
+(deftest broadcast-stream-streams.error.2
+ (signals-error (broadcast-stream-streams (make-broadcast-stream) nil)
+ program-error)
+ t)
+
+
+
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/clear-input.lsp
@@ -0,0 +1,64 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Jan 28 06:12:39 2004
+;;;; Contains: Tests of CLEAR-INPUT
+
+(in-package :cl-test)
+
+;;; These tests are limited, since whether an input stream can be
+;;; cleared is not well specified.
+
+(deftest clear-input.1
+ (loop for s in (list *debug-io* *query-io*
+ *standard-input* *terminal-io*)
+ always (eq (clear-input s) nil))
+ t)
+
+(deftest clear-input.2
+ (clear-input)
+ nil)
+
+(deftest clear-input.3
+ (clear-input nil)
+ nil)
+
+(deftest clear-input.4
+ (clear-input t)
+ nil)
+
+(deftest clear-input.5
+ (with-input-from-string
+ (is "!?*")
+ (let ((*terminal-io* (make-two-way-stream is (make-broadcast-stream))))
+ (clear-input t)))
+ nil)
+
+(deftest clear-input.6
+ (with-input-from-string
+ (*standard-input* "345")
+ (clear-input nil))
+ nil)
+
+;;; Error cases
+
+(deftest clear-input.error.1
+ :notes (:assume-no-simple-streams)
+ (signals-error (clear-input t nil) program-error)
+ t)
+
+(deftest clear-input.error.2
+ :notes (:assume-no-simple-streams)
+ (signals-error (clear-input nil nil) program-error)
+ t)
+
+(deftest clear-input.error.3
+ (signals-error (clear-input t nil nil) program-error)
+ t)
+
+(deftest clear-input.error.4
+ (signals-error (clear-input nil nil nil) program-error)
+ t)
+
+(deftest clear-input.error.5
+ (check-type-error #'clear-input #'(lambda (x) (typep x '(or stream (member nil t)))))
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/clear-output.lsp
@@ -0,0 +1,53 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Jan 28 06:43:17 2004
+;;;; Contains: Tests of CLEAR-OUTPUT
+
+(in-package :cl-test)
+
+(deftest clear-output.1
+ (progn (finish-output) (clear-output))
+ nil)
+
+(deftest clear-output.2
+ (progn (finish-output) (clear-output t))
+ nil)
+
+(deftest clear-output.3
+ (progn (finish-output) (clear-output nil))
+ nil)
+
+(deftest clear-output.4
+ (loop for s in (list *debug-io* *error-output* *query-io*
+ *standard-output* *trace-output* *terminal-io*)
+ for dummy = (finish-output s)
+ for results = (multiple-value-list (clear-output s))
+ unless (equal results '(nil))
+ collect s)
+ nil)
+
+(deftest clear-output.5
+ (let ((os (make-string-output-stream)))
+ (let ((*terminal-io* (make-two-way-stream (make-string-input-stream "")
+ os)))
+ (clear-output t)))
+ nil)
+
+(deftest clear-output.6
+ (let ((*standard-output* (make-string-output-stream)))
+ (clear-output nil))
+ nil)
+
+;;; Error tests
+
+(deftest clear-output.error.1
+ (signals-error (clear-output nil nil) program-error)
+ t)
+
+(deftest clear-output.error.2
+ (signals-error (clear-output t nil) program-error)
+ t)
+
+(deftest clear-output.error.3
+ (check-type-error #'clear-output #'(lambda (x) (typep x '(or stream (member nil t)))))
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/compile-file-test-file.lsp
@@ -0,0 +1,3 @@
+(in-package "CL-TEST")
+
+(defun compile-file-test-fun.1 () nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/concatenated-stream-streams.lsp
@@ -0,0 +1,67 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Feb 14 08:43:45 2004
+;;;; Contains: Tests of CONCATENATED-STREAM-STREAMS
+
+(in-package :cl-test)
+
+(deftest concatenated-stream-streams.1
+ (concatenated-stream-streams (make-concatenated-stream))
+ nil)
+
+(deftest concatenated-stream-streams.2
+ (equalt (list (list *standard-input*))
+ (multiple-value-list
+ (concatenated-stream-streams
+ (make-concatenated-stream *standard-input*))))
+ t)
+
+(deftest concatenated-stream-streams.3
+ (with-input-from-string
+ (s1 "abc")
+ (with-input-from-string
+ (s2 "def")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (equalt (list (list s1 s2))
+ (multiple-value-list
+ (concatenated-stream-streams s))))))
+ t)
+
+(deftest concatenated-stream-streams.4
+ (with-input-from-string
+ (s1 "")
+ (with-input-from-string
+ (s2 "def")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (equalt (list (list s1 s2))
+ (multiple-value-list
+ (concatenated-stream-streams s))))))
+ t)
+
+(deftest concatenated-stream-streams.5
+ (with-input-from-string
+ (s1 "")
+ (with-input-from-string
+ (s2 "def")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (values
+ (read-char s)
+ (equalt (list (list s2))
+ (multiple-value-list
+ (concatenated-stream-streams s)))))))
+ #\d t)
+
+;;; Error cases
+
+(deftest concatenated-stream-streams.error.1
+ (signals-error (concatenated-stream-streams) program-error)
+ t)
+
+(deftest concatenated-stream-streams.error.2
+ (signals-error (concatenated-stream-streams
+ (make-concatenated-stream)
+ nil)
+ program-error)
+ t)
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/delete-file.lsp
@@ -0,0 +1,95 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 13 18:42:29 2004
+;;;; Contains: Tests for DELETE-FILE
+
+(in-package :cl-test)
+
+(deftest delete-file.1
+ (let ((pn "scratchfile.txt"))
+ (unless (probe-file pn)
+ (with-open-file (s pn :direction :output)
+ (format s "Contents~%")))
+ (values
+ (notnot (probe-file pn))
+ (multiple-value-list (delete-file pn))
+ (probe-file pn)))
+ t (t) nil)
+
+(deftest delete-file.2
+ (let ((pn #p"scratchfile.txt"))
+ (unless (probe-file pn)
+ (with-open-file (s pn :direction :output)
+ (format s "Contents~%")))
+ (values
+ (notnot (probe-file pn))
+ (multiple-value-list (delete-file pn))
+ (probe-file pn)))
+ t (t) nil)
+
+(deftest delete-file.3
+ (let ((pn "CLTEST:SCRATCHFILE.TXT"))
+ (assert (typep (pathname pn) 'logical-pathname))
+ (unless (probe-file pn)
+ (with-open-file (s pn :direction :output)
+ (format s "Contents~%")))
+ (values
+ (notnot (probe-file pn))
+ (multiple-value-list (delete-file pn))
+ (probe-file pn)))
+ t (t) nil)
+
+(deftest delete-file.4
+ (let ((pn "CLTEST:SCRATCHFILE.TXT"))
+ (assert (typep (pathname pn) 'logical-pathname))
+ (unless (probe-file pn)
+ (with-open-file (s pn :direction :output)
+ (format s "Contents~%")))
+ (let ((s (open pn :direction :input)))
+ (close s)
+ (values
+ (notnot (probe-file pn))
+ (multiple-value-list (delete-file s))
+ (probe-file pn))))
+ t (t) nil)
+
+;;; Specialized string tests
+
+(deftest delete-file.5
+ (do-special-strings
+ (pn "scratchfile.txt" nil)
+ (unless (probe-file pn)
+ (with-open-file (s pn :direction :output)
+ (format s "Contents~%")))
+ (assert (probe-file pn))
+ (assert (equal (multiple-value-list (delete-file pn)) '(t)))
+ (assert (not (probe-file pn))))
+ nil)
+
+;;; Error tests
+
+(deftest delete-file.error.1
+ (signals-error (delete-file) program-error)
+ t)
+
+(deftest delete-file.error.2
+ (let ((pn "scratch.txt"))
+ (unless (probe-file pn)
+ (with-open-file (s pn :direction :output)
+ (format s "Contents~%")))
+ (values
+ (notnot (probe-file pn))
+ (signals-error (delete-file "scratch.txt" nil) program-error)
+ (notnot (probe-file pn))
+ (delete-file pn)
+ (probe-file pn)))
+ t t t t nil)
+
+#|
+(deftest delete-file.error.3
+ (let ((pn "nonexistent.txt"))
+ (when (probe-file pn) (delete-file pn))
+ (signals-error (delete-file "nonexistent.txt") file-error))
+ t)
+|#
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/directory-namestring.lsp
@@ -0,0 +1,50 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Sep 12 06:21:42 2004
+;;;; Contains: Tests for DIRECTORY-NAMESTRING
+
+(in-package :cl-test)
+
+(deftest directory-namestring.1
+ (let* ((vals (multiple-value-list
+ (directory-namestring "directory-namestring.lsp")))
+ (s (first vals)))
+ (if (and (null (cdr vals))
+ (stringp s)
+ (equal (directory-namestring s) s))
+ :good
+ vals))
+ :good)
+
+(deftest directory-namestring.2
+ (do-special-strings
+ (s "directory-namestring.lsp" nil)
+ (let ((ns (directory-namestring s)))
+ (assert (stringp ns))
+ (assert (string= (directory-namestring ns) ns))))
+ nil)
+
+;;; Lispworks makes another assumption about filename normalization
+;;; when using file streams as pathname designators, so this test
+;;; doesn't work there.
+;;; (This is another example of the difficulty of testing a feature
+;;; in which so much is left up to the implementation.)
+#-lispworks
+(deftest directory-namestring.3
+ (let* ((name "directory-namestring.lsp")
+ (pn (merge-pathnames (pathname name)))
+ (name2 (with-open-file (s pn :direction :input)
+ (directory-namestring s)))
+ (name3 (directory-namestring pn)))
+ (or (equalt name2 name3) (list name2 name3)))
+ t)
+
+;;; Error tests
+
+(deftest directory-namestring.error.1
+ (signals-error (directory-namestring) program-error)
+ t)
+
+(deftest directory-namestring.error.2
+ (signals-error (directory-namestring "directory-namestring.lsp" nil) program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/directory.lsp
@@ -0,0 +1,71 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Jan 1 12:00:18 2004
+;;;; Contains: Tests of DIRECTORY
+
+(in-package :cl-test)
+
+(deftest directory.1
+ (directory "nonexistent")
+ nil)
+
+(deftest directory.2
+ (directory #p"nonexistent")
+ nil)
+
+(deftest directory.3
+ (directory "nonexistent" :allow-other-keys nil)
+ nil)
+
+(deftest directory.4
+ (directory "nonexistent" :allow-other-keys t :foo 'bar)
+ nil)
+
+(deftest directory.5
+ (directory "nonexistent" :foo 0 :allow-other-keys t)
+ nil)
+
+(deftest directory.6
+ (let* ((pattern-pathname (make-pathname :name :wild :type :wild
+ :defaults *default-pathname-defaults*))
+ (pathnames (directory pattern-pathname)))
+ (values
+ (remove-if #'pathnamep pathnames)
+ (loop for pn in pathnames
+ unless (equal pn (truename pn))
+ collect pn)
+;; (loop for pn in pathnames
+;; unless (pathname-match-p pn pattern-pathname)
+;; collect pn))
+ ))
+ nil nil ;; nil
+ )
+
+(deftest directory.7
+ (let* ((pattern-pathname (make-pathname :name :wild :type :wild
+ :defaults *default-pathname-defaults*))
+ (pathnames (directory pattern-pathname)))
+ (loop for pn in pathnames
+ unless (equal pn (probe-file pn))
+ collect pn))
+ nil)
+
+(deftest directory.8
+ (let* ((pathname-pattern "CLTEST:*.*")
+ (len (length (directory pathname-pattern))))
+ (if (< len 300) len nil))
+ nil)
+
+;;; Specialized string tests
+
+(deftest directory.9
+ (do-special-strings
+ (s "nonexistent" nil)
+ (assert (null (directory s))))
+ nil)
+
+;;; Error tests
+
+(deftest directory.error.1
+ (signals-error (directory) program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/echo-stream-input-stream.lsp
@@ -0,0 +1,27 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Feb 12 04:30:40 2004
+;;;; Contains: Tests of ECHO-STREAM-INPUT-STREAM
+
+(in-package :cl-test)
+
+(deftest echo-stream-input-stream.1
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (equalt (multiple-value-list (echo-stream-input-stream s))
+ (list is)))
+ t)
+
+(deftest echo-stream-input-stream.error.1
+ (signals-error (echo-stream-input-stream) program-error)
+ t)
+
+(deftest echo-stream-input-stream.error.2
+ (signals-error (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (echo-stream-input-stream s nil))
+ program-error)
+ t)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/echo-stream-output-stream.lsp
@@ -0,0 +1,26 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Feb 12 04:32:33 2004
+;;;; Contains: Tests off ECHO-STREAM-OUTPUT-STREAM
+
+(in-package :cl-test)
+
+(deftest echo-stream-output-stream.1
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (equalt (multiple-value-list (echo-stream-output-stream s))
+ (list os)))
+ t)
+
+(deftest echo-stream-output-stream.error.1
+ (signals-error (echo-stream-output-stream) program-error)
+ t)
+
+(deftest echo-stream-output-stream.error.2
+ (signals-error (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (echo-stream-output-stream s nil))
+ program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/enough-namestring.lsp
@@ -0,0 +1,84 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Sep 12 06:23:50 2004
+;;;; Contains: Tests of ENOUGH-NAMESTRING
+
+(in-package :cl-test)
+
+(deftest enough-namestring.1
+ (let* ((vals (multiple-value-list (enough-namestring "enough-namestring.lsp")))
+ (s (first vals)))
+ (if (and (null (cdr vals))
+ (stringp s)
+ (equal (enough-namestring s) s))
+ :good
+ vals))
+ :good)
+
+(deftest enough-namestring.2
+ (do-special-strings
+ (s "enough-namestring.lsp" nil)
+ (let ((ns (enough-namestring s)))
+ (assert (stringp ns))
+ (assert (string= (enough-namestring ns) ns))))
+ nil)
+
+(deftest enough-namestring.3
+ (let* ((name "enough-namestring.lsp")
+ (pn (merge-pathnames (pathname name)))
+ (name2 (enough-namestring pn))
+ (name3 (enough-namestring name)))
+ (or (equalt name2 name3) (list name2 name3)))
+ t)
+
+(deftest enough-namestring.4
+ (let* ((name "enough-namestring.lsp")
+ (pn (merge-pathnames (pathname name)))
+ (name2 (with-open-file (s pn :direction :input) (enough-namestring s)))
+ (name3 (enough-namestring name)))
+ (or (equalt name2 name3) (list name2 name3)))
+ t)
+
+(deftest enough-namestring.5
+ (let* ((vals (multiple-value-list (enough-namestring "enough-namestring.lsp"
+ *default-pathname-defaults*)))
+ (s (first vals)))
+ (if (and (null (cdr vals))
+ (stringp s)
+ (equal (enough-namestring s) s))
+ :good
+ vals))
+ :good)
+
+(deftest enough-namestring.6
+ (let* ((vals (multiple-value-list (enough-namestring "enough-namestring.lsp"
+ (namestring *default-pathname-defaults*))))
+ (s (first vals)))
+ (if (and (null (cdr vals))
+ (stringp s)
+ (equal (enough-namestring s) s))
+ :good
+ vals))
+ :good)
+
+(deftest enough-namestring.7
+ (do-special-strings
+ (s (namestring *default-pathname-defaults*) nil)
+ (let* ((vals (multiple-value-list (enough-namestring "enough-namestring.lsp" s)))
+ (s2 (first vals)))
+ (assert (null (cdr vals)))
+ (assert (stringp s2))
+ (assert (equal (enough-namestring s2) s2))))
+ nil)
+
+;;; Error tests
+
+(deftest enough-namestring.error.1
+ (signals-error (enough-namestring) program-error)
+ t)
+
+(deftest enough-namestring.error.2
+ (signals-error
+ (enough-namestring "enough-namestring.lsp" *default-pathname-defaults* nil)
+ program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/ensure-directories-exist.lsp
@@ -0,0 +1,166 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Mon Jan 5 20:53:03 2004
+;;;; Contains: Tests of ENSURE-DIRECTORIES-EXIST
+
+(in-package :cl-test)
+
+(deftest ensure-directories-exist.1
+ (let* ((pn (make-pathname :name "ensure-directories-exist.lsp"
+ :defaults *default-pathname-defaults*))
+ (results nil)
+ (verbosity
+ (with-output-to-string
+ (*standard-output*)
+ (setq results (multiple-value-list (ensure-directories-exist pn))))))
+ (values
+ (length results)
+ (equalt (truename pn) (truename (first results)))
+ (second results)
+ verbosity))
+ 2 t nil "")
+
+(deftest ensure-directories-exist.2
+ (with-open-file
+ (s "ensure-directories-exist.lsp" :direction :input)
+ (let* ((results (multiple-value-list (ensure-directories-exist s))))
+ (values
+ (length results)
+ (equalt (truename (first results)) (truename s))
+ (second results))))
+ 2 t nil)
+
+(deftest ensure-directories-exist.3
+ (let ((s (open "ensure-directories-exist.lsp" :direction :input)))
+ (close s)
+ (let* ((results (multiple-value-list (ensure-directories-exist s))))
+ (values
+ (length results)
+ (equalt (truename (first results)) (truename s))
+ (second results))))
+ 2 t nil)
+
+(deftest ensure-directories-exist.4
+ (let* ((pn (make-pathname :name "ensure-directories-exist.lsp"
+ :defaults *default-pathname-defaults*))
+ (results nil)
+ (verbosity
+ (with-output-to-string
+ (*standard-output*)
+ (setq results (multiple-value-list
+ (ensure-directories-exist pn :verbose nil))))))
+ (values
+ (length results)
+ (equalt (truename pn) (truename (first results)))
+ (second results)
+ verbosity))
+ 2 t nil "")
+
+(deftest ensure-directories-exist.5
+ (let* ((pn (make-pathname :name "ensure-directories-exist.lsp"
+ :defaults *default-pathname-defaults*))
+ (results nil)
+ (verbosity
+ (with-output-to-string
+ (*standard-output*)
+ (setq results (multiple-value-list
+ (ensure-directories-exist pn :verbose t))))))
+ (values
+ (length results)
+ (equalt (truename pn) (truename (first results)))
+ (second results)
+ verbosity))
+ 2 t nil "")
+
+(deftest ensure-directories-exist.6
+ (let* ((pn (make-pathname :name "ensure-directories-exist.lsp"
+ :defaults *default-pathname-defaults*))
+ (results nil)
+ (verbosity
+ (with-output-to-string
+ (*standard-output*)
+ (setq results (multiple-value-list
+ (ensure-directories-exist
+ pn :allow-other-keys nil))))))
+ (values
+ (length results)
+ (equalt (truename pn) (truename (first results)))
+ (second results)
+ verbosity))
+ 2 t nil "")
+
+(deftest ensure-directories-exist.7
+ (let* ((pn (make-pathname :name "ensure-directories-exist.lsp"
+ :defaults *default-pathname-defaults*))
+ (results nil)
+ (verbosity
+ (with-output-to-string
+ (*standard-output*)
+ (setq results (multiple-value-list
+ (ensure-directories-exist
+ pn :allow-other-keys t :nonsense t))))))
+ (values
+ (length results)
+ (equalt (truename pn) (truename (first results)))
+ (second results)
+ verbosity))
+ 2 t nil "")
+
+;;; Case where directory shouldn't exist
+
+;; The directort ansi-tests/scratch must not exist before this
+;; test is run
+(deftest ensure-directories-exist.8
+ (let* ((subdir (make-pathname :directory '(:relative "scratch")
+ :defaults *default-pathname-defaults*))
+ (pn (make-pathname :name "foo" :type "txt"
+ :defaults subdir)))
+ (ignore-errors (delete-file pn) (delete-file subdir))
+ (assert (not (probe-file pn)) ()
+ "Delete subdirectory scratch and its contents!")
+ (let* ((results nil)
+ (verbosity
+ (with-output-to-string
+ (*standard-output*)
+ (setq results (multiple-value-list (ensure-directories-exist pn)))))
+ (result-pn (first results))
+ (created (second results)))
+ ;; Create the file and write to it
+ (with-open-file (*standard-output*
+ pn :direction :output :if-exists :error
+ :if-does-not-exist :create)
+ (print nil))
+ (values
+ (length results)
+ (notnot created)
+ (equalt pn result-pn)
+ (notnot (probe-file pn))
+ verbosity
+ )))
+ 2 t t t "")
+
+;;; Specialized string tests
+
+(deftest ensure-directories-exist.9
+ (do-special-strings
+ (str "ensure-directories-exist.lsp" nil)
+ (let* ((results (multiple-value-list (ensure-directories-exist str))))
+ (assert (eql (length results) 2))
+ (assert (equalt (truename (first results)) (truename str)))
+ (assert (null (second results)))))
+ nil)
+
+;; FIXME
+;; Need to add a LPN test
+
+(deftest ensure-directories-exist.error.1
+ (signals-error-always
+ (ensure-directories-exist
+ (make-pathname :directory '(:relative :wild)
+ :defaults *default-pathname-defaults*))
+ file-error)
+ t t)
+
+(deftest ensure-directories-exist.error.2
+ (signals-error (ensure-directories-exist) program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/file-author.lsp
@@ -0,0 +1,88 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 6 05:41:06 2004
+;;;; Contains: Tests of FILE-AUTHOR
+
+(in-package :cl-test)
+
+(deftest file-author.1
+ (loop for pn in
+ (directory (make-pathname :name :wild :type :wild
+ :defaults *default-pathname-defaults*))
+ for author = (file-author pn)
+ unless (or (null author) (stringp author))
+ collect (list pn author))
+ nil)
+
+(deftest file-author.2
+ (let ((author (file-author "file-author.lsp")))
+ (if (or (null author) (stringp author))
+ nil
+ author))
+ nil)
+
+(deftest file-author.3
+ (let ((author (file-author #p"file-author.lsp")))
+ (if (or (null author) (stringp author))
+ nil
+ author))
+ nil)
+
+(deftest file-author.4
+ (let ((author (file-author (truename "file-author.lsp"))))
+ (if (or (null author) (stringp author))
+ nil
+ author))
+ nil)
+
+(deftest file-author.5
+ (let ((author (with-open-file (s "file-author.lsp" :direction :input)
+ (file-author s))))
+ (if (or (null author) (stringp author))
+ nil
+ author))
+ nil)
+
+(deftest file-author.6
+ (let ((author (let ((s (open "file-author.lsp" :direction :input)))
+ (close s)
+ (file-author s))))
+ (if (or (null author) (stringp author))
+ nil
+ author))
+ nil)
+
+;;; Specialized string tests
+
+(deftest file-author.7
+ (do-special-strings
+ (s "file-author.lsp" nil)
+ (assert (equal (file-author s) (file-author "file-author.lsp"))))
+ nil)
+
+;;; FIXME
+;;; Add LPN test
+
+;;; Error tests
+
+(deftest file-author.error.1
+ (signals-error (file-author) program-error)
+ t)
+
+(deftest file-author.error.2
+ (signals-error (file-author "file-author.lsp" nil) program-error)
+ t)
+
+(deftest file-author.error.3
+ (signals-error-always
+ (file-author (make-pathname :name :wild :type "lsp"
+ :defaults *default-pathname-defaults*))
+ file-error)
+ t t)
+
+(deftest file-author.error.4
+ (signals-error-always
+ (file-author (make-pathname :name "file-author" :type :wild
+ :defaults *default-pathname-defaults*))
+ file-error)
+ t t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/file-error.lsp
@@ -0,0 +1,89 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 13 19:10:02 2004
+;;;; Contains: Tests of the FILE-ERROR condition, and associated accessor function
+
+(in-package :cl-test)
+
+(deftest file-error.1
+ (let ((pn (make-pathname :name :wild
+ :type "txt"
+ :version :newest
+ :defaults *default-pathname-defaults*)))
+ (handler-case
+ (probe-file pn)
+ (error (c)
+ (values
+ (notnot (typep c 'file-error))
+ (if (equalp (file-error-pathname c) pn)
+ t
+ (list (file-error-pathname c) pn))))))
+ t t)
+
+(deftest file-error-pathname.1
+ (let ((c (make-condition 'file-error :pathname "foo.txt")))
+ (values
+ (notnot (typep c 'file-error))
+ (eqlt (class-of c) (find-class 'file-error))
+ (file-error-pathname c)))
+ t t "foo.txt")
+
+(deftest file-error-pathname.2
+ (let ((c (make-condition 'file-error :pathname #p"foo.txt")))
+ (values
+ (notnot (typep c 'file-error))
+ (eqlt (class-of c) (find-class 'file-error))
+ (equalt #p"foo.txt" (file-error-pathname c))))
+ t t t)
+
+(deftest file-error-pathname.3
+ (let ((c (make-condition 'file-error :pathname "CLTEST:FOO.TXT")))
+ (values
+ (notnot (typep c 'file-error))
+ (eqlt (class-of c) (find-class 'file-error))
+ (equalpt "CLTEST:FOO.TXT"
+ (file-error-pathname c))))
+ t t t)
+
+(deftest file-error-pathname.4
+ (let ((c (make-condition 'file-error :pathname (logical-pathname "CLTEST:FOO.TXT"))))
+ (values
+ (notnot (typep c 'file-error))
+ (eqlt (class-of c) (find-class 'file-error))
+ (equalpt (logical-pathname "CLTEST:FOO.TXT")
+ (file-error-pathname c))))
+ t t t)
+
+(deftest file-error-pathname.5
+ (with-open-file (s "file-error.lsp" :direction :input)
+ (let ((c (make-condition 'file-error :pathname s)))
+ (values
+ (notnot (typep c 'file-error))
+ (eqlt (class-of c) (find-class 'file-error))
+ (equalpt s (file-error-pathname c)))))
+ t t t)
+
+(deftest file-error-pathname.6
+ (let ((s (open "file-error.lsp" :direction :input)))
+ (close s)
+ (let ((c (make-condition 'file-error :pathname s)))
+ (values
+ (notnot (typep c 'file-error))
+ (eqlt (class-of c) (find-class 'file-error))
+ (equalpt s (file-error-pathname c)))))
+ t t t)
+
+(deftest file-error-pathname.error.1
+ (signals-error (file-error-pathname) program-error)
+ t)
+
+(deftest file-error-pathname.error.2
+ (signals-error
+ (file-error-pathname (make-condition 'file-error :pathname "foo.txt") nil)
+ program-error)
+ t)
+
+
+
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/file-length.lsp
@@ -0,0 +1,176 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Jan 21 06:21:11 2004
+;;;; Contains: Tests of FILE-LENGTH
+
+(in-package :cl-test)
+
+(deftest file-length.error.1
+ (signals-error (file-length) program-error)
+ t)
+
+(deftest file-length.error.2
+ (signals-error
+ (with-open-file (is "file-length.lsp" :direction :input)
+ (file-length is nil))
+ program-error)
+ t)
+
+(deftest file-length.error.3
+ (loop for x in *mini-universe*
+ unless (or (typep x 'file-stream)
+ (typep x 'broadcast-stream)
+ (handler-case (progn (file-length x) nil)
+ (type-error (c)
+ (assert (not (typep x (type-error-expected-type c))))
+ t)
+ (condition () nil)))
+ collect x)
+ nil)
+
+(deftest file-length.error.4
+ :notes (:assume-no-simple-streams :assume-no-gray-streams)
+ (signals-error (with-input-from-string (s "abc") (file-length s))
+ type-error)
+ t)
+
+(deftest file-length.error.5
+ (signals-error
+ (with-open-file
+ (is "file-length.lsp" :direction :input)
+ (with-open-file
+ (os "tmp.txt" :direction :output :if-exists :supersede)
+ (let ((s (make-two-way-stream is os)))
+ (unwind-protect (file-length s) (close s)))))
+ type-error)
+ t)
+
+(deftest file-length.error.6
+ (signals-error
+ (with-open-file
+ (is "file-length.lsp" :direction :input)
+ (with-open-file
+ (os "tmp.txt" :direction :output :if-exists :supersede)
+ (let ((s (make-echo-stream is os)))
+ (unwind-protect (file-length s) (close s)))))
+ type-error)
+ t)
+
+(deftest file-length.error.8
+ (with-open-file
+ (os "tmp.txt" :direction :output :if-exists :supersede)
+ (let ((s (make-broadcast-stream os)))
+ (eqlt (file-length s) (file-length os))))
+ t)
+
+(deftest file-length.error.9
+ (signals-type-error s (make-concatenated-stream)
+ (unwind-protect (file-length s) (close s)))
+ t)
+
+(deftest file-length.error.10
+ (signals-error
+ (with-open-file
+ (is "file-length.lsp" :direction :input)
+ (let ((s (make-concatenated-stream is)))
+ (unwind-protect (file-length s) (close s))))
+ type-error)
+ t)
+
+(deftest file-length.error.11
+ :notes (:assume-no-simple-streams :assume-no-gray-streams)
+ (signals-type-error s (make-string-input-stream "abcde")
+ (unwind-protect (file-length s) (close s)))
+ t)
+
+(deftest file-length.error.12
+ :notes (:assume-no-simple-streams :assume-no-gray-streams)
+ (signals-type-error s (make-string-output-stream)
+ (unwind-protect (file-length s) (close s)))
+ t)
+
+;;; Non-error tests
+
+(deftest file-length.1
+ (let ((results (multiple-value-list
+ (with-open-file
+ (is "file-length.lsp" :direction :input)
+ (file-length is)))))
+ (and (= (length results) 1)
+ (typep (car results) '(integer 1))
+ t))
+ t)
+
+(deftest file-length.2
+ (loop for i from 1 to 32
+ for etype = `(unsigned-byte ,i)
+ for e = (max 0 (- (ash 1 i) 5))
+ for os = (open "tmp.dat" :direction :output
+ :if-exists :supersede
+ :element-type etype)
+ do (loop repeat 17 do (write-byte e os))
+ do (finish-output os)
+ unless (= (file-length os) 17)
+ collect (list i (file-length os))
+ do (close os))
+ nil)
+
+(deftest file-length.3
+ (loop for i from 1 to 32
+ for etype = `(unsigned-byte ,i)
+ for e = (max 0 (- (ash 1 i) 5))
+ for os = (open "tmp.dat" :direction :output
+ :if-exists :supersede
+ :element-type etype)
+ for len = 0
+ do (loop repeat 17 do (write-byte e os))
+ do (close os)
+ unless (let ((is (open "tmp.dat" :direction :input
+ :element-type etype)))
+ (prog1
+ (= (file-length is) 17)
+ (close is)))
+ collect i)
+ nil)
+
+(deftest file-length.4
+ (loop for i from 33 to 100
+ for etype = `(unsigned-byte ,i)
+ for e = (max 0 (- (ash 1 i) 5))
+ for os = (open "tmp.dat" :direction :output
+ :if-exists :supersede
+ :element-type etype)
+ do (loop repeat 17 do (write-byte e os))
+ do (finish-output os)
+ unless (= (file-length os) 17)
+ collect (list i (file-length os))
+ do (close os))
+ nil)
+
+(deftest file-length.5
+ (loop for i from 33 to 100
+ for etype = `(unsigned-byte ,i)
+ for e = (max 0 (- (ash 1 i) 5))
+ for os = (open "tmp.dat" :direction :output
+ :if-exists :supersede
+ :element-type etype)
+ for len = 0
+ do (loop repeat 17 do (write-byte e os))
+ do (close os)
+ unless (let ((is (open "tmp.dat" :direction :input
+ :element-type etype)))
+ (prog1
+ (= (file-length is) 17)
+ (close is)))
+ collect i)
+ nil)
+
+(deftest file-length.6
+ (with-open-file
+ (*foo* "file-length.lsp" :direction :input)
+ (declare (special *foo*))
+ (let ((s (make-synonym-stream '*foo*)))
+ (unwind-protect
+ (typep* (file-length s) '(integer 1))
+ (close s))))
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/file-namestring.lsp
@@ -0,0 +1,44 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Sep 11 07:40:47 2004
+;;;; Contains: Tests for FILE-NAMESTRING
+
+(in-package :cl-test)
+
+(deftest file-namestring.1
+ (let* ((vals (multiple-value-list
+ (file-namestring "file-namestring.lsp")))
+ (s (first vals)))
+ (if (and (null (cdr vals))
+ (stringp s)
+ (equal (file-namestring s) s))
+ :good
+ vals))
+ :good)
+
+(deftest file-namestring.2
+ (do-special-strings
+ (s "file-namestring.lsp" nil)
+ (let ((ns (file-namestring s)))
+ (assert (stringp ns))
+ (assert (string= (file-namestring ns) ns))))
+ nil)
+
+(deftest file-namestring.3
+ (let* ((name "file-namestring.lsp")
+ (pn (merge-pathnames (pathname name)))
+ (name2 (with-open-file (s pn :direction :input)
+ (file-namestring s)))
+ (name3 (file-namestring pn)))
+ (or (equalt name2 name3) (list name2 name3)))
+ t)
+
+;;; Error tests
+
+(deftest file-namestring.error.1
+ (signals-error (file-namestring) program-error)
+ t)
+
+(deftest file-namestring.error.2
+ (signals-error (file-namestring "file-namestring.lsp" nil) program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/file-position.lsp
@@ -0,0 +1,170 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Jan 22 03:02:31 2004
+;;;; Contains: Tests of FILE-POSITION
+
+(in-package :cl-test)
+
+(deftest file-position.1
+ (with-open-file (is "file-position.lsp":direction :input)
+ (file-position is))
+ 0)
+
+(deftest file-position.2
+ (with-open-file (is "file-position.lsp":direction :input)
+ (values
+ (multiple-value-list
+ (notnot-mv (file-position is :start)))
+ (file-position is)))
+
+ (t) 0)
+
+(deftest file-position.3
+ (with-open-file (is "file-position.lsp":direction :input)
+ (values
+ (multiple-value-list
+ (notnot-mv (file-position is :end)))
+ (notnot (> (file-position is) 0))))
+ (t) t)
+
+(deftest file-position.4
+ (with-open-file
+ (is "file-position.lsp":direction :input)
+ (values
+ (file-position is)
+ (read-char is)
+ (notnot (> (file-position is) 0))))
+ 0 #\; t)
+
+(deftest file-position.5
+ (with-open-file
+ (os "tmp.dat":direction :output
+ :if-exists :supersede)
+ (values
+ (file-position os)
+ (write-char #\x os)
+ (notnot (> (file-position os) 0))))
+ 0 #\x t)
+
+(deftest file-position.6
+ (with-open-file
+ (os "tmp.dat":direction :output
+ :if-exists :supersede)
+ (let ((p1 (file-position os))
+ (delta (file-string-length os #\x)))
+ (write-char #\x os)
+ (let ((p2 (file-position os)))
+ (or (null p1) (null p2) (null delta)
+ (=t (+ p1 delta) p2)))))
+ t)
+
+;;; Byte streams
+
+(deftest file-position.7
+ (loop for len from 1 to 32
+ for n = (ash 1 len)
+ do (with-open-file
+ (os "tmp.dat" :direction :output
+ :if-exists :supersede
+ :element-type `(unsigned-byte ,len))
+ (loop for i from 0 below 100
+ for r = (logand (1- n) i)
+ for pos = (file-position os)
+ do (assert (or (not pos) (eql pos i)))
+ do (write-byte r os)))
+ do (with-open-file
+ (is "tmp.dat" :direction :input
+ :element-type `(unsigned-byte ,len))
+ (loop for i from 0 below 100
+ for pos = (file-position is)
+ do (assert (or (not pos) (eql pos i)))
+ do (let ((byte (read-byte is)))
+ (assert (eql byte (logand (1- n) i)))))))
+ nil)
+
+(deftest file-position.8
+ (loop for len from 33 to 100
+ for n = (ash 1 len)
+ do (with-open-file
+ (os "tmp.dat" :direction :output
+ :if-exists :supersede
+ :element-type `(unsigned-byte ,len))
+ (loop for i from 0 below 100
+ for r = (logand (1- n) i)
+ for pos = (file-position os)
+ do (assert (or (not pos) (eql pos i)))
+ do (write-byte r os)))
+ do (with-open-file
+ (is "tmp.dat" :direction :input
+ :element-type `(unsigned-byte ,len))
+ (loop for i from 0 below 100
+ for pos = (file-position is)
+ do (assert (or (not pos) (eql pos i)))
+ do (let ((byte (read-byte is)))
+ (assert (eql byte (logand (1- n) i)))))))
+ nil)
+
+(deftest file-position.9
+ (with-input-from-string
+ (s "abcdefghijklmnopqrstuvwxyz")
+ (loop repeat 26
+ for p = (file-position s)
+ unless (or (not p)
+ (progn
+ (file-position s p)
+ (eql (file-position s) p)))
+ collect p
+ do (read-char s)))
+ nil)
+
+(deftest file-position.10
+ (with-output-to-string
+ (s)
+ (loop repeat 26
+ for p = (file-position s)
+ unless (or (not p)
+ (progn
+ (file-position s p)
+ (eql (file-position s) p)))
+ collect p
+ do (write-char #\x s)))
+ "xxxxxxxxxxxxxxxxxxxxxxxxxx")
+
+;;; Error tests
+
+(deftest file-position.error.1
+ (signals-error (file-position) program-error)
+ t)
+
+(deftest file-position.error.2
+ (signals-error
+ (file-position (make-string-input-stream "abc") :start nil)
+ program-error)
+ t)
+
+;;; It's not clear what 'too large' means -- can we set the
+;;; file position to a point where the file may later be extended
+;;; by some other writer?
+#|
+(deftest file-position.error.3
+ (signals-error
+ (with-open-file
+ (is "file-position.lsp" :direction :input)
+ (flet ((%fail () (error 'type-error)))
+ (unless (file-position is :end) (%fail))
+ (let ((fp (file-position is)))
+ (unless fp (%fail))
+ (file-position is (+ 1000000 fp)))))
+ error)
+ t)
+
+(deftest file-position.error.4
+ (signals-error
+ (with-open-file
+ (is "file-position.lsp" :direction :input)
+ (file-position is 1000000000000000000000))
+ error)
+ t)
+|#
+
+
\ No newline at end of file
--- /dev/null
+++ gcl-2.6.12/ansi-tests/file-string-length.lsp
@@ -0,0 +1,73 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Jan 22 21:34:04 2004
+;;;; Contains: Tests of FILE-STRING-LENGTH
+
+(in-package :cl-test)
+
+(deftest file-string-length.1
+ (with-open-file
+ (s "tmp.dat" :direction :output
+ :if-exists :supersede)
+ (loop for x across +standard-chars+
+ for len = (file-string-length s x)
+ do (assert (typep len '(or null (integer 0))))
+ do (let ((pos1 (file-position s)))
+ (write-char x s)
+ (let ((pos2 (file-position s)))
+ (when (and pos1 pos2 len)
+ (assert (= (+ pos1 len) pos2)))))))
+ nil)
+
+(deftest file-string-length.2
+ (with-open-file
+ (s "tmp.dat" :direction :output
+ :if-exists :supersede)
+ (loop for x across +standard-chars+
+ for len = (file-string-length s (string x))
+ do (assert (typep len '(or null (integer 0))))
+ do (let ((pos1 (file-position s)))
+ (write-sequence (string x) s)
+ (let ((pos2 (file-position s)))
+ (when (and pos1 pos2 len)
+ (assert (= (+ pos1 len) pos2)))))))
+ nil)
+
+(deftest file-string-length.3
+ (with-open-file
+ (stream "tmp.dat" :direction :output
+ :if-exists :supersede)
+ (let* ((s1 "abcde")
+ (n (file-string-length stream s1)))
+ (do-special-strings
+ (s2 s1 nil)
+ (assert (= (file-string-length stream s2) n)))))
+ nil)
+
+;;; Error tests
+
+(deftest file-string-length.error.1
+ (signals-error (file-string-length) program-error)
+ t)
+
+(deftest file-string-length.error.2
+ (signals-error
+ (with-open-file
+ (s "tmp.dat" :direction :output
+ :if-exists :supersede)
+ (file-string-length s))
+ program-error)
+ t)
+
+(deftest file-string-length.error.3
+ (signals-error
+ (with-open-file
+ (s "tmp.dat" :direction :output
+ :if-exists :supersede)
+ (file-string-length s #\x nil))
+ program-error)
+ t)
+
+
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/file-write-date.lsp
@@ -0,0 +1,89 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 6 06:01:35 2004
+;;;; Contains: Tests for FILE-WRITE-DATE
+
+(in-package :cl-test)
+
+(deftest file-write-date.1
+ (let* ((pn "file-write-date.lsp")
+ (date (file-write-date pn))
+ (time (get-universal-time)))
+ (or (null date)
+ (and (integerp date)
+ (<= 0 date time)
+ t)))
+ t)
+
+(deftest file-write-date.2
+ (let* ((pn #p"file-write-date.lsp")
+ (date (file-write-date pn))
+ (time (get-universal-time)))
+ (or (null date)
+ (and (integerp date)
+ (<= 0 date time)
+ t)))
+ t)
+
+(deftest file-write-date.3
+ (let* ((pn (truename "file-write-date.lsp"))
+ (date (file-write-date pn))
+ (time (get-universal-time)))
+ (or (null date)
+ (and (integerp date)
+ (<= 0 date time)
+ t)))
+ t)
+
+(deftest file-write-date.4
+ (loop for pn in (directory
+ (make-pathname :name :wild :type :wild
+ :defaults *default-pathname-defaults*))
+ for date = (file-write-date pn)
+ for time = (get-universal-time)
+ unless (or (null date)
+ (<= 0 date time))
+ collect (list pn date time))
+ nil)
+
+(deftest file-write-date.5
+ (length (multiple-value-list (file-write-date "file-write-date.lsp")))
+ 1)
+
+;;; Specialized string tests
+
+(deftest file-write-date.6
+ (let* ((str "file-write-date.lsp")
+ (date (file-write-date str)))
+ (do-special-strings
+ (s str nil)
+ (assert (equal (file-write-date s) date))))
+ nil)
+
+;;; FIXME
+;;; Add LPN test
+
+;;; Error tests
+
+(deftest file-write-date.error.1
+ (signals-error (file-write-date) program-error)
+ t)
+
+(deftest file-write-date.error.2
+ (signals-error (file-write-date "file-write-date.lsp" nil)
+ program-error)
+ t)
+
+(deftest file-write-date.error.3
+ (signals-error-always
+ (file-write-date (make-pathname :name :wild :type "lsp"
+ :defaults *default-pathname-defaults*))
+ file-error)
+ t t)
+
+(deftest file-write-date.error.4
+ (signals-error-always
+ (file-write-date (make-pathname :name "file-write-date" :type :wild
+ :defaults *default-pathname-defaults*))
+ file-error)
+ t t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/finish-output.lsp
@@ -0,0 +1,54 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Jan 28 06:38:20 2004
+;;;; Contains: Tests of FINISH-OUTPUT
+
+(in-package :cl-test)
+
+(deftest finish-output.1
+ (finish-output)
+ nil)
+
+(deftest finish-output.2
+ (finish-output t)
+ nil)
+
+(deftest finish-output.3
+ (finish-output nil)
+ nil)
+
+(deftest finish-output.4
+ (loop for s in (list *debug-io* *error-output* *query-io*
+ *standard-output* *trace-output* *terminal-io*)
+ for results = (multiple-value-list (finish-output s))
+ unless (equal results '(nil))
+ collect s)
+ nil)
+
+(deftest finish-output.5
+ (let ((os (make-string-output-stream)))
+ (let ((*terminal-io* (make-two-way-stream (make-string-input-stream "")
+ os)))
+ (finish-output t)))
+ nil)
+
+(deftest finish-output.6
+ (let ((*standard-output* (make-string-output-stream)))
+ (finish-output nil))
+ nil)
+
+;;; Error tests
+
+(deftest finish-output.error.1
+ (signals-error (finish-output nil nil) program-error)
+ t)
+
+(deftest finish-output.error.2
+ (signals-error (finish-output t nil) program-error)
+ t)
+
+(deftest finish-output.error.3
+ (check-type-error #'finish-output
+ #'(lambda (x) (typep x '(or stream (member nil t)))))
+ nil)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/force-output.lsp
@@ -0,0 +1,56 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Jan 28 06:41:46 2004
+;;;; Contains: Tests of FORCE-OUTPUT
+
+(in-package :cl-test)
+
+(deftest force-output.1
+ (force-output)
+ nil)
+
+(deftest force-output.2
+ (force-output t)
+ nil)
+
+(deftest force-output.3
+ (force-output nil)
+ nil)
+
+(deftest force-output.4
+ (loop for s in (list *debug-io* *error-output* *query-io*
+ *standard-output* *trace-output* *terminal-io*)
+ for results = (multiple-value-list (force-output s))
+ unless (equal results '(nil))
+ collect s)
+ nil)
+
+(deftest force-output.5
+ (let ((os (make-string-output-stream)))
+ (let ((*terminal-io* (make-two-way-stream (make-string-input-stream "")
+ os)))
+ (force-output t)))
+ nil)
+
+(deftest force-output.6
+ (let ((*standard-output* (make-string-output-stream)))
+ (force-output nil))
+ nil)
+
+
+;;; Error tests
+
+(deftest force-output.error.1
+ (signals-error (force-output nil nil) program-error)
+ t)
+
+(deftest force-output.error.2
+ (signals-error (force-output t nil) program-error)
+ t)
+
+(deftest force-output.error.3
+ (check-type-error #'force-output
+ #'(lambda (x) (typep x '(or stream (member nil t)))))
+ nil)
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/fresh-line.lsp
@@ -0,0 +1,87 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Jan 18 20:41:18 2004
+;;;; Contains: Tests of FRESH-LINE
+
+(in-package :cl-test)
+
+(deftest fresh-line.1
+ (let (result)
+ (values
+ (with-output-to-string
+ (*standard-output*)
+ (write-char #\a)
+ (setq result (notnot (fresh-line))))
+ result))
+ #.(concatenate 'string "a" (string #\Newline))
+ t)
+
+(deftest fresh-line.2
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (write-char #\a s)
+ (setq result (notnot (fresh-line s))))
+ result))
+ #.(concatenate 'string "a" (string #\Newline))
+ t)
+
+(deftest fresh-line.3
+ (with-output-to-string
+ (s)
+ (write-char #\x s)
+ (fresh-line s)
+ (fresh-line s)
+ (write-char #\y s))
+ #.(concatenate 'string "x" (string #\Newline) "y"))
+
+(deftest fresh-line.4
+ (let (result)
+ (values
+ (with-output-to-string
+ (*standard-output*)
+ (setq result (multiple-value-list (fresh-line))))
+ result))
+ "" (nil))
+
+(deftest fresh-line.5
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (write-char #\Space s)
+ (setq result
+ (list
+ (multiple-value-list (notnot-mv (fresh-line s)))
+ (multiple-value-list (fresh-line s))
+ (multiple-value-list (fresh-line s)))))
+ result))
+ "
+" ((t) (nil) (nil)))
+
+(deftest fresh-line.6
+ (with-output-to-string
+ (os)
+ (let ((*terminal-io* (make-two-way-stream *standard-input* os)))
+ (write-char #\a t)
+ (fresh-line t)
+ (finish-output t)))
+ #.(concatenate 'string (string #\a) (string #\Newline)))
+
+(deftest fresh-line.7
+ (with-output-to-string
+ (*standard-output*)
+ (write-char #\a nil)
+ (terpri nil))
+ #.(concatenate 'string (string #\a) (string #\Newline)))
+
+;;; Error tests
+
+(deftest fresh-line.error.1
+ (signals-error
+ (with-output-to-string
+ (s)
+ (fresh-line s nil))
+ program-error)
+ t)
--- gcl-2.6.12.orig/ansi-tests/gclload2.lsp
+++ gcl-2.6.12/ansi-tests/gclload2.lsp
@@ -46,6 +46,15 @@
;;; Tests of strings
(load "load-strings.lsp")
+;;; Tests of pathnames
+(load "load-pathnames.lsp")
+
+;;; Tests of file operations
+(load "load-files.lsp")
+
+;;; Tests of streams
+(load "load-streams.lsp")
+
;;; Tests for character functions
(compile-and-load "char-aux.lsp")
(load "character.lsp")
--- /dev/null
+++ gcl-2.6.12/ansi-tests/get-output-stream-string.lsp
@@ -0,0 +1,32 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Feb 14 09:48:46 2004
+;;;; Contains: Tests of GET-OUTPUT-STREAM-STRING
+
+(in-package :cl-test)
+
+;; this function is used extensively elsewhere in the test suite
+
+(deftest get-output-stream-string.1
+ (let ((s (make-string-output-stream)))
+ (values
+ (get-output-stream-string s)
+ (write-string "abc" s)
+ (write-string "def" s)
+ (get-output-stream-string s)
+ (get-output-stream-string s)))
+ "" "abc" "def" "abcdef" "")
+
+;;; Error cases
+
+(deftest get-output-stream-string.error.1
+ (signals-error (get-output-stream-string) t)
+ t)
+
+(deftest get-output-stream-string.error.2
+ (signals-error (get-output-stream-string (make-string-output-stream) nil) t)
+ t)
+
+
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/host-namestring.lsp
@@ -0,0 +1,49 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Sep 12 06:22:40 2004
+;;;; Contains: Tests of HOST-NAMESTRING
+
+(in-package :cl-test)
+
+(deftest host-namestring.1
+ (let* ((vals (multiple-value-list
+ (host-namestring "host-namestring.lsp")))
+ (s (first vals)))
+ (if (and (null (cdr vals))
+ (or (null s)
+ (stringp s)
+ ;; (equal (host-namestring s) s)
+ ))
+ :good
+ vals))
+ :good)
+
+(deftest host-namestring.2
+ (do-special-strings
+ (s "host-namestring.lsp" nil)
+ (let ((ns (host-namestring s)))
+ (when ns
+ (assert (stringp ns))
+ ;; (assert (string= (host-namestring ns) ns))
+ )))
+ nil)
+
+(deftest host-namestring.3
+ (let* ((name "host-namestring.lsp")
+ (pn (merge-pathnames (pathname name)))
+ (name2 (with-open-file (s pn :direction :input)
+ (host-namestring s)))
+ (name3 (host-namestring pn)))
+ (or (equalt name2 name3) (list name2 name3)))
+ t)
+
+;;; Error tests
+
+(deftest host-namestring.error.1
+ (signals-error (host-namestring) program-error)
+ t)
+
+(deftest host-namestring.error.2
+ (signals-error (host-namestring "host-namestring.lsp" nil) program-error)
+ t)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/input-stream-p.lsp
@@ -0,0 +1,40 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 13 19:39:27 2004
+;;;; Contains: Tests for INPUT-STREAM-P
+
+(in-package :cl-test)
+
+(deftest input-stream-p.1
+ (notnot-mv (input-stream-p *standard-input*))
+ t)
+
+(deftest input-stream-p.2
+ (notnot-mv (input-stream-p *terminal-io*))
+ t)
+
+(deftest input-stream-p.3
+ (with-open-file (s "input-stream-p.lsp" :direction :input)
+ (notnot-mv (input-stream-p s)))
+ t)
+
+(deftest input-stream-p.4
+ (with-open-file (s "foo.txt" :direction :output
+ :if-exists :supersede)
+ (input-stream-p s))
+ nil)
+
+;;; Error tests
+
+(deftest input-stream-p.error.1
+ (signals-error (input-stream-p) program-error)
+ t)
+
+(deftest input-stream-p.error.2
+ (signals-error (input-stream-p *standard-input* nil)
+ program-error)
+ t)
+
+(deftest input-stream-p.error.3
+ (check-type-error #'input-stream-p #'streamp)
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/interactive-stream-p.lsp
@@ -0,0 +1,28 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 13 19:47:59 2004
+;;;; Contains: Tests of INTERACTIVE-STREAM-P
+
+(in-package :cl-test)
+
+(deftest interactive-stream-p.1
+ (let ((streams (list *debug-io* *error-output* *query-io*
+ *standard-input* *standard-output*
+ *trace-output* *terminal-io*)))
+ (mapc #'interactive-stream-p streams)
+ ;; no error should occur
+ nil)
+ nil)
+
+(deftest interactive-stream-p.error.1
+ (check-type-error #'interactive-stream-p #'streamp)
+ nil)
+
+(deftest interactive-stream-p.error.2
+ (signals-error (interactive-stream-p) program-error)
+ t)
+
+(deftest interactive-stream-p.error.3
+ (signals-error (interactive-stream-p *terminal-io* nil)
+ program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/ldtest.lsp
@@ -0,0 +1 @@
+(in-package :cl-test) (defun LOAD-TEST-FUN-3 () :foo)
\ No newline at end of file
--- /dev/null
+++ gcl-2.6.12/ansi-tests/listen.lsp
@@ -0,0 +1,73 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 27 21:16:39 2004
+;;;; Contains: Tests of LISTEN
+
+(in-package :cl-test)
+
+(deftest listen.1
+ (with-input-from-string (s "") (listen s))
+ nil)
+
+(deftest listen.2
+ (with-input-from-string (s "x") (notnot-mv (listen s)))
+ t)
+
+(deftest listen.3
+ (with-input-from-string (*standard-input* "") (listen))
+ nil)
+
+(deftest listen.4
+ (with-input-from-string (*standard-input* "A") (notnot-mv (listen)))
+ t)
+
+;;; (deftest listen.5
+;;; (when (interactive-stream-p *standard-input*)
+;;; (clear-input) (listen))
+;;; nil)
+
+(deftest listen.6
+ (with-input-from-string
+ (s "x")
+ (values
+ (read-char s)
+ (listen s)
+ (unread-char #\x s)
+ (notnot (listen s))
+ (read-char s)))
+ #\x nil nil t #\x)
+
+(deftest listen.7
+ (with-open-file
+ (s "listen.lsp")
+ (values
+ (notnot (listen s))
+ (handler-case
+ (locally (declare (optimize safety))
+ (loop (read-char s)))
+ (end-of-file () (listen s)))))
+ t nil)
+
+(deftest listen.8
+ (with-input-from-string
+ (is "abc")
+ (let ((*terminal-io* (make-two-way-stream is (make-broadcast-stream))))
+ (notnot-mv (listen t))))
+ t)
+
+(deftest listen.9
+ (with-input-from-string
+ (*standard-input* "345")
+ (notnot-mv (listen nil)))
+ t)
+
+;;; Error tests
+
+(deftest listen.error.1
+ :notes (:assume-no-simple-streams)
+ (signals-error (listen *standard-input* nil) program-error)
+ t)
+
+(deftest listen.error.2
+ (signals-error (listen *standard-input* nil nil) program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/load-files.lsp
@@ -0,0 +1,16 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Jan 1 11:59:35 2004
+;;;; Contains: Load tests of section 20, 'Files'
+
+(in-package :cl-test)
+
+(load "directory.lsp")
+(load "probe-file.lsp")
+(load "ensure-directories-exist.lsp")
+(load "truename.lsp")
+(load "file-author.lsp")
+(load "file-write-date.lsp")
+(load "rename-file.lsp")
+(load "delete-file.lsp")
+(load "file-error.lsp")
--- /dev/null
+++ gcl-2.6.12/ansi-tests/load-logical-pathname-translations.lsp
@@ -0,0 +1,34 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Dec 31 09:31:33 2003
+;;;; Contains: Tests (such as they are) for LOAD-LOGICAL-PATHNAME-TRANSLATIONS
+
+(in-package :cl-test)
+
+;;; The function LOAD-LOGICAL-PATHNAME-TRANSLATIONS is almost entirely
+;;; untestable, since the basic behavior is implementation defined.
+
+(deftest load-logical-pathname-translations.1
+ (load-logical-pathname-translations "CLTESTROOT")
+ nil)
+
+;;; Error cases
+
+(deftest load-logical-pathname-translations.error.1
+ (handler-case
+ (progn (load-logical-pathname-translations
+ "THEREHADBETTERNOTBEAHOSTCALLEDTHIS")
+ nil)
+ (error () :good))
+ :good)
+
+(deftest load-logical-pathname-translations.error.2
+ (signals-error (load-logical-pathname-translations)
+ program-error)
+ t)
+
+(deftest load-logical-pathname-translations.error.3
+ (signals-error (load-logical-pathname-translations "CLTESTROOT" nil)
+ program-error)
+ t)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/load-pathnames.lsp
@@ -0,0 +1,36 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Nov 29 04:33:05 2003
+;;;; Contains: Load tests for pathnames and logical pathnames
+
+(in-package :cl-test)
+
+(compile-and-load "pathnames-aux.lsp")
+
+(load "pathnames.lsp")
+(load "pathname.lsp")
+(load "pathnamep.lsp")
+(load "make-pathname.lsp")
+(load "pathname-host.lsp")
+(load "pathname-device.lsp")
+(load "pathname-directory.lsp")
+(load "pathname-name.lsp")
+(load "pathname-type.lsp")
+(load "pathname-version.lsp")
+
+(load "load-logical-pathname-translations.lsp")
+(load "logical-pathname.lsp")
+(load "logical-pathname-translations.lsp")
+(load "translate-logical-pathname.lsp")
+
+(load "namestring.lsp")
+(load "file-namestring.lsp")
+(load "directory-namestring.lsp")
+(load "host-namestring.lsp")
+(load "enough-namestring.lsp")
+
+(load "wild-pathname-p.lsp")
+(load "merge-pathnames.lsp")
+(load "pathname-match-p.lsp")
+
+(load "parse-namestring.lsp")
\ No newline at end of file
--- /dev/null
+++ gcl-2.6.12/ansi-tests/load-streams.lsp
@@ -0,0 +1,57 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 13 19:38:10 2004
+;;;; Contains: Load files containing tests for section 21 (streams)
+
+(in-package :cl-test)
+
+(load "input-stream-p.lsp")
+(load "output-stream-p.lsp")
+(load "interactive-stream-p.lsp")
+(load "open-stream-p.lsp")
+(load "stream-element-type.lsp")
+(load "streamp.lsp")
+(load "read-byte.lsp")
+(load "peek-char.lsp")
+(load "read-char.lsp")
+(load "read-char-no-hang.lsp")
+(load "terpri.lsp")
+(load "fresh-line.lsp")
+(load "unread-char.lsp")
+(load "write-char.lsp")
+(load "read-line.lsp")
+(load "write-string.lsp")
+(load "write-line.lsp")
+(load "read-sequence.lsp")
+(load "write-sequence.lsp")
+(load "file-length.lsp")
+(load "file-position.lsp")
+(load "file-string-length.lsp")
+(load "open.lsp")
+(load "stream-external-format.lsp")
+(load "with-open-file.lsp")
+(load "with-open-stream.lsp")
+(load "listen.lsp")
+(load "clear-input.lsp")
+(load "finish-output.lsp")
+(load "force-output.lsp")
+(load "clear-output.lsp")
+(load "make-synonym-stream.lsp")
+(load "synonym-stream-symbol.lsp")
+(load "make-broadcast-stream.lsp")
+(load "broadcast-stream-streams.lsp")
+(load "make-two-way-stream.lsp")
+(load "two-way-stream-input-stream.lsp")
+(load "two-way-stream-output-stream.lsp")
+(load "echo-stream-input-stream.lsp")
+(load "echo-stream-output-stream.lsp")
+(load "make-echo-stream.lsp")
+(load "concatenated-stream-streams.lsp")
+(load "make-concatenated-stream.lsp")
+(load "get-output-stream-string.lsp")
+(load "make-string-input-stream.lsp")
+(load "make-string-output-stream.lsp")
+(load "with-input-from-string.lsp")
+(load "with-output-to-string.lsp")
+(load "stream-error-stream.lsp")
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/load-system-construction.lsp
@@ -0,0 +1,12 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Dec 12 19:44:29 2004
+;;;; Contains: Load tests for system construction (section 24)
+
+(in-package :cl-test)
+
+(load "compile-file.lsp")
+(load "load.lsp")
+(load "with-compilation-unit.lsp")
+(load "features.lsp")
+(load "modules.lsp")
--- /dev/null
+++ gcl-2.6.12/ansi-tests/load-test-file-2.lsp
@@ -0,0 +1,7 @@
+(in-package :cl-test)
+
+(declaim (special *load-test-var.1* *load-test-var.2*))
+(eval-when (:load-toplevel)
+ (setq *load-test-var.1* *load-pathname*)
+ (setq *load-test-var.2* *load-truename*))
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/load-test-file.lsp
@@ -0,0 +1,9 @@
+(in-package :cl-test)
+
+(defun load-file-test-fun.1 ()
+ '#.*load-pathname*)
+
+(defun load-file-test-fun.2 ()
+ '#.*load-truename*)
+
+
--- gcl-2.6.12.orig/ansi-tests/load.lsp
+++ gcl-2.6.12/ansi-tests/load.lsp
@@ -1,15 +1,227 @@
-;; Get the MK package
-;; I've hardwired a path here; fix for your system
-;; I assume the package is already compiled.
-(unless (find-package "MK")
- (load #.(concatenate 'string "../defsys30/defsystem."
- #+cmu (C::BACKEND-FASL-FILE-TYPE C::*TARGET-BACKEND*)
- #+allegro "fasl"
- #+(or akcl gcl) "o")))
-
-(load "rt/rt.system")
-(mk::load-system "rt")
-(mk::compile-system "cltest")
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Apr 12 21:51:49 2005
+;;;; Contains: Tests of LOAD
+
(in-package :cl-test)
+(defun load-file-test (file funname &rest args &key
+ if-does-not-exist
+ (print nil print-p)
+ (verbose nil verbose-p)
+ (*load-print* nil)
+ (*load-verbose* nil)
+ external-format)
+ (declare (ignorable external-format if-does-not-exist
+ print print-p verbose verbose-p))
+ (fmakunbound funname)
+ (let* ((str (make-array '(0) :element-type 'character :adjustable t
+ :fill-pointer 0))
+ (vals (multiple-value-list
+ (with-output-to-string
+ (*standard-output* str)
+ (apply #'load file :allow-other-keys t args))))
+ (print? (if print-p print *load-print*))
+ (verbose? (if verbose-p verbose *load-verbose*)))
+ (values
+ (let ((v1 (car vals))
+ (v2 (or (and verbose-p (not verbose))
+ (and (not verbose-p) (not *load-verbose*))
+ (position #\; str)))
+ (v3 (or (and print-p (not print))
+ (and (not print-p) (not *load-print*))
+ (> (length str) 0)))
+ (v4 (if (or print? verbose?)
+ (> (length str) 0)
+ t)))
+ (if (and (= (length vals) 1) v1 v2 v3 v4) t (list vals v2 v3 v4 str)))
+ (funcall funname))))
+
+(deftest load.1
+ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1)
+ t nil)
+
+(deftest load.2
+ (load-file-test #p"compile-file-test-file.lsp" 'compile-file-test-fun.1)
+ t nil)
+
+(deftest load.3
+ (with-input-from-string
+ (s "(in-package :cl-test) (defun load-file-test-fun.2 () 'good)")
+ (load-file-test s 'load-file-test-fun.2))
+ t good)
+
+(deftest load.4
+ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1
+ :external-format :default)
+ t nil)
+
+(deftest load.5
+ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1
+ :verbose t)
+ t nil)
+
+(deftest load.6
+ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1
+ :*load-verbose* t)
+ t nil)
+
+(deftest load.7
+ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1
+ :*load-verbose* t :verbose nil)
+ t nil)
+
+(deftest load.8
+ (with-input-from-string
+ (s "(in-package :cl-test) (defun load-file-test-fun.2 () 'good)")
+ (load-file-test s 'load-file-test-fun.2 :verbose t))
+ t good)
+
+(deftest load.9
+ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1
+ :print t)
+ t nil)
+
+(deftest load.10
+ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1
+ :*load-print* t)
+ t nil)
+
+(deftest load.11
+ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1
+ :*load-print* t :print nil)
+ t nil)
+
+(deftest load.12
+ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1
+ :*load-print* nil :print t)
+ t nil)
+
+(deftest load.13
+ (with-input-from-string
+ (s "(in-package :cl-test) (defun load-file-test-fun.2 () 'good)")
+ (load-file-test s 'load-file-test-fun.2 :print t))
+ t good)
+
+(deftest load.14
+ (load "nonexistent-file.lsp" :if-does-not-exist nil)
+ nil)
+
+(defpackage LOAD-TEST-PACKAGE (:use "COMMON-LISP"))
+
+(deftest load.15
+ (let ((*package* (find-package "LOAD-TEST-PACKAGE")))
+ (with-input-from-string
+ (s "(defun f () 'good)")
+ (load-file-test s 'load-test-package::f)))
+ t load-test-package::good)
+
+(deftest load.15a
+ (let ((*package* (find-package "CL-TEST")))
+ (values
+ (with-input-from-string
+ (s "(eval-when (:load-toplevel :execute) (setq *package* (find-package \"LOAD-TEST-PACKAGE\")))
+ (defun f () 'good)")
+ (multiple-value-list (load-file-test s 'load-test-package::f)))
+ (read-from-string "GOOD")))
+ (t load-test-package::good) good)
+
+(deftest load.16
+ (let ((*readtable* (copy-readtable nil)))
+ (set-macro-character #\! (get-macro-character #\'))
+ (with-input-from-string
+ (s "(in-package :cl-test) (defun load-file-test-fun.3 () !good)")
+ (load-file-test s 'load-file-test-fun.3)))
+ t good)
+
+(deftest load.16a
+ (let ((*readtable* *readtable*)
+ (*package* (find-package "CL-TEST")))
+ (values
+ (with-input-from-string
+ (s "(in-package :cl-test)
+ (eval-when (:load-toplevel :execute)
+ (setq *readtable* (copy-readtable nil))
+ (set-macro-character #\\! (get-macro-character #\\')))
+ (defun load-file-test-fun.3 () !good)")
+ (multiple-value-list
+ (load-file-test s 'load-file-test-fun.3)))
+ (read-from-string "!FOO")))
+ (t good) !FOO)
+
+(deftest load.17
+ (let ((file #p"load-test-file.lsp"))
+ (fmakunbound 'load-file-test-fun.1)
+ (fmakunbound 'load-file-test-fun.2)
+ (values
+ (notnot (load file))
+ (let ((p1 (pathname (merge-pathnames file)))
+ (p2 (funcall 'load-file-test-fun.1)))
+ (equalpt-or-report p1 p2))
+ (let ((p1 (truename file))
+ (p2 (funcall 'load-file-test-fun.2)))
+ (equalpt-or-report p1 p2))))
+ t t t)
+
+;;; Test that the load pathname/truename variables are bound
+;;; properly when loading compiled files
+
+(deftest load.18
+ (let* ((file "load-test-file-2.lsp")
+ (target (enough-namestring (compile-file-pathname file))))
+ (declare (special *load-test-var.1* *load-test-var.2*))
+ (compile-file file)
+ (makunbound '*load-test-var.1*)
+ (makunbound '*load-test-var.2*)
+ (load target)
+ (values
+ (let ((p1 (pathname (merge-pathnames target)))
+ (p2 *load-test-var.1*))
+ (equalpt-or-report p1 p2))
+ (let ((p1 (truename target))
+ (p2 *load-test-var.2*))
+ (equalpt-or-report p1 p2))))
+ t t)
+
+(deftest load.19
+ (let ((file (logical-pathname "CLTEST:LDTEST.LSP"))
+ (fn 'load-test-fun-3)
+ (*package* (find-package "CL-TEST")))
+ (with-open-file
+ (s file :direction :output :if-exists :supersede
+ :if-does-not-exist :create)
+ (format s "(in-package :cl-test) (defun ~a () :foo)" fn))
+ (fmakunbound fn)
+ (values
+ (notnot (load file))
+ (funcall fn)))
+ t :foo)
+
+;;; Defaults of the load variables
+
+(deftest load-pathname.1
+ *load-pathname*
+ nil)
+
+(deftest load-truename.1
+ *load-truename*
+ nil)
+
+(deftest load-print.1
+ *load-print*
+ nil)
+
+;;; Error tests
+
+(deftest load.error.1
+ (signals-error (load "nonexistent-file.lsp") file-error)
+ t)
+
+(deftest load.error.2
+ (signals-error (load) program-error)
+ t)
+(deftest load.error.3
+ (signals-error (load "compile-file-test-file.lsp" :bad-key-arg t)
+ program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/logical-pathname-translations.lsp
@@ -0,0 +1,8 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Dec 31 09:46:08 2003
+;;;; Contains: Tests of LOGICAL-PATHNAME-TRANSLATIONS
+
+(in-package :cl-test)
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/logical-pathname.lsp
@@ -0,0 +1,93 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Dec 30 19:05:01 2003
+;;;; Contains: Tests of LOGICAL-PATHNAME
+
+(in-package :cl-test)
+
+(deftest logical-pathname.1
+ (loop for x in *logical-pathnames*
+ always (eql x (logical-pathname x)))
+ t)
+
+(deftest logical-pathname.2
+ (notnot-mv (typep (logical-pathname "CLTEST:FOO") 'logical-pathname))
+ t)
+
+(deftest logical-pathname.3
+ (let ((name "CLTEST:TEMP.DAT.NEWEST"))
+ (with-open-file
+ (s (logical-pathname name)
+ :direction :output
+ :if-exists :supersede
+ :if-does-not-exist :create)
+ (or (equalt (logical-pathname s) (logical-pathname name))
+ (list (logical-pathname s) (logical-pathname name)))))
+ t)
+
+
+;;; Error tests
+
+(deftest logical-pathname.error.1
+ (check-type-error #'logical-pathname
+ (typef '(or string stream logical-pathname)))
+ nil)
+
+(deftest logical-pathname.error.2
+ ;; Doesn't specify a host
+ (signals-error (logical-pathname "FOO.TXT") type-error)
+ t)
+
+(deftest logical-pathname.error.3
+ (signals-error
+ (with-open-file (s #p"logical-pathname.lsp" :direction :input)
+ (logical-pathname s))
+ type-error)
+ t)
+
+(deftest logical-pathname.error.4
+ (signals-error
+ (with-open-stream
+ (is (make-concatenated-stream))
+ (with-open-stream
+ (os (make-broadcast-stream))
+ (with-open-stream
+ (s (make-two-way-stream is os))
+ (logical-pathname s))))
+ type-error)
+ t)
+
+(deftest logical-pathname.error.5
+ (signals-error
+ (with-open-stream
+ (is (make-concatenated-stream))
+ (with-open-stream
+ (os (make-broadcast-stream))
+ (with-open-stream
+ (s (make-echo-stream is os))
+ (logical-pathname s))))
+ type-error)
+ t)
+
+(deftest logical-pathname.error.6
+ (signals-error (with-open-stream (s (make-broadcast-stream)) (logical-pathname s)) type-error)
+ t)
+
+(deftest logical-pathname.error.7
+ (signals-error (with-open-stream (s (make-concatenated-stream)) (logical-pathname s)) type-error)
+ t)
+
+(deftest logical-pathname.error.8
+ (signals-error (with-open-stream (s (make-string-input-stream "foo"))
+ (logical-pathname s)) type-error)
+ t)
+
+(deftest logical-pathname.error.9
+ (signals-error (with-output-to-string (s) (logical-pathname s)) type-error)
+ t)
+
+(deftest logical-pathname.error.10
+ (handler-case
+ (progn (eval '(locally (declare (optimize safety)) (logical-pathname "CLROOT:%"))) t)
+ (type-error () t))
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/make-broadcast-stream.lsp
@@ -0,0 +1,99 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Jan 29 21:28:25 2004
+;;;; Contains: Tests of MAKE-BROADCAST-STREAM
+
+(in-package :cl-test)
+
+(deftest make-broadcast-stream.1
+ (let ((s (make-broadcast-stream)))
+ (assert (typep s 'stream))
+ (assert (typep s 'broadcast-stream))
+ (assert (output-stream-p s))
+ ;; (assert (not (input-stream-p s)))
+ (assert (open-stream-p s))
+ (assert (streamp s))
+ ;; (assert (eq (stream-element-type s) t))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'broadcast-stream))
+ (notnot (output-stream-p s))
+ (progn (write-char #\x s) nil)
+ ))
+ t t t nil)
+
+(deftest make-broadcast-stream.2
+ (with-output-to-string
+ (s1)
+ (let ((s (make-broadcast-stream s1)))
+ (assert (typep s 'stream))
+ (assert (typep s 'broadcast-stream))
+ (assert (output-stream-p s))
+ ;; (assert (not (input-stream-p s)))
+ (assert (open-stream-p s))
+ (assert (streamp s))
+ (assert (eql (stream-element-type s)
+ (stream-element-type s1)))
+ (write-char #\x s)))
+ "x")
+
+(deftest make-broadcast-stream.3
+ (let ((s1 (make-string-output-stream))
+ (s2 (make-string-output-stream)))
+ (let ((s (make-broadcast-stream s1 s2)))
+ (assert (typep s 'stream))
+ (assert (typep s 'broadcast-stream))
+ (assert (output-stream-p s))
+ ;; (assert (not (input-stream-p s)))
+ (assert (open-stream-p s))
+ (assert (streamp s))
+ (assert (eql (stream-element-type s)
+ (stream-element-type s2)))
+ (format s "This is a test"))
+ (values
+ (get-output-stream-string s1)
+ (get-output-stream-string s2)))
+ "This is a test"
+ "This is a test")
+
+(deftest make-broadcast-stream.4
+ (fresh-line (make-broadcast-stream))
+ nil)
+
+(deftest make-broadcast-stream.5
+ (file-length (make-broadcast-stream))
+ 0)
+
+(deftest make-broadcast-stream.6
+ (file-position (make-broadcast-stream))
+ 0)
+
+(deftest make-broadcast-stream.7
+ (file-string-length (make-broadcast-stream) "antidisestablishmentarianism")
+ 1)
+
+(deftest make-broadcast-stream.8
+ (stream-external-format (make-broadcast-stream))
+ :default)
+
+
+
+;;; FIXME
+;;; Add tests for: close,
+;;; peek-char, read-char-no-hang, terpri, fresh-line, unread-char,
+;;; read-line, write-line, write-string, read-sequence, write-sequence,
+;;; read-byte, write-byte, listen, clear-input, finish-output, force-output,
+;;; clear-output, print, prin1 princ
+
+;;; Error tests
+
+(deftest make-broadcast-stream.error.1
+ (check-type-error #'make-broadcast-stream
+ #'(lambda (x) (and (streamp x) (output-stream-p x))))
+ nil)
+
+(deftest make-broadcast-stream.error.2
+ (check-type-error #'make-broadcast-stream
+ #'(lambda (x) (and (streamp x) (output-stream-p x)))
+ *streams*)
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/make-concatenated-stream.lsp
@@ -0,0 +1,323 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Feb 14 08:41:18 2004
+;;;; Contains: Tests of MAKE-CONCATENATED-STREAM
+
+(in-package :cl-test)
+
+(deftest make-concatenated-stream.1
+ (let ((s (make-concatenated-stream)))
+ (read s nil :eof))
+ :eof)
+
+(deftest make-concatenated-stream.2
+ (let ((s (make-concatenated-stream)))
+ (notnot-mv (input-stream-p s)))
+ t)
+
+(deftest make-concatenated-stream.3
+ (let ((s (make-concatenated-stream)))
+ (output-stream-p s))
+ nil)
+
+(deftest make-concatenated-stream.4
+ (let ((s (make-concatenated-stream)))
+ (notnot-mv (streamp s)))
+ t)
+
+(deftest make-concatenated-stream.5
+ (let ((s (make-concatenated-stream)))
+ (notnot-mv (typep s 'stream)))
+ t)
+
+(deftest make-concatenated-stream.6
+ (let ((s (make-concatenated-stream)))
+ (notnot-mv (typep s 'concatenated-stream)))
+ t)
+
+(deftest make-concatenated-stream.7
+ (let ((s (make-concatenated-stream)))
+ (notnot-mv (open-stream-p s)))
+ t)
+
+(deftest make-concatenated-stream.8
+ (let ((s (make-concatenated-stream *standard-input*)))
+ (notnot-mv (stream-element-type s)))
+ t)
+
+(deftest make-concatenated-stream.9
+ (let ((pn #p"tmp.dat")
+ (element-type '(unsigned-byte 8)))
+ (with-open-file (s pn :direction :output :element-type element-type
+ :if-exists :supersede)
+ (dolist (b '(1 5 9 13)) (write-byte b s)))
+ (with-open-file
+ (s1 pn :direction :input :element-type element-type)
+ (with-open-file
+ (s2 pn :direction :input :element-type element-type)
+ (let ((s (make-concatenated-stream s1 s2)))
+ (loop repeat 8 collect (read-byte s))))))
+ (1 5 9 13 1 5 9 13))
+
+(deftest make-concatenated-stream.10
+ (let ((s (make-concatenated-stream)))
+ (read-byte s nil :eof))
+ :eof)
+
+(deftest make-concatenated-stream.11
+ (let ((s (make-concatenated-stream)))
+ (peek-char nil s nil :eof))
+ :eof)
+
+(deftest make-concatenated-stream.12
+ (with-input-from-string
+ (s1 "a")
+ (with-input-from-string
+ (s2 "b")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (values
+ (peek-char nil s)
+ (read-char s)
+ (peek-char nil s)
+ (read-char s)
+ (peek-char nil s nil :eof)))))
+ #\a #\a #\b #\b :eof)
+
+(deftest make-concatenated-stream.13
+ (with-input-from-string
+ (s1 " a ")
+ (with-input-from-string
+ (s2 " b ")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (values
+ (peek-char t s)
+ (read-char s)
+ (peek-char t s)
+ (read-char s)
+ (peek-char t s nil :eof)))))
+ #\a #\a #\b #\b :eof)
+
+(deftest make-concatenated-stream.14
+ (with-input-from-string
+ (s1 "a")
+ (with-input-from-string
+ (s2 "b")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (values
+ (read-char s)
+ (unread-char #\a s)
+ (read-char s)
+ (read-char s)
+ (unread-char #\b s)
+ (read-char s)
+ (read-char s nil :eof)))))
+ #\a nil #\a #\b nil #\b :eof)
+
+(deftest make-concatenated-stream.15
+ (let ((s (make-concatenated-stream)))
+ (read-char-no-hang s nil :eof))
+ :eof)
+
+(deftest make-concatenated-stream.16
+ (with-input-from-string
+ (s1 "a")
+ (with-input-from-string
+ (s2 "b")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (values
+ (read-char-no-hang s)
+ (read-char-no-hang s)
+ (read-char-no-hang s nil :eof)))))
+ #\a #\b :eof)
+
+(deftest make-concatenated-stream.17
+ (with-input-from-string
+ (s1 "a")
+ (with-input-from-string
+ (s2 "b")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (multiple-value-bind (str mnp)
+ (read-line s)
+ (values str (notnot mnp))))))
+ "ab" t)
+
+(deftest make-concatenated-stream.18
+ (with-input-from-string
+ (s1 "ab")
+ (with-input-from-string
+ (s2 "")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (multiple-value-bind (str mnp)
+ (read-line s)
+ (values str (notnot mnp))))))
+ "ab" t)
+
+(deftest make-concatenated-stream.19
+ (with-input-from-string
+ (s1 "")
+ (with-input-from-string
+ (s2 "ab")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (multiple-value-bind (str mnp)
+ (read-line s)
+ (values str (notnot mnp))))))
+ "ab" t)
+
+(deftest make-concatenated-stream.20
+ (with-input-from-string
+ (s1 "ab")
+ (with-input-from-string
+ (s2 (concatenate 'string (string #\Newline) "def"))
+ (let ((s (make-concatenated-stream s1 s2)))
+ (read-line s))))
+ "ab" nil)
+
+(deftest make-concatenated-stream.21
+ (with-input-from-string
+ (s1 "")
+ (with-input-from-string
+ (s2 "")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (multiple-value-bind (str mnp)
+ (read-line s nil :eof)
+ (values str (notnot mnp))))))
+ :eof t)
+
+(deftest make-concatenated-stream.22
+ (let ((pn #p"tmp.dat")
+ (element-type '(unsigned-byte 8)))
+ (with-open-file (s pn :direction :output :element-type element-type
+ :if-exists :supersede)
+ (dolist (b '(1 5 9 13)) (write-byte b s)))
+ (with-open-file
+ (s1 pn :direction :input :element-type element-type)
+ (with-open-file
+ (s2 pn :direction :input :element-type element-type)
+ (let ((s (make-concatenated-stream s1 s2))
+ (x (vector nil nil nil nil nil nil nil nil)))
+ (values
+ (read-sequence x s)
+ x)))))
+ 8
+ #(1 5 9 13 1 5 9 13))
+
+(deftest make-concatenated-stream.23
+ (let ((pn #p"tmp.dat")
+ (element-type '(unsigned-byte 8)))
+ (with-open-file (s pn :direction :output :element-type element-type
+ :if-exists :supersede)
+ (dolist (b '(1 5 9 13)) (write-byte b s)))
+ (with-open-file
+ (s1 pn :direction :input :element-type element-type)
+ (with-open-file
+ (s2 pn :direction :input :element-type element-type)
+ (let ((s (make-concatenated-stream s1 s2))
+ (x (vector nil nil nil nil nil nil)))
+ (values
+ (read-sequence x s)
+ x)))))
+ 6
+ #(1 5 9 13 1 5))
+
+(deftest make-concatenated-stream.24
+ (let ((pn #p"tmp.dat")
+ (element-type '(unsigned-byte 8)))
+ (with-open-file (s pn :direction :output :element-type element-type
+ :if-exists :supersede)
+ (dolist (b '(1 5 9 13)) (write-byte b s)))
+ (with-open-file
+ (s1 pn :direction :input :element-type element-type)
+ (with-open-file
+ (s2 pn :direction :input :element-type element-type)
+ (let ((s (make-concatenated-stream s1 s2))
+ (x (vector nil nil nil nil nil nil nil nil nil nil)))
+ (values
+ (read-sequence x s)
+ x)))))
+ 8
+ #(1 5 9 13 1 5 9 13 nil nil))
+
+(deftest make-concatenated-stream.25
+ (close (make-concatenated-stream))
+ t)
+
+(deftest make-concatenated-stream.26
+ (let ((s (make-concatenated-stream)))
+ (values (prog1 (close s) (close s))
+ (open-stream-p s)))
+ t nil)
+
+(deftest make-concatenated-stream.27
+ (with-input-from-string
+ (s1 "abc")
+ (let ((s (make-concatenated-stream s1)))
+ (values
+ (notnot (open-stream-p s1))
+ (notnot (open-stream-p s))
+ (close s)
+ (notnot (open-stream-p s1))
+ (open-stream-p s))))
+ t t t t nil)
+
+(deftest make-concatenated-stream.28
+ (with-input-from-string
+ (s1 "a")
+ (let ((s (make-concatenated-stream s1)))
+ (notnot-mv (listen s))))
+ t)
+
+(deftest make-concatenated-stream.28a
+ (listen (make-concatenated-stream))
+ nil)
+
+(deftest make-concatenated-stream.29
+ (with-input-from-string
+ (s1 "")
+ (let ((s (make-concatenated-stream s1)))
+ (listen s)))
+ nil)
+
+(deftest make-concatenated-stream.30
+ (with-input-from-string
+ (s1 "")
+ (with-input-from-string
+ (s2 "a")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (notnot-mv (listen s)))))
+ t)
+
+(deftest make-concatenated-stream.31
+ (with-input-from-string
+ (s1 "")
+ (with-input-from-string
+ (s2 "")
+ (let ((s (make-concatenated-stream s1 s2)))
+ (listen s))))
+ nil)
+
+(deftest make-concatenated-stream.32
+ (clear-input (make-concatenated-stream))
+ nil)
+
+(deftest make-concatenated-stream.33
+ (with-input-from-string
+ (s1 "abc")
+ (clear-input (make-concatenated-stream s1)))
+ nil)
+
+;;; Error cases
+
+(deftest make-concatenated-stream.error.1
+ (loop for x in *mini-universe*
+ unless (or (and (streamp x) (input-stream-p x))
+ (eval `(signals-error (make-concatenated-stream ',x) t)))
+ collect x)
+ nil)
+
+(deftest make-concatenated-stream.error.2
+ (loop for x in *streams*
+ unless (or (and (streamp x) (input-stream-p x))
+ (eval `(signals-error (make-concatenated-stream ',x) t)))
+ collect x)
+ nil)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/make-echo-stream.lsp
@@ -0,0 +1,332 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Feb 12 04:34:42 2004
+;;;; Contains: Tests of MAKE-ECHO-STREAM
+
+(in-package :cl-test)
+
+(deftest make-echo-stream.1
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (read-char s)
+ (get-output-stream-string os)))
+ #\f "f")
+
+(deftest make-echo-stream.2
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (get-output-stream-string os))
+ "")
+
+(deftest make-echo-stream.3
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values (read-line s nil)
+ (get-output-stream-string os)))
+ "foo" "foo")
+
+;;; Tests of READ-BYTE on echo streams
+
+(deftest make-echo-stream.4
+ (let ((pn #p"tmp.dat")
+ (pn2 #p"tmp2.dat")
+ (element-type '(unsigned-byte 8)))
+ (with-open-file (os pn
+ :direction :output
+ :element-type element-type
+ :if-exists :supersede)
+ (loop for x in '(2 3 5 7 11)
+ do (write-byte x os)))
+ (with-open-file
+ (is pn :direction :input :element-type element-type)
+ (values
+ (with-open-file
+ (os pn2 :direction :output :if-exists :supersede
+ :element-type element-type)
+ (let ((s (make-echo-stream is os)))
+ (loop repeat 6 collect (read-byte s nil :eof1))))
+ (with-open-file
+ (s pn2 :direction :input :element-type element-type)
+ (loop repeat 6 collect (read-byte s nil :eof2))))))
+ (2 3 5 7 11 :eof1)
+ (2 3 5 7 11 :eof2))
+
+(deftest make-echo-stream.5
+ (let ((pn #p"tmp.dat")
+ (pn2 #p"tmp2.dat")
+ (element-type '(unsigned-byte 8)))
+ (with-open-file (os pn
+ :direction :output
+ :element-type element-type
+ :if-exists :supersede)
+ (loop for x in '(2 3 5 7 11)
+ do (write-byte x os)))
+ (with-open-file
+ (is pn :direction :input :element-type element-type)
+ (values
+ (with-open-file
+ (os pn2 :direction :output :if-exists :supersede
+ :element-type element-type)
+ (let ((s (make-echo-stream is os)))
+ (loop repeat 6 collect (read-byte s nil 100))))
+ (with-open-file
+ (s pn2 :direction :input :element-type element-type)
+ (loop repeat 6 collect (read-byte s nil 200))))))
+ (2 3 5 7 11 100)
+ (2 3 5 7 11 200))
+
+(deftest make-echo-stream.6
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values (coerce (loop repeat 3 collect (read-char-no-hang s)) 'string)
+ (get-output-stream-string os)))
+ "foo" "foo")
+
+(deftest make-echo-stream.7
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values (coerce (loop repeat 4 collect (read-char-no-hang s nil '#\z))
+ 'string)
+ (get-output-stream-string os)))
+ "fooz" "foo")
+
+;;; peek-char + echo streams is tested in peek-char.lsp
+;;; unread-char + echo streams is tested in unread-char.lsp
+
+(deftest make-echo-stream.8
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os))
+ (x (copy-seq "xxxxxx")))
+ (values
+ (read-sequence x s)
+ x
+ (get-output-stream-string os)))
+ 3
+ "fooxxx"
+ "foo")
+
+(deftest make-echo-stream.9
+ (let ((pn #p"tmp.dat")
+ (pn2 #p"tmp2.dat")
+ (element-type '(unsigned-byte 8)))
+ (with-open-file (os pn
+ :direction :output
+ :element-type element-type
+ :if-exists :supersede)
+ (loop for x in '(2 3 5 7 11)
+ do (write-byte x os)))
+ (with-open-file
+ (is pn :direction :input :element-type element-type)
+ (values
+ (with-open-file
+ (os pn2 :direction :output :if-exists :supersede
+ :element-type element-type)
+ (let ((s (make-echo-stream is os))
+ (x (vector 0 0 0 0 0 0 0 0)))
+ (list (read-sequence x s)
+ x)))
+ (with-open-file
+ (s pn2 :direction :input :element-type element-type)
+ (loop repeat 8 collect (read-byte s nil nil))))))
+ (5 #(2 3 5 7 11 0 0 0))
+ (2 3 5 7 11 nil nil nil))
+
+(deftest make-echo-stream.10
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (notnot (open-stream-p s))
+ (close s)
+ (open-stream-p s)
+ (notnot (open-stream-p is))
+ (notnot (open-stream-p os))))
+ t t nil t t)
+
+(deftest make-echo-stream.11
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (notnot (listen s))
+ (read-char s)
+ (notnot (listen s))
+ (read-char s)
+ (notnot (listen s))
+ (read-char s)
+ (listen s)))
+ t #\f t #\o t #\o nil)
+
+(deftest make-echo-stream.12
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (notnot (streamp s))
+ (notnot (typep s 'stream))
+ (notnot (typep s 'echo-stream))
+ (notnot (input-stream-p s))
+ (notnot (output-stream-p s))
+ (notnot (stream-element-type s))))
+ t t t t t t)
+
+;;; FIXME
+;;; Add tests for clear-input, file-position(?)
+;;; Also, add tests for output operations (since echo-streams are
+;;; bidirectional)
+
+(deftest make-echo-stream.13
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (write-char #\0 s)
+ (close s)
+ (get-output-stream-string os)))
+ #\0 t "0")
+
+(deftest make-echo-stream.14
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (terpri s)
+ (close s)
+ (get-output-stream-string os)))
+ nil t #.(string #\Newline))
+
+(deftest make-echo-stream.15
+ (let ((pn #p"tmp.dat")
+ (pn2 #p"tmp2.dat")
+ (element-type '(unsigned-byte 8)))
+ (with-open-file (os pn
+ :direction :output
+ :element-type element-type
+ :if-exists :supersede))
+ (with-open-file
+ (is pn :direction :input :element-type element-type)
+ (values
+ (with-open-file
+ (os pn2 :direction :output :if-exists :supersede
+ :element-type element-type)
+ (let ((s (make-echo-stream is os))
+ (x (mapcar #'char-code (coerce "abcdefg" 'list))))
+ (loop for b in x do
+ (assert (equal (list b)
+ (multiple-value-list (write-byte b s)))))
+ (close s)))))
+ (with-open-file
+ (is pn2 :direction :input :element-type element-type)
+ (let ((x (vector 0 0 0 0 0 0 0)))
+ (read-sequence x is)
+ (values
+ (read-byte is nil :done)
+ (map 'string #'code-char x)))))
+ :done
+ "abcdefg")
+
+(deftest make-echo-stream.16
+ (let ((pn #p"tmp.dat")
+ (pn2 #p"tmp2.dat")
+ (element-type '(unsigned-byte 8)))
+ (with-open-file (os pn
+ :direction :output
+ :element-type element-type
+ :if-exists :supersede))
+ (with-open-file
+ (is pn :direction :input :element-type element-type)
+ (values
+ (with-open-file
+ (os pn2 :direction :output :if-exists :supersede
+ :element-type element-type)
+ (let ((s (make-echo-stream is os))
+ (x (map 'vector #'char-code "abcdefg")))
+ (assert (equal (multiple-value-list (write-sequence x s)) (list x)))
+ (close s)))))
+ (with-open-file
+ (is pn2 :direction :input :element-type element-type)
+ (let ((x (vector 0 0 0 0 0 0 0)))
+ (read-sequence x is)
+ (values
+ (read-byte is nil :done)
+ (map 'string #'code-char x)))))
+ :done
+ "abcdefg")
+
+(deftest make-echo-stream.17
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (write-char #\X s)
+ (notnot (fresh-line s))
+ (finish-output s)
+ (force-output s)
+ (close s)
+ (get-output-stream-string os)))
+ #\X t nil nil t #.(coerce '(#\X #\Newline) 'string))
+
+(deftest make-echo-stream.18
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (write-string "159" s)
+ (close s)
+ (get-output-stream-string os)))
+ "159" t "159")
+
+(deftest make-echo-stream.20
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (write-string "0159X" s :start 1 :end 4)
+ (close s)
+ (get-output-stream-string os)))
+ "0159X" t "159")
+
+(deftest make-echo-stream.21
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (write-line "159" s)
+ (close s)
+ (get-output-stream-string os)))
+ "159" t #.(concatenate 'string "159" (string #\Newline)))
+
+(deftest make-echo-stream.22
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-echo-stream is os)))
+ (values
+ (write-char #\0 s)
+ (clear-output s)))
+ #\0 nil)
+
+;;; Error tests
+
+(deftest make-echo-stream.error.1
+ (signals-error (make-echo-stream) program-error)
+ t)
+
+(deftest make-echo-stream.error.2
+ (signals-error (make-echo-stream *standard-input*) program-error)
+ t)
+
+(deftest make-echo-stream.error.3
+ (signals-error (make-echo-stream *standard-input* *standard-output* nil)
+ program-error)
+ t)
+
+
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/make-pathname.lsp
@@ -0,0 +1,171 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Nov 29 05:54:30 2003
+;;;; Contains: Tests of MAKE-PATHNAME
+
+(in-package :cl-test)
+
+(defvar *null-pathname*
+ (make-pathname))
+
+(defun make-pathname-test
+ (&rest args &key (defaults nil)
+ (host (if defaults (pathname-host defaults)
+ (pathname-host *default-pathname-defaults*)))
+ (device (if defaults (pathname-device defaults)
+ (pathname-device *null-pathname*)))
+ (directory (if defaults (pathname-directory defaults)
+ (pathname-directory *null-pathname*)))
+ (name (if defaults (pathname-name defaults)
+ (pathname-name *null-pathname*)))
+ (type (if defaults (pathname-type defaults)
+ (pathname-type *null-pathname*)))
+ (version (if defaults (pathname-version defaults)
+ (pathname-version *null-pathname*)))
+ case)
+ (declare (ignorable case))
+ (let* ((vals (multiple-value-list (apply #'make-pathname args)))
+ (pn (first vals)))
+ (and (= (length vals) 1)
+ (typep pn 'pathname)
+ (equalp (pathname-host pn) host)
+ (equalp (pathname-device pn) device)
+ ;; (equalp (pathname-directory pn) directory)
+ (let ((pnd (pathname-directory pn)))
+ (if (eq directory :wild)
+ (member pnd '((:absolute :wild-inferiors)
+ (:absolute :wild))
+ :test #'equal)
+ (equalp pnd directory)))
+ (equalp (pathname-name pn) name)
+ (equalp (pathname-type pn) type)
+ (equalp (pathname-version pn) version)
+ t)))
+
+
+
+(deftest make-pathname.1
+ (make-pathname-test)
+ t)
+
+(deftest make-pathname.2
+ (make-pathname-test :name "foo")
+ t)
+
+(deftest make-pathname.2a
+ (do-special-strings
+ (s "foo")
+ (assert (make-pathname-test :name s)))
+ nil)
+
+(deftest make-pathname.3
+ (make-pathname-test :name "foo" :type "txt")
+ t)
+
+(deftest make-pathname.3a
+ (do-special-strings
+ (s "txt")
+ (assert (make-pathname-test :name "foo" :type s)))
+ nil)
+
+(deftest make-pathname.4
+ (make-pathname-test :type "lsp")
+ t)
+
+(deftest make-pathname.5
+ (make-pathname-test :directory :wild)
+ t)
+
+(deftest make-pathname.6
+ (make-pathname-test :name :wild)
+ t)
+
+(deftest make-pathname.7
+ (make-pathname-test :type :wild)
+ t)
+
+(deftest make-pathname.8
+ (make-pathname-test :version :wild)
+ t)
+
+(deftest make-pathname.9
+ (make-pathname-test :defaults *default-pathname-defaults*)
+ t)
+
+(deftest make-pathname.10
+ (make-pathname-test :defaults (make-pathname :name "foo" :type "bar"))
+ t)
+
+(deftest make-pathname.11
+ (make-pathname-test :version :newest)
+ t)
+
+(deftest make-pathname.12
+ (make-pathname-test :case :local)
+ t)
+
+(deftest make-pathname.13
+ (make-pathname-test :case :common)
+ t)
+
+(deftest make-pathname.14
+ (let ((*default-pathname-defaults*
+ (make-pathname :name "foo" :type "lsp" :version :newest)))
+ (make-pathname-test))
+ t)
+
+;;; Works on the components of actual pathnames
+(deftest make-pathname.rebuild
+ (loop for p in *pathnames*
+ for host = (pathname-host p)
+ for device = (pathname-device p)
+ for directory = (pathname-directory p)
+ for name = (pathname-name p)
+ for type = (pathname-type p)
+ for version = (pathname-version p)
+ for p2 = (make-pathname
+ :host host
+ :device device
+ :directory directory
+ :name name
+ :type type
+ :version version)
+ unless (equal p p2)
+ collect (list p p2))
+ nil)
+
+;;; Various constraints on :directory
+
+(deftest make-pathname-error-absolute-up
+ (signals-error (directory (make-pathname :directory '(:absolute :up)))
+ file-error)
+ t)
+
+(deftest make-pathname-error-absolute-back
+ (signals-error (directory (make-pathname :directory '(:absolute :back)))
+ file-error)
+ t)
+
+;; The next test is correct, but was causing very large amounts of time to be spent
+;; in buggy implementations
+;;#|
+(deftest make-pathname-error-absolute-wild-inferiors-up
+ (signals-error (directory (make-pathname :directory '(:absolute :wild-inferiors :up)))
+ file-error)
+ t)
+;;|#
+
+(deftest make-pathname-error-relative-wild-inferiors-up
+ (signals-error (length (directory (make-pathname :directory '(:relative :wild-inferiors :up))))
+ file-error)
+ t)
+
+(deftest make-pathname-error-absolute-wild-inferiors-back
+ (signals-error (directory (make-pathname :directory '(:absolute :wild-inferiors :back)))
+ file-error)
+ t)
+
+(deftest make-pathname-error-relative-wild-inferiors-back
+ (signals-error (directory (make-pathname :directory '(:relative :wild-inferiors :back)))
+ file-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/make-string-input-stream.lsp
@@ -0,0 +1,93 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Feb 14 18:36:48 2004
+;;;; Contains: Tests for MAKE-STRING-INPUT-STREAM
+
+(in-package :cl-test)
+
+(deftest make-string-input-stream.1
+ (let ((s (make-string-input-stream "")))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (streamp s))
+ (notnot (input-stream-p s))
+ (output-stream-p s)))
+ t t t nil)
+
+(deftest make-string-input-stream.2
+ (let ((s (make-string-input-stream "abcd")))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (streamp s))
+ (notnot (input-stream-p s))
+ (output-stream-p s)))
+ t t t nil)
+
+
+(deftest make-string-input-stream.3
+ (let ((s (make-string-input-stream "abcd" 1)))
+ (values (read-line s)))
+ "bcd")
+
+
+(deftest make-string-input-stream.4
+ (let ((s (make-string-input-stream "abcd" 0 2)))
+ (values (read-line s)))
+ "ab")
+
+(deftest make-string-input-stream.5
+ (let ((s (make-string-input-stream "abcd" 1 nil)))
+ (values (read-line s)))
+ "bcd")
+
+(deftest make-string-input-stream.6
+ (let ((str1 (make-array 6 :element-type 'character
+ :initial-contents "abcdef"
+ :fill-pointer 4)))
+ (let ((s (make-string-input-stream str1)))
+ (values (read-line s) (read-char s nil :eof))))
+ "abcd" :eof)
+
+(deftest make-string-input-stream.7
+ (let* ((str1 (make-array 6 :element-type 'character
+ :initial-contents "abcdef"))
+ (str2 (make-array 4 :element-type 'character
+ :displaced-to str1)))
+ (let ((s (make-string-input-stream str2)))
+ (values (read-line s) (read-char s nil :eof))))
+ "abcd" :eof)
+
+(deftest make-string-input-stream.8
+ (let* ((str1 (make-array 6 :element-type 'character
+ :initial-contents "abcdef"))
+ (str2 (make-array 4 :element-type 'character
+ :displaced-to str1
+ :displaced-index-offset 1)))
+ (let ((s (make-string-input-stream str2)))
+ (values (read-line s) (read-char s nil :eof))))
+ "bcde" :eof)
+
+(deftest make-string-input-stream.9
+ (let ((str1 (make-array 6 :element-type 'character
+ :initial-contents "abcdef"
+ :adjustable t)))
+ (let ((s (make-string-input-stream str1)))
+ (values (read-line s) (read-char s nil :eof))))
+ "abcdef" :eof)
+
+(deftest make-string-input-stream.10
+ :notes (:allow-nil-arrays :nil-vectors-are-strings)
+ (let ((s (make-string-input-stream
+ (make-array 0 :element-type nil))))
+ (read-char s nil :eof))
+ :eof)
+
+;;; Error tests
+
+(deftest make-string-input-stream.error.1
+ (signals-error (make-string-input-stream) program-error)
+ t)
+
+(deftest make-string-input-stream.error.2
+ (signals-error (make-string-input-stream "abc" 1 2 nil) program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/make-string-output-stream.lsp
@@ -0,0 +1,139 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Feb 14 19:42:07 2004
+;;;; Contains: Tests of MAKE-STRING-OUTPUT-STREAM
+
+(in-package :cl-test)
+
+(deftest make-string-output-stream.1
+ (let ((s (make-string-output-stream)))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (input-stream-p s)
+ (notnot (output-stream-p s))
+ (notnot (open-stream-p s))))
+ t t nil t t)
+
+(deftest make-string-output-stream.2
+ (let ((s (make-string-output-stream :element-type 'character)))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (input-stream-p s)
+ (notnot (output-stream-p s))
+ (notnot (open-stream-p s))))
+ t t nil t t)
+
+(deftest make-string-output-stream.3
+ (let ((s (make-string-output-stream :element-type 'base-char)))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (input-stream-p s)
+ (notnot (output-stream-p s))
+ (notnot (open-stream-p s))))
+ t t nil t t)
+
+(deftest make-string-output-stream.4
+ :notes (:nil-vectors-are-strings)
+ (let ((s (make-string-output-stream :element-type nil)))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (input-stream-p s)
+ (notnot (output-stream-p s))
+ (notnot (open-stream-p s))))
+ t t nil t t)
+
+(deftest make-string-output-stream.5
+ (let ((s (make-string-output-stream :allow-other-keys nil)))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (input-stream-p s)
+ (notnot (output-stream-p s))
+ (notnot (open-stream-p s))))
+ t t nil t t)
+
+(deftest make-string-output-stream.6
+ (let ((s (make-string-output-stream :allow-other-keys t :foo 'bar)))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (input-stream-p s)
+ (notnot (output-stream-p s))
+ (notnot (open-stream-p s))))
+ t t nil t t)
+
+(deftest make-string-output-stream.7
+ (let ((s (make-string-output-stream :foo 'bar :allow-other-keys t
+ :allow-other-keys nil
+ :foo2 'x)))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (input-stream-p s)
+ (notnot (output-stream-p s))
+ (notnot (open-stream-p s))))
+ t t nil t t)
+
+(deftest make-string-output-stream.8
+ (let ((s (make-string-output-stream)))
+ (write-string "abc" s)
+ (write-string "def" s)
+ (get-output-stream-string s))
+ "abcdef")
+
+(deftest make-string-output-stream.9
+ (let ((s (make-string-output-stream :element-type 'character)))
+ (write-string "abc" s)
+ (write-string "def" s)
+ (get-output-stream-string s))
+ "abcdef")
+
+(deftest make-string-output-stream.10
+ (let ((s (make-string-output-stream :element-type 'base-char)))
+ (write-string "abc" s)
+ (write-string "def" s)
+ (get-output-stream-string s))
+ "abcdef")
+
+(deftest make-string-output-stream.11
+ :notes (:nil-vectors-are-strings)
+ (let ((s (make-string-output-stream :element-type nil)))
+ (get-output-stream-string s))
+ "")
+
+(deftest make-string-output-stream.12
+ :notes (:nil-vectors-are-strings)
+ (let ((s (make-string-output-stream :element-type nil)))
+ (typep #\a (array-element-type (get-output-stream-string s))))
+ nil)
+
+(deftest make-string-output-stream.13
+ (let ((s (make-string-output-stream)))
+ (values
+ (close s)
+ (open-stream-p s)))
+ t nil)
+
+;;; Error tests
+
+(deftest make-string-output-stream.error.1
+ (signals-error (make-string-output-stream nil) program-error)
+ t)
+
+(deftest make-string-output-stream.error.2
+ (signals-error (make-string-output-stream :foo nil) program-error)
+ t)
+
+(deftest make-string-output-stream.error.3
+ (signals-error (make-string-output-stream :allow-other-keys nil
+ :foo 'bar)
+ program-error)
+ t)
+
+
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/make-synonym-stream.lsp
@@ -0,0 +1,97 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Jan 28 06:54:33 2004
+;;;; Contains: Tests of MAKE-SYNONYM-STREAM
+
+(in-package :cl-test)
+
+(deftest make-synonym-stream.1
+ (with-input-from-string
+ (*s* "abcde")
+ (declare (special *s*))
+ (let ((ss (make-synonym-stream '*s*)))
+ (assert (typep ss 'stream))
+ (assert (typep ss 'synonym-stream))
+ (assert (input-stream-p ss))
+ (assert (not (output-stream-p ss)))
+ (assert (open-stream-p ss))
+ (assert (streamp ss))
+ (assert (stream-element-type ss))
+ (values
+ (read-char *s*)
+ (read-char ss)
+ (read-char *s*)
+ (read-char ss)
+ (read-char ss))))
+ #\a #\b #\c #\d #\e)
+
+
+;;; This test was wrong (section 21.1.4)
+#|
+(deftest make-synonym-stream.2
+ (let ((ss (make-synonym-stream '*s*)))
+ (with-input-from-string
+ (*s* "z")
+ (declare (special *s*))
+ (assert (typep ss 'stream))
+ (assert (typep ss 'synonym-stream))
+ (assert (input-stream-p ss))
+ (assert (not (output-stream-p ss)))
+ (assert (open-stream-p ss))
+ (assert (streamp ss))
+ (assert (stream-element-type ss))
+ (read-char ss)))
+ #\z)
+|#
+
+(deftest make-synonym-stream.3
+ (with-output-to-string
+ (*s*)
+ (declare (special *s*))
+ (let ((ss (make-synonym-stream '*s*)))
+ (assert (typep ss 'stream))
+ (assert (typep ss 'synonym-stream))
+ (assert (output-stream-p ss))
+ (assert (not (input-stream-p ss)))
+ (assert (open-stream-p ss))
+ (assert (streamp ss))
+ (assert (stream-element-type ss))
+ (write-char #\a *s*)
+ (write-char #\b ss)
+ (write-char #\x *s*)
+ (write-char #\y ss)))
+ "abxy")
+
+(deftest make-synonym-stream.4
+ (let ((ss (make-synonym-stream '*terminal-io*)))
+ (assert (typep ss 'stream))
+ (assert (typep ss 'synonym-stream))
+ (assert (output-stream-p ss))
+ (assert (input-stream-p ss))
+ (assert (open-stream-p ss))
+ (assert (streamp ss))
+ (assert (stream-element-type ss))
+ nil)
+ nil)
+
+
+;;; FIXME
+;;; Add tests for: close,
+;;; peek-char, read-char-no-hang, terpri, fresh-line, unread-char,
+;;; read-line, write-line, write-string, read-sequence, write-sequence,
+;;; read-byte, write-byte, listen, clear-input, finish-output, force-output,
+;;; clear-output, format, print, prin1, princ
+
+;;; Error cases
+
+(deftest make-synonym-stream.error.1
+ (signals-error (make-synonym-stream) program-error)
+ t)
+
+(deftest make-synonym-stream.error.2
+ (signals-error (make-synonym-stream '*standard-input* nil) program-error)
+ t)
+
+(deftest make-synonym-stream.error.3
+ (check-type-error #'make-synonym-stream #'symbolp)
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/make-two-way-stream.lsp
@@ -0,0 +1,244 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Fri Jan 30 05:39:56 2004
+;;;; Contains: Tests for MAKE-TWO-WAY-STREAM
+
+(in-package :cl-test)
+
+(deftest make-two-way-stream.1
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (assert (typep s 'stream))
+ (assert (typep s 'two-way-stream))
+ (assert (streamp s))
+ (assert (open-stream-p s))
+ (assert (input-stream-p s))
+ (assert (output-stream-p s))
+ (assert (stream-element-type s))
+ (values
+ (read-char s)
+ (write-char #\b s)
+ (read-char s)
+ (write-char #\a s)
+ (read-char s)
+ (write-char #\r s)
+ (get-output-stream-string os)))
+ #\f #\b #\o #\a #\o #\r "bar")
+
+(deftest make-two-way-stream.2
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (values
+ (close s)
+ (open-stream-p s)
+ (notnot (open-stream-p is))
+ (notnot (open-stream-p os))
+ (write-char #\8 os)
+ (get-output-stream-string os)))
+ t nil t t #\8 "8")
+
+(deftest make-two-way-stream.3
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (values
+ (peek-char nil s)
+ (read-char s)
+ (get-output-stream-string os)))
+ #\f #\f "")
+
+(deftest make-two-way-stream.4
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (values
+ (read-char-no-hang s)
+ (read-char-no-hang s nil)
+ (read-char-no-hang s t :eof)
+ (read-char-no-hang s nil :eof)
+ (get-output-stream-string os)))
+ #\f #\o #\o :eof "")
+
+(deftest make-two-way-stream.5
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (values
+ (terpri s)
+ (get-output-stream-string os)))
+ nil #.(string #\Newline))
+
+(deftest make-two-way-stream.6
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (values
+ (write-char #\+ s)
+ (notnot (fresh-line s))
+ (read-char s)
+ (get-output-stream-string os)))
+ #\+ t #\f #.(coerce (list #\+ #\Newline) 'string))
+
+(deftest make-two-way-stream.7
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (values
+ (read-char s)
+ (unread-char #\f s)
+ (read-char s)
+ (read-char s)
+ (unread-char #\o s)
+ (get-output-stream-string os)))
+ #\f nil #\f #\o nil "")
+
+(deftest make-two-way-stream.8
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (values
+ (read-line s)
+ (get-output-stream-string os)))
+ "foo" "")
+
+(deftest make-two-way-stream.9
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (values
+ (write-string "bar" s)
+ (get-output-stream-string os)))
+ "bar" "bar")
+
+(deftest make-two-way-stream.10
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (values
+ (write-line "bar" s)
+ (get-output-stream-string os)))
+ "bar" #.(concatenate 'string "bar" '(#\Newline)))
+
+(deftest make-two-way-stream.11
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (let ((x (vector nil nil nil)))
+ (values
+ (read-sequence x s)
+ x
+ (get-output-stream-string os))))
+ 3 #(#\f #\o #\o) "")
+
+(deftest make-two-way-stream.12
+ (let ((pn1 #p"tmp.dat")
+ (pn2 #p"tmp2.dat")
+ (element-type '(unsigned-byte 8)))
+ (with-open-file (s pn1 :direction :output :if-exists :supersede
+ :element-type element-type)
+ (dolist (b '(3 8 19 41)) (write-byte b s)))
+ (with-open-file
+ (is pn1 :direction :input :element-type element-type)
+ (with-open-file
+ (os pn2 :direction :output :element-type element-type
+ :if-exists :supersede)
+ (let ((s (make-two-way-stream is os))
+ (x (vector nil nil nil nil)))
+ (assert (eql (read-sequence x s) 4))
+ (assert (equalp x #(3 8 19 41)))
+ (let ((y #(100 5 18 211 0 178)))
+ (assert (eql (write-sequence y s) y))
+ (close s)))))
+ (with-open-file
+ (s pn2 :direction :input :element-type element-type)
+ (let ((x (vector nil nil nil nil nil nil nil)))
+ (values
+ (read-sequence x s)
+ x))))
+ 6
+ #(100 5 18 211 0 178 nil))
+
+(deftest make-two-way-stream.13
+ (let ((pn1 #p"tmp.dat")
+ (pn2 #p"tmp2.dat")
+ (element-type '(unsigned-byte 32)))
+ (with-open-file (s pn1 :direction :output :if-exists :supersede
+ :element-type element-type)
+ (dolist (b '(3 8 19 41)) (write-byte b s)))
+ (with-open-file
+ (is pn1 :direction :input :element-type element-type)
+ (with-open-file
+ (os pn2 :direction :output :element-type element-type
+ :if-exists :supersede)
+ (let ((s (make-two-way-stream is os))
+ (x (vector nil nil nil nil)))
+ (assert (eql (read-sequence x s) 4))
+ (assert (equalp x #(3 8 19 41)))
+ (let ((y #(100 5 18 211 0 178)))
+ (assert (eql (write-sequence y s) y))
+ (close s)))))
+ (with-open-file
+ (s pn2 :direction :input :element-type element-type)
+ (let ((x (vector nil nil nil nil nil nil nil)))
+ (values
+ (read-sequence x s)
+ x))))
+ 6
+ #(100 5 18 211 0 178 nil))
+
+(deftest make-two-way-stream.14
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (values
+ (write-string "abc" s)
+ (clear-input s)
+ (write-string "def" s)
+ (get-output-stream-string os)))
+ "abc" nil "def" "abcdef")
+
+;;; Error tests
+
+(deftest make-two-way-stream.error.1
+ (signals-error (make-two-way-stream) program-error)
+ t)
+
+(deftest make-two-way-stream.error.2
+ (signals-error (make-two-way-stream (make-string-input-stream "foo"))
+ program-error)
+ t)
+
+(deftest make-two-way-stream.error.3
+ (signals-error (let ((os (make-string-output-stream)))
+ (make-two-way-stream (make-string-input-stream "foo")
+ os nil))
+ program-error)
+ t)
+
+(deftest make-two-way-stream.error.4
+ (check-type-error #'(lambda (x) (make-two-way-stream x (make-string-output-stream)))
+ #'(lambda (x) (and (streamp x) (input-stream-p x))))
+ nil)
+
+(deftest make-two-way-stream.error.5
+ (check-type-error #'(lambda (x) (make-two-way-stream x (make-string-output-stream)))
+ #'(lambda (x) (and (streamp x) (input-stream-p x)))
+ *streams*)
+ nil)
+
+(deftest make-two-way-stream.error.6
+ (check-type-error #'(lambda (x) (make-two-way-stream (make-string-input-stream "foo") x))
+ #'(lambda (x) (and (streamp x) (output-stream-p x))))
+ nil)
+
+(deftest make-two-way-stream.error.7
+ (check-type-error #'(lambda (x) (make-two-way-stream (make-string-input-stream "foo") x))
+ #'(lambda (x) (and (streamp x) (output-stream-p x)))
+ *streams*)
+ nil)
+
+
+
+
\ No newline at end of file
--- /dev/null
+++ gcl-2.6.12/ansi-tests/merge-pathnames.lsp
@@ -0,0 +1,124 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Dec 31 11:25:55 2003
+;;;; Contains: Tests of MERGE-PATHNAMES
+
+(in-package :cl-test)
+
+#|
+(defun merge-pathnames-test (&rest args)
+ (assert (<= 1 (length args) 3))
+ (let* ((p1 (car args))
+ (p2 (if (cdr args) (cadr args) *default-pathname-defaults*))
+ (default-version (if (cddr args) (caddr args) :newest))
+ (results (multiple-value-list (apply #'merge-pathnames args))))
+ (assert (= (length results) 1))
+ (let ((p3 (first results)))
+
+|#
+
+(deftest merge-pathnames.1
+ (let* ((p1 (make-pathname :name "foo"))
+ (p2 (merge-pathnames p1 p1 nil)))
+ (values
+ (equalpt (pathname-name p1) "foo")
+ (if (equalpt p1 p2) t
+ (list p1 p2))))
+ t t)
+
+(deftest merge-pathnames.2
+ (let* ((p1 (make-pathname :name "foo"))
+ (p2 (merge-pathnames p1 p1)))
+ (values
+ (equalpt (pathname-host p1) (pathname-host p2))
+ (equalpt (pathname-device p1) (pathname-device p2))
+ (equalpt (pathname-directory p1) (pathname-directory p2))
+ (pathname-name p1)
+ (pathname-name p2)
+ (equalpt (pathname-type p1) (pathname-type p2))
+ (if (pathname-version p1)
+ (equalpt (pathname-version p1) (pathname-version p2))
+ (equalpt (pathname-version p2) :newest))))
+ t t t "foo" "foo" t t)
+
+(deftest merge-pathnames.3
+ (let* ((p1 (make-pathname :name "foo"))
+ (p2 (make-pathname :name "bar"))
+ (p3 (merge-pathnames p1 p2)))
+ (values
+ (equalpt (pathname-host p1) (pathname-host p3))
+ (equalpt (pathname-device p1) (pathname-device p3))
+ (equalpt (pathname-directory p1) (pathname-directory p3))
+ (pathname-name p1)
+ (pathname-name p3)
+ (equalpt (pathname-type p1) (pathname-type p3))
+ (if (pathname-version p1)
+ (equalpt (pathname-version p1) (pathname-version p3))
+ (equalpt (pathname-version p3) :newest))))
+ t t t "foo" "foo" t t)
+
+(deftest merge-pathnames.4
+ (let* ((p1 (make-pathname :name "foo"))
+ (p2 (make-pathname :type "lsp"))
+ (p3 (merge-pathnames p1 p2)))
+ (values
+ (equalpt (pathname-host p1) (pathname-host p3))
+ (equalpt (pathname-device p1) (pathname-device p3))
+ (equalpt (pathname-directory p1) (pathname-directory p3))
+ (pathname-name p1)
+ (pathname-type p2)
+ (pathname-type p3)
+ (equalpt (pathname-type p2) (pathname-type p3))
+ (if (pathname-version p1)
+ (equalpt (pathname-version p1) (pathname-version p3))
+ (equalpt (pathname-version p3) :newest))))
+ t t t "foo" "lsp" "lsp" t t)
+
+(deftest merge-pathnames.5
+ (let* ((p1 (make-pathname :name "foo"))
+ (p2 (make-pathname :type "lsp" :version :newest))
+ (p3 (merge-pathnames p1 p2 nil)))
+ (values
+ (equalpt (pathname-host p1) (pathname-host p3))
+ (equalpt (pathname-device p1) (pathname-device p3))
+ (equalpt (pathname-directory p1) (pathname-directory p3))
+ (pathname-name p1)
+ (pathname-name p3)
+ (pathname-type p2)
+ (pathname-type p3)
+ (equalpt (pathname-version p1) (pathname-version p3))))
+ t t t "foo" "foo" "lsp" "lsp" t)
+
+(deftest merge-pathnames.6
+ (let* ((p1 (make-pathname))
+ (p2 (make-pathname :name "foo" :version :newest))
+ (p3 (merge-pathnames p1 p2 nil)))
+ (values
+ (equalpt (pathname-host p1) (pathname-host p3))
+ (equalpt (pathname-device p1) (pathname-device p3))
+ (equalpt (pathname-directory p1) (pathname-directory p3))
+ (pathname-name p2)
+ (pathname-name p3)
+ (equalpt (pathname-type p2) (pathname-type p3))
+ (pathname-version p2)
+ (pathname-version p3)))
+ t t t "foo" "foo" t :newest :newest)
+
+(deftest merge-pathnames.7
+ (let* ((p1 (make-pathname))
+ (p2 *default-pathname-defaults*)
+ (p3 (merge-pathnames p1)))
+ (values
+ (equalpt (pathname-host p1) (pathname-host p3))
+ (equalpt (pathname-host p2) (pathname-host p3))
+ (equalpt (pathname-device p2) (pathname-device p3))
+ (equalpt (pathname-directory p2) (pathname-directory p3))
+ (equalpt (pathname-name p2) (pathname-name p3))
+ (equalpt (pathname-type p2) (pathname-type p3))
+ (cond
+ ((pathname-version p1) (equalpt (pathname-version p1)
+ (pathname-version p3)))
+ ((pathname-version p2) (equalpt (pathname-version p2)
+ (pathname-version p3)))
+ (t (equalpt (pathname-version p3) :newest)))))
+ t t t t t t t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/namestring.lsp
@@ -0,0 +1,64 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Sep 2 07:24:42 2004
+;;;; Contains: Tests for NAMESTRING
+
+(in-package :cl-test)
+
+(deftest namestring.1
+ (let* ((vals (multiple-value-list (namestring "namestring.lsp")))
+ (s (first vals)))
+ (if (and (null (cdr vals))
+ (stringp s)
+ (equal (namestring s) s))
+ :good
+ vals))
+ :good)
+
+(deftest namestring.2
+ (do-special-strings
+ (s "namestring.lsp" nil)
+ (let ((ns (namestring s)))
+ (assert (stringp ns))
+ (assert (string= (namestring ns) ns))))
+ nil)
+
+;;; I'm not convinced these tested required behavior, so I'm commenting
+;;; them out for now. FIXME: determine if they are bogus
+#|
+(deftest namestring.3
+ (let* ((name "namestring.lsp")
+ (pn (merge-pathnames (pathname name)))
+ (name2 (namestring pn))
+ (pn2 (pathname name2)))
+ (or (equalt pn pn2) (list (list pn (pathname-host pn) (pathname-device pn)
+ (pathname-directory pn) (pathname-name pn)
+ (pathname-type pn) (pathname-version pn))
+ (list pn2 (pathname-host pn2) (pathname-device pn2)
+ (pathname-directory pn2) (pathname-name pn2)
+ (pathname-type pn2) (pathname-version pn2)))))
+ t)
+
+(deftest namestring.4
+ (let* ((name "namestring.lsp")
+ (pn (merge-pathnames (pathname name)))
+ (name2 (with-open-file (s pn :direction :input) (namestring s)))
+ (pn2 (pathname name2)))
+ (or (equalt pn pn2) (list (list pn (pathname-host pn) (pathname-device pn)
+ (pathname-directory pn) (pathname-name pn)
+ (pathname-type pn) (pathname-version pn))
+ (list pn2 (pathname-host pn2) (pathname-device pn2)
+ (pathname-directory pn2) (pathname-name pn2)
+ (pathname-type pn2) (pathname-version pn2)))))
+ t)
+|#
+
+;;; Error tests
+
+(deftest namestring.error.1
+ (signals-error (namestring) program-error)
+ t)
+
+(deftest namestring.error.2
+ (signals-error (namestring "namestring.lsp" nil) program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/open-stream-p.lsp
@@ -0,0 +1,54 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 13 19:52:30 2004
+;;;; Contains: Tests of OPEN-STREAM-P
+
+(in-package :cl-test)
+
+(deftest open-stream-p.1
+ (loop for s in (list *debug-io* *error-output* *query-io*
+ *standard-input* *standard-output*
+ *trace-output* *terminal-io*)
+ for results = (multiple-value-list (open-stream-p s))
+ unless (and (eql (length results) 1)
+ (car results))
+ collect s)
+ nil)
+
+(deftest open-stream-p.2
+ (with-open-file (s "open-stream-p.lsp" :direction :input)
+ (notnot-mv (open-stream-p s)))
+ t)
+
+(deftest open-stream-p.3
+ (with-open-file (s "foo.txt" :direction :output
+ :if-exists :supersede)
+ (notnot-mv (open-stream-p s)))
+ t)
+
+(deftest open-stream-p.4
+ (let ((s (open "open-stream-p.lsp" :direction :input)))
+ (close s)
+ (open-stream-p s))
+ nil)
+
+(deftest open-stream-p.5
+ (let ((s (open "foo.txt" :direction :output
+ :if-exists :supersede)))
+ (close s)
+ (open-stream-p s))
+ nil)
+
+;;; error tests
+
+(deftest open-stream-p.error.1
+ (signals-error (open-stream-p) program-error)
+ t)
+
+(deftest open-stream-p.error.2
+ (signals-error (open-stream-p *standard-input* nil) program-error)
+ t)
+
+(deftest open-stream-p.error.3
+ (check-type-error #'open-stream-p #'streamp)
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/open.lsp
@@ -0,0 +1,1238 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Fri Jan 23 05:36:55 2004
+;;;; Contains: Tests of OPEN
+
+(in-package :cl-test)
+
+;;; Input streams
+
+(defun generator-for-element-type (type)
+ (etypecase type
+ ((member character base-char)
+ #'(lambda (i) (aref "abcdefghijklmnopqrstuvwxyz" (mod i 26))))
+ ((member signed-byte unsigned-byte bit)
+ #'(lambda (i) (logand i 1)))
+ (cons
+ (let ((op (car type))
+ (arg1 (cadr type))
+ (arg2 (caddr type)))
+ (ecase op
+ (unsigned-byte
+ (let ((mask (1- (ash 1 arg1))))
+ #'(lambda (i) (logand i mask))))
+ (signed-byte
+ (let ((mask (1- (ash 1 (1- arg1)))))
+ #'(lambda (i) (logand i mask))))
+ (integer
+ (let* ((lo arg1)
+ (hi arg2)
+ (lower-bound
+ (etypecase lo
+ (integer lo)
+ (cons (1+ (car lo)))))
+ (upper-bound
+ (etypecase hi
+ (integer hi)
+ (cons (1- (car hi)))))
+ (range (1+ (- upper-bound lower-bound))))
+ #'(lambda (i) (+ lower-bound (mod i range))))))))))
+
+(compile 'generator-for-element-type)
+
+(defmacro def-open-test (name args form expected
+ &key
+ (notes nil notes-p)
+ (build-form nil build-form-p)
+ (element-type 'character element-type-p)
+ (pathname #p"tmp.dat"))
+
+ (when element-type-p
+ (setf args (append args (list :element-type `',element-type))))
+
+ (unless build-form-p
+ (let ((write-element-form
+ (cond
+ ((subtypep element-type 'integer)
+ `(write-byte
+ (funcall (the function
+ (generator-for-element-type ',element-type)) i)
+ os))
+ ((subtypep element-type 'character)
+ `(write-char
+ (funcall (the function
+ (generator-for-element-type ',element-type)) i)
+ os)))))
+ (setq build-form
+ `(with-open-file
+ (os pn :direction :output
+ ,@(if element-type-p
+ `(:element-type ',element-type))
+ :if-exists :supersede)
+ (assert (open-stream-p os))
+ (dotimes (i 10) ,write-element-form)
+ (finish-output os)
+ ))))
+
+ `(deftest ,name
+ ,@(when notes-p `(:notes ,notes))
+ (let ((pn ,pathname))
+ (delete-all-versions pn)
+ ,build-form
+ (let ((s (open pn ,@args)))
+ (unwind-protect
+ (progn
+ (assert (open-stream-p s))
+ (assert (typep s 'file-stream))
+ ,@
+ (unless (member element-type '(signed-byte unsigned-byte))
+ #-allegro
+ `((assert (subtypep ',element-type
+ (stream-element-type s))))
+ #+allegro nil
+ )
+ ,form)
+ (close s))))
+ ,@expected))
+
+;; (compile 'def-open-test)
+
+(def-open-test open.1 () (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.2 (:direction :input)
+ (values (read-line s nil)) ("abcdefghij") :element-type character)
+(def-open-test open.3 (:direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.4 (:direction :input)
+ (values (read-line s nil)) ("abcdefghij") :element-type base-char)
+(def-open-test open.5 (:if-exists :error)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.6 (:if-exists :error :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.7 (:if-exists :new-version)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.8 (:if-exists :new-version :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.9 (:if-exists :rename)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.10 (:if-exists :rename :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.11 (:if-exists :rename-and-delete)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.12 (:if-exists :rename-and-delete :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.13 (:if-exists :overwrite)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.14 (:if-exists :overwrite :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.15 (:if-exists :append)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.16 (:if-exists :append :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.17 (:if-exists :supersede)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.18 (:if-exists :supersede :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.19 (:if-exists nil)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.20 (:if-exists nil :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+
+(def-open-test open.21 (:if-does-not-exist nil)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.22 (:if-does-not-exist nil :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.23 (:if-does-not-exist :error)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.24 (:if-does-not-exist :error :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.25 (:if-does-not-exist :create)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.26 (:if-does-not-exist :create :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+
+(def-open-test open.27 (:external-format :default)
+ (values (read-line s nil)) ("abcdefghij"))
+(def-open-test open.28 (:external-format :default :direction :input)
+ (values (read-line s nil)) ("abcdefghij"))
+
+(def-open-test open.29 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 0 1 0 1 0 1 0 1)) :element-type (unsigned-byte 1))
+(def-open-test open.30 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 0 1 0 1 0 1 0 1)) :element-type (unsigned-byte 1))
+
+(def-open-test open.31 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 0 1 2 3 0 1)) :element-type (unsigned-byte 2))
+(def-open-test open.32 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 0 1 2 3 0 1)) :element-type (unsigned-byte 2))
+
+(def-open-test open.33 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 0 1)) :element-type (unsigned-byte 3))
+(def-open-test open.34 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 0 1)) :element-type (unsigned-byte 3))
+
+(def-open-test open.35 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 4))
+(def-open-test open.36 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 4))
+
+(def-open-test open.37 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 5))
+(def-open-test open.38 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 5))
+
+(def-open-test open.39 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 6))
+(def-open-test open.40 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 6))
+
+(def-open-test open.41 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 7))
+(def-open-test open.42 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 7))
+
+(def-open-test open.43 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 8))
+(def-open-test open.44 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 8))
+
+(def-open-test open.45 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 9))
+(def-open-test open.46 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 9))
+
+(def-open-test open.47 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 10))
+(def-open-test open.48 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 10))
+
+(def-open-test open.49 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 20))
+(def-open-test open.50 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 20))
+
+(def-open-test open.51 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 25))
+(def-open-test open.52 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 25))
+
+(def-open-test open.53 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 30))
+(def-open-test open.54 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 30))
+
+(def-open-test open.55 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 32))
+(def-open-test open.56 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 32))
+
+(def-open-test open.57 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 33))
+(def-open-test open.58 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 33))
+
+(def-open-test open.59 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 0 1 0 1 0 1 0 1)) :element-type unsigned-byte)
+(def-open-test open.60 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 0 1 0 1 0 1 0 1)) :element-type unsigned-byte)
+
+(def-open-test open.61 ()
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 0 1 0 1 0 1 0 1)) :element-type signed-byte)
+(def-open-test open.62 (:direction :input)
+ (let ((seq (make-array 10))) (read-sequence seq s) seq)
+ (#(0 1 0 1 0 1 0 1 0 1)) :element-type signed-byte)
+
+
+(def-open-test open.63 ()
+ (values (read-line s nil)) ("abcdefghij")
+ :pathname "tmp.dat")
+
+(def-open-test open.64 ()
+ (values (read-line s nil)) ("abcdefghij")
+ :pathname (logical-pathname "CLTEST:TMP.DAT"))
+
+;;; It works on recognizable subtypes.
+(deftest open.65
+ (let ((type '(or (integer 0 1) (integer 100 200)))
+ (pn #p"tmp.dat")
+ (vals '(0 1 100 120 130 190 200 1 0 150)))
+ (or
+ (not (subtypep type 'integer))
+ (progn
+ (with-open-file
+ (os pn :direction :output
+ :element-type type
+ :if-exists :supersede)
+ (dolist (e vals) (write-byte e os)))
+ (let ((s (open pn :direction :input
+ :element-type type))
+ (seq (make-array 10)))
+ (unwind-protect
+ (progn (read-sequence seq s) seq)
+ (close s))
+ (notnot (every #'eql seq vals))))))
+ t)
+
+;;; FIXME: Add -- tests for when the filespec is a stream
+
+(deftest open.66
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (with-open-file
+ (s pn :direction :io :if-exists :rename-and-delete
+ :if-does-not-exist :create)
+ (format s "some stuff~%")
+ (finish-output s)
+ (let ((is (open s :direction :input)))
+ (unwind-protect
+ (values
+ (read-char is)
+ (notnot (file-position s :start))
+ (read-line is)
+ (read-line s))
+ (close is)))))
+ #\s
+ t
+ "ome stuff"
+ "some stuff")
+
+(deftest open.67
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (let ((s (open pn :direction :output)))
+ (unwind-protect
+ (progn
+ (format s "some stuff~%")
+ (finish-output s)
+ (close s)
+ (let ((is (open s :direction :input)))
+ (unwind-protect
+ (values (read-line is))
+ (close is))))
+ (when (open-stream-p s) (close s)))))
+ "some stuff")
+
+;;; FIXME: Add -- tests for when element-type is :default
+
+;;; Tests of file creation
+
+(defmacro def-open-output-test
+ (name args form expected
+ &rest keyargs
+ &key
+ (element-type 'character)
+ (build-form
+ `(dotimes (i 10)
+ ,(cond
+ ((subtypep element-type 'integer)
+ `(write-byte
+ (funcall (the function
+ (generator-for-element-type ',element-type)) i)
+ s))
+ ((subtypep element-type 'character)
+ `(write-char
+ (funcall (the function
+ (generator-for-element-type ',element-type)) i)
+ s)))))
+ &allow-other-keys)
+ `(def-open-test ,name (:direction :output ,@args)
+ (progn
+ ,build-form
+ (assert (output-stream-p s))
+ ,form)
+ ,expected
+ :build-form nil
+ ,@keyargs))
+
+;; (compile 'def-open-output-test)
+
+(def-open-output-test open.output.1 ()
+ (progn (close s)
+ (with-open-file (is #p"tmp.dat") (values (read-line is nil))))
+ ("abcdefghij"))
+
+(def-open-output-test open.output.2 ()
+ (progn (close s)
+ (with-open-file (is "tmp.dat") (values (read-line is nil))))
+ ("abcdefghij")
+ :pathname "tmp.dat")
+
+(def-open-output-test open.output.3
+ ()
+ (progn (close s)
+ (with-open-file (is (logical-pathname "CLTEST:TMP.DAT"))
+ (values (read-line is nil))))
+ ("abcdefghij")
+ :pathname (logical-pathname "CLTEST:TMP.DAT"))
+
+(def-open-output-test open.output.4 ()
+ (progn (close s)
+ (with-open-file (is #p"tmp.dat" :element-type 'character)
+ (values (read-line is nil))))
+ ("abcdefghij")
+ :element-type character)
+
+(def-open-output-test open.output.5 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type 'base-char)
+ (values (read-line is nil))))
+ ("abcdefghij")
+ :element-type base-char)
+
+(def-open-output-test open.output.6 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(integer 0 1))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 0 1 0 1 0 1 0 1))
+ :element-type (integer 0 1))
+
+(def-open-output-test open.output.7 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type 'bit)
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 0 1 0 1 0 1 0 1))
+ :element-type bit)
+
+(def-open-output-test open.output.8 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 1))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 0 1 0 1 0 1 0 1))
+ :element-type (unsigned-byte 1))
+
+(def-open-output-test open.output.9 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 2))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 0 1 2 3 0 1))
+ :element-type (unsigned-byte 2))
+
+(def-open-output-test open.output.10 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 3))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 4 5 6 7 0 1))
+ :element-type (unsigned-byte 3))
+
+(def-open-output-test open.output.11 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 4))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 4))
+
+
+(def-open-output-test open.output.12 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 6))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 6))
+
+(def-open-output-test open.output.13 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 8))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 8))
+
+(def-open-output-test open.output.14 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 12))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 12))
+
+(def-open-output-test open.output.15 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 16))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 16))
+
+(def-open-output-test open.output.16 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 24))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 24))
+
+(def-open-output-test open.output.17 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 32))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 32))
+
+(def-open-output-test open.output.18 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 64))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 64))
+
+(def-open-output-test open.output.19 ()
+ (progn (close s) (with-open-file (is #p"tmp.dat"
+ :element-type '(unsigned-byte 100))
+ (let ((seq (make-array 10)))
+ (read-sequence seq is)
+ seq)))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 100))
+
+(deftest open.output.20
+ (let ((pn #p"tmp.dat"))
+ (with-open-file (s pn :direction :output :if-exists :supersede))
+ (open pn :direction :output :if-exists nil))
+ nil)
+
+(def-open-test open.output.21 (:if-exists :new-version :direction :output)
+ (progn (write-sequence "wxyz" s)
+ (close s)
+ (with-open-file
+ (s pn :direction :input)
+ (values (read-line s nil))))
+ ("wxyz")
+ :notes (:open-if-exists-new-version-no-error)
+ )
+
+(def-open-test open.output.22 (:if-exists :rename :direction :output)
+ (progn (write-sequence "wxyz" s)
+ (close s)
+ (with-open-file
+ (s pn :direction :input)
+ (values (read-line s nil))))
+ ("wxyz"))
+
+(def-open-test open.output.23 (:if-exists :rename-and-delete
+ :direction :output)
+ (progn (write-sequence "wxyz" s)
+ (close s)
+ (with-open-file
+ (s pn :direction :input)
+ (values (read-line s nil))))
+ ("wxyz"))
+
+(def-open-test open.output.24 (:if-exists :overwrite
+ :direction :output)
+ (progn (write-sequence "wxyz" s)
+ (close s)
+ (with-open-file
+ (s pn :direction :input)
+ (values (read-line s nil))))
+ ("wxyzefghij"))
+
+(def-open-test open.output.25 (:if-exists :append
+ :direction :output)
+ (progn (write-sequence "wxyz" s)
+ (close s)
+ (with-open-file
+ (s pn :direction :input)
+ (values (read-line s nil))))
+ ("abcdefghijwxyz"))
+
+(def-open-test open.output.26 (:if-exists :supersede
+ :direction :output)
+ (progn (write-sequence "wxyz" s)
+ (close s)
+ (with-open-file
+ (s pn :direction :input)
+ (values (read-line s nil))))
+ ("wxyz"))
+
+(def-open-output-test open.output.27 (:if-does-not-exist :create
+ :direction :output)
+ (progn (close s)
+ (with-open-file
+ (is pn :direction :input)
+ (values (read-line is nil))))
+ ("abcdefghij"))
+
+(deftest open.output.28
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :direction :output :if-does-not-exist nil))
+ nil)
+
+(def-open-output-test open.output.28a (:external-format :default)
+ (progn (close s)
+ (with-open-file (is #p"tmp.dat") (values (read-line is nil))))
+ ("abcdefghij"))
+
+(def-open-output-test open.output.29
+ (:external-format (prog1
+ (with-open-file (s "foo.dat" :direction :output
+ :if-exists :supersede)
+ (stream-external-format s))
+ (delete-all-versions "foo.dat")
+ ))
+ (progn (close s)
+ (with-open-file (is #p"tmp.dat") (values (read-line is nil))))
+ ("abcdefghij"))
+
+;;; Default behavior of open :if-exists is :create when the version
+;;; of the filespec is :newest
+
+(deftest open.output.30
+ :notes (:open-if-exists-new-version-no-error)
+ (let ((pn (make-pathname :name "tmp" :type "dat" :version :newest)))
+ (or (not (eql (pathname-version pn) :newest))
+ (progn
+ ;; Create file
+ (let ((s1 (open pn :direction :output :if-exists :overwrite
+ :if-does-not-exist :create)))
+ (unwind-protect
+ ;; Now try again
+ (let ((s2 (open pn :direction :output)))
+ (unwind-protect
+ (write-line "abcdef" s2)
+ (close s2))
+ (unwind-protect
+ (progn
+ (setq s2 (open s1 :direction :input))
+ (equalt (read-line s2 nil) "abcdef"))
+ (close s2)))
+ (close s1)
+ (delete-all-versions pn)
+ )))))
+ t)
+
+(def-open-output-test open.output.31 (:if-exists :rename
+ :direction :output)
+ (progn (close s)
+ (with-open-file
+ (is pn :direction :input)
+ (values (read-line is nil))))
+ ("abcdefghij"))
+
+(def-open-output-test open.output.32 (:if-exists :rename-and-delete
+ :direction :output)
+ (progn (close s)
+ (with-open-file
+ (is pn :direction :input)
+ (values (read-line is nil))))
+ ("abcdefghij"))
+
+(def-open-output-test open.output.33 (:if-exists :new-version
+ :direction :output)
+ (progn (close s)
+ (with-open-file
+ (is pn :direction :input)
+ (values (read-line is nil))))
+ ("abcdefghij"))
+
+(def-open-output-test open.output.34 (:if-exists :supersede
+ :direction :output)
+ (progn (close s)
+ (with-open-file
+ (is pn :direction :input)
+ (values (read-line is nil))))
+ ("abcdefghij"))
+
+(def-open-output-test open.output.35 (:if-exists nil
+ :direction :output)
+ (progn (close s)
+ (with-open-file
+ (is pn :direction :input)
+ (values (read-line is nil))))
+ ("abcdefghij"))
+
+;;; Add -- tests for when the filespec is a stream
+
+
+;;; Tests of bidirectional IO
+
+(defmacro def-open-io-test
+ (name args form expected
+ &rest keyargs
+ &key
+ (element-type 'character)
+ (build-form
+ `(dotimes (i 10)
+ ,(cond
+ ((subtypep element-type 'integer)
+ `(write-byte
+ (funcall (the function
+ (generator-for-element-type ',element-type)) i)
+ s))
+ ((subtypep element-type 'character)
+ `(write-char
+ (funcall (the function
+ (generator-for-element-type ',element-type)) i)
+ s)))))
+ &allow-other-keys)
+ `(def-open-test ,name (:direction :io ,@args)
+ (progn
+ ,build-form
+ (assert (input-stream-p s))
+ (assert (output-stream-p s))
+ ,form)
+ ,expected
+ :build-form nil
+ ,@keyargs))
+
+;; (compile 'def-open-io-test)
+
+(def-open-io-test open.io.1 ()
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij"))
+
+(def-open-io-test open.io.2 ()
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij")
+ :pathname "tmp.dat")
+
+(def-open-io-test open.io.3
+ ()
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij")
+ :pathname (logical-pathname "CLTEST:TMP.DAT"))
+
+(def-open-io-test open.io.4 ()
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij")
+ :element-type character)
+
+(def-open-io-test open.io.5 ()
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij")
+ :element-type base-char)
+
+(def-open-io-test open.io.6 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 0 1 0 1 0 1 0 1))
+ :element-type (integer 0 1))
+
+(def-open-io-test open.io.7 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 0 1 0 1 0 1 0 1))
+ :element-type bit)
+
+(def-open-io-test open.io.8 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 0 1 0 1 0 1 0 1))
+ :element-type (unsigned-byte 1))
+
+(def-open-io-test open.io.9 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 0 1 2 3 0 1))
+ :element-type (unsigned-byte 2))
+
+(def-open-io-test open.io.10 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 4 5 6 7 0 1))
+ :element-type (unsigned-byte 3))
+
+(def-open-io-test open.io.11 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 4))
+
+
+(def-open-io-test open.io.12 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 6))
+
+(def-open-io-test open.io.13 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 8))
+
+(def-open-io-test open.io.14 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 12))
+
+(def-open-io-test open.io.15 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 16))
+
+(def-open-io-test open.io.16 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 24))
+
+(def-open-io-test open.io.17 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 32))
+
+(def-open-io-test open.io.18 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 64))
+
+(def-open-io-test open.io.19 ()
+ (progn (file-position s :start)
+ (let ((seq (make-array 10)))
+ (read-sequence seq s)
+ seq))
+ (#(0 1 2 3 4 5 6 7 8 9))
+ :element-type (unsigned-byte 100))
+
+(deftest open.io.20
+ (let ((pn #p"tmp.dat"))
+ (with-open-file (s pn :direction :io :if-exists :supersede))
+ (open pn :direction :io :if-exists nil))
+ nil)
+
+(def-open-test open.io.21 (:if-exists :new-version :direction :io)
+ (progn (write-sequence "wxyz" s)
+ (file-position s :start)
+ (values (read-line s nil)))
+ ("wxyz")
+ :notes (:open-if-exists-new-version-no-error)
+ )
+
+(def-open-test open.io.22 (:if-exists :rename :direction :io)
+ (progn (write-sequence "wxyz" s)
+ (file-position s :start)
+ (values (read-line s nil)))
+ ("wxyz"))
+
+(def-open-test open.io.23 (:if-exists :rename-and-delete
+ :direction :io)
+ (progn (write-sequence "wxyz" s)
+ (file-position s :start)
+ (values (read-line s nil)))
+ ("wxyz"))
+
+(def-open-test open.io.24 (:if-exists :overwrite
+ :direction :io)
+ (progn (write-sequence "wxyz" s)
+ (file-position s :start)
+ (values (read-line s nil)))
+ ("wxyzefghij"))
+
+(def-open-test open.io.25 (:if-exists :append
+ :direction :io)
+ (progn (write-sequence "wxyz" s)
+ (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghijwxyz"))
+
+(def-open-test open.io.26 (:if-exists :supersede
+ :direction :io)
+ (progn (write-sequence "wxyz" s)
+ (file-position s :start)
+ (values (read-line s nil)))
+ ("wxyz"))
+
+(def-open-io-test open.io.27 (:if-does-not-exist :create
+ :direction :io)
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij"))
+
+(deftest open.io.28
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :direction :io :if-does-not-exist nil))
+ nil)
+
+(def-open-io-test open.io.28a (:external-format :default)
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij"))
+
+(def-open-io-test open.io.29
+ (:external-format (prog1
+ (with-open-file (s "foo.dat" :direction :io
+ :if-exists :supersede)
+ (stream-external-format s))
+ (delete-all-versions "foo.dat")
+ ))
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij"))
+
+;;; Default behavior of open :if-exists is :create when the version
+;;; of the filespec is :newest
+
+(deftest open.io.30
+ :notes (:open-if-exists-new-version-no-error)
+ (let ((pn (make-pathname :name "tmp" :type "dat" :version :newest)))
+ (or (not (eql (pathname-version pn) :newest))
+ (progn
+ ;; Create file
+ (let ((s1 (open pn :direction :io :if-exists :overwrite
+ :if-does-not-exist :create)))
+ (unwind-protect
+ ;; Now try again
+ (let ((s2 (open pn :direction :io)))
+ (unwind-protect
+ (write-line "abcdef" s2)
+ (close s2))
+ (unwind-protect
+ (progn
+ (setq s2 (open s1 :direction :input))
+ (equalt (read-line s2 nil) "abcdef"))
+ (close s2)))
+ (close s1)
+ (delete-all-versions pn)
+ )))))
+ t)
+
+(def-open-io-test open.io.31 (:if-exists :rename
+ :direction :io)
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij"))
+
+(def-open-io-test open.io.32 (:if-exists :rename-and-delete
+ :direction :io)
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij"))
+
+(def-open-io-test open.io.33 (:if-exists :new-version
+ :direction :io)
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij"))
+
+(def-open-io-test open.io.34 (:if-exists :supersede
+ :direction :io)
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij"))
+
+(def-open-io-test open.io.35 (:if-exists nil
+ :direction :io)
+ (progn (file-position s :start)
+ (values (read-line s nil)))
+ ("abcdefghij"))
+
+;;;; :PROBE tests
+
+(defmacro def-open-probe-test
+ (name args form
+ &key (build-form nil build-form-p)
+ (pathname #p"tmp.dat"))
+ (unless build-form-p
+ (setf build-form
+ `(with-open-file (s pn :direction :output
+ :if-exists :supersede))))
+ `(deftest ,name
+ (let ((pn ,pathname))
+ (delete-all-versions pn)
+ ,build-form
+ (let ((s (open pn :direction :probe ,@args)))
+ (values
+ ,(if build-form
+ `(and
+ (typep s 'file-stream)
+ (not (open-stream-p s))
+ )
+ `(not s))
+ ,form)))
+ t t))
+
+(def-open-probe-test open.probe.1 () t)
+(def-open-probe-test open.probe.2 (:if-exists :error) t)
+(def-open-probe-test open.probe.3 (:if-exists :new-version) t)
+(def-open-probe-test open.probe.4 (:if-exists :rename) t)
+(def-open-probe-test open.probe.5 (:if-exists :rename-and-delete) t)
+(def-open-probe-test open.probe.6 (:if-exists :overwrite) t)
+(def-open-probe-test open.probe.7 (:if-exists :append) t)
+(def-open-probe-test open.probe.8 (:if-exists :supersede) t)
+
+(def-open-probe-test open.probe.9 (:if-does-not-exist :error) t)
+(def-open-probe-test open.probe.10 (:if-does-not-exist nil) t)
+(def-open-probe-test open.probe.11 (:if-does-not-exist :create) t)
+
+(def-open-probe-test open.probe.12 () t :build-form nil)
+(def-open-probe-test open.probe.13 (:if-exists :error) t :build-form nil)
+(def-open-probe-test open.probe.14 (:if-exists :new-version) t :build-form nil)
+(def-open-probe-test open.probe.15 (:if-exists :rename) t :build-form nil)
+(def-open-probe-test open.probe.16 (:if-exists :rename-and-delete) t
+ :build-form nil)
+(def-open-probe-test open.probe.17 (:if-exists :overwrite) t
+ :build-form nil)
+(def-open-probe-test open.probe.18 (:if-exists :append) t
+ :build-form nil)
+(def-open-probe-test open.probe.19 (:if-exists :supersede) t
+ :build-form nil)
+
+(def-open-probe-test open.probe.20 (:if-does-not-exist nil) t
+ :build-form nil)
+
+(deftest open.probe.21
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (let ((s (open pn :direction :probe :if-does-not-exist :create)))
+ (values
+ (notnot s)
+ (notnot (probe-file pn)))))
+ t t)
+
+(deftest open.probe.22
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (let ((s (open pn :direction :probe :if-does-not-exist :create
+ :if-exists :error)))
+ (values
+ (notnot s)
+ (notnot (probe-file pn)))))
+ t t)
+
+(def-open-probe-test open.probe.23 (:external-format :default) t)
+(def-open-probe-test open.probe.24 (:element-type 'character) t)
+(def-open-probe-test open.probe.25 (:element-type 'bit) t)
+(def-open-probe-test open.probe.26 (:element-type '(unsigned-byte 2)) t)
+(def-open-probe-test open.probe.27 (:element-type '(unsigned-byte 4)) t)
+(def-open-probe-test open.probe.28 (:element-type '(unsigned-byte 8)) t)
+(def-open-probe-test open.probe.29 (:element-type '(unsigned-byte 9)) t)
+(def-open-probe-test open.probe.30 (:element-type '(unsigned-byte 15)) t)
+(def-open-probe-test open.probe.31 (:element-type '(unsigned-byte 16)) t)
+(def-open-probe-test open.probe.32 (:element-type '(unsigned-byte 17)) t)
+(def-open-probe-test open.probe.33 (:element-type '(unsigned-byte 31)) t)
+(def-open-probe-test open.probe.34 (:element-type '(unsigned-byte 32)) t)
+(def-open-probe-test open.probe.35 (:element-type '(unsigned-byte 33)) t)
+(def-open-probe-test open.probe.36 (:element-type '(integer -1002 13112)) t)
+
+;;;; Error tests
+
+(deftest open.error.1
+ (signals-error (open) program-error)
+ t)
+
+(deftest open.error.2
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (close (open pn :direction :output :if-does-not-exist :create))
+ (open pn :if-exists :error :direction :output))
+ file-error)
+ t t)
+
+(deftest open.error.3
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (close (open pn :direction :output :if-does-not-exist :create))
+ (open pn :if-exists :error :direction :io))
+ file-error)
+ t t)
+
+(deftest open.error.4
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn))
+ file-error)
+ t t)
+
+(deftest open.error.5
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :if-does-not-exist :error))
+ file-error)
+ t t)
+
+(deftest open.error.6
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :direction :input))
+ file-error)
+ t t)
+
+(deftest open.error.7
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :if-does-not-exist :error :direction :input))
+ file-error)
+ t t)
+
+(deftest open.error.8
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :direction :output :if-does-not-exist :error))
+ file-error)
+ t t)
+
+(deftest open.error.9
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :direction :io :if-does-not-exist :error))
+ file-error)
+ t t)
+
+(deftest open.error.10
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :direction :probe :if-does-not-exist :error))
+ file-error)
+ t t)
+
+(deftest open.error.11
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :direction :output :if-exists :overwrite))
+ file-error)
+ t t)
+
+(deftest open.error.12
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :direction :output :if-exists :append))
+ file-error)
+ t t)
+
+(deftest open.error.13
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :direction :io :if-exists :overwrite))
+ file-error)
+ t t)
+
+(deftest open.error.14
+ (signals-error-always
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (open pn :direction :io :if-exists :append))
+ file-error)
+ t t)
+
+(deftest open.error.15
+ (signals-error-always
+ (open (make-pathname :name :wild :type "lsp"))
+ file-error)
+ t t)
+
+(deftest open.error.16
+ (signals-error-always
+ (open (make-pathname :name "open" :type :wild))
+ file-error)
+ t t)
+
+(deftest open.error.17
+ (signals-error-always
+ (let ((pn (make-pathname :name "open" :type "lsp" :version :wild)))
+ (if (wild-pathname-p pn) (open pn)
+ (error 'file-error)))
+ file-error)
+ t t)
+
+(deftest open.error.18
+ (signals-error-always
+ (open #p"tmp.dat" :direction :output :if-exists :supersede
+ :external-form (gensym))
+ error)
+ t t)
+
+
+;;; FIXME -- add tests for :element-type :default
+
+;;; FIXME -- add tests for filespec being a specialized string
--- /dev/null
+++ gcl-2.6.12/ansi-tests/output-stream-p.lsp
@@ -0,0 +1,39 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 13 19:46:12 2004
+;;;; Contains: Tests of OUTPUT-STREAM-P
+
+(in-package :cl-test)
+
+(deftest output-stream-p.1
+ (notnot-mv (output-stream-p *standard-output*))
+ t)
+
+(deftest output-stream-p.2
+ (notnot-mv (output-stream-p *terminal-io*))
+ t)
+
+(deftest output-stream-p.3
+ (with-open-file (s "output-stream-p.lsp" :direction :input)
+ (output-stream-p s))
+ nil)
+
+(deftest output-stream-p.4
+ (with-open-file (s "foo.txt" :direction :output
+ :if-exists :supersede)
+ (notnot-mv (output-stream-p s)))
+ t)
+
+;;; Error tests
+
+(deftest output-stream-p.error.1
+ (signals-error (output-stream-p) program-error)
+ t)
+
+(deftest output-stream-p.error.2
+ (signals-error (output-stream-p *standard-output* nil) program-error)
+ t)
+
+(deftest output-stream-p.error.3
+ (check-type-error #'output-stream-p #'streamp)
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/parse-namestring.lsp
@@ -0,0 +1,89 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Aug 14 13:59:18 2004
+;;;; Contains: Tests of PARSE-NAMESTRING
+
+(in-package :cl-test)
+
+;;; "Parsing a null string always succeeds, producing a pathname
+;;; with all components (except the host) equal to nil."
+
+(deftest parse-namestring.1
+ (let ((vals (multiple-value-list (parse-namestring ""))))
+ (assert (= (length vals) 2))
+ (let ((pn (first vals))
+ (pos (second vals)))
+ (values
+ (pathname-directory pn)
+ (pathname-device pn)
+ (pathname-name pn)
+ (pathname-type pn)
+ (pathname-version pn)
+ pos)))
+ nil nil nil nil nil 0)
+
+(deftest parse-namestring.2
+ (let ((vals (multiple-value-list (parse-namestring (make-array 0 :element-type 'base-char)))))
+ (assert (= (length vals) 2))
+ (let ((pn (first vals))
+ (pos (second vals)))
+ (values
+ (pathname-directory pn)
+ (pathname-device pn)
+ (pathname-name pn)
+ (pathname-type pn)
+ (pathname-version pn)
+ pos)))
+ nil nil nil nil nil 0)
+
+(deftest parse-namestring.3
+ (let ((vals (multiple-value-list (parse-namestring (make-array 4 :element-type 'base-char
+ :initial-element #\X
+ :fill-pointer 0)))))
+ (assert (= (length vals) 2))
+ (let ((pn (first vals))
+ (pos (second vals)))
+ (values
+ (pathname-directory pn)
+ (pathname-device pn)
+ (pathname-name pn)
+ (pathname-type pn)
+ (pathname-version pn)
+ pos)))
+ nil nil nil nil nil 0)
+
+(deftest parse-namestring.4
+ (loop for etype in '(standard-char base-char character)
+ for s0 = (make-array 4 :element-type etype :initial-element #\X)
+ for s = (make-array 0 :element-type etype :displaced-to s0
+ :displaced-index-offset 1)
+ for vals = (multiple-value-list (parse-namestring s))
+ for pn = (first vals)
+ for pos = (second vals)
+ do (assert (= (length vals) 2))
+ nconc
+ (let ((result (list (pathname-directory pn)
+ (pathname-device pn)
+ (pathname-name pn)
+ (pathname-type pn)
+ (pathname-version pn)
+ pos)))
+ (unless (equal result '(nil nil nil nil nil 0))
+ (list (list etype result)))))
+ nil)
+
+;;; Error tests
+
+(deftest parse-namestring.error.1
+ (signals-error (parse-namestring) program-error)
+ t)
+
+(deftest parse-name-string.error.2
+ (signals-error (parse-namestring "" nil *default-pathname-defaults* :foo nil) program-error)
+ t)
+
+(deftest parse-name-string.error.3
+ (signals-error (parse-namestring "" nil *default-pathname-defaults* :start) program-error)
+ t)
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathname-device.lsp
@@ -0,0 +1,74 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Dec 6 14:23:54 2003
+;;;; Contains: Tests for PATHNAME-DEVICE
+
+(in-package :cl-test)
+
+(compile-and-load "pathnames-aux.lsp")
+
+(deftest pathname-device.1
+ (loop for p in *pathnames*
+ for device = (pathname-device p)
+ unless (or (stringp device)
+ (member device '(nil :wild :unspecific)))
+ collect (list p device))
+ nil)
+
+(deftest pathname-device.2
+ (loop for p in *pathnames*
+ for device = (pathname-device p :case :local)
+ unless (or (stringp device)
+ (member device '(nil :wild :unspecific)))
+ collect (list p device))
+ nil)
+
+(deftest pathname-device.3
+ (loop for p in *pathnames*
+ for device = (pathname-device p :case :common)
+ unless (or (stringp device)
+ (member device '(nil :wild :unspecific)))
+ collect (list p device))
+ nil)
+
+(deftest pathname-device.4
+ (loop for p in *pathnames*
+ for device = (pathname-device p :allow-other-keys nil)
+ unless (or (stringp device)
+ (member device '(nil :wild :unspecific)))
+ collect (list p device))
+ nil)
+
+(deftest pathname-device.5
+ (loop for p in *pathnames*
+ for device = (pathname-device p :foo 'bar :allow-other-keys t)
+ unless (or (stringp device)
+ (member device '(nil :wild :unspecific)))
+ collect (list p device))
+ nil)
+
+(deftest pathname-device.6
+ (loop for p in *pathnames*
+ for device = (pathname-device p :allow-other-keys t :allow-other-keys nil :foo 'bar)
+ unless (or (stringp device)
+ (member device '(nil :wild :unspecific)))
+ collect (list p device))
+ nil)
+
+;;; section 19.3.2.1
+(deftest pathname-device.7
+ (loop for p in *logical-pathnames*
+ always (eq (pathname-device p) :unspecific))
+ t)
+
+(deftest pathname-device.8
+ (do-special-strings (s "" nil) (pathname-device s))
+ nil)
+
+(deftest pathname-device.error.1
+ (signals-error (pathname-device) program-error)
+ t)
+
+(deftest pathname-device.error.2
+ (check-type-error #'pathname-device #'could-be-pathname-designator)
+ nil)
\ No newline at end of file
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathname-directory.lsp
@@ -0,0 +1,89 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Dec 6 14:24:39 2003
+;;;; Contains: Tests for PATHNAME-DIRECTORY
+
+(in-package :cl-test)
+
+(compile-and-load "pathnames-aux.lsp")
+
+(deftest pathname-directory.1
+ (loop for p in *pathnames*
+ for directory = (pathname-directory p)
+ unless (or (stringp directory)
+ (member directory '(nil :wild :unspecific))
+ (and (consp directory)
+ (member (car directory) '(:absolute :relative))))
+ collect (list p directory))
+ nil)
+
+(deftest pathname-directory.2
+ (loop for p in *pathnames*
+ for directory = (pathname-directory p :case :local)
+ unless (or (stringp directory)
+ (member directory '(nil :wild :unspecific))
+ (and (consp directory)
+ (member (car directory) '(:absolute :relative))))
+ collect (list p directory))
+ nil)
+
+(deftest pathname-directory.3
+ (loop for p in *pathnames*
+ for directory = (pathname-directory p :case :common)
+ unless (or (stringp directory)
+ (member directory '(nil :wild :unspecific))
+ (and (consp directory)
+ (member (car directory) '(:absolute :relative))))
+ collect (list p directory))
+ nil)
+
+(deftest pathname-directory.4
+ (loop for p in *pathnames*
+ for directory = (pathname-directory p :allow-other-keys nil)
+ unless (or (stringp directory)
+ (member directory '(nil :wild :unspecific))
+ (and (consp directory)
+ (member (car directory) '(:absolute :relative))))
+ collect (list p directory))
+ nil)
+
+(deftest pathname-directory.5
+ (loop for p in *pathnames*
+ for directory = (pathname-directory p :foo 'bar :allow-other-keys t)
+ unless (or (stringp directory)
+ (member directory '(nil :wild :unspecific))
+ (and (consp directory)
+ (member (car directory) '(:absolute :relative))))
+ collect (list p directory))
+ nil)
+
+(deftest pathname-directory.6
+ (loop for p in *pathnames*
+ for directory = (pathname-directory p :allow-other-keys t
+ :allow-other-keys nil
+ 'foo 'bar)
+ unless (or (stringp directory)
+ (member directory '(nil :wild :unspecific))
+ (and (consp directory)
+ (member (car directory) '(:absolute :relative))))
+ collect (list p directory))
+ nil)
+
+;;; section 19.3.2.1
+(deftest pathname-directory.7
+ (loop for p in *logical-pathnames*
+ when (eq (pathname-directory p) :unspecific)
+ collect p)
+ nil)
+
+(deftest pathname-directory.8
+ (do-special-strings (s "" nil) (pathname-directory s))
+ nil)
+
+(deftest pathname-directory.error.1
+ (signals-error (pathname-directory) program-error)
+ t)
+
+(deftest pathname-directory.error.2
+ (check-type-error #'pathname-directory #'could-be-pathname-designator)
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathname-host.lsp
@@ -0,0 +1,79 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Dec 6 14:23:22 2003
+;;;; Contains: Tests for PATHNAME-HOST
+
+(in-package :cl-test)
+
+(compile-and-load "pathnames-aux.lsp")
+
+(deftest pathname-host.1
+ (loop for p in *pathnames*
+ always (eql (length (multiple-value-list (pathname-host p))) 1))
+ t)
+
+(deftest pathname-host.2
+ (loop for p in *pathnames*
+ always (eql (length (multiple-value-list (pathname-host p :case :local))) 1))
+ t)
+
+(deftest pathname-host.3
+ (loop for p in *pathnames*
+ always (eql (length (multiple-value-list (pathname-host p :case :common))) 1))
+ t)
+
+(deftest pathname-host.4
+ (loop for p in *pathnames*
+ always (eql (length (multiple-value-list (pathname-host p :allow-other-keys nil))) 1))
+ t)
+
+(deftest pathname-host.5
+ (loop for p in *pathnames*
+ always (eql (length (multiple-value-list
+ (pathname-host p :foo t :allow-other-keys t))) 1))
+ t)
+
+(deftest pathname-host.6
+ (loop for p in *pathnames*
+ always (eql (length (multiple-value-list
+ (pathname-host p :allow-other-keys t
+ :allow-other-keys nil
+ 'foo t))) 1))
+ t)
+
+;;; section 19.3.2.1
+(deftest pathname-host.7
+ (loop for p in *logical-pathnames*
+ when (eq (pathname-host p) :unspecific)
+ collect p)
+ nil)
+
+(deftest pathname-host.8
+ (do-special-strings (s "" nil) (pathname-host s))
+ nil)
+
+#|
+(deftest pathname-host.9
+ (loop for p in *pathnames*
+ for host = (pathname-host p)
+ unless (or (stringp host)
+ (and (listp host) (every #'stringp host))
+ (eql host :unspecific))
+ collect (list p host))
+ nil)
+|#
+
+;;; Error cases
+
+(deftest pathname-host.error.1
+ (signals-error (pathname-host) program-error)
+ t)
+
+(deftest pathname-host.error.2
+ (check-type-error #'pathname-host #'could-be-pathname-designator)
+ nil)
+
+(deftest pathname-host.error.3
+ (signals-error (pathname-host *default-pathname-defaults* '#:bogus t)
+ program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathname-match-p.lsp
@@ -0,0 +1,103 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Aug 15 07:46:22 2004
+;;;; Contains: Tests for PATHNAME-MATCH-P
+
+(in-package :cl-test)
+
+(compile-and-load "pathnames-aux.lsp")
+
+;;; Much of the behavior cannot be tested portably.
+
+(deftest pathname-match-p.1
+ (let ((pn1 (make-pathname :name :wild))
+ (pn2 (make-pathname :name "foo")))
+ (pathname-match-p pn1 pn2))
+ nil)
+
+(deftest pathname-match-p.2
+ (let ((pn1 (make-pathname :type :wild))
+ (pn2 (make-pathname :type "txt")))
+ (pathname-match-p pn1 pn2))
+ nil)
+
+(deftest pathname-match-p.3
+ (let ((pn1 (make-pathname :directory '(:absolute :wild)))
+ (pn2 (make-pathname :directory '(:absolute))))
+ (pathname-match-p pn1 pn2))
+ nil)
+
+(deftest pathname-match-p.4
+ (let ((pn1 (make-pathname :directory '(:relative :wild)))
+ (pn2 (make-pathname :directory '(:relative))))
+ (pathname-match-p pn1 pn2))
+ nil)
+
+(deftest pathname-match-p.5
+ (let ((pn1 (make-pathname :directory '(:relative :wild)))
+ (pn2 (make-pathname :directory nil)))
+ (and (wild-pathname-p pn1)
+ (not (pathname-directory pn2))
+ (not (pathname-match-p pn1 pn2))))
+ nil)
+
+(deftest pathname-match-p.6
+ (let ((pn1 (make-pathname :version :wild))
+ (pn2 (make-pathname)))
+ (and (wild-pathname-p pn1)
+ (not (pathname-version pn2))
+ (not (pathname-match-p pn1 pn2))))
+ nil)
+
+;;; Specialized string tests
+
+(deftest pathname-match-p.7
+ (let ((wpn (parse-namestring "CLTEST:*.LSP")))
+ (assert (wild-pathname-p wpn))
+ (do-special-strings
+ (s "CLTEST:FOO.LSP" nil)
+ (assert (pathname-match-p s wpn))))
+ nil)
+
+(deftest pathname-match-p.8
+ (do-special-strings
+ (s "CLTEST:*.LSP" nil)
+ (assert (pathname-match-p "CLTEST:FOO.LSP" s)))
+ nil)
+
+
+;;; Add more tests here
+
+;;; Here are error tests
+
+(deftest pathname-match-p.error.1
+ (signals-error (pathname-match-p) program-error)
+ t)
+
+(deftest pathname-match-p.error.2
+ (signals-error (pathname-match-p #p"") program-error)
+ t)
+
+(deftest pathname-match-p.error.3
+ (signals-error (pathname-match-p #p"" #p"" nil) program-error)
+ t)
+
+(deftest pathname-match-p.error.4
+ (check-type-error #'(lambda (x) (pathname-match-p x #p""))
+ #'could-be-pathname-designator)
+ nil)
+
+(deftest pathname-match-p.error.5
+ (check-type-error #'(lambda (x) (declare (optimize (safety 0))) (pathname-match-p x #p""))
+ #'could-be-pathname-designator)
+ nil)
+
+(deftest pathname-match-p.error.6
+ (check-type-error #'(lambda (x) (pathname-match-p #p"" x))
+ #'could-be-pathname-designator)
+ nil)
+
+(deftest pathname-match-p.error.7
+ (check-type-error #'(lambda (x) (declare (optimize (safety 0))) (pathname-match-p #p"" x))
+ #'could-be-pathname-designator)
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathname-name.lsp
@@ -0,0 +1,75 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Dec 6 14:45:16 2003
+;;;; Contains: Tests for PATHNAME-NAME
+
+(in-package :cl-test)
+
+(compile-and-load "pathnames-aux.lsp")
+
+(deftest pathname-name.1
+ (loop for p in *pathnames*
+ for name = (pathname-name p)
+ unless (or (stringp name)
+ (member name '(nil :wild :unspecific)))
+ collect (list p name))
+ nil)
+
+(deftest pathname-name.2
+ (loop for p in *pathnames*
+ for name = (pathname-name p :case :local)
+ unless (or (stringp name)
+ (member name '(nil :wild :unspecific)))
+ collect (list p name))
+ nil)
+
+(deftest pathname-name.3
+ (loop for p in *pathnames*
+ for name = (pathname-name p :case :common)
+ unless (or (stringp name)
+ (member name '(nil :wild :unspecific)))
+ collect (list p name))
+ nil)
+
+(deftest pathname-name.4
+ (loop for p in *pathnames*
+ for name = (pathname-name p :allow-other-keys nil)
+ unless (or (stringp name)
+ (member name '(nil :wild :unspecific)))
+ collect (list p name))
+ nil)
+
+(deftest pathname-name.5
+ (loop for p in *pathnames*
+ for name = (pathname-name p :foo 'bar :allow-other-keys t)
+ unless (or (stringp name)
+ (member name '(nil :wild :unspecific)))
+ collect (list p name))
+ nil)
+
+(deftest pathname-name.6
+ (loop for p in *pathnames*
+ for name = (pathname-name p :allow-other-keys t :allow-other-keys nil :foo 'bar)
+ unless (or (stringp name)
+ (member name '(nil :wild :unspecific)))
+ collect (list p name))
+ nil)
+
+;;; section 19.3.2.1
+(deftest pathname-name.7
+ (loop for p in *logical-pathnames*
+ when (eq (pathname-name p) :unspecific)
+ collect p)
+ nil)
+
+(deftest pathname-name.8
+ (do-special-strings (s "" nil) (pathname-name s))
+ nil)
+
+(deftest pathname-name.error.1
+ (signals-error (pathname-name) program-error)
+ t)
+
+(deftest pathname-name.error.2
+ (check-type-error #'pathname-name #'could-be-pathname-designator)
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathname-type.lsp
@@ -0,0 +1,75 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Dec 6 14:45:16 2003
+;;;; Contains: Tests for PATHNAME-TYPE
+
+(in-package :cl-test)
+
+(compile-and-load "pathnames-aux.lsp")
+
+(deftest pathname-type.1
+ (loop for p in *pathnames*
+ for type = (pathname-type p)
+ unless (or (stringp type)
+ (member type '(nil :wild :unspecific)))
+ collect (list p type))
+ nil)
+
+(deftest pathname-type.2
+ (loop for p in *pathnames*
+ for type = (pathname-type p :case :local)
+ unless (or (stringp type)
+ (member type '(nil :wild :unspecific)))
+ collect (list p type))
+ nil)
+
+(deftest pathname-type.3
+ (loop for p in *pathnames*
+ for type = (pathname-type p :case :common)
+ unless (or (stringp type)
+ (member type '(nil :wild :unspecific)))
+ collect (list p type))
+ nil)
+
+(deftest pathname-type.4
+ (loop for p in *pathnames*
+ for type = (pathname-type p :allow-other-keys nil)
+ unless (or (stringp type)
+ (member type '(nil :wild :unspecific)))
+ collect (list p type))
+ nil)
+
+(deftest pathname-type.5
+ (loop for p in *pathnames*
+ for type = (pathname-type p :foo 'bar :allow-other-keys t)
+ unless (or (stringp type)
+ (member type '(nil :wild :unspecific)))
+ collect (list p type))
+ nil)
+
+(deftest pathname-type.6
+ (loop for p in *pathnames*
+ for type = (pathname-type p :allow-other-keys t :allow-other-keys nil :foo 'bar)
+ unless (or (stringp type)
+ (member type '(nil :wild :unspecific)))
+ collect (list p type))
+ nil)
+
+;;; section 19.3.2.1
+(deftest pathname-type.7
+ (loop for p in *logical-pathnames*
+ when (eq (pathname-type p) :unspecific)
+ collect p)
+ nil)
+
+(deftest pathname-type.8
+ (do-special-strings (s "" nil) (pathname-type s))
+ nil)
+
+(deftest pathname-type.error.1
+ (signals-error (pathname-type) program-error)
+ t)
+
+(deftest pathname-type.error.2
+ (check-type-error #'pathname-type #'could-be-pathname-designator)
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathname-version.lsp
@@ -0,0 +1,40 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Dec 6 14:45:16 2003
+;;;; Contains: Tests for PATHNAME-VERSION
+
+(in-package :cl-test)
+
+(compile-and-load "pathnames-aux.lsp")
+
+(deftest pathname-version.1
+ (loop for p in *pathnames*
+ for version = (pathname-version p)
+ unless (or (integerp version) (symbolp version))
+ collect (list p version))
+ nil)
+
+;;; section 19.3.2.1
+(deftest pathname-version.2
+ (loop for p in *logical-pathnames*
+ when (eq (pathname-version p) :unspecific)
+ collect p)
+ nil)
+
+(deftest pathname-version.3
+ (do-special-strings (s "" nil) (pathname-version s))
+ nil)
+
+(deftest pathname-version.error.1
+ (signals-error (pathname-version) program-error)
+ t)
+
+(deftest pathname-version.error.2
+ (signals-error (pathname-version *default-pathname-defaults* nil)
+ program-error)
+ t)
+
+(deftest pathname-version.error.3
+ (check-type-error #'pathname-version #'could-be-pathname-designator)
+ nil)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathname.lsp
@@ -0,0 +1,88 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Nov 29 05:06:57 2003
+;;;; Contains: Tests of the function PATHNAME
+
+(in-package :cl-test)
+
+(deftest pathname.1
+ (loop for x in *pathnames*
+ always (eq x (pathname x)))
+ t)
+
+(deftest pathname.2
+ (equalt #p"ansi-aux.lsp" (pathname "ansi-aux.lsp"))
+ t)
+
+(deftest pathname.3
+ (let ((s (open "ansi-aux.lsp" :direction :input)))
+ (prog1 (equalt (truename (pathname s)) (truename #p"ansi-aux.lsp"))
+ (close s)))
+ t)
+
+(deftest pathname.4
+ (let ((s (open "ansi-aux.lsp" :direction :input)))
+ (close s)
+ (equalt (truename (pathname s)) (truename #p"ansi-aux.lsp")))
+ t)
+
+(deftest pathname.5
+ (loop for x in *logical-pathnames*
+ always (eq x (pathname x)))
+ t)
+
+(deftest pathname.6
+ (equalt #p"ansi-aux.lsp"
+ (pathname (make-array 12 :initial-contents "ansi-aux.lsp"
+ :element-type 'base-char)))
+ t)
+
+(deftest pathname.7
+ (equalt #p"ansi-aux.lsp"
+ (pathname (make-array 15 :initial-contents "ansi-aux.lspXXX"
+ :element-type 'base-char
+ :fill-pointer 12)))
+ t)
+
+(deftest pathname.8
+ (equalt #p"ansi-aux.lsp"
+ (pathname (make-array 12 :initial-contents "ansi-aux.lsp"
+ :element-type 'base-char
+ :adjustable t)))
+ t)
+
+(deftest pathname.9
+ (equalt #p"ansi-aux.lsp"
+ (pathname (make-array 15 :initial-contents "ansi-aux.lspXXX"
+ :element-type 'character
+ :fill-pointer 12)))
+ t)
+
+(deftest pathname.10
+ (equalt #p"ansi-aux.lsp"
+ (pathname (make-array 12 :initial-contents "ansi-aux.lsp"
+ :element-type 'character
+ :adjustable t)))
+ t)
+
+(deftest pathname.11
+ (loop for etype in '(standard-char base-char character)
+ collect
+ (equalt #p"ansi-aux.lsp"
+ (pathname
+ (let* ((s (make-array 15 :initial-contents "XXansi-aux.lspX"
+ :element-type etype)))
+ (make-array 12 :element-type etype
+ :displaced-to s
+ :displaced-index-offset 2)))))
+ (t t t))
+
+;;; Error tests
+
+(deftest pathname.error.1
+ (signals-error (pathname) program-error)
+ t)
+
+(deftest pathname.error.2
+ (signals-error (pathname (first *pathnames*) nil) program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathnamep.lsp
@@ -0,0 +1,31 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Dec 6 10:26:45 2003
+;;;; Contains: Tests of PATHNAMEP
+
+(in-package :cl-test)
+
+(deftest pathnamep.1
+ (check-type-predicate #'pathnamep 'pathname)
+ 0)
+
+(deftest pathnamep.2
+ (check-predicate #'(lambda (x) (eql (length (multiple-value-list (pathnamep x))) 1)))
+ nil)
+
+(deftest pathnamep.3
+ (check-predicate (typef '(not logical-pathname)) #'pathnamep)
+ nil)
+
+(deftest pathnamep.error.1
+ (signals-error (pathnamep) program-error)
+ t)
+
+(deftest pathnamep.error.2
+ (signals-error (pathnamep nil nil) program-error)
+ t)
+
+(deftest pathnamep.error.3
+ (signals-error (pathnamep *default-pathname-defaults* nil)
+ program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathnames-aux.lsp
@@ -0,0 +1,25 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Dec 6 15:05:05 2003
+;;;; Contains: Functions associated with pathname tests
+
+(in-package :cl-test)
+
+(defun could-be-pathname-designator (x)
+ (or (stringp x)
+ (pathnamep x)
+ (typep x 'file-stream)
+ (and (typep x 'synonym-stream)
+ (could-be-pathname-designator
+ (symbol-value
+ (synonym-stream-symbol x))))))
+
+(defun explode-pathname (pn)
+ (list
+ :host (pathname-host pn)
+ :device (pathname-device pn)
+ :directory (pathname-directory pn)
+ :name (pathname-name pn)
+ :type (pathname-type pn)
+ :version (pathname-version pn)))
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/pathnames.lsp
@@ -0,0 +1,19 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Nov 29 04:21:53 2003
+;;;; Contains: Various tests on pathnames
+
+(in-package :cl-test)
+
+(deftest pathnames-print-and-read-properly
+ (with-standard-io-syntax
+ (loop
+ for p1 in *pathnames*
+ for s = (handler-case (write-to-string p1 :readably t)
+ (print-not-readable () :unreadable-error))
+ unless (eql s :unreadable-error)
+ append
+ (let ((p2 (read-from-string s)))
+ (unless (equal p1 p2)
+ (list (list p1 s p2))))))
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/peek-char.lsp
@@ -0,0 +1,329 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Jan 17 21:02:13 2004
+;;;; Contains: Tests of PEEK-CHAR
+
+(in-package :cl-test)
+
+(deftest peek-char.1
+ (with-input-from-string
+ (*standard-input* "abc")
+ (values
+ (peek-char)
+ (read-char)
+ (read-char)
+ (peek-char)
+ (read-char)))
+ #\a #\a #\b #\c #\c)
+
+(deftest peek-char.2
+ (with-input-from-string
+ (*standard-input* " ab")
+ (values
+ (peek-char)
+ (read-char)
+ (peek-char t)
+ (read-char)
+ (peek-char t)
+ (read-char)))
+ #\Space #\Space #\a #\a #\b #\b)
+
+(deftest peek-char.3
+ (with-input-from-string
+ (*standard-input* (concatenate 'string
+ (string #\Newline)
+ (string #\Newline)
+ " "
+ (string #\Newline)
+ "ab"))
+ (values
+ (peek-char)
+ (read-char)
+ (peek-char t)
+ (read-char)
+ (peek-char t)
+ (read-char)))
+ #\Newline #\Newline #\a #\a #\b #\b)
+
+(when (name-char "Linefeed")
+ (deftest peek-char.4
+ (with-input-from-string
+ (*standard-input* (concatenate 'string
+ (string (name-char "Linefeed"))
+ (string (name-char "Linefeed"))
+ "abc"))
+ (values
+ (peek-char)
+ (read-char)
+ (peek-char t)
+ (read-char)))
+ #.(name-char "Linefeed")
+ #.(name-char "Linefeed")
+ #\a #\a))
+
+(when (name-char "Page")
+ (deftest peek-char.5
+ (with-input-from-string
+ (*standard-input* (concatenate 'string
+ (string (name-char "Page"))
+ (string (name-char "Page"))
+ "abc"))
+ (values
+ (peek-char)
+ (read-char)
+ (peek-char t)
+ (read-char)))
+ #.(name-char "Page")
+ #.(name-char "Page")
+ #\a #\a))
+
+(when (name-char "Tab")
+ (deftest peek-char.6
+ (with-input-from-string
+ (*standard-input* (concatenate 'string
+ (string (name-char "Tab"))
+ (string (name-char "Tab"))
+ "abc"))
+ (values
+ (peek-char)
+ (read-char)
+ (peek-char t)
+ (read-char)))
+ #.(name-char "Tab")
+ #.(name-char "Tab")
+ #\a #\a))
+
+(when (name-char "Return")
+ (deftest peek-char.7
+ (with-input-from-string
+ (*standard-input* (concatenate 'string
+ (string (name-char "Return"))
+ (string (name-char "Return"))
+ "abc"))
+ (values
+ (peek-char)
+ (read-char)
+ (peek-char t)
+ (read-char)))
+ #.(name-char "Return")
+ #.(name-char "Return")
+ #\a #\a))
+
+(deftest peek-char.8
+ (with-input-from-string
+ (s "a bcd")
+ (values
+ (peek-char nil s)
+ (read-char s)
+ (peek-char t s)
+ (read-char s)
+ (peek-char t s)
+ (read-char s)))
+ #\a #\a #\b #\b #\c #\c)
+
+(deftest peek-char.9
+ (with-input-from-string
+ (*standard-input* " a bCcde")
+ (values
+ (peek-char #\c)
+ (read-char)
+ (read-char)))
+ #\c #\c #\d)
+
+(deftest peek-char.10
+ (with-input-from-string
+ (*standard-input* " ; foo")
+ (values
+ (peek-char t)
+ (read-char)))
+ #\; #\;)
+
+(deftest peek-char.11
+ (with-input-from-string
+ (s "")
+ (peek-char nil s nil))
+ nil)
+
+(deftest peek-char.12
+ (with-input-from-string
+ (s "")
+ (peek-char nil s nil 'foo))
+ foo)
+
+(deftest peek-char.13
+ (with-input-from-string
+ (s " ")
+ (peek-char t s nil))
+ nil)
+
+(deftest peek-char.14
+ (with-input-from-string
+ (s " ")
+ (peek-char t s nil 'foo))
+ foo)
+
+(deftest peek-char.15
+ (with-input-from-string
+ (s "ab c d")
+ (peek-char #\z s nil))
+ nil)
+
+(deftest peek-char.16
+ (with-input-from-string
+ (s "ab c d")
+ (peek-char #\z s nil 'foo))
+ foo)
+
+;;; Interaction with echo streams
+
+(deftest peek-char.17
+ (block done
+ (with-input-from-string
+ (is "ab")
+ (with-output-to-string
+ (os)
+ (let ((es (make-echo-stream is os)))
+ (let ((pos1 (file-position os)))
+ (unless (zerop pos1) (return-from done :good))
+ (peek-char nil es nil)
+ (let ((pos2 (file-position os)))
+ (return-from done
+ (if (eql pos1 pos2)
+ :good
+ (list pos1 pos2)))))))))
+ :good)
+
+(deftest peek-char.18
+ (block done
+ (with-input-from-string
+ (is " ab")
+ (with-output-to-string
+ (os)
+ (let ((es (make-echo-stream is os)))
+ (let ((pos1 (file-position os)))
+ (unless (zerop pos1) (return-from done :good))
+ (peek-char t es nil)
+ (let ((pos2 (file-position os)))
+ (return-from done
+ (if (eql pos1 pos2)
+ pos1
+ :good))))))))
+ :good)
+
+(deftest peek-char.19
+ (block done
+ (with-input-from-string
+ (is "abcde")
+ (with-output-to-string
+ (os)
+ (let ((es (make-echo-stream is os)))
+ (let ((pos1 (file-position os)))
+ (unless (zerop pos1) (return-from done :good))
+ (peek-char #\c es nil)
+ (let ((pos2 (file-position os)))
+ (return-from done
+ (if (eql pos1 pos2)
+ pos1
+ :good))))))))
+ :good)
+
+;;; Interactions with the readtable
+
+(deftest peek-char.20
+ (let ((*readtable* (copy-readtable)))
+ (set-syntax-from-char #\Space #\a)
+ (with-input-from-string
+ (*standard-input* " x")
+ (values
+ (peek-char)
+ (read-char)
+ (peek-char t)
+ (read-char))))
+ #\Space #\Space
+ #\Space #\Space ; *not* #\x #\x
+ )
+
+(deftest peek-char.21
+ (let ((*readtable* (copy-readtable)))
+ (set-syntax-from-char #\x #\Space)
+ (with-input-from-string
+ (*standard-input* "xxa")
+ (values
+ (peek-char)
+ (read-char)
+ (peek-char t)
+ (read-char))))
+ #\x #\x
+ #\a #\a ; *not* #\x #\x
+ )
+
+;;; Stream designators are accepted for the stream argument
+
+(deftest peek-char.22
+ (with-input-from-string
+ (is "!?*")
+ (let ((*terminal-io* (make-two-way-stream is (make-string-output-stream))))
+ (peek-char nil t)))
+ #\!)
+
+(deftest peek-char.23
+ (with-input-from-string
+ (*standard-input* "345")
+ (peek-char nil nil))
+ #\3)
+
+;;; Error tests
+
+(deftest peek-char.error.1
+ (signals-error
+ (with-input-from-string
+ (s "abc")
+ (peek-char s nil nil nil nil 'nonsense))
+ program-error)
+ t)
+
+
+(deftest peek-char.error.2
+ (signals-error-always
+ (with-input-from-string
+ (*standard-input* "")
+ (peek-char))
+ end-of-file)
+ t t)
+
+(deftest peek-char.error.3
+ (signals-error-always
+ (with-input-from-string
+ (s "")
+ (peek-char nil s))
+ end-of-file)
+ t t)
+
+(deftest peek-char.error.4
+ (signals-error-always
+ (with-input-from-string
+ (s " ")
+ (peek-char t s))
+ end-of-file)
+ t t)
+
+(deftest peek-char.error.5
+ (signals-error-always
+ (with-input-from-string
+ (s "abcd")
+ (peek-char #\z s))
+ end-of-file)
+ t t)
+
+;;; There was a consensus on comp.lang.lisp that the requirement
+;;; that an end-of-file error be thrown in the following case
+;;; is a spec bug
+#|
+(deftest peek-char.error.6
+ (signals-error
+ (with-input-from-string
+ (s "")
+ (peek-char nil s nil nil t))
+ end-of-file)
+ t)
+|#
--- /dev/null
+++ gcl-2.6.12/ansi-tests/probe-file.lsp
@@ -0,0 +1,58 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Mon Jan 5 20:46:29 2004
+;;;; Contains: Tests of PROBE-FILE
+
+(in-package :cl-test)
+
+(deftest probe-file.1
+ (probe-file #p"nonexistent")
+ nil)
+
+(deftest probe-file.2
+ (let ((s (open #p"probe-file.lsp" :direction :input)))
+ (prog1
+ (equalpt (truename #p"probe-file.lsp")
+ (probe-file s))
+ (close s)))
+ t)
+
+(deftest probe-file.3
+ (let ((s (open #p"probe-file.lsp" :direction :input)))
+ (close s)
+ (equalpt (truename #p"probe-file.lsp")
+ (probe-file s)))
+ t)
+
+(deftest probe-file.4
+ (equalpt (truename #p"probe-file.lsp")
+ (probe-file "CLTEST:PROBE-FILE.LSP"))
+ t)
+
+;;; Specialized string tests
+
+(deftest probe-file.5
+ (do-special-strings
+ (str "probe-file.lsp" nil)
+ (let ((s (open str :direction :input)))
+ (assert (equalpt (truename #p"probe-file.lsp") (probe-file s)))
+ (close s)))
+ nil)
+
+;;; Error tests
+
+(deftest probe-file.error.1
+ (signals-error (probe-file) program-error)
+ t)
+
+(deftest probe-file.error.2
+ (signals-error (probe-file #p"probe-file.lsp" nil) program-error)
+ t)
+
+(deftest probe-file.error.3
+ (signals-error-always (probe-file (make-pathname :name :wild)) file-error)
+ t t)
+
+(deftest probe-file.error.4
+ (signals-error-always (probe-file "CLTEST:*.FOO") file-error)
+ t t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/read-byte.lsp
@@ -0,0 +1,194 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Jan 17 17:30:49 2004
+;;;; Contains: Tests of READ-BYTE, WRITE-BYTE
+
+(in-package :cl-test)
+
+(deftest read-byte.1
+ (let ((s (open "foo.txt"
+ :direction :output
+ :if-exists :supersede
+ :element-type '(unsigned-byte 8))))
+ (values
+ (write-byte 17 s)
+ (close s)
+ (progn
+ (setq s (open "foo.txt"
+ :direction :input
+ :element-type '(unsigned-byte 8)))
+ (read-byte s))
+ (close s)))
+ 17 t 17 t)
+
+(deftest read-byte.2
+ (let ((s (open "foo.txt"
+ :direction :output
+ :if-exists :supersede
+ :element-type '(unsigned-byte 8))))
+ (values
+ (close s)
+ (progn
+ (setq s (open "foo.txt"
+ :direction :input
+ :element-type '(unsigned-byte 8)))
+ (read-byte s nil 'foo))
+ (read-byte s nil)
+ (close s)))
+ t foo nil t)
+
+(deftest read-byte.3
+ (loop with b1 = 0
+ and b2 = 0
+ for i from 1 to 32
+ do (let ((s (open "foo.txt"
+ :direction :output
+ :if-exists :supersede
+ :element-type `(unsigned-byte ,i))))
+ (write-byte (1- (ash 1 i)) s)
+ (write-byte 1 s)
+ (close s))
+ unless (let ((s (open "foo.txt"
+ :direction :input
+ :element-type `(unsigned-byte ,i))))
+ (prog1
+ (and (eql (setq b1 (read-byte s)) (1- (ash 1 i)))
+ (eql (setq b2 (read-byte s)) 1))
+ (close s)))
+ collect (list i b1 b2))
+ nil)
+
+(deftest read-byte.4
+ (loop with b1 = 0
+ and b2 = 0
+ for i from 33 to 200 by 7
+ do (let ((s (open "foo.txt"
+ :direction :output
+ :if-exists :supersede
+ :element-type `(unsigned-byte ,i))))
+ (write-byte (1- (ash 1 i)) s)
+ (write-byte 1 s)
+ (close s))
+ unless (let ((s (open "foo.txt"
+ :direction :input
+ :element-type `(unsigned-byte ,i))))
+ (prog1
+ (and (eql (setq b1 (read-byte s)) (1- (ash 1 i)))
+ (eql (setq b2 (read-byte s)) 1))
+ (close s)))
+ collect (list i b1 b2))
+ nil)
+
+;;; Error tests
+
+(deftest read-byte.error.1
+ (signals-error (read-byte) program-error)
+ t)
+
+(deftest read-byte.error.2
+ (progn
+ (let ((s (open "foo.txt"
+ :direction :output
+ :if-exists :supersede
+ :element-type `(unsigned-byte 8))))
+ (close s))
+ (signals-error
+ (let ((s (open "foo.txt"
+ :direction :input
+ :element-type '(unsigned-byte 8))))
+ (read-byte s))
+ end-of-file))
+ t)
+
+(deftest read-byte.error.3
+ (progn
+ (let ((s (open "foo.txt"
+ :direction :output
+ :if-exists :supersede)))
+ (close s))
+ (signals-error
+ (let ((s (open "foo.txt" :direction :input)))
+ (unwind-protect
+ (read-byte s)
+ (close s)))
+ error))
+ t)
+
+(deftest read-byte.error.4
+ (signals-error-always
+ (progn
+ (let ((s (open "foo.txt"
+ :direction :output
+ :if-exists :supersede
+ :element-type '(unsigned-byte 8))))
+ (close s))
+ (let ((s (open "foo.txt"
+ :direction :input
+ :element-type '(unsigned-byte 8))))
+ (unwind-protect
+ (read-byte s t)
+ (close s))))
+ end-of-file)
+ t t)
+
+(deftest read-byte.error.5
+ (check-type-error #'read-byte #'streamp)
+ nil)
+
+(deftest read-byte.error.6
+ (progn
+ (let ((s (open "foo.txt"
+ :direction :output
+ :if-exists :supersede
+ :element-type '(unsigned-byte 8))))
+ (close s))
+ (signals-error
+ (let ((s (open "foo.txt"
+ :direction :input
+ :element-type '(unsigned-byte 8))))
+ (unwind-protect
+ (read-byte s t t nil)
+ (close s)))
+ program-error))
+ t)
+
+
+(deftest write-byte.error.1
+ (signals-error (write-byte) program-error)
+ t)
+
+(deftest write-byte.error.2
+ (signals-error (write-byte 0) program-error)
+ t)
+
+(deftest write-byte.error.3
+ (signals-error
+ (let ((s (open "foo.txt"
+ :direction :output
+ :if-exists :supersede
+ :element-type '(unsigned-byte 8))))
+ (unwind-protect
+ (write 1 s nil)
+ (close s)))
+ program-error)
+ t)
+
+(deftest write-byte.error.4
+ (check-type-error #'(lambda (x) (write-byte 0 x)) #'streamp)
+ nil)
+
+(deftest write-byte.error.5
+ (signals-error
+ (let ((s (open "foo.txt"
+ :direction :output
+ :if-exists :supersede)))
+ (unwind-protect
+ (write 1 s)
+ (close s)))
+ error)
+ t)
+
+
+
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/read-char-no-hang.lsp
@@ -0,0 +1,123 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Jan 18 20:32:38 2004
+;;;; Contains: Tests of READ-CHAR-NO-HANG
+
+(in-package :cl-test)
+
+(deftest read-char-no-hang.1
+ (with-input-from-string
+ (*standard-input* "a")
+ (read-char-no-hang))
+ #\a)
+
+(deftest read-char-no-hang.2
+ (with-input-from-string
+ (*standard-input* "abc")
+ (values
+ (read-char-no-hang)
+ (read-char-no-hang)
+ (read-char-no-hang)))
+ #\a #\b #\c)
+
+(when (code-char 0)
+ (deftest read-char-no-hang.3
+ (with-input-from-string
+ (*standard-input* (concatenate 'string
+ "a"
+ (string (code-char 0))
+ "b"))
+ (values
+ (read-char-no-hang)
+ (read-char-no-hang)
+ (read-char-no-hang)))
+ #\a #.(code-char 0) #\b))
+
+(deftest read-char-no-hang.4
+ (with-input-from-string
+ (s "abc")
+ (values
+ (read-char-no-hang s)
+ (read-char-no-hang s)
+ (read-char-no-hang s)))
+ #\a #\b #\c)
+
+(deftest read-char-no-hang.5
+ (with-input-from-string
+ (s "")
+ (read-char-no-hang s nil))
+ nil)
+
+(deftest read-char-no-hang.6
+ (with-input-from-string
+ (s "")
+ (read-char-no-hang s nil 'foo))
+ foo)
+
+(deftest read-char-no-hang.7
+ (with-input-from-string
+ (s "abc")
+ (values
+ (read-char-no-hang s nil nil)
+ (read-char-no-hang s nil nil)
+ (read-char-no-hang s nil nil)))
+ #\a #\b #\c)
+
+(deftest read-char-no-hang.8
+ (with-input-from-string
+ (s "abc")
+ (values
+ (read-char-no-hang s nil t)
+ (read-char-no-hang s nil t)
+ (read-char-no-hang s nil t)))
+ #\a #\b #\c)
+
+(deftest read-char-no-hang.9
+ (with-input-from-string
+ (is "!?*")
+ (let ((*terminal-io* (make-two-way-stream is (make-string-output-stream))))
+ (read-char-no-hang t)))
+ #\!)
+
+(deftest read-char-no-hang.10
+ (with-input-from-string
+ (*standard-input* "345")
+ (read-char-no-hang nil))
+ #\3)
+
+;;; Need a test of the non-hanging.
+;;; This is hard to do portably.
+
+;;; Error tests
+
+(deftest read-char-no-hang.error.1
+ (signals-error
+ (with-input-from-string
+ (s "abc")
+ (read-char-no-hang s nil nil nil nil))
+ program-error)
+ t)
+
+(deftest read-char-no-hang.error.2
+ (signals-error-always
+ (with-input-from-string
+ (s "")
+ (read-char-no-hang s))
+ end-of-file)
+ t t)
+
+(deftest read-char-no-hang.error.3
+ (signals-error-always
+ (with-input-from-string
+ (s "")
+ (read-char-no-hang s t))
+ end-of-file)
+ t t)
+
+(deftest read-char-no-hang.error.4
+ (signals-error-always
+ (with-input-from-string
+ (s "")
+ (read-char-no-hang s t t))
+ end-of-file)
+ t t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/read-char.lsp
@@ -0,0 +1,121 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Jan 18 08:53:56 2004
+;;;; Contains: Tests of READ-CHAR
+
+(in-package :cl-test)
+
+(deftest read-char.1
+ (with-input-from-string
+ (*standard-input* "a")
+ (read-char))
+ #\a)
+
+(deftest read-char.2
+ (with-input-from-string
+ (*standard-input* "abc")
+ (values
+ (read-char)
+ (read-char)
+ (read-char)))
+ #\a #\b #\c)
+
+(when (code-char 0)
+ (deftest read-char.3
+ (with-input-from-string
+ (*standard-input* (concatenate 'string
+ "a"
+ (string (code-char 0))
+ "b"))
+ (values
+ (read-char)
+ (read-char)
+ (read-char)))
+ #\a #.(code-char 0) #\b))
+
+(deftest read-char.4
+ (with-input-from-string
+ (s "abc")
+ (values
+ (read-char s)
+ (read-char s)
+ (read-char s)))
+ #\a #\b #\c)
+
+(deftest read-char.5
+ (with-input-from-string
+ (s "")
+ (read-char s nil))
+ nil)
+
+(deftest read-char.6
+ (with-input-from-string
+ (s "")
+ (read-char s nil 'foo))
+ foo)
+
+(deftest read-char.7
+ (with-input-from-string
+ (s "abc")
+ (values
+ (read-char s nil nil)
+ (read-char s nil nil)
+ (read-char s nil nil)))
+ #\a #\b #\c)
+
+(deftest read-char.8
+ (with-input-from-string
+ (s "abc")
+ (values
+ (read-char s nil t)
+ (read-char s nil t)
+ (read-char s nil t)))
+ #\a #\b #\c)
+
+(deftest read-char.9
+ (with-input-from-string
+ (is "!?*")
+ (let ((*terminal-io* (make-two-way-stream is (make-string-output-stream))))
+ (read-char t)))
+ #\!)
+
+(deftest read-char.10
+ (with-input-from-string
+ (*standard-input* "345")
+ (read-char nil))
+ #\3)
+
+
+;;; Error tests
+
+(deftest read-char.error.1
+ (signals-error
+ (with-input-from-string
+ (s "abc")
+ (read-char s nil nil nil nil))
+ program-error)
+ t)
+
+(deftest read-char.error.2
+ (signals-error-always
+ (with-input-from-string
+ (s "")
+ (read-char s))
+ end-of-file)
+ t t)
+
+(deftest read-char.error.3
+ (signals-error-always
+ (with-input-from-string
+ (s "")
+ (read-char s t))
+ end-of-file)
+ t t)
+
+(deftest read-char.error.4
+ (signals-error-always
+ (with-input-from-string
+ (s "")
+ (read-char s t t))
+ end-of-file)
+ t t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/read-line.lsp
@@ -0,0 +1,104 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Jan 18 20:53:59 2004
+;;;; Contains: Tests of READ-LINE
+
+(in-package :cl-test)
+
+(deftest read-line.1
+ (with-input-from-string
+ (*standard-input* " abcd ")
+ (let ((vals (multiple-value-list (read-line))))
+ (assert (= (length vals) 2))
+ (values (first vals) (notnot (second vals)))))
+ " abcd " t)
+
+(deftest read-line.2
+ (with-input-from-string
+ (*standard-input* (string #\Newline))
+ (read-line))
+ "" nil)
+
+(deftest read-line.3
+ (with-input-from-string
+ (s (concatenate 'string "abc" (string #\Newline)))
+ (read-line s))
+ "abc" nil)
+
+(deftest read-line.4
+ (with-input-from-string
+ (s "")
+ (let ((vals (multiple-value-list (read-line s nil))))
+ (assert (= (length vals) 2))
+ (values (first vals) (notnot (second vals)))))
+ nil t)
+
+(deftest read-line.5
+ (with-input-from-string
+ (s "")
+ (let ((vals (multiple-value-list (read-line s nil 'foo))))
+ (assert (= (length vals) 2))
+ (values (first vals) (notnot (second vals)))))
+ foo t)
+
+(deftest read-line.6
+ (with-input-from-string
+ (s " abcd ")
+ (let ((vals (multiple-value-list (read-line s t nil t))))
+ (assert (= (length vals) 2))
+ (values (first vals) (notnot (second vals)))))
+ " abcd " t)
+
+(deftest read-line.7
+ (with-input-from-string
+ (is "abc")
+ (let ((*terminal-io* (make-two-way-stream is *standard-output*)))
+ (let ((vals (multiple-value-list (read-line t))))
+ (assert (= (length vals) 2))
+ (assert (second vals))
+ (first vals))))
+ "abc")
+
+(deftest read-line.8
+ (with-input-from-string
+ (*standard-input* "abc")
+ (let ((vals (multiple-value-list (read-line nil))))
+ (assert (= (length vals) 2))
+ (assert (second vals))
+ (first vals)))
+ "abc")
+
+;;; Error tests
+
+(deftest read-line.error.1
+ (signals-error
+ (with-input-from-string
+ (s (concatenate 'string "abc" (string #\Newline)))
+ (read-line s t nil nil nil))
+ program-error)
+ t)
+
+(deftest read-line.error.2
+ (signals-error-always
+ (with-input-from-string
+ (s "")
+ (read-line s))
+ end-of-file)
+ t t)
+
+(deftest read-line.error.3
+ (signals-error-always
+ (with-input-from-string
+ (*standard-input* "")
+ (read-line))
+ end-of-file)
+ t t)
+
+(deftest read-line.error.4
+ (signals-error-always
+ (with-input-from-string
+ (s "")
+ (read-line s t))
+ end-of-file)
+ t t)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/read-sequence.lsp
@@ -0,0 +1,300 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Mon Jan 19 06:55:04 2004
+;;;; Contains: Tests of READ-SEQUENCE
+
+(in-package :cl-test)
+
+;;; Read into a string
+
+(defmacro def-read-sequence-test (name init args input &rest expected)
+ `(deftest ,name
+ (let ((s ,init))
+ (with-input-from-string
+ (is ,input)
+ (values
+ (read-sequence s is ,@args)
+ s)))
+ ,@expected))
+
+(def-read-sequence-test read-sequence.string.1 (copy-seq " ")
+ () "abcdefghijk" 5 "abcde")
+
+(def-read-sequence-test read-sequence.string.2 (copy-seq " ")
+ () "abc" 3 "abc ")
+
+(def-read-sequence-test read-sequence.string.3 (copy-seq " ")
+ (:start 1) "abcdefghijk" 5 " abcd")
+
+(def-read-sequence-test read-sequence.string.4 (copy-seq " ")
+ (:end 3) "abcdefghijk" 3 "abc ")
+
+(def-read-sequence-test read-sequence.string.5 (copy-seq " ")
+ (:start 1 :end 4) "abcdefghijk" 4 " abc ")
+
+(def-read-sequence-test read-sequence.string.6 (copy-seq " ")
+ (:start 0 :end 0) "abcdefghijk" 0 " ")
+
+(def-read-sequence-test read-sequence.string.7 (copy-seq " ")
+ (:end nil) "abcdefghijk" 5 "abcde")
+
+(def-read-sequence-test read-sequence.string.8 (copy-seq " ")
+ (:allow-other-keys nil) "abcdefghijk" 5 "abcde")
+
+(def-read-sequence-test read-sequence.string.9 (copy-seq " ")
+ (:allow-other-keys t :foo 'bar) "abcdefghijk" 5 "abcde")
+
+(def-read-sequence-test read-sequence.string.10 (copy-seq " ")
+ (:foo 'bar :allow-other-keys 'x) "abcdefghijk" 5 "abcde")
+
+(def-read-sequence-test read-sequence.string.11 (copy-seq " ")
+ (:foo 'bar :allow-other-keys 'x :allow-other-keys nil)
+ "abcdefghijk" 5 "abcde")
+
+(def-read-sequence-test read-sequence.string.12 (copy-seq " ")
+ (:end 5 :end 3 :start 0 :start 1) "abcdefghijk" 5 "abcde")
+
+;;; Read into a base string
+
+(def-read-sequence-test read-sequence.base-string.1
+ (make-array 5 :element-type 'base-char)
+ () "abcdefghijk" 5 "abcde")
+
+(def-read-sequence-test read-sequence.base-string.2
+ (make-array 5 :element-type 'base-char :initial-element #\Space)
+ () "abc" 3 "abc ")
+
+(def-read-sequence-test read-sequence.base-string.3
+ (make-array 5 :element-type 'base-char :initial-element #\Space)
+ (:start 1) "abcdefghijk" 5 " abcd")
+
+(def-read-sequence-test read-sequence.base-string.4
+ (make-array 5 :element-type 'base-char :initial-element #\Space)
+ (:end 3) "abcdefghijk" 3 "abc ")
+
+(def-read-sequence-test read-sequence.base-string.5
+ (make-array 5 :element-type 'base-char :initial-element #\Space)
+ (:start 1 :end 4) "abcdefghijk" 4 " abc ")
+
+(def-read-sequence-test read-sequence.base-string.6
+ (make-array 5 :element-type 'base-char :initial-element #\Space)
+ (:start 0 :end 0) "abcdefghijk" 0 " ")
+
+(def-read-sequence-test read-sequence.base-string.7
+ (make-array 5 :element-type 'base-char :initial-element #\Space)
+ (:end nil) "abcdefghijk" 5 "abcde")
+
+;;; Read into a list
+
+(def-read-sequence-test read-sequence.list.1 (make-list 5)
+ () "abcdefghijk" 5 (#\a #\b #\c #\d #\e))
+
+(def-read-sequence-test read-sequence.list.2 (make-list 5)
+ () "abc" 3 (#\a #\b #\c nil nil))
+
+(def-read-sequence-test read-sequence.list.3 (make-list 5)
+ (:start 1) "abcdefghijk" 5 (nil #\a #\b #\c #\d))
+
+(def-read-sequence-test read-sequence.list.4 (make-list 5)
+ (:end 3) "abcdefghijk" 3 (#\a #\b #\c nil nil))
+
+(def-read-sequence-test read-sequence.list.5 (make-list 5)
+ (:end 4 :start 1) "abcdefghijk" 4 (nil #\a #\b #\c nil))
+
+(def-read-sequence-test read-sequence.list.6 (make-list 5)
+ (:start 0 :end 0) "abcdefghijk" 0 (nil nil nil nil nil))
+
+(def-read-sequence-test read-sequence.list.7 (make-list 5)
+ (:end nil) "abcdefghijk" 5 (#\a #\b #\c #\d #\e))
+
+;;; Read into a vector
+
+(def-read-sequence-test read-sequence.vector.1
+ (vector nil nil nil nil nil)
+ () "abcdefghijk" 5 #(#\a #\b #\c #\d #\e))
+
+(def-read-sequence-test read-sequence.vector.2
+ (vector nil nil nil nil nil)
+ () "abc" 3 #(#\a #\b #\c nil nil))
+
+(def-read-sequence-test read-sequence.vector.3
+ (vector nil nil nil nil nil)
+ (:start 2) "abcdefghijk" 5 #(nil nil #\a #\b #\c))
+
+(def-read-sequence-test read-sequence.vector.4
+ (vector nil nil nil nil nil)
+ (:start 1 :end 4) "abcdefghijk" 4 #(nil #\a #\b #\c nil))
+
+(def-read-sequence-test read-sequence.vector.5
+ (vector nil nil nil nil nil)
+ (:end 2) "abcdefghijk" 2 #(#\a #\b nil nil nil))
+
+(def-read-sequence-test read-sequence.vector.6
+ (vector nil nil nil nil nil)
+ (:end 0 :start 0) "abcdefghijk" 0 #(nil nil nil nil nil))
+
+(def-read-sequence-test read-sequence.vector.7
+ (vector nil nil nil nil nil)
+ (:end nil) "abcdefghijk" 5 #(#\a #\b #\c #\d #\e))
+
+;;; Read into a vector with a fill pointer
+
+(def-read-sequence-test read-sequence.fill-vector.1
+ (make-array 10 :initial-element nil :fill-pointer 5)
+ () "abcdefghijk" 5 #(#\a #\b #\c #\d #\e))
+
+(def-read-sequence-test read-sequence.fill-vector.2
+ (make-array 10 :initial-element nil :fill-pointer 5)
+ () "ab" 2 #(#\a #\b nil nil nil))
+
+(def-read-sequence-test read-sequence.fill-vector.3
+ (make-array 10 :initial-element nil :fill-pointer 5)
+ () "" 0 #(nil nil nil nil nil))
+
+(def-read-sequence-test read-sequence.fill-vector.4
+ (make-array 10 :initial-element nil :fill-pointer 5)
+ (:start 2) "abcdefghijk" 5 #(nil nil #\a #\b #\c))
+
+(def-read-sequence-test read-sequence.fill-vector.5
+ (make-array 10 :initial-element nil :fill-pointer 5)
+ (:start 1 :end 4) "abcdefghijk" 4 #(nil #\a #\b #\c nil))
+
+(def-read-sequence-test read-sequence.fill-vector.6
+ (make-array 10 :initial-element nil :fill-pointer 5)
+ (:end 2) "abcdefghijk" 2 #(#\a #\b nil nil nil))
+
+(def-read-sequence-test read-sequence.fill-vector.7
+ (make-array 10 :initial-element nil :fill-pointer 5)
+ (:end 0 :start 0) "abcdefghijk" 0 #(nil nil nil nil nil))
+
+(def-read-sequence-test read-sequence.fill-vector.8
+ (make-array 10 :initial-element nil :fill-pointer 5)
+ (:end nil) "abcdefghijk" 5 #(#\a #\b #\c #\d #\e))
+
+;;; Nil vectors
+
+(deftest read-sequence.nil-vector.1
+ :notes (:nil-vectors-are-strings)
+ (let ((s (make-array 0 :element-type nil)))
+ (with-input-from-string
+ (is "abcde")
+ (values
+ (read-sequence s is)
+ s)))
+ 0 "")
+
+;;; Read into a bit vector
+
+(defmacro def-read-sequence-bv-test (name init args &rest expected)
+ `(deftest ,name
+ ;; Create output file
+ (progn
+ (let (os)
+ (unwind-protect
+ (progn
+ (setq os (open "temp.dat" :direction :output
+ :element-type '(unsigned-byte 8)
+ :if-exists :supersede))
+ (loop for i in '(0 1 1 0 0 1 1 0 1 0 1 1 1 0)
+ do (write-byte i os)))
+ (when os (close os))))
+ (let (is (bv (copy-seq ,init)))
+ (unwind-protect
+ (progn
+ (setq is (open "temp.dat" :direction :input
+ :element-type '(unsigned-byte 8)))
+ (values
+ (read-sequence bv is ,@args)
+ bv))
+ (when is (close is)))))
+ ,@expected))
+
+(def-read-sequence-bv-test read-sequence.bv.1 #*00000000000000 ()
+ 14 #*01100110101110)
+
+(def-read-sequence-bv-test read-sequence.bv.2 #*00000000000000 (:start 0)
+ 14 #*01100110101110)
+
+(def-read-sequence-bv-test read-sequence.bv.3 #*00000000000000 (:end 14)
+ 14 #*01100110101110)
+
+(def-read-sequence-bv-test read-sequence.bv.4 #*00000000000000 (:end nil)
+ 14 #*01100110101110)
+
+(def-read-sequence-bv-test read-sequence.bv.5 #*00000000000000 (:start 2)
+ 14 #*00011001101011)
+
+(def-read-sequence-bv-test read-sequence.bv.6 #*00000000000000
+ (:start 2 :end 13)
+ 13 #*00011001101010)
+
+(def-read-sequence-bv-test read-sequence.bv.7 #*00000000000000 (:end 6)
+ 6 #*01100100000000)
+
+;;; Error cases
+
+(deftest read-sequence.error.1
+ (signals-error (read-sequence) program-error)
+ t)
+
+(deftest read-sequence.error.2
+ (signals-error (read-sequence (make-string 10)) program-error)
+ t)
+
+(deftest read-sequence.error.3
+ (signals-error
+ (read-sequence (make-string 5) (make-string-input-stream "abc") :start)
+ program-error)
+ t)
+
+(deftest read-sequence.error.4
+ (signals-error
+ (read-sequence (make-string 5) (make-string-input-stream "abc") :foo 1)
+ program-error)
+ t)
+
+(deftest read-sequence.error.5
+ (signals-error
+ (read-sequence (make-string 5) (make-string-input-stream "abc")
+ :allow-other-keys nil :bar 2)
+ program-error)
+ t)
+
+(deftest read-sequence.error.6
+ (check-type-error #'(lambda (x) (read-sequence x (make-string-input-stream "abc")))
+ #'sequencep)
+ nil)
+
+(deftest read-sequence.error.7
+ (signals-error
+ (read-sequence (cons 'a 'b) (make-string-input-stream "abc"))
+ type-error)
+ t)
+
+;;; This test appears to cause Allegro CL to crash
+(deftest read-sequence.error.8
+ (signals-type-error x -1
+ (read-sequence (make-string 3)
+ (make-string-input-stream "abc")
+ :start x))
+ t)
+
+(deftest read-sequence.error.9
+ (check-type-error #'(lambda (s)
+ (read-sequence (make-string 3) (make-string-input-stream "abc")
+ :start s))
+ (typef 'unsigned-byte))
+ nil)
+
+(deftest read-sequence.error.10
+ (signals-type-error x -1
+ (read-sequence (make-string 3) (make-string-input-stream "abc")
+ :end x))
+ t)
+
+(deftest read-sequence.error.11
+ (check-type-error #'(lambda (e)
+ (read-sequence (make-string 3) (make-string-input-stream "abc")
+ :end e))
+ (typef '(or unsigned-byte null)))
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/rename-file.lsp
@@ -0,0 +1,199 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Jan 8 06:22:53 2004
+;;;; Contains: Tests for RENAME-FILE
+
+(in-package :cl-test)
+
+(deftest rename-file.1
+ (let ((pn1 #p"file-to-be-renamed.txt")
+ (pn2 #p"file-that-was-renamed.txt"))
+ (delete-all-versions pn1)
+ (delete-all-versions pn2)
+ (with-open-file (s pn1 :direction :output) (format s "Whatever~%"))
+ (let ((results (multiple-value-list (rename-file pn1 pn2))))
+ (destructuring-bind (defaulted-new-name old-truename new-truename)
+ results
+ (values
+ (=t (length results) 3)
+ (probe-file pn1)
+ (notnot (probe-file pn2))
+ (list (notnot (pathnamep defaulted-new-name))
+ (notnot (pathnamep old-truename))
+ (notnot (pathnamep new-truename))
+ (typep old-truename 'logical-pathname)
+ (typep new-truename 'logical-pathname))
+ (notnot (probe-file defaulted-new-name))
+ (probe-file old-truename)
+ (notnot (probe-file new-truename))))))
+ t nil t (t t t nil nil) t nil t)
+
+(deftest rename-file.2
+ (let ((pn1 "file-to-be-renamed.txt")
+ (pn2 "file-that-was-renamed.txt"))
+ (delete-all-versions pn1)
+ (delete-all-versions pn2)
+ (with-open-file (s pn1 :direction :output) (format s "Whatever~%"))
+ (let ((results (multiple-value-list (rename-file pn1 pn2))))
+ (destructuring-bind (defaulted-new-name old-truename new-truename)
+ results
+ (values
+ (=t (length results) 3)
+ (probe-file pn1)
+ (notnot (probe-file pn2))
+ (list (notnot (pathnamep defaulted-new-name))
+ (notnot (pathnamep old-truename))
+ (notnot (pathnamep new-truename))
+ (typep old-truename 'logical-pathname)
+ (typep new-truename 'logical-pathname))
+ (notnot (probe-file defaulted-new-name))
+ (probe-file old-truename)
+ (notnot (probe-file new-truename))))))
+ t nil t (t t t nil nil) t nil t)
+
+ (deftest rename-file.3
+ (let* ((pn1 (make-pathname :name "file-to-be-renamed"
+ :type "txt"
+ :version :newest
+ :defaults *default-pathname-defaults*))
+ (pn2 (make-pathname :name "file-that-was-renamed"))
+ (pn3 (make-pathname :name "file-that-was-renamed"
+ :defaults pn1)))
+ (delete-all-versions pn1)
+ (delete-all-versions pn3)
+ (with-open-file (s pn1 :direction :output) (format s "Whatever~%"))
+ (let ((results (multiple-value-list (rename-file pn1 pn2))))
+ (destructuring-bind (defaulted-new-name old-truename new-truename)
+ results
+ (values
+ (equalpt (pathname-type pn1)
+ (pathname-type defaulted-new-name))
+ (=t (length results) 3)
+ (probe-file pn1)
+ (notnot (probe-file pn3))
+ (list (notnot (pathnamep defaulted-new-name))
+ (notnot (pathnamep old-truename))
+ (notnot (pathnamep new-truename))
+ (typep old-truename 'logical-pathname)
+ (typep new-truename 'logical-pathname))
+ (notnot (probe-file defaulted-new-name))
+ (probe-file old-truename)
+ (notnot (probe-file new-truename))))))
+ t t nil t (t t t nil nil) t nil t)
+
+(deftest rename-file.4
+ (let ((pn1 "file-to-be-renamed.txt")
+ (pn2 "file-that-was-renamed.txt"))
+ (delete-all-versions pn1)
+ (delete-all-versions pn2)
+ (let ((s (open pn1 :direction :output)))
+ (format s "Whatever~%")
+ (close s)
+ (let ((results (multiple-value-list (rename-file s pn2))))
+ (destructuring-bind (defaulted-new-name old-truename new-truename)
+ results
+ (values
+ (=t (length results) 3)
+ (probe-file pn1)
+ (notnot (probe-file pn2))
+ (list (notnot (pathnamep defaulted-new-name))
+ (notnot (pathnamep old-truename))
+ (notnot (pathnamep new-truename))
+ (typep old-truename 'logical-pathname)
+ (typep new-truename 'logical-pathname))
+ (notnot (probe-file defaulted-new-name))
+ (probe-file old-truename)
+ (notnot (probe-file new-truename)))))))
+ t nil t (t t t nil nil) t nil t)
+
+(deftest rename-file.5
+ (let ((pn1 "CLTEST:FILE-TO-BE-RENAMED.TXT")
+ (pn2 "CLTEST:FILE-THAT-WAS-RENAMED.TXT"))
+ (delete-all-versions pn1)
+ (delete-all-versions pn2)
+ (assert (typep (pathname pn1) 'logical-pathname))
+ (assert (typep (pathname pn2) 'logical-pathname))
+ (with-open-file (s pn1 :direction :output) (format s "Whatever~%"))
+ (let ((results (multiple-value-list (rename-file pn1 pn2))))
+ (destructuring-bind (defaulted-new-name old-truename new-truename)
+ results
+ (values
+ (=t (length results) 3)
+ (probe-file pn1)
+ (notnot (probe-file pn2))
+ (list (notnot (pathnamep defaulted-new-name))
+ (notnot (pathnamep old-truename))
+ (notnot (pathnamep new-truename))
+ (typep old-truename 'logical-pathname)
+ (typep new-truename 'logical-pathname))
+ (notnot (probe-file defaulted-new-name))
+ (probe-file old-truename)
+ (notnot (probe-file new-truename))
+ (notnot (typep defaulted-new-name 'logical-pathname))
+ ))))
+ t nil t (t t t nil nil) t nil t t)
+
+;;; Specialized string tests
+
+(deftest rename-file.6
+ (do-special-strings
+ (s "file-to-be-renamed.txt" nil)
+ (let ((pn1 s)
+ (pn2 "file-that-was-renamed.txt"))
+ (delete-all-versions pn1)
+ (delete-all-versions pn2)
+ (with-open-file (s pn1 :direction :output) (format s "Whatever~%"))
+ (let ((results (multiple-value-list (rename-file pn1 pn2))))
+ (destructuring-bind (defaulted-new-name old-truename new-truename)
+ results
+ (assert
+ (equal
+ (list
+ (=t (length results) 3)
+ (probe-file pn1)
+ (notnot (probe-file pn2))
+ (list (notnot (pathnamep defaulted-new-name))
+ (notnot (pathnamep old-truename))
+ (notnot (pathnamep new-truename))
+ (typep old-truename 'logical-pathname)
+ (typep new-truename 'logical-pathname))
+ (notnot (probe-file defaulted-new-name))
+ (probe-file old-truename)
+ (notnot (probe-file new-truename)))
+ '(t nil t (t t t nil nil) t nil t)))))))
+ nil)
+
+(deftest rename-file.7
+ (do-special-strings
+ (s "file-that-was-renamed.txt" nil)
+ (let ((pn1 "file-to-be-renamed.txt")
+ (pn2 s))
+ (delete-all-versions pn1)
+ (delete-all-versions pn2)
+ (with-open-file (s pn1 :direction :output) (format s "Whatever~%"))
+ (let ((results (multiple-value-list (rename-file pn1 pn2))))
+ (destructuring-bind (defaulted-new-name old-truename new-truename)
+ results
+ (assert
+ (equal
+ (list
+ (=t (length results) 3)
+ (probe-file pn1)
+ (notnot (probe-file pn2))
+ (list (notnot (pathnamep defaulted-new-name))
+ (notnot (pathnamep old-truename))
+ (notnot (pathnamep new-truename))
+ (typep old-truename 'logical-pathname)
+ (typep new-truename 'logical-pathname))
+ (notnot (probe-file defaulted-new-name))
+ (probe-file old-truename)
+ (notnot (probe-file new-truename)))
+ '(t nil t (t t t nil nil) t nil t)))))))
+ nil)
+
+;;; Error tests
+
+(deftest rename-file.error.1
+ (signals-error (rename-file) program-error)
+ t)
+
--- gcl-2.6.12.orig/ansi-tests/rt.lsp
+++ gcl-2.6.12/ansi-tests/rt.lsp
@@ -21,81 +21,147 @@
| SOFTWARE. |
|----------------------------------------------------------------------------|#
-;This is the December 19, 1990 version of the regression tester.
+;This was the December 19, 1990 version of the regression tester, but
+;has since been modified.
(in-package :regression-test)
+(declaim (ftype (function (t) t) get-entry expanded-eval do-entries))
+(declaim (type list *entries*))
+(declaim (ftype (function (t &rest t) t) report-error))
+(declaim (ftype (function (t &optional t) t) do-entry))
+
(defvar *test* nil "Current test name")
(defvar *do-tests-when-defined* nil)
-(defvar *entries* '(nil) "Test database")
+(defvar *entries* (list nil) "Test database. Has a leading dummy cell that does not contain an entry.")
+(defvar *entries-tail* *entries* "Tail of the *entries* list")
+(defvar *entries-table* (make-hash-table :test #'equal)
+ "Map the names of entries to the cons cell in *entries* that precedes the one whose car is the entry.")
(defvar *in-test* nil "Used by TEST")
(defvar *debug* nil "For debugging")
(defvar *catch-errors* t "When true, causes errors in a test to be caught.")
(defvar *print-circle-on-failure* nil
"Failure reports are printed with *PRINT-CIRCLE* bound to this value.")
-(defvar *compile-tests* nil "When true, compile the tests before running
-them.")
+(defvar *compile-tests* nil "When true, compile the tests before running them.")
+(defvar *expanded-eval* nil "When true, convert the tests into a form that is less likely to have compiler optimizations.")
(defvar *optimization-settings* '((safety 3)))
+(defvar *failed-tests* nil "After DO-TESTS, becomes the list of names of tests that have failed")
+(defvar *passed-tests* nil "After DO-TESTS, becomes the list of names of tests that have passed")
+
(defvar *expected-failures* nil
"A list of test names that are expected to fail.")
-(defstruct (entry (:conc-name nil)
- (:type list))
- pend name form)
-
-(defmacro vals (entry) `(cdddr ,entry))
-
-(defmacro defn (entry) `(cdr ,entry))
+(defvar *notes* (make-hash-table :test 'equal)
+ "A mapping from names of notes to note objects.")
+
+(defstruct (entry (:conc-name nil))
+ pend name props form vals)
+
+;;; Note objects are used to attach information to tests.
+;;; A typical use is to mark tests that depend on a particular
+;;; part of a set of requirements, or a particular interpretation
+;;; of the requirements.
+
+(defstruct note
+ name
+ contents
+ disabled ;; When true, tests with this note are considered inactive
+ )
+
+;; (defmacro vals (entry) `(cdddr ,entry))
+
+(defmacro defn (entry)
+ (let ((var (gensym)))
+ `(let ((,var ,entry))
+ (list* (name ,var) (form ,var) (vals ,var)))))
+
+(defun entry-notes (entry)
+ (let* ((props (props entry))
+ (notes (getf props :notes)))
+ (if (listp notes)
+ notes
+ (list notes))))
+
+(defun has-disabled-note (entry)
+ (let ((notes (entry-notes entry)))
+ (loop for n in notes
+ for note = (if (note-p n) n
+ (gethash n *notes*))
+ thereis (and note (note-disabled note)))))
+
+(defun has-note (entry note)
+ (unless (note-p note)
+ (let ((new-note (gethash note *notes*)))
+ (setf note new-note)))
+ (and note (not (not (member note (entry-notes entry))))))
(defun pending-tests ()
- (do ((l (cdr *entries*) (cdr l))
- (r nil))
- ((null l) (nreverse r))
- (when (pend (car l))
- (push (name (car l)) r))))
+ (loop for entry in (cdr *entries*)
+ when (and (pend entry) (not (has-disabled-note entry)))
+ collect (name entry)))
(defun rem-all-tests ()
(setq *entries* (list nil))
+ (setq *entries-tail* *entries*)
+ (clrhash *entries-table*)
nil)
(defun rem-test (&optional (name *test*))
- (do ((l *entries* (cdr l)))
- ((null (cdr l)) nil)
- (when (equal (name (cadr l)) name)
- (setf (cdr l) (cddr l))
- (return name))))
+ (let ((pred (gethash name *entries-table*)))
+ (when pred
+ (if (null (cddr pred))
+ (setq *entries-tail* pred)
+ (setf (gethash (name (caddr pred)) *entries-table*) pred))
+ (setf (cdr pred) (cddr pred))
+ (remhash name *entries-table*)
+ name)))
(defun get-test (&optional (name *test*))
(defn (get-entry name)))
(defun get-entry (name)
- (let ((entry (find name (cdr *entries*)
- :key #'name
- :test #'equal)))
+ (let ((entry ;; (find name (the list (cdr *entries*))
+ ;; :key #'name :test #'equal)
+ (cadr (gethash name *entries-table*))
+ ))
(when (null entry)
(report-error t
"~%No test with name ~:@(~S~)."
name))
entry))
-(defmacro deftest (name form &rest values)
- `(add-entry '(t ,name ,form .,values)))
+(defmacro deftest (name &rest body)
+ (let* ((p body)
+ (properties
+ (loop while (keywordp (first p))
+ unless (cadr p)
+ do (error "Poorly formed deftest: ~A~%"
+ (list* 'deftest name body))
+ append (list (pop p) (pop p))))
+ (form (pop p))
+ (vals p))
+ `(add-entry (make-entry :pend t
+ :name ',name
+ :props ',properties
+ :form ',form
+ :vals ',vals))))
(defun add-entry (entry)
- (setq entry (copy-list entry))
- (do ((l *entries* (cdr l))) (nil)
- (when (null (cdr l))
- (setf (cdr l) (list entry))
- (return nil))
- (when (equal (name (cadr l))
- (name entry))
- (setf (cadr l) entry)
+ (setq entry (copy-entry entry))
+ (let* ((pred (gethash (name entry) *entries-table*)))
+ (cond
+ (pred
+ (setf (cadr pred) entry)
(report-error nil
"Redefining test ~:@(~S~)"
- (name entry))
- (return nil)))
+ (name entry)))
+ (t
+ (setf (gethash (name entry) *entries-table*) *entries-tail*)
+ (setf (cdr *entries-tail*) (cons entry nil))
+ (setf *entries-tail* (cdr *entries-tail*))
+ )))
(when *do-tests-when-defined*
(do-entry entry))
(setq *test* (name entry)))
@@ -105,53 +171,59 @@ them.")
(apply #'format t args)
(if error? (throw '*debug* nil)))
(error? (apply #'error args))
- (t (apply #'warn args))))
+ (t (apply #'warn args)))
+ nil)
-(defun do-test (&optional (name *test*))
- (do-entry (get-entry name)))
+(defun do-test (&optional (name *test*) &rest key-args)
+ (flet ((%parse-key-args
+ (&key
+ ((:catch-errors *catch-errors*) *catch-errors*)
+ ((:compile *compile-tests*) *compile-tests*))
+ (do-entry (get-entry name))))
+ (apply #'%parse-key-args key-args)))
+
+(defun my-aref (a &rest args)
+ (apply #'aref a args))
+
+(defun my-row-major-aref (a index)
+ (row-major-aref a index))
(defun equalp-with-case (x y)
"Like EQUALP, but doesn't do case conversion of characters.
Currently doesn't work on arrays of dimension > 2."
(cond
+ ((eq x y) t)
((consp x)
(and (consp y)
(equalp-with-case (car x) (car y))
(equalp-with-case (cdr x) (cdr y))))
((and (typep x 'array)
(= (array-rank x) 0))
- (equalp-with-case (aref x) (aref y)))
+ (equalp-with-case (my-aref x) (my-aref y)))
((typep x 'vector)
(and (typep y 'vector)
(let ((x-len (length x))
(y-len (length y)))
(and (eql x-len y-len)
(loop
- for e1 across x
- for e2 across y
+ for i from 0 below x-len
+ for e1 = (my-aref x i)
+ for e2 = (my-aref y i)
always (equalp-with-case e1 e2))))))
((and (typep x 'array)
(typep y 'array)
(not (equal (array-dimensions x)
(array-dimensions y))))
nil)
- #|
- ((and (typep x 'array)
- (= (array-rank x) 2))
- (let ((dim (array-dimensions x)))
- (loop for i from 0 below (first dim)
- always (loop for j from 0 below (second dim)
- always (equalp-with-case (aref x i j)
- (aref y i j))))))
- |#
((typep x 'array)
(and (typep y 'array)
(let ((size (array-total-size x)))
(loop for i from 0 below size
- always (equalp-with-case (row-major-aref x i)
- (row-major-aref y i))))))
-
+ always (equalp-with-case (my-row-major-aref x i)
+ (my-row-major-aref y i))))))
+ ((typep x 'pathname)
+ (equal x y))
(t (eql x y))))
(defun do-entry (entry &optional
@@ -165,49 +237,110 @@ them.")
r)
;; (declare (special *break-on-warnings*))
- (flet ((%do
- ()
- (setf r
- (multiple-value-list
- (if *compile-tests*
- (funcall (compile
- nil
- `(lambda ()
- (declare
- (optimize ,@*optimization-settings*))
- ,(form entry))))
- (eval (form entry)))))))
- (block aborted
- (if *catch-errors*
- (handler-bind (#-ecl (style-warning #'muffle-warning)
- (error #'(lambda (c)
- (setf aborted t)
- (setf r (list c))
- (return-from aborted nil))))
- (%do))
- (%do))))
-
+ (block aborted
+ (setf r
+ (flet ((%do ()
+ (handler-bind
+ #-sbcl nil
+ #+sbcl ((sb-ext:code-deletion-note #'(lambda (c)
+ (if (has-note entry :do-not-muffle)
+ nil
+ (muffle-warning c)))))
+ (cond
+ (*compile-tests*
+ (multiple-value-list
+ (funcall (compile
+ nil
+ `(lambda ()
+ (declare
+ (optimize ,@*optimization-settings*))
+ ,(form entry))))))
+ (*expanded-eval*
+ (multiple-value-list
+ (expanded-eval (form entry))))
+ (t
+ (multiple-value-list
+ (eval (form entry))))))))
+ (if *catch-errors*
+ (handler-bind
+ (#-ecl (style-warning #'(lambda (c) (if (has-note entry :do-not-muffle-warnings)
+ c
+ (muffle-warning c))))
+ (error #'(lambda (c)
+ (setf aborted t)
+ (setf r (list c))
+ (return-from aborted nil))))
+ (%do))
+ (%do)))))
+
(setf (pend entry)
(or aborted
(not (equalp-with-case r (vals entry)))))
+
(when (pend entry)
(let ((*print-circle* *print-circle-on-failure*))
- (format s "~&Test ~:@(~S~) failed~%Form: ~S~%Expected value~P:~%"
- *test* (form entry) (length (vals entry)))
- (dolist (v (vals entry)) (format s "~10t~S~%" v))
- (format s "Actual value~P:~%" (length r))
- (dolist (v r)
- (format s "~10t~S~:[~; [~2:*~A]~]~%"
- v (typep v 'condition)))))))
+ (format s "~&Test ~:@(~S~) failed~
+ ~%Form: ~S~
+ ~%Expected value~P: ~
+ ~{~S~^~%~17t~}~%"
+ *test* (form entry)
+ (length (vals entry))
+ (vals entry))
+ (handler-case
+ (let ((st (format nil "Actual value~P: ~
+ ~{~S~^~%~15t~}.~%"
+ (length r) r)))
+ (format s "~A" st))
+ (error () (format s "Actual value: #<error during printing>~%")))
+ (finish-output s)))))
(when (not (pend entry)) *test*))
+(defun expanded-eval (form)
+ "Split off top level of a form and eval separately. This reduces the chance that
+ compiler optimizations will fold away runtime computation."
+ (if (not (consp form))
+ (eval form)
+ (let ((op (car form)))
+ (cond
+ ((eq op 'let)
+ (let* ((bindings (loop for b in (cadr form)
+ collect (if (consp b) b (list b nil))))
+ (vars (mapcar #'car bindings))
+ (binding-forms (mapcar #'cadr bindings)))
+ (apply
+ (the function
+ (eval `(lambda ,vars ,@(cddr form))))
+ (mapcar #'eval binding-forms))))
+ ((and (eq op 'let*) (cadr form))
+ (let* ((bindings (loop for b in (cadr form)
+ collect (if (consp b) b (list b nil))))
+ (vars (mapcar #'car bindings))
+ (binding-forms (mapcar #'cadr bindings)))
+ (funcall
+ (the function
+ (eval `(lambda (,(car vars) &aux ,@(cdr bindings)) ,@(cddr form))))
+ (eval (car binding-forms)))))
+ ((eq op 'progn)
+ (loop for e on (cdr form)
+ do (if (null (cdr e)) (return (eval (car e)))
+ (eval (car e)))))
+ ((and (symbolp op) (fboundp op)
+ (not (macro-function op))
+ (not (special-operator-p op)))
+ (apply (symbol-function op)
+ (mapcar #'eval (cdr form))))
+ (t (eval form))))))
+
(defun continue-testing ()
(if *in-test*
(throw '*in-test* nil)
(do-entries *standard-output*)))
-(defun do-tests (&optional
- (out *standard-output*))
+(defun do-tests (&key (out *standard-output*)
+ ((:catch-errors *catch-errors*) *catch-errors*)
+ ((:compile *compile-tests*) *compile-tests*))
+ (setq *failed-tests* nil
+ *passed-tests* nil)
(dolist (entry (cdr *entries*))
(setf (pend entry) t))
(if (streamp out)
@@ -219,13 +352,19 @@ them.")
(defun do-entries (s)
(format s "~&Doing ~A pending test~:P ~
of ~A tests total.~%"
- (count t (cdr *entries*)
- :key #'pend)
+ (count t (the list (cdr *entries*)) :key #'pend)
(length (cdr *entries*)))
+ (finish-output s)
(dolist (entry (cdr *entries*))
- (when (pend entry)
- (format s "~@[~<~%~:; ~:@(~S~)~>~]"
- (do-entry entry s))))
+ (when (and (pend entry)
+ (not (has-disabled-note entry)))
+ (let ((success? (do-entry entry s)))
+ (if success?
+ (push (name entry) *passed-tests*)
+ (push (name entry) *failed-tests*))
+ (format s "~@[~<~%~:; ~:@(~S~)~>~]" success?))
+ (finish-output s)
+ ))
(let ((pending (pending-tests))
(expected-table (make-hash-table :test #'equal)))
(dolist (ex *expected-failures*)
@@ -252,19 +391,46 @@ them.")
~^, ~}~)."
(length new-failures)
new-failures)))
- (when *expected-failures*
- (let ((pending-table (make-hash-table :test #'equal)))
- (dolist (ex pending)
- (setf (gethash ex pending-table) t))
- (let ((unexpected-successes
- (loop :for ex :in *expected-failures*
- :unless (gethash ex pending-table) :collect ex)))
- (if unexpected-successes
- (format t "~&~:D unexpected successes: ~
- ~:@(~{~<~% ~1:;~S~>~
- ~^, ~}~)."
- (length unexpected-successes)
- unexpected-successes)
- (format t "~&No unexpected successes.")))))
))
+ (finish-output s)
(null pending))))
+
+;;; Note handling functions and macros
+
+(defmacro defnote (name contents &optional disabled)
+ `(eval-when (:load-toplevel :execute)
+ (let ((note (make-note :name ',name
+ :contents ',contents
+ :disabled ',disabled)))
+ (setf (gethash (note-name note) *notes*) note)
+ note)))
+
+(defun disable-note (n)
+ (let ((note (if (note-p n) n
+ (setf n (gethash n *notes*)))))
+ (unless note (error "~A is not a note or note name." n))
+ (setf (note-disabled note) t)
+ note))
+
+(defun enable-note (n)
+ (let ((note (if (note-p n) n
+ (setf n (gethash n *notes*)))))
+ (unless note (error "~A is not a note or note name." n))
+ (setf (note-disabled note) nil)
+ note))
+
+;;; Extended random regression
+
+(defun do-extended-tests (&key (tests *passed-tests*) (count nil)
+ ((:catch-errors *catch-errors*) *catch-errors*)
+ ((:compile *compile-tests*) *compile-tests*))
+ "Execute randomly chosen tests from TESTS until one fails or until
+ COUNT is an integer and that many tests have been executed."
+ (let ((test-vector (coerce tests 'simple-vector)))
+ (let ((n (length test-vector)))
+ (when (= n 0) (error "Must provide at least one test."))
+ (loop for i from 0
+ for name = (svref test-vector (random n))
+ until (eql i count)
+ do (print name)
+ unless (do-test name) return (values name (1+ i))))))
--- /dev/null
+++ gcl-2.6.12/ansi-tests/stream-element-type.lsp
@@ -0,0 +1,102 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 13 20:09:50 2004
+;;;; Contains: Tests for STREAM-ELEMENT-TYPE
+
+(in-package :cl-test)
+
+(deftest stream-element-type.1
+ (loop for s in (list *debug-io* *error-output* *query-io*
+ *standard-input* *standard-output*
+ *trace-output* *terminal-io*)
+ for results = (multiple-value-list (stream-element-type s))
+ unless (and (eql (length results) 1)
+ (car results))
+ collect s)
+ nil)
+
+(deftest stream-element-type.2
+ (let ((pn "foo.txt"))
+ (loop for i from 1 to 100
+ for etype = `(unsigned-byte ,i)
+ for s = (progn (delete-all-versions pn)
+ (open pn :direction :output
+ :element-type etype))
+ unless
+ (multiple-value-bind (sub good)
+ (subtypep etype (stream-element-type s))
+ (close s)
+ (or sub (not good)))
+ collect i))
+ nil)
+
+(deftest stream-element-type.3
+ (let ((pn "foo.txt"))
+ (loop for i from 1 to 100
+ for etype = `(signed-byte ,i)
+ for s = (progn (delete-all-versions pn)
+ (open pn :direction :output
+ :element-type etype))
+ unless
+ (multiple-value-bind (sub good)
+ (subtypep etype (stream-element-type s))
+ (close s)
+ (or sub (not good)))
+ collect i))
+ nil)
+
+(deftest stream-element-type.4
+ (let ((pn "foo.txt"))
+ (loop for i from 1 to 100
+ for etype = `(integer 0 ,i)
+ for s = (progn (delete-all-versions pn)
+ (open pn :direction :output
+ :element-type etype))
+ unless
+ (multiple-value-bind (sub good)
+ (subtypep etype (stream-element-type s))
+ (close s)
+ (or sub (not good)))
+ collect i))
+ nil)
+
+
+(deftest stream-element-type.5
+ :notes (:assume-no-simple-streams)
+ (let ((pn "foo.txt"))
+ (delete-all-versions pn)
+ (let ((s (open pn :direction :output)))
+ (let ((etype (stream-element-type s)))
+ (unwind-protect
+ (equalt (multiple-value-list (subtypep* 'character etype))
+ '(nil t))
+ (close s)))))
+ nil)
+
+(deftest stream-element-type.6
+ :notes (:assume-no-simple-streams)
+ (let ((pn "foo.txt"))
+ (delete-all-versions pn)
+ (let ((s (open pn :direction :output
+ :element-type :default)))
+ (let ((etype (stream-element-type s)))
+ (unwind-protect
+ (multiple-value-bind (sub1 good1) (subtypep* etype 'integer)
+ (multiple-value-bind (sub2 good2) (subtypep* etype 'character)
+ (or (not good1)
+ (not good2)
+ sub1 sub2)))
+ (close s)))))
+ t)
+
+(deftest stream-element-type.error.1
+ (signals-error (stream-element-type) program-error)
+ t)
+
+(deftest stream-element-type.error.2
+ (signals-error (stream-element-type *standard-input* nil) program-error)
+ t)
+
+(deftest stream-element-type.error.3
+ (check-type-error #'stream-element-type #'streamp)
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/stream-error-stream.lsp
@@ -0,0 +1,34 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Feb 14 20:51:33 2004
+;;;; Contains: Tests of STREAM-ERROR-STREAM
+
+(in-package :cl-test)
+
+(deftest stream-error-stream.1
+ (with-input-from-string
+ (s "")
+ (handler-case
+ (read-char s)
+ (stream-error (c) (eqlt (stream-error-stream c) s))))
+ t)
+
+;;; Error tests
+
+(deftest stream-error-stream.error.1
+ (signals-error (stream-error-stream) program-error)
+ t)
+
+
+(deftest stream-error-stream.error.2
+ (signals-error
+ (with-input-from-string
+ (s "")
+ (handler-case
+ (read-char s)
+ (stream-error (c) (stream-error-stream c nil))))
+ program-error)
+ t)
+
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/stream-external-format.lsp
@@ -0,0 +1,24 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 27 20:53:21 2004
+;;;; Contains: Tests of STREAM-EXTERNAL-FORMAT
+
+(in-package :cl-test)
+
+;;; This is tested in open.lsp
+
+;;; Error tests
+
+(deftest stream-external-format.error.1
+ (signals-error (stream-external-format) program-error)
+ t)
+
+(deftest stream-external-format.error.2
+ (signals-error
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (with-open-file
+ (s pn :direction :output :if-exists :supersede)
+ (stream-external-format s nil)))
+ program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/streamp.lsp
@@ -0,0 +1,44 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Jan 17 17:12:38 2004
+;;;; Contains: Tests for STREAMP
+
+(in-package :cl-test)
+
+(deftest streamp.1
+ (loop for s in (list *debug-io* *error-output* *query-io*
+ *standard-input* *standard-output*
+ *trace-output* *terminal-io*)
+ unless (equal (multiple-value-list (notnot-mv (streamp s)))
+ '(t))
+ collect s)
+ nil)
+
+(deftest streamp.2
+ (check-type-predicate #'streamp 'stream)
+ 0)
+
+(deftest streamp.3
+ (let ((s (open "foo.txt" :direction :output
+ :if-exists :supersede)))
+ (close s)
+ (notnot-mv (streamp s)))
+ t)
+
+(deftest streamp.4
+ (let ((s (open "foo.txt" :direction :output
+ :if-exists :supersede)))
+ (unwind-protect
+ (notnot-mv (streamp s))
+ (close s)))
+ t)
+
+;;; Error tests
+
+(deftest streamp.error.1
+ (signals-error (streamp) program-error)
+ t)
+
+(deftest streamp.error.2
+ (signals-error (streamp *standard-input* nil) program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/synonym-stream-symbol.lsp
@@ -0,0 +1,23 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Jan 29 21:21:06 2004
+;;;; Contains: Tests of SYNONYM-STREAM-SYMBOL
+
+(in-package :cl-test)
+
+(deftest synonym-stream-symbol.1
+ (synonym-stream-symbol (make-synonym-stream '*standard-input*))
+ *standard-input*)
+
+(deftest synonym-stream-symbol.error.1
+ (signals-error (synonym-stream-symbol) program-error)
+ t)
+
+(deftest synonym-stream-symbol.error.2
+ (signals-error (synonym-stream-symbol
+ (make-synonym-stream '*terminal-io*)
+ nil)
+ program-error)
+ t)
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/terpri.lsp
@@ -0,0 +1,62 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Jan 18 20:35:57 2004
+;;;; Contains: Tests of TERPRI
+
+(in-package :cl-test)
+
+(deftest terpri.1
+ (let (result)
+ (values
+ (with-output-to-string
+ (*standard-output*)
+ (write-char #\a)
+ (setq result (terpri)))
+ result))
+ #.(concatenate 'string "a" (string #\Newline))
+ nil)
+
+(deftest terpri.2
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (write-char #\a s)
+ (setq result (terpri s)))
+ result))
+ #.(concatenate 'string "a" (string #\Newline))
+ nil)
+
+(deftest terpri.3
+ (with-output-to-string
+ (s)
+ (write-char #\x s)
+ (terpri s)
+ (terpri s)
+ (write-char #\y s))
+ #.(concatenate 'string "x" (string #\Newline) (string #\Newline) "y"))
+
+(deftest terpri.4
+ (with-output-to-string
+ (os)
+ (let ((*terminal-io* (make-two-way-stream *standard-input* os)))
+ (terpri t)
+ (finish-output t)))
+ #.(string #\Newline))
+
+(deftest terpri.5
+ (with-output-to-string
+ (*standard-output*)
+ (terpri nil))
+ #.(string #\Newline))
+
+;;; Error tests
+
+(deftest terpri.error.1
+ (signals-error
+ (with-output-to-string
+ (s)
+ (terpri s nil))
+ program-error)
+ t)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/translate-logical-pathname.lsp
@@ -0,0 +1,48 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Mon Dec 29 14:45:50 2003
+;;;; Contains: Tests for TRANSLATE-LOGICAL-PATHNAME
+
+(in-package :cl-test)
+
+;; On physical pathnames, t-l-p returns the pathname itself
+
+;;; Every physical pathname is converted to itself
+(deftest translate-logical-pathname.1
+ (loop for p in *pathnames*
+ unless (or (typep p 'logical-pathname)
+ (eq p (translate-logical-pathname p)))
+ collect p)
+ nil)
+
+;;; &key arguments are allowed
+(deftest translate-logical-pathname.2
+ (loop for p in *pathnames*
+ unless (or (typep p 'logical-pathname)
+ (eq p (translate-logical-pathname
+ p :allow-other-keys t)))
+ collect p)
+ nil)
+
+(deftest translate-logical-pathname.3
+ (loop for p in *pathnames*
+ unless (or (typep p 'logical-pathname)
+ (eq p (translate-logical-pathname
+ p :allow-other-keys nil)))
+ collect p)
+ nil)
+
+(deftest translate-logical-pathname.4
+ (loop for p in *pathnames*
+ unless (or (typep p 'logical-pathname)
+ (eq p (translate-logical-pathname
+ p :foo 1 :allow-other-keys t :bar 2)))
+ collect p)
+ nil)
+
+
+;;; errors
+
+(deftest translate-logical-pathname.error.1
+ (signals-error (translate-logical-pathname) program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/translate-pathname.lsp
@@ -0,0 +1,50 @@
+;-*- Mode: Lisp -*-
+
+(in-package :cl-test)
+
+(deftest translate-pathname.1 (translate-pathname "foobar" "foobar" "foobar") #P"foobar")
+(deftest translate-pathname.2 (translate-pathname "foobar" "foobar" "foo*") #P"foo")
+(deftest translate-pathname.3 (translate-pathname "foobar" "foobar" "*") #P"foobar")
+(deftest translate-pathname.4 (translate-pathname "foobar" "foobar" "") #P"foobar")
+
+(deftest translate-pathname.5 (translate-pathname "foobar" "foo*r" "foobar") #P"foobar")
+(deftest translate-pathname.6 (translate-pathname "foobar" "foo*r" "foo*") #P"fooba")
+(deftest translate-pathname.7 (translate-pathname "foobar" "foo*r" "*") #P"foobar")
+(deftest translate-pathname.8 (translate-pathname "foobar" "foo*r" "") #P"foobar")
+
+(deftest translate-pathname.9 (translate-pathname "foobar" "*" "foobar") #P"foobar")
+(deftest translate-pathname.10 (translate-pathname "foobar" "*" "foo*") #P"foofoobar")
+(deftest translate-pathname.11 (translate-pathname "foobar" "*" "*") #P"foobar")
+(deftest translate-pathname.12 (translate-pathname "foobar" "*" "") #P"foobar")
+
+(deftest translate-pathname.13 (translate-pathname "foobar" "" "foobar") #P"foobar")
+(deftest translate-pathname.14 (translate-pathname "foobar" "" "foo*") #P"foofoobar")
+(deftest translate-pathname.15 (translate-pathname "foobar" "" "*") #P"foobar")
+(deftest translate-pathname.16 (translate-pathname "foobar" "" "") #P"foobar")
+
+(deftest translate-pathname.17 (translate-pathname "/a/bbfb/c/d/" "/a/bbfb/c/d/" "/a/qc/c/d/") #P"/a/qc/c/d/")
+(deftest translate-pathname.18 (translate-pathname "/a/bbfb/c/d/" "/a/bbfb/c/d/" "/a/q*c*/c/d/") #P"/a/qc/c/d/")
+(deftest translate-pathname.19 (translate-pathname "/a/bbfb/c/d/" "/a/bbfb/c/d/" "/a/*/c/d/") #P"/a/c/d/")
+(deftest translate-pathname.20 (translate-pathname "/a/bbfb/c/d/" "/a/bbfb/c/d/" "/a/**/d/") #P"/a/d/")
+
+(deftest translate-pathname.21 (translate-pathname "/a/bbfb/c/d/" "/a/b*f*/c/d/" "/a/qc/c/d/") #P"/a/qc/c/d/")
+(deftest translate-pathname.22 (translate-pathname "/a/bbfb/c/d/" "/a/b*f*/c/d/" "/a/q*c*/c/d/") #P"/a/qbcb/c/d/")
+(deftest translate-pathname.23 (translate-pathname "/a/bbfb/c/d/" "/a/b*f*/c/d/" "/a/*/c/d/") #P"/a/bbfb/c/d/")
+(deftest translate-pathname.24 (translate-pathname "/a/bbfb/c/d/" "/a/b*f*/c/d/" "/a/**/d/") #P"/a/bbfb/d/")
+
+(deftest translate-pathname.25 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "/a/qc/c/d/") #P"/a/qc/c/d/")
+(deftest translate-pathname.26 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "/a/q*c*/c/d/") #P"/a/qc/c/d/")
+(deftest translate-pathname.27 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "/a/*/d/") #P"/a/bbfb/d/")
+(deftest translate-pathname.28 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "/a/**/d/") #P"/a/bbfb/c/d/")
+
+(deftest translate-pathname.29 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "a/qc/c/d/") #P"a/qc/c/d/")
+(deftest translate-pathname.30 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "a/q*c*/c/d/") #P"a/qc/c/d/")
+(deftest translate-pathname.31 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "a/*/d/") #P"a/bbfb/d/")
+(deftest translate-pathname.32 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "a/**/d/") #P"a/bbfb/c/d/")
+
+(deftest translate-pathname.33 (translate-pathname "/a/bbfb/c/d/" "/a/bbfb/c/d/" "a") #P"/a/bbfb/c/d/a")
+(deftest translate-pathname.34 (translate-pathname "/a/bbfb/c/d/" "/a/b*f*/c/d/" "a") #P"/a/bbfb/c/d/a")
+(deftest translate-pathname.35 (translate-pathname "/a/bbfb/c/d/" "/a/*/c/d/" "a") #P"/a/bbfb/c/d/a")
+(deftest translate-pathname.36 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "a") #P"/a/bbfb/c/d/a")
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/truename.lsp
@@ -0,0 +1,108 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 6 05:32:37 2004
+;;;; Contains: Tests of TRUENAME
+
+(in-package :cl-test)
+
+(deftest truename.1
+ (let* ((pn #p"truename.lsp")
+ (tn (truename pn)))
+ (values
+ (notnot (pathnamep pn))
+ (typep pn 'logical-pathname)
+ (equalt (pathname-name pn) (pathname-name tn))
+ (equalt (pathname-type pn) (pathname-type tn))
+ ))
+ t nil t t)
+
+(deftest truename.2
+ (let* ((name "truename.lsp")
+ (pn (pathname name))
+ (tn (truename name)))
+ (values
+ (notnot (pathnamep pn))
+ (typep pn 'logical-pathname)
+ (equalt (pathname-name pn) (pathname-name tn))
+ (equalt (pathname-type pn) (pathname-type tn))
+ ))
+ t nil t t)
+
+(deftest truename.3
+ (let* ((pn #p"truename.lsp"))
+ (with-open-file
+ (s pn :direction :input)
+ (let ((tn (truename s)))
+ (values
+ (notnot (pathnamep pn))
+ (typep pn 'logical-pathname)
+ (equalt (pathname-name pn) (pathname-name tn))
+ (equalt (pathname-type pn) (pathname-type tn))
+ ))))
+ t nil t t)
+
+(deftest truename.4
+ (let* ((pn #p"truename.lsp"))
+ (let ((s (open pn :direction :input)))
+ (close s)
+ (let ((tn (truename s)))
+ (values
+ (notnot (pathnamep pn))
+ (typep pn 'logical-pathname)
+ (equalt (pathname-name pn) (pathname-name tn))
+ (equalt (pathname-type pn) (pathname-type tn))
+ ))))
+ t nil t t)
+
+(deftest truename.5
+ (let* ((lpn "CLTEST:foo.txt")
+ (pn (translate-logical-pathname lpn)))
+ (unless (probe-file lpn)
+ (with-open-file (s lpn :direction :output) (format s "Stuff~%")))
+ (let ((tn (truename lpn)))
+ (values
+ (notnot (pathnamep pn))
+ (if (equalt (pathname-name pn) (pathname-name tn))
+ t (list (pathname-name pn) (pathname-name tn)))
+ (if (equalt (pathname-type pn) (pathname-type tn))
+ t (list (pathname-type pn) (pathname-type tn)))
+ )))
+ t t t)
+
+;;; Specialized string tests
+
+(deftest truename.6
+ (do-special-strings
+ (s "truename.lsp" nil)
+ (assert (equalp (truename s) (truename "truename.lsp"))))
+ nil)
+
+;;; Error tests
+
+(deftest truename.error.1
+ (signals-error (truename) program-error)
+ t)
+
+(deftest truename.error.2
+ (signals-error (truename "truename.lsp" nil) program-error)
+ t)
+
+(deftest truename.error.3
+ (signals-error-always (truename "nonexistent") file-error)
+ t t)
+
+(deftest truename.error.4
+ (signals-error-always (truename #p"nonexistent") file-error)
+ t t)
+
+(deftest truename.error.5
+ (signals-error-always (truename (logical-pathname "CLTESTROOT:NONEXISTENT")) file-error)
+ t t)
+
+(deftest truename.error.6
+ (signals-error-always
+ (let ((pn (make-pathname :name :wild
+ :defaults *default-pathname-defaults*)))
+ (truename pn))
+ file-error)
+ t t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/two-way-stream-input-stream.lsp
@@ -0,0 +1,26 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Feb 12 04:22:50 2004
+;;;; Contains: Tests of TWO-WAY-STREAM-INPUT-STREAM
+
+(in-package :cl-test)
+
+(deftest two-way-stream-input-stream.1
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (equalt (multiple-value-list (two-way-stream-input-stream s))
+ (list is)))
+ t)
+
+(deftest two-way-stream-input-stream.error.1
+ (signals-error (two-way-stream-input-stream) program-error)
+ t)
+
+(deftest two-way-stream-input-stream.error.2
+ (signals-error (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (two-way-stream-input-stream s nil))
+ program-error)
+ t)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/two-way-stream-output-stream.lsp
@@ -0,0 +1,26 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Thu Feb 12 04:25:59 2004
+;;;; Contains: Tests off TWO-WAY-STREAM-OUTPUT-STREAM
+
+(in-package :cl-test)
+
+(deftest two-way-stream-output-stream.1
+ (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (equalt (multiple-value-list (two-way-stream-output-stream s))
+ (list os)))
+ t)
+
+(deftest two-way-stream-output-stream.error.1
+ (signals-error (two-way-stream-output-stream) program-error)
+ t)
+
+(deftest two-way-stream-output-stream.error.2
+ (signals-error (let* ((is (make-string-input-stream "foo"))
+ (os (make-string-output-stream))
+ (s (make-two-way-stream is os)))
+ (two-way-stream-output-stream s nil))
+ program-error)
+ t)
--- gcl-2.6.12.orig/ansi-tests/universe.lsp
+++ gcl-2.6.12/ansi-tests/universe.lsp
@@ -307,15 +307,50 @@
#-(or GCL CMU ECL) (make-hash-table :test #'equalp)
))
-(defvar *pathnames*
- (list
- (make-pathname :name "foo")
- (make-pathname :name "bar")
- (make-pathname :name "foo" :type "txt")
- (make-pathname :name "bar" :type "txt")
- (make-pathname :name :wild)
- (make-pathname :name :wild :type "txt")
- ))
+(defparameter *pathnames*
+ (locally
+ (declare (optimize safety))
+ (loop for form in '((make-pathname :name "foo")
+ (make-pathname :name "FOO" :case :common)
+ (make-pathname :name "bar")
+ (make-pathname :name "foo" :type "txt")
+ (make-pathname :name "bar" :type "txt")
+ (make-pathname :name "XYZ" :type "TXT" :case :common)
+ (make-pathname :name nil)
+ (make-pathname :name :wild)
+ (make-pathname :name nil :type "txt")
+ (make-pathname :name :wild :type "txt")
+ (make-pathname :name :wild :type "TXT" :case :common)
+ (make-pathname :name :wild :type "abc" :case :common)
+ (make-pathname :directory :wild)
+ (make-pathname :type :wild)
+ (make-pathname :version :wild)
+ (make-pathname :version :newest))
+ append (ignore-errors (eval `(list ,form))))))
+
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (locally
+ (declare (optimize safety))
+ (ignore-errors
+ (setf (logical-pathname-translations "CLTESTROOT")
+ `(("**;*.*.*" ,(make-pathname :directory '(:absolute :wild-inferiors)
+ :name :wild :type :wild)))))
+ (ignore-errors
+ (setf (logical-pathname-translations "CLTEST")
+ `(("**;*.*.*" ,(make-pathname
+ :directory (append
+ (pathname-directory
+ (truename (make-pathname)))
+ '(:wild-inferiors))
+ :name :wild :type :wild)))))
+ ))
+
+(defparameter *logical-pathnames*
+ (locally
+ (declare (optimize safety))
+ (append
+ (ignore-errors (list (logical-pathname "CLTESTROOT:")))
+ )))
(defvar *streams*
(remove-duplicates
--- /dev/null
+++ gcl-2.6.12/ansi-tests/unread-char.lsp
@@ -0,0 +1,92 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Jan 18 20:05:36 2004
+;;;; Contains: Tests of UNREAD-CHAR
+
+(in-package :cl-test)
+
+(deftest unread-char.1
+ (with-input-from-string
+ (*standard-input* "abc")
+ (values
+ (read-char)
+ (unread-char #\a)
+ (read-char)
+ (read-char)
+ (unread-char #\b)
+ (read-char)
+ (read-char)))
+ #\a nil #\a #\b nil #\b #\c)
+
+(deftest unread-char.2
+ (with-input-from-string
+ (s "abc")
+ (values
+ (read-char s)
+ (unread-char #\a s)
+ (read-char s)
+ (read-char s)
+ (unread-char #\b s)
+ (read-char s)
+ (read-char s)))
+ #\a nil #\a #\b nil #\b #\c)
+
+(deftest unread-char.3
+ (with-input-from-string
+ (is "abc")
+ (with-output-to-string
+ (os)
+ (let ((s (make-echo-stream is os)))
+ (read-char s)
+ (unread-char #\a s)
+ (read-char s)
+ (read-char s)
+ (read-char s)
+ (unread-char #\c s)
+ (read-char s))))
+ "abc")
+
+(deftest unread-char.4
+ (with-input-from-string
+ (*standard-input* "abc")
+ (values
+ (read-char)
+ (unread-char #\a nil)
+ (read-char)
+ (read-char)
+ (unread-char #\b nil)
+ (read-char)
+ (read-char)))
+ #\a nil #\a #\b nil #\b #\c)
+
+(deftest unread-char.5
+ (with-input-from-string
+ (is "abc")
+ (let ((*terminal-io* (make-two-way-stream
+ is (make-string-output-stream))))
+ (values
+ (read-char t)
+ (unread-char #\a t)
+ (read-char t)
+ (read-char t)
+ (unread-char #\b t)
+ (read-char t)
+ (read-char t))))
+ #\a nil #\a #\b nil #\b #\c)
+
+;;; Error tests
+
+(deftest unread-char.error.1
+ (signals-error (unread-char) program-error)
+ t)
+
+(deftest unread-char.error.2
+ (signals-error
+ (with-input-from-string
+ (s "abc")
+ (read-char s)
+ (unread-char #\a s nil))
+ program-error)
+ t)
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/wild-pathname-p.lsp
@@ -0,0 +1,234 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Dec 31 16:54:55 2003
+;;;; Contains: Tests of WILD-PATHNAME-P
+
+(in-package :cl-test)
+
+(compile-and-load "pathnames-aux.lsp")
+
+(deftest wild-pathname-p.1
+ (wild-pathname-p (make-pathname))
+ nil)
+
+(deftest wild-pathname-p.2
+ (loop for key in '(:host :device :directory :name :type :version nil)
+ when (wild-pathname-p (make-pathname) key)
+ collect key)
+ nil)
+
+(deftest wild-pathname-p.3
+ (let ((p (make-pathname :directory :wild)))
+ (notnot-mv (wild-pathname-p p)))
+ t)
+
+(deftest wild-pathname-p.4
+ (let ((p (make-pathname :directory :wild)))
+ (notnot-mv (wild-pathname-p p nil)))
+ t)
+
+(deftest wild-pathname-p.5
+ (let ((p (make-pathname :directory :wild)))
+ (notnot-mv (wild-pathname-p p :directory)))
+ t)
+
+(deftest wild-pathname-p.6
+ (let ((p (make-pathname :directory :wild)))
+ (loop for key in '(:host :device :name :type :version)
+ when (wild-pathname-p p key)
+ collect key))
+ nil)
+
+
+(deftest wild-pathname-p.7
+ (let ((p (make-pathname :directory '(:absolute :wild))))
+ (notnot-mv (wild-pathname-p p)))
+ t)
+
+(deftest wild-pathname-p.8
+ (let ((p (make-pathname :directory '(:absolute :wild))))
+ (notnot-mv (wild-pathname-p p nil)))
+ t)
+
+(deftest wild-pathname-p.9
+ (let ((p (make-pathname :directory '(:absolute :wild))))
+ (notnot-mv (wild-pathname-p p :directory)))
+ t)
+
+(deftest wild-pathname-p.10
+ (let ((p (make-pathname :directory '(:absolute :wild))))
+ (loop for key in '(:host :device :name :type :version)
+ when (wild-pathname-p p key)
+ collect key))
+ nil)
+
+
+(deftest wild-pathname-p.11
+ (let ((p (make-pathname :directory '(:relative :wild))))
+ (notnot-mv (wild-pathname-p p)))
+ t)
+
+(deftest wild-pathname-p.12
+ (let ((p (make-pathname :directory '(:relative :wild))))
+ (notnot-mv (wild-pathname-p p nil)))
+ t)
+
+(deftest wild-pathname-p.13
+ (let ((p (make-pathname :directory '(:relative :wild))))
+ (notnot-mv (wild-pathname-p p :directory)))
+ t)
+
+(deftest wild-pathname-p.14
+ (let ((p (make-pathname :directory '(:relative :wild))))
+ (loop for key in '(:host :device :name :type :version)
+ when (wild-pathname-p p key)
+ collect key))
+ nil)
+
+;;;
+
+(deftest wild-pathname-p.15
+ (let ((p (make-pathname :name :wild)))
+ (notnot-mv (wild-pathname-p p)))
+ t)
+
+(deftest wild-pathname-p.16
+ (let ((p (make-pathname :name :wild)))
+ (notnot-mv (wild-pathname-p p nil)))
+ t)
+
+(deftest wild-pathname-p.17
+ (let ((p (make-pathname :name :wild)))
+ (notnot-mv (wild-pathname-p p :name)))
+ t)
+
+(deftest wild-pathname-p.18
+ (let ((p (make-pathname :name :wild)))
+ (loop for key in '(:host :device :directory :type :version)
+ when (wild-pathname-p p key)
+ collect key))
+ nil)
+
+;;;
+
+(deftest wild-pathname-p.19
+ (let ((p (make-pathname :type :wild)))
+ (notnot-mv (wild-pathname-p p)))
+ t)
+
+(deftest wild-pathname-p.20
+ (let ((p (make-pathname :type :wild)))
+ (notnot-mv (wild-pathname-p p nil)))
+ t)
+
+(deftest wild-pathname-p.21
+ (let ((p (make-pathname :type :wild)))
+ (notnot-mv (wild-pathname-p p :type)))
+ t)
+
+(deftest wild-pathname-p.22
+ (let ((p (make-pathname :type :wild)))
+ (loop for key in '(:host :device :directory :name :version)
+ when (wild-pathname-p p key)
+ collect key))
+ nil)
+
+;;;
+
+ (deftest wild-pathname-p.23
+ (let ((p (make-pathname :version :wild)))
+ (notnot-mv (wild-pathname-p p)))
+ t)
+
+(deftest wild-pathname-p.24
+ (let ((p (make-pathname :version :wild)))
+ (notnot-mv (wild-pathname-p p nil)))
+ t)
+
+(deftest wild-pathname-p.25
+ (let ((p (make-pathname :version :wild)))
+ (notnot-mv (wild-pathname-p p :version)))
+ t)
+
+(deftest wild-pathname-p.26
+ (let ((p (make-pathname :version :wild)))
+ (loop for key in '(:host :device :directory :name :type)
+ when (wild-pathname-p p key)
+ collect key))
+ nil)
+
+;;;
+
+(deftest wild-pathname-p.27
+ (loop for p in (append *pathnames* *logical-pathnames*)
+ unless (if (wild-pathname-p p) (wild-pathname-p p nil)
+ (not (wild-pathname-p p nil)))
+ collect p)
+ nil)
+
+(deftest wild-pathname-p.28
+ (loop for p in (append *pathnames* *logical-pathnames*)
+ when (and (loop for key in '(:host :device :directory
+ :name :type :version)
+ thereis (wild-pathname-p p key))
+ (not (wild-pathname-p p)))
+ collect p)
+ nil)
+
+;;; On streams associated with files
+
+(deftest wild-pathname-p.29
+ (with-open-file (s "foo.lsp"
+ :direction :output
+ :if-exists :append
+ :if-does-not-exist :create)
+ (wild-pathname-p s))
+ nil)
+
+(deftest wild-pathname-p.30
+ (let ((s (open "foo.lsp"
+ :direction :output
+ :if-exists :append
+ :if-does-not-exist :create)))
+ (close s)
+ (wild-pathname-p s))
+ nil)
+
+;;; logical pathname designators
+
+(deftest wild-pathname-p.31
+ (wild-pathname-p "CLTEST:FOO.LISP")
+ nil)
+
+;;; Odd strings
+
+(deftest wild-pathname-p.32
+ (do-special-strings
+ (s "CLTEST:FOO.LISP" nil)
+ (let ((vals (multiple-value-list (wild-pathname-p s))))
+ (assert (equal vals '(nil)))))
+ nil)
+
+;;;
+
+(deftest wild-pathname-p.error.1
+ (signals-error (wild-pathname-p) program-error)
+ t)
+
+(deftest wild-pathname-p.error.2
+ (signals-error (wild-pathname-p *default-pathname-defaults* nil nil)
+ program-error)
+ t)
+
+(deftest wild-pathname-p.error.3
+ (check-type-error #'wild-pathname-p
+ (typef '(or pathname string file-stream
+ synonym-stream)))
+ nil)
+
+(deftest wild-pathname-p.error.4
+ (check-type-error #'(lambda (x) (declare (optimize (safety 0)))
+ (wild-pathname-p x))
+ (typef '(or pathname string file-stream
+ synonym-stream)))
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/with-input-from-string.lsp
@@ -0,0 +1,245 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Feb 14 20:13:02 2004
+;;;; Contains: Tests of WITH-INPUT-FROM-STRING
+
+(in-package :cl-test)
+
+(deftest with-input-from-string.1
+ (with-input-from-string
+ (s "abc")
+ (values (read-char s) (read-char s) (read-char s) (read-char s nil :eof)))
+ #\a #\b #\c :eof)
+
+(deftest with-input-from-string.2
+ (with-input-from-string (s "abc"))
+ nil)
+
+(deftest with-input-from-string.3
+ (with-input-from-string (s "abc") (declare (optimize speed)))
+ nil)
+
+(deftest with-input-from-string.3a
+ (with-input-from-string (s "abc")
+ (declare (optimize speed))
+ (declare (optimize space)))
+ nil)
+
+(deftest with-input-from-string.4
+ (with-input-from-string
+ (s "abc")
+ (declare (optimize safety))
+ (read-char s)
+ (read-char s))
+ #\b)
+
+(deftest with-input-from-string.5
+ (let ((i nil))
+ (values
+ (with-input-from-string
+ (s "abc" :index i))
+ i))
+ nil 0)
+
+(deftest with-input-from-string.6
+ (let ((i (list nil)))
+ (values
+ (with-input-from-string
+ (s "abc" :index (car i)))
+ i))
+ nil (0))
+
+(deftest with-input-from-string.7
+ (let ((i nil))
+ (values
+ (with-input-from-string
+ (s "abc" :index i)
+ (list i (read-char s) i (read-char s) i))
+ i))
+ (nil #\a nil #\b nil) 2)
+
+(deftest with-input-from-string.9
+ (with-input-from-string
+ (s "abc")
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (notnot (open-stream-p s))
+ (notnot (input-stream-p s))
+ (output-stream-p s)))
+ t t t t nil)
+
+(deftest with-input-from-string.10
+ :notes (:nil-vectors-are-strings)
+ (with-input-from-string
+ (s (make-array 0 :element-type nil))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (notnot (open-stream-p s))
+ (notnot (input-stream-p s))
+ (output-stream-p s)))
+ t t t t nil)
+
+(deftest with-input-from-string.11
+ (with-input-from-string
+ (s (make-array 3 :element-type 'character :initial-contents "abc"))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (notnot (open-stream-p s))
+ (notnot (input-stream-p s))
+ (output-stream-p s)
+ (read-line s)))
+ t t t t nil "abc")
+
+(deftest with-input-from-string.12
+ (with-input-from-string
+ (s (make-array 3 :element-type 'base-char :initial-contents "abc"))
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (notnot (open-stream-p s))
+ (notnot (input-stream-p s))
+ (output-stream-p s)
+ (read-line s)))
+ t t t t nil "abc")
+
+(deftest with-input-from-string.13
+ (with-input-from-string
+ (s "abcdef" :start 2)
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (notnot (open-stream-p s))
+ (notnot (input-stream-p s))
+ (output-stream-p s)
+ (read-line s)))
+ t t t t nil "cdef")
+
+(deftest with-input-from-string.14
+ (with-input-from-string
+ (s "abcdef" :end 3)
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (notnot (open-stream-p s))
+ (notnot (input-stream-p s))
+ (output-stream-p s)
+ (read-line s)))
+ t t t t nil "abc")
+
+(deftest with-input-from-string.15
+ (with-input-from-string
+ (s "abcdef" :start 1 :end 5)
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (notnot (open-stream-p s))
+ (notnot (input-stream-p s))
+ (output-stream-p s)
+ (read-line s)))
+ t t t t nil "bcde")
+
+(deftest with-input-from-string.16
+ (with-input-from-string
+ (s "abcdef" :start 1 :end nil)
+ (values
+ (notnot (typep s 'stream))
+ (notnot (typep s 'string-stream))
+ (notnot (open-stream-p s))
+ (notnot (input-stream-p s))
+ (output-stream-p s)
+ (read-line s)))
+ t t t t nil "bcdef")
+
+(deftest with-input-from-string.17
+ (let ((i 2))
+ (values
+ (with-input-from-string
+ (s "abcdef" :index i :start i)
+ (read-char s))
+ i))
+ #\c 3)
+
+;;; Test that there is no implicit tagbody
+
+(deftest with-input-from-string.18
+ (block done
+ (tagbody
+ (with-input-from-string
+ (s "abc")
+ (go 1)
+ 1
+ (return-from done :bad))
+ 1
+ (return-from done :good)))
+ :good)
+
+;;; Free declaration scope
+
+(deftest with-input-from-string.19
+ (block done
+ (let ((x :bad))
+ (declare (special x))
+ (let ((x :good))
+ (with-input-from-string (s (return-from done x))
+ (declare (special x))))))
+ :good)
+
+(deftest with-input-from-string.20
+ (block done
+ (let ((x :bad))
+ (declare (special x))
+ (let ((x :good))
+ (with-input-from-string (s "abc" :start (return-from done x))
+ (declare (special x))))))
+ :good)
+
+(deftest with-input-from-string.21
+ (block done
+ (let ((x :bad))
+ (declare (special x))
+ (let ((x :good))
+ (with-input-from-string (s "abc" :end (return-from done x))
+ (declare (special x))))))
+ :good)
+
+;;; index is not updated if the form exits abnormally
+
+(deftest with-input-from-string.22
+ (let ((i nil))
+ (values
+ (block done
+ (with-input-from-string (s "abcde" :index i) (return-from done (read-char s))))
+ i))
+ #\a nil)
+
+;;; Test that explicit calls to macroexpand in subforms
+;;; are done in the correct environment
+
+(deftest with-input-from-string.23
+ (macrolet
+ ((%m (z) z))
+ (with-input-from-string (s (expand-in-current-env (%m "123")))
+ (read-char s)))
+ #\1)
+
+(deftest with-input-from-string.24
+ (macrolet
+ ((%m (z) z))
+ (with-input-from-string (s "123" :start (expand-in-current-env (%m 1)))
+ (read-char s)))
+ #\2)
+
+(deftest with-input-from-string.25
+ (macrolet
+ ((%m (z) z))
+ (with-input-from-string (s "123" :start 0
+ :end (expand-in-current-env (%m 0)))
+ (read-char s nil nil)))
+ nil)
+
+
+;;; FIXME: Add more tests on specialized strings.
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/with-open-file.lsp
@@ -0,0 +1,98 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Tue Jan 27 20:57:05 2004
+;;;; Contains: Tests of WITH-OPEN-FILE
+
+(in-package :cl-test)
+
+;;; For now, omit most of the options combinations, assuming they will
+;;; be tested in OPEN. The tests of OPEN should be ported to here at some
+;;; point.
+
+(deftest with-open-file.1
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (with-open-file (s pn :direction :output)))
+ nil)
+
+(deftest with-open-file.2
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (with-open-file
+ (s pn :direction :output)
+ (notnot-mv (output-stream-p s))))
+ t)
+
+(deftest with-open-file.3
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (with-open-file
+ (s pn :direction :output)
+ (values))))
+
+(deftest with-open-file.4
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (with-open-file
+ (s pn :direction :output)
+ (values 1 2 3 4 5 6 7 8)))
+ 1 2 3 4 5 6 7 8)
+
+(deftest with-open-file.5
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (with-open-file
+ (s pn :direction :output)
+ (declare (ignore s))
+ (declare (optimize))))
+ nil)
+
+(deftest with-open-file.6
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (with-open-file
+ (s pn (cdr '(nil . :direction)) (car '(:output)))
+ (format s "foo!~%"))
+ (with-open-file (s pn) (read-line s)))
+ "foo!" nil)
+
+;;; Free declaration scope tests
+
+(deftest with-open-file.7
+ (block done
+ (let ((x :bad))
+ (declare (special x))
+ (let ((x :good))
+ (with-open-file (s (return-from done x))
+ (declare (special x))))))
+ :good)
+
+(deftest with-open-file.8
+ (block done
+ (let ((x :bad))
+ (declare (special x))
+ (let ((x :good))
+ (with-open-file (s "with-open-file.lsp" (return-from done x) :input)
+ (declare (special x))))))
+ :good)
+
+(deftest with-open-file.9
+ (block done
+ (let ((x :bad))
+ (declare (special x))
+ (let ((x :good))
+ (with-open-file (s "with-open-file.lsp" :direction (return-from done x))
+ (declare (special x))))))
+ :good)
+
+;;; Test that explicit calls to macroexpand in subforms
+;;; are done in the correct environment
+
+(deftest with-open-file.10
+ (macrolet
+ ((%m (z) z))
+ (let ((pn #p"tmp.dat"))
+ (delete-all-versions pn)
+ (with-open-file (s (expand-in-current-env (%m pn))
+ :direction :output))))
+ nil)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/with-open-stream.lsp
@@ -0,0 +1,77 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Mon Dec 13 01:42:59 2004
+;;;; Contains: Tests of WITH-OPEN-STREAM
+
+(in-package :cl-test)
+
+(deftest with-open-stream.1
+ (with-open-stream (os (make-string-output-stream)))
+ nil)
+
+(deftest with-open-stream.2
+ (with-open-stream (os (make-string-output-stream))
+ (declare (ignore os)))
+ nil)
+
+(deftest with-open-stream.3
+ (with-open-stream (os (make-string-output-stream))
+ (declare (ignore os))
+ (declare (type string-stream os)))
+ nil)
+
+(deftest with-open-stream.4
+ (with-open-stream (os (make-string-output-stream))
+ (declare (ignore os))
+ (values)))
+
+(deftest with-open-stream.5
+ (with-open-stream (os (make-string-output-stream))
+ (declare (ignore os))
+ (values 'a 'b))
+ a b)
+
+(deftest with-open-stream.6
+ (let ((s (make-string-output-stream)))
+ (values
+ (with-open-stream (os s))
+ (notnot (typep s 'string-stream))
+ (open-stream-p s)))
+ nil t nil)
+
+(deftest with-open-stream.7
+ (let ((s (make-string-input-stream "123")))
+ (values
+ (with-open-stream (is s) (read-char s))
+ (notnot (typep s 'string-stream))
+ (open-stream-p s)))
+ #\1 t nil)
+
+(deftest with-open-stream.8
+ (let ((s (make-string-output-stream)))
+ (values
+ (block done
+ (with-open-stream (os s) (return-from done nil)))
+ (notnot (typep s 'string-stream))
+ (open-stream-p s)))
+ nil t nil)
+
+(deftest with-open-stream.9
+ (let ((s (make-string-output-stream)))
+ (values
+ (catch 'done
+ (with-open-stream (os s) (throw 'done nil)))
+ (notnot (typep s 'string-stream))
+ (open-stream-p s)))
+ nil t nil)
+
+;;; Free declaration scope
+
+(deftest with-open-stream.10
+ (block done
+ (let ((x :bad))
+ (declare (special x))
+ (let ((x :good))
+ (with-open-stream (s (return-from done x))
+ (declare (special x))))))
+ :good)
--- /dev/null
+++ gcl-2.6.12/ansi-tests/with-output-to-string.lsp
@@ -0,0 +1,129 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sat Feb 14 20:33:51 2004
+;;;; Contains: Tests of WITH-OUTPUT-TO-STRING
+
+(in-package :cl-test)
+
+
+(deftest with-output-to-string.1
+ (with-output-to-string (s))
+ "")
+
+(deftest with-output-to-string.2
+ (with-output-to-string (s) (write-char #\3 s))
+ "3")
+
+(deftest with-output-to-string.3
+ (with-output-to-string (s (make-array 10 :fill-pointer 0
+ :element-type 'character)))
+ nil)
+
+(deftest with-output-to-string.4
+ :notes (:allow-nil-arrays :nil-vectors-are-strings)
+ (let ((str (make-array 10 :fill-pointer 0 :element-type 'character)))
+ (values
+ (with-output-to-string
+ (s str :element-type nil)
+ (write-string "abcdef" s))
+ str))
+ "abcdef" "abcdef")
+
+(deftest with-output-to-string.5
+ (with-output-to-string (s (make-array 10 :fill-pointer 0
+ :element-type 'character))
+ (values)))
+
+(deftest with-output-to-string.6
+ (with-output-to-string (s (make-array 10 :fill-pointer 0
+ :element-type 'character))
+ (values 'a 'b 'c 'd))
+ a b c d)
+
+(deftest with-output-to-string.7
+ (with-output-to-string (s nil :element-type 'character)
+ (write-char #\& s))
+ "&")
+
+(deftest with-output-to-string.8
+ (let ((str (with-output-to-string (s nil :element-type 'base-char)
+ (write-char #\8 s))))
+ (assert (typep str 'simple-base-string))
+ str)
+ "8")
+
+(deftest with-output-to-string.9
+ :notes (:allow-nil-arrays :nil-vectors-are-strings)
+ (with-output-to-string (s nil :element-type nil))
+ "")
+
+(deftest with-output-to-string.10
+ (let* ((s1 (make-array 20 :element-type 'character
+ :initial-element #\.))
+ (s2 (make-array 10 :element-type 'character
+ :displaced-to s1
+ :displaced-index-offset 5
+ :fill-pointer 0)))
+
+ (values
+ (with-output-to-string
+ (s s2)
+ (write-string "0123456789" s))
+ s1
+ s2))
+ "0123456789"
+ ".....0123456789....."
+ "0123456789")
+
+(deftest with-output-to-string.11
+ (with-output-to-string (s) (declare (optimize safety)))
+ "")
+
+(deftest with-output-to-string.12
+ (with-output-to-string (s) (declare (optimize safety))
+ (declare (optimize (speed 0))))
+ "")
+
+(deftest with-output-to-string.13
+ (with-output-to-string
+ (s)
+ (write-char #\0 s)
+ (write-char #\4 s)
+ (write-char #\9 s))
+ "049")
+
+(deftest with-output-to-string.14
+ (let* ((str1 (make-array '(256) :element-type 'base-char :fill-pointer 0))
+ (str2 (with-output-to-string
+ (s nil :element-type 'base-char)
+ (loop for i below 256
+ for c = (code-char i)
+ when (typep c 'base-char)
+ do (progn (write-char c s)
+ (vector-push c str1))))))
+ (if (string= str1 str2) :good
+ (list str1 str2)))
+ :good)
+
+;;; Free declaration scope
+
+(deftest with-output-to-string.15
+ (block done
+ (let ((x :bad))
+ (declare (special x))
+ (let ((x :good))
+ (with-output-to-string (s (return-from done x))
+ (declare (special x))))))
+ :good)
+
+(deftest with-output-to-string.16
+ (block done
+ (let ((x :bad))
+ (declare (special x))
+ (let ((x :good)
+ (str (make-array '(10) :element-type 'character
+ :fill-pointer 0)))
+ (with-output-to-string (s str :element-type (return-from done x))
+ (declare (special x))))))
+ :good)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/write-char.lsp
@@ -0,0 +1,51 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Jan 18 20:50:31 2004
+;;;; Contains: Tests of WRITE-CHAR
+
+(in-package :cl-test)
+
+(deftest write-char.1
+ (loop for i from 0 to 255
+ for c = (code-char i)
+ when c
+ unless (string= (with-output-to-string
+ (*standard-output*)
+ (write-char c))
+ (string c))
+ collect c)
+ nil)
+
+(deftest write-char.2
+ (with-input-from-string
+ (is "abcd")
+ (with-output-to-string
+ (os)
+ (let ((*terminal-io* (make-two-way-stream is os)))
+ (write-char #\$ t)
+ (close *terminal-io*))))
+ "$")
+
+(deftest write-char.3
+ (with-output-to-string
+ (*standard-output*)
+ (write-char #\: nil))
+ ":")
+
+;;; Error tests
+
+(deftest write-char.error.1
+ (signals-error (write-char) program-error)
+ t)
+
+(deftest write-char.error.2
+ (signals-error
+ (with-output-to-string
+ (s)
+ (write-char #\a s nil))
+ program-error)
+ t)
+
+;;; More tests in other files
+
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/write-line.lsp
@@ -0,0 +1,165 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Mon Jan 19 06:49:26 2004
+;;;; Contains: Tests of WRITE-LINE
+
+(in-package :cl-test)
+
+(deftest write-line.1
+ (let (result)
+ (values
+ (with-output-to-string
+ (*standard-output*)
+ (setq result (multiple-value-list (write-line ""))))
+ result))
+ #.(string #\Newline)
+ (""))
+
+(deftest write-line.2
+ :notes (:nil-vectors-are-strings)
+ (let (result)
+ (values
+ (with-output-to-string
+ (*standard-output*)
+ (setq result
+ (multiple-value-list
+ (write-line (make-array '(0) :element-type nil)))))
+ result))
+ #.(string #\Newline)
+ (""))
+
+(deftest write-line.3
+ (let (result)
+ (values
+ (with-output-to-string
+ (*standard-output*)
+ (setq result (multiple-value-list (write-line "abcde"))))
+ result))
+ #.(concatenate 'string "abcde" (string #\Newline))
+ ("abcde"))
+
+(deftest write-line.4
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list (write-line "abcde" s :start 1))))
+ result))
+ #.(concatenate 'string "bcde" (string #\Newline))
+ ("abcde"))
+
+(deftest write-line.5
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list
+ (write-line "abcde" s :start 1 :end 3))))
+ result))
+ #.(concatenate 'string "bc" (string #\Newline))
+ ("abcde"))
+
+(deftest write-line.6
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list
+ (write-line "abcde" s :start 1 :end nil))))
+ result))
+ #.(concatenate 'string "bcde" (string #\Newline))
+ ("abcde"))
+
+(deftest write-line.7
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list (write-line "abcde" s :end 3))))
+ result))
+ #.(concatenate 'string "abc" (string #\Newline))
+ ("abcde"))
+
+(deftest write-line.8
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list
+ (write-line "abcde" s :end 3 :allow-other-keys nil))))
+ result))
+ #.(concatenate 'string "abc" (string #\Newline))
+ ("abcde"))
+
+(deftest write-line.9
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result
+ (multiple-value-list
+ (write-line "abcde" s :end 3 :allow-other-keys t :foo 'bar))))
+ result))
+ #.(concatenate 'string "abc" (string #\Newline))
+ ("abcde"))
+
+(deftest write-line.10
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list
+ (write-line "abcde" s :end 3 :end 2))))
+ result))
+ #.(concatenate 'string "abc" (string #\Newline))
+ ("abcde"))
+
+(deftest write-line.11
+ (with-input-from-string
+ (is "abcd")
+ (with-output-to-string
+ (os)
+ (let ((*terminal-io* (make-two-way-stream is os)))
+ (write-line "951" t)
+ (close *terminal-io*))))
+ #.(concatenate 'string "951" (string #\Newline)))
+
+(deftest write-line.12
+ (with-output-to-string
+ (*standard-output*)
+ (write-line "-=|!" nil))
+ #.(concatenate 'string "-=|!" (string #\Newline)))
+
+;;; Specialized string tests
+
+(deftest write-line.13
+ (do-special-strings
+ (s "abcde" nil)
+ (assert (equal
+ (with-output-to-string
+ (*standard-output*)
+ (multiple-value-list (write-line "abcde")))
+ #.(concatenate 'string "abcde" (string #\Newline)))))
+ nil)
+
+;;; Error tests
+
+(deftest write-line.error.1
+ (signals-error (write-line) program-error)
+ t)
+
+(deftest write-line.error.2
+ (signals-error (write-line "" *standard-output* :start) program-error)
+ t)
+
+(deftest write-line.error.3
+ (signals-error (write-line "" *standard-output* :foo nil) program-error)
+ t)
+
+(deftest write-line.error.4
+ (signals-error (write-line "" *standard-output*
+ :allow-other-keys nil
+ :foo nil)
+ program-error)
+ t)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/write-sequence.lsp
@@ -0,0 +1,225 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Wed Jan 21 04:07:58 2004
+;;;; Contains: Tests of WRITE-SEQUENCE
+
+(in-package :cl-test)
+
+(defmacro def-write-sequence-test (name input args &rest expected)
+ `(deftest ,name
+ (let ((s ,input))
+ (with-output-to-string
+ (os)
+ (assert (eq (write-sequence s os ,@args) s))))
+ ,@expected))
+
+;;; on strings
+
+(def-write-sequence-test write-sequence.string.1 "abcde" () "abcde")
+(def-write-sequence-test write-sequence.string.2 "abcde" (:start 1) "bcde")
+(def-write-sequence-test write-sequence.string.3 "abcde" (:end 3) "abc")
+(def-write-sequence-test write-sequence.string.4 "abcde"
+ (:start 1 :end 4) "bcd")
+(def-write-sequence-test write-sequence.string.5 "abcde" (:end nil) "abcde")
+(def-write-sequence-test write-sequence.string.6 "abcde" (:start 3 :end 3) "")
+(def-write-sequence-test write-sequence.string.7 "abcde"
+ (:end nil :start 1) "bcde")
+(def-write-sequence-test write-sequence.string.8 "abcde"
+ (:allow-other-keys nil) "abcde")
+(def-write-sequence-test write-sequence.string.9 "abcde"
+ (:allow-other-keys t :foo nil) "abcde")
+(def-write-sequence-test write-sequence.string.10 "abcde"
+ (:allow-other-keys t :allow-other-keys nil :foo nil) "abcde")
+(def-write-sequence-test write-sequence.string.11 "abcde"
+ (:bar 'x :allow-other-keys t) "abcde")
+(def-write-sequence-test write-sequence.string.12 "abcde"
+ (:start 1 :end 4 :start 2 :end 3) "bcd")
+(def-write-sequence-test write-sequence.string.13 "" () "")
+
+(defmacro def-write-sequence-special-test (name string args expected)
+ `(deftest ,name
+ (let ((str ,string)
+ (expected ,expected))
+ (do-special-strings
+ (s str nil)
+ (let ((out (with-output-to-string
+ (os)
+ (assert (eq (write-sequence s os ,@args) s)))))
+ (assert (equal out expected)))))
+ nil))
+
+(def-write-sequence-special-test write-sequence.string.14 "12345" () "12345")
+(def-write-sequence-special-test write-sequence.string.15 "12345" (:start 1 :end 3) "23")
+
+;;; on lists
+
+(def-write-sequence-test write-sequence.list.1 (coerce "abcde" 'list)
+ () "abcde")
+(def-write-sequence-test write-sequence.list.2 (coerce "abcde" 'list)
+ (:start 1) "bcde")
+(def-write-sequence-test write-sequence.list.3 (coerce "abcde" 'list)
+ (:end 3) "abc")
+(def-write-sequence-test write-sequence.list.4 (coerce "abcde" 'list)
+ (:start 1 :end 4) "bcd")
+(def-write-sequence-test write-sequence.list.5 (coerce "abcde" 'list)
+ (:end nil) "abcde")
+(def-write-sequence-test write-sequence.list.6 (coerce "abcde" 'list)
+ (:start 3 :end 3) "")
+(def-write-sequence-test write-sequence.list.7 (coerce "abcde" 'list)
+ (:end nil :start 1) "bcde")
+(def-write-sequence-test write-sequence.list.8 () () "")
+
+
+;;; on vectors
+
+(def-write-sequence-test write-sequence.simple-vector.1
+ (coerce "abcde" 'simple-vector) () "abcde")
+(def-write-sequence-test write-sequence.simple-vector.2
+ (coerce "abcde" 'simple-vector) (:start 1) "bcde")
+(def-write-sequence-test write-sequence.simple-vector.3
+ (coerce "abcde" 'simple-vector) (:end 3) "abc")
+(def-write-sequence-test write-sequence.simple-vector.4
+ (coerce "abcde" 'simple-vector) (:start 1 :end 4) "bcd")
+(def-write-sequence-test write-sequence.simple-vector.5
+ (coerce "abcde" 'simple-vector) (:end nil) "abcde")
+(def-write-sequence-test write-sequence.simple-vector.6
+ (coerce "abcde" 'simple-vector) (:start 3 :end 3) "")
+(def-write-sequence-test write-sequence.simple-vector.7
+ (coerce "abcde" 'simple-vector) (:end nil :start 1) "bcde")
+(def-write-sequence-test write-sequence.simple-vector.8 #() () "")
+
+;;; on vectors with fill pointers
+
+(def-write-sequence-test write-sequence.fill-vector.1
+ (make-array 10 :initial-contents "abcde " :fill-pointer 5) () "abcde")
+(def-write-sequence-test write-sequence.fill-vector.2
+ (make-array 10 :initial-contents "abcde " :fill-pointer 5)
+ (:start 1) "bcde")
+(def-write-sequence-test write-sequence.fill-vector.3
+ (make-array 10 :initial-contents "abcde " :fill-pointer 5)
+ (:end 3) "abc")
+(def-write-sequence-test write-sequence.fill-vector.4
+ (make-array 10 :initial-contents "abcde " :fill-pointer 5)
+ (:start 1 :end 4) "bcd")
+(def-write-sequence-test write-sequence.fill-vector.5
+ (make-array 10 :initial-contents "abcde " :fill-pointer 5)
+ (:end nil) "abcde")
+(def-write-sequence-test write-sequence.fill-vector.6
+ (make-array 10 :initial-contents "abcde " :fill-pointer 5)
+ (:start 3 :end 3) "")
+(def-write-sequence-test write-sequence.fill-vector.7
+ (make-array 10 :initial-contents "abcde " :fill-pointer 5)
+ (:end nil :start 1) "bcde")
+
+;;; on bit vectors
+
+(defmacro def-write-sequence-bv-test (name input args expected)
+ `(deftest ,name
+ (let ((s ,input)
+ (expected ,expected))
+ (with-open-file
+ (os "tmp.dat" :direction :output
+ :element-type '(unsigned-byte 8)
+ :if-exists :supersede)
+ (assert (eq (write-sequence s os ,@args) s)))
+ (with-open-file
+ (is "tmp.dat" :direction :input
+ :element-type '(unsigned-byte 8))
+ (loop for i from 0 below (length expected)
+ for e = (elt expected i)
+ always (eql (read-byte is) e))))
+ t))
+
+(def-write-sequence-bv-test write-sequence.bv.1 #*00111010
+ () #*00111010)
+(def-write-sequence-bv-test write-sequence.bv.2 #*00111010
+ (:start 1) #*0111010)
+(def-write-sequence-bv-test write-sequence.bv.3 #*00111010
+ (:end 5) #*00111)
+(def-write-sequence-bv-test write-sequence.bv.4 #*00111010
+ (:start 1 :end 6) #*01110)
+(def-write-sequence-bv-test write-sequence.bv.5 #*00111010
+ (:start 1 :end nil) #*0111010)
+(def-write-sequence-bv-test write-sequence.bv.6 #*00111010
+ (:start 1 :end nil :end 4) #*0111010)
+
+
+;;; Error tests
+
+(deftest write-sequence.error.1
+ (signals-error (write-sequence) program-error)
+ t)
+
+(deftest write-sequence.error.2
+ (signals-error (write-sequence "abcde") program-error)
+ t)
+
+(deftest write-sequence.error.3
+ (signals-error (write-sequence '(#\a . #\b) *standard-output*) type-error)
+ t)
+
+(deftest write-sequence.error.4
+ (signals-error (write-sequence #\a *standard-output*) type-error)
+ t)
+
+(deftest write-sequence.error.5
+ (signals-error (write-sequence "ABC" *standard-output* :start -1) type-error)
+ t)
+
+(deftest write-sequence.error.6
+ (signals-error (write-sequence "ABC" *standard-output* :start 'x) type-error)
+ t)
+
+(deftest write-sequence.error.7
+ (signals-error (write-sequence "ABC" *standard-output* :start 0.0)
+ type-error)
+ t)
+
+(deftest write-sequence.error.8
+ (signals-error (write-sequence "ABC" *standard-output* :end -1)
+ type-error)
+ t)
+
+(deftest write-sequence.error.9
+ (signals-error (write-sequence "ABC" *standard-output* :end 'x)
+ type-error)
+ t)
+
+(deftest write-sequence.error.10
+ (signals-error (write-sequence "ABC" *standard-output* :end 2.0)
+ type-error)
+ t)
+
+(deftest write-sequence.error.11
+ (signals-error (write-sequence "abcde" *standard-output*
+ :foo nil) program-error)
+ t)
+
+(deftest write-sequence.error.12
+ (signals-error (write-sequence "abcde" *standard-output*
+ :allow-other-keys nil :foo t)
+ program-error)
+ t)
+
+(deftest write-sequence.error.13
+ (signals-error (write-sequence "abcde" *standard-output* :start)
+ program-error)
+ t)
+
+(deftest write-sequence.error.14
+ (check-type-error #'(lambda (x) (write-sequence x *standard-output*))
+ #'sequencep)
+ nil)
+
+(deftest write-sequence.error.15
+ (check-type-error #'(lambda (x) (write-sequence "abcde" *standard-output*
+ :start x))
+ (typef 'unsigned-byte))
+ nil)
+
+(deftest write-sequence.error.16
+ (check-type-error #'(lambda (x) (write-sequence "abcde" *standard-output*
+ :end x))
+ (typef '(or null unsigned-byte)))
+ nil)
+
--- /dev/null
+++ gcl-2.6.12/ansi-tests/write-string.lsp
@@ -0,0 +1,156 @@
+;-*- Mode: Lisp -*-
+;;;; Author: Paul Dietz
+;;;; Created: Sun Jan 18 21:13:32 2004
+;;;; Contains: Tests of WRITE-STRING
+
+(in-package :cl-test)
+
+(deftest write-string.1
+ (let (result)
+ (values
+ (with-output-to-string
+ (*standard-output*)
+ (setq result (multiple-value-list (write-string ""))))
+ result))
+ "" (""))
+
+(deftest write-string.2
+ :notes (:nil-vectors-are-strings)
+ (let (result)
+ (values
+ (with-output-to-string
+ (*standard-output*)
+ (setq result
+ (multiple-value-list
+ (write-string (make-array '(0) :element-type nil)))))
+ result))
+ "" (""))
+
+(deftest write-string.3
+ (let (result)
+ (values
+ (with-output-to-string
+ (*standard-output*)
+ (setq result (multiple-value-list (write-string "abcde"))))
+ result))
+ "abcde" ("abcde"))
+
+(deftest write-string.4
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list (write-string "abcde" s :start 1))))
+ result))
+ "bcde" ("abcde"))
+
+(deftest write-string.5
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list
+ (write-string "abcde" s :start 1 :end 3))))
+ result))
+ "bc" ("abcde"))
+
+(deftest write-string.6
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list
+ (write-string "abcde" s :start 1 :end nil))))
+ result))
+ "bcde" ("abcde"))
+
+(deftest write-string.7
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list (write-string "abcde" s :end 3))))
+ result))
+ "abc" ("abcde"))
+
+(deftest write-string.8
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list
+ (write-string "abcde" s :end 3 :allow-other-keys nil))))
+ result))
+ "abc" ("abcde"))
+
+(deftest write-string.9
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result
+ (multiple-value-list
+ (write-string "abcde" s :end 3 :allow-other-keys t :foo 'bar))))
+ result))
+ "abc" ("abcde"))
+
+(deftest write-string.10
+ (let (result)
+ (values
+ (with-output-to-string
+ (s)
+ (setq result (multiple-value-list
+ (write-string "abcde" s :end 3 :end 2))))
+ result))
+ "abc" ("abcde"))
+
+(deftest write-string.11
+ (with-input-from-string
+ (is "abcd")
+ (with-output-to-string
+ (os)
+ (let ((*terminal-io* (make-two-way-stream is os)))
+ (write-string "951" t)
+ (close *terminal-io*))))
+ "951")
+
+(deftest write-string.12
+ (with-output-to-string
+ (*standard-output*)
+ (write-string "-=|!" nil))
+ "-=|!")
+
+;;; Specialized string tests
+
+(deftest write-string.13
+ (let (result)
+ (do-special-strings
+ (s "abcde" nil)
+ (assert (equal
+ (with-output-to-string
+ (*standard-output*)
+ (setq result (multiple-value-list (write-string "abcde"))))
+ "abcde"))
+ (assert (equal result '("abcde")))))
+ nil)
+
+;;; Error tests
+
+(deftest write-string.error.1
+ (signals-error (write-string) program-error)
+ t)
+
+(deftest write-string.error.2
+ (signals-error (write-string "" *standard-output* :start) program-error)
+ t)
+
+(deftest write-string.error.3
+ (signals-error (write-string "" *standard-output* :foo nil) program-error)
+ t)
+
+(deftest write-string.error.4
+ (signals-error (write-string "" *standard-output*
+ :allow-other-keys nil
+ :foo nil)
+ program-error)
+ t)
--- gcl-2.6.12.orig/cmpnew/gcl_cmpfun.lsp
+++ gcl-2.6.12/cmpnew/gcl_cmpfun.lsp
@@ -556,6 +556,14 @@
((null type) nil)
((setq f (assoc type *type-alist* :test 'equal))
(list (cdr f) x))
+ ((setq f (when (symbolp type) (get type 'si::type-predicate)))
+ (list f x))
+ ((and (consp type) (eq (car type) 'or))
+ `(or ,@(mapcar (lambda (y) `(typep ,x ',y)) (cdr type))))
+ ((and (consp type) (eq (car type) 'member))
+ `(or ,@(mapcar (lambda (y) `(eql ,x ',y)) (cdr type))))
+ ((and (consp type) (eq (car type) 'eql))
+ `(eql ,x ',(cadr type)))
((and (consp type)
(or (and (eq (car type) 'vector)
(null (cddr type)))
--- gcl-2.6.12.orig/cmpnew/gcl_cmplabel.lsp
+++ gcl-2.6.12/cmpnew/gcl_cmplabel.lsp
@@ -44,7 +44,7 @@
`(when (cdr ,label) (wt-nl "goto T" (car ,label) ";")(wt-nl1 "T" (car ,label) ":;")))
(defmacro wt-go (label)
- `(progn (rplacd ,label t) (wt "goto T" (car ,label) ";")))
+ `(progn (rplacd ,label t) (wt "goto T" (car ,label) ";")(wt-nl)))
(defvar *restore-avma* nil)
--- gcl-2.6.12.orig/cmpnew/gcl_cmplam.lsp
+++ gcl-2.6.12/cmpnew/gcl_cmplam.lsp
@@ -407,6 +407,12 @@
(c2lambda-expr-without-key lambda-list body)))
))
+(defun decl-body-safety (body)
+ (case (car body)
+ (decl-body (or (cadr (assoc 'safety (caddr body))) 0))
+ ((let let*) (decl-body-safety (car (last body))))
+ (otherwise 0)))
+
(defun c2lambda-expr-without-key
(lambda-list body
&aux (requireds (car lambda-list))
@@ -439,7 +445,7 @@
(when rest (do-decl rest))
)
;;; check arguments
- (when (or *safe-compile* *compiler-check-args*)
+ (when (or *safe-compile* *compiler-check-args* (plusp (decl-body-safety body)));FIXME
(cond ((or rest optionals)
(when requireds
(wt-nl "if(vs_top-vs_base<" (length requireds)
@@ -448,7 +454,7 @@
(wt-nl "if(vs_top-vs_base>"
(+ (length requireds) (length optionals))
") too_many_arguments();")))
- (t (wt-nl "check_arg(" (length requireds) ");"))))
+ (t (when requireds (wt-nl "check_arg(" (length requireds) ");")))))
;;; Allocate the parameters.
(dolist** (var requireds) (setf (var-ref var) (vs-push)))
@@ -562,7 +568,7 @@
(when (cadddr kwd) (do-decl (cadddr kwd))))
)
;;; Check arguments.
- (when (and (or *safe-compile* *compiler-check-args*) requireds)
+ (when (and (or *safe-compile* *compiler-check-args* (plusp (decl-body-safety body))) requireds);FIXME
(when requireds
(wt-nl "if(vs_top-vs_base<" (length requireds)
") too_few_arguments();")))
--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp
+++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp
@@ -52,7 +52,7 @@
(defvar *cmpinclude-string*
(si::file-to-string
(namestring
- (make-pathname :directory (append (pathname-directory si::*system-directory*) (list :parent "h"))
+ (make-pathname :directory (append (pathname-directory si::*system-directory*) (list :back "h"))
:name "cmpinclude" :type "h"))))
@@ -160,7 +160,7 @@
(defun compile-file1 (input-pathname
- &key (output-file (truename input-pathname))
+ &key (output-file (merge-pathnames ".o" (truename input-pathname)))
(o-file t)
(c-file *default-c-file*)
(h-file *default-h-file*)
@@ -175,7 +175,7 @@
(*c-debug* c-debug)
(*compile-print* (or print *compile-print*))
(*package* *package*)
- (*DEFAULT-PATHNAME-DEFAULTS* #"")
+ (*DEFAULT-PATHNAME-DEFAULTS* #p"")
(*data* (list (make-array 50 :fill-pointer 0 :adjustable t) nil nil))
*init-name*
(*fasd-data* *fasd-data*)
@@ -186,25 +186,25 @@
(cond (*compiler-in-use*
(format t "~&The compiler was called recursively.~%~
Cannot compile ~a.~%"
- (namestring (merge-pathnames input-pathname #".lsp")))
+ (namestring (merge-pathnames input-pathname #p".lsp")))
(setq *error-p* t)
(return-from compile-file1 (values)))
(t (setq *error-p* nil)
(setq *compiler-in-use* t)))
- (unless (probe-file (merge-pathnames input-pathname #".lsp"))
+ (unless (probe-file (merge-pathnames input-pathname #p".lsp"))
(format t "~&The source file ~a is not found.~%"
- (namestring (merge-pathnames input-pathname #".lsp")))
+ (namestring (merge-pathnames input-pathname #p".lsp")))
(setq *error-p* t)
(return-from compile-file1 (values)))
(when *compile-verbose*
- (format t "~&Compiling ~a.~%" (namestring (merge-pathnames input-pathname #".lsp"))))
+ (format t "~&Compiling ~a.~%" (namestring (merge-pathnames input-pathname #p".lsp"))))
(and *record-call-info* (clear-call-table))
(with-open-file
- (*compiler-input* (merge-pathnames input-pathname #".lsp"))
+ (*compiler-input* (merge-pathnames input-pathname #p".lsp"))
(cond ((numberp *split-files*)
@@ -232,8 +232,11 @@ Cannot compile ~a.~%"
(device (or (and (not (null output-file))
(pathname-device output-file))
(pathname-device input-pathname)))
+ (typ (or (and (not (null output-file))
+ (pathname-type output-file))
+ "o"))
- (o-pathname (get-output-pathname o-file "o" name dir device))
+ (o-pathname (get-output-pathname o-file typ name dir device))
(c-pathname (get-output-pathname c-file "c" name dir device))
(h-pathname (get-output-pathname h-file "h" name dir device))
(data-pathname (get-output-pathname data-file "data" name dir device)))
@@ -351,7 +354,7 @@ Cannot compile ~a.~%"
(wt-data1 form) ;; this binds all the print stuff
))
-(defun compile (name &optional def &aux tem gaz (*default-pathname-defaults* #"."))
+(defun compile (name &optional def &aux tem gaz (*default-pathname-defaults* #p"."))
(cond ((not(symbolp name)) (error "Must be a name"))
((and (consp def)
@@ -797,7 +800,7 @@ Cannot compile ~a.~%"
(with-open-file (st (namestring map) :direction :output))
(safe-system
- (let* ((par (namestring (make-pathname :directory '(:parent))))
+ (let* ((par (namestring (make-pathname :directory '(:back))))
(i (concatenate 'string " " par))
(j (concatenate 'string " " si::*system-directory* par)))
(format nil "~a ~a ~a ~a -L~a ~a ~a ~a"
--- gcl-2.6.12.orig/cmpnew/gcl_cmpopt.lsp
+++ gcl-2.6.12/cmpnew/gcl_cmpopt.lsp
@@ -1170,6 +1170,14 @@ type_of(#0)==t_complex")
(push '((t) t #.(flags ans)"coerce_to_string(#0)")
(get 'string 'inline-always))
+;;PATHNAME-DESIGNATORP
+(push '((t) boolean #.(flags)"pathname_designatorp(#0)")
+ (get 'si::pathname-designatorp 'inline-always))
+
+;;PATHNAMEP
+(push '((t) boolean #.(flags)"pathnamep(#0)")
+ (get 'pathnamep 'inline-always))
+
;;STRINGP
(push '((t) boolean #.(flags)"type_of(#0)==t_string")
(get 'stringp 'inline-always))
--- gcl-2.6.12.orig/cmpnew/gcl_cmptop.lsp
+++ gcl-2.6.12/cmpnew/gcl_cmptop.lsp
@@ -209,7 +209,7 @@
(cond ((not sp) "code")
((not (pathnamep p)) (init-name (pathname p) sp gp dc nt))
- (gp (init-name (truename (merge-pathnames p #".lsp")) sp nil dc nt))
+ (gp (init-name (truename (merge-pathnames p #p".lsp")) sp nil dc nt))
((pathname-type p)
(init-name (make-pathname
:host (pathname-host p)
--- gcl-2.6.12.orig/cmpnew/gcl_collectfn.lsp
+++ gcl-2.6.12/cmpnew/gcl_collectfn.lsp
@@ -240,22 +240,20 @@
(defvar *warn-on-multiple-fn-definitions* t)
-(defun add-fn-data (lis &aux tem file)
- (let ((file (and (setq file (si::fp-input-stream *standard-input*))
- (truename file))))
+(defun add-fn-data (lis &aux tem (file *load-truename*))
(dolist (v lis)
- (cond ((eql (fn-name v) 'other-form)
- (setf (fn-name v) (intern
- (concatenate 'string "OTHER-FORM-"
- (namestring file))))
- (setf (get (fn-name v) 'other-form) t)))
- (setf (gethash (fn-name v) *call-table*) v)
- (when *warn-on-multiple-fn-definitions*
- (when (setq tem (gethash (fn-name v) *file-table*))
- (unless (equal tem file)
- (warn 'simple-warning :format-control "~% ~a redefined in ~a. Originally in ~a."
- :format-arguments (list (fn-name v) file tem)))))
- (setf (gethash (fn-name v) *file-table*) file))))
+ (cond ((eql (fn-name v) 'other-form)
+ (setf (fn-name v) (intern
+ (concatenate 'string "OTHER-FORM-"
+ (namestring file))))
+ (setf (get (fn-name v) 'other-form) t)))
+ (setf (gethash (fn-name v) *call-table*) v)
+ (when *warn-on-multiple-fn-definitions*
+ (when (setq tem (gethash (fn-name v) *file-table*))
+ (unless (equal tem file)
+ (warn 'simple-warning :format-control "~% ~a redefined in ~a. Originally in ~a."
+ :format-arguments (list (fn-name v) file tem)))))
+ (setf (gethash (fn-name v) *file-table*) file)))
(defun dump-fn-data (&optional (file "fn-data.lsp")
&aux (*package* (find-package "COMPILER"))
--- gcl-2.6.12.orig/cmpnew/gcl_lfun_list.lsp
+++ gcl-2.6.12/cmpnew/gcl_lfun_list.lsp
@@ -20,7 +20,6 @@
(DEFSYSFUN 'CHAR-NAME "Lchar_name" '(T) 'T NIL NIL)
(DEFSYSFUN 'RASSOC-IF "Lrassoc_if" '(T T) 'T NIL NIL)
(DEFSYSFUN 'MAKE-LIST "Lmake_list" '(T *) 'T NIL NIL)
-(DEFSYSFUN 'HOST-NAMESTRING "Lhost_namestring" '(T) 'STRING NIL NIL)
(DEFSYSFUN 'MAKE-ECHO-STREAM "Lmake_echo_stream" '(T T) 'T NIL NIL)
;(DEFSYSFUN 'NTH "Lnth" '(T T) 'T NIL NIL)
(DEFSYSFUN 'SIN "Lsin" '(T) 'T NIL NIL)
@@ -31,8 +30,6 @@
;#-clcs (DEFSYSFUN 'OPEN "Lopen" '(T *) 'T NIL NIL)
(DEFSYSFUN 'BOTH-CASE-P "Lboth_case_p" '(T) 'T NIL T)
(DEFSYSFUN 'NULL "Lnull" '(T) 'T NIL T)
-(DEFSYSFUN 'RENAME-FILE "Lrename_file" '(T T) 'T NIL NIL)
-(DEFSYSFUN 'FILE-AUTHOR "Lfile_author" '(T) 'T NIL NIL)
(DEFSYSFUN 'STRING-CAPITALIZE "Lstring_capitalize" '(T *) 'STRING NIL
NIL)
(DEFSYSFUN 'MACROEXPAND "Lmacroexpand" '(T *) '(VALUES T T) NIL NIL)
@@ -45,7 +42,6 @@
(DEFSYSFUN 'LENGTH "Llength" '(T) 'FIXNUM T NIL)
(DEFSYSFUN 'RASSOC "Lrassoc" '(T T *) 'T NIL NIL)
(DEFSYSFUN 'PPRINT "Lpprint" '(T *) 'T NIL NIL)
-(DEFSYSFUN 'PATHNAME-HOST "Lpathname_host" '(T) 'T NIL NIL)
(DEFSYSFUN 'NSUBST-IF-NOT "Lnsubst_if_not" '(T T T *) 'T NIL NIL)
(DEFSYSFUN 'FILE-POSITION "Lfile_position" '(T *) 'T NIL NIL)
(DEFSYSFUN 'STRING< "Lstring_l" '(T T *) 'T NIL NIL)
@@ -58,14 +54,11 @@
(DEFSYSFUN 'STRING>= "Lstring_ge" '(T T *) 'T NIL NIL)
(DEFSYSFUN 'REALPART "Lrealpart" '(T) 'T NIL NIL)
;;broken on suns..
-;(DEFSYSFUN 'USER-HOMEDIR-PATHNAME "Luser_homedir_pathname" '(*) 'T NIL
-; NIL)
(DEFSYSFUN 'NBUTLAST "Lnbutlast" '(T *) 'T NIL NIL)
(DEFSYSFUN 'ARRAY-DIMENSION "Larray_dimension" '(T T) 'FIXNUM NIL NIL)
(DEFSYSFUN 'CDR "Lcdr" '(T) 'T NIL NIL)
;(DEFSYSFUN 'EQL "Leql" '(T T) 'T NIL T)
(DEFSYSFUN 'LOG "Llog" '(T *) 'T NIL NIL)
-(DEFSYSFUN 'DIRECTORY "Ldirectory" '(T) 'T NIL NIL)
(DEFSYSFUN 'STRING-NOT-EQUAL "Lstring_not_equal" '(T T *) 'T NIL NIL)
(DEFSYSFUN 'SHADOWING-IMPORT "Lshadowing_import" '(T *) 'T NIL NIL)
(DEFSYSFUN 'MAPC "Lmapc" '(T T *) 'T NIL NIL)
@@ -78,8 +71,6 @@
(DEFSYSFUN 'MAKE-SYMBOL "Lmake_symbol" '(T) 'T NIL NIL)
(DEFSYSFUN 'STRING-RIGHT-TRIM "Lstring_right_trim" '(T T) 'STRING NIL
NIL)
-(DEFSYSFUN 'ENOUGH-NAMESTRING "Lenough_namestring" '(T *) 'STRING NIL
- NIL)
(DEFSYSFUN 'PRINT "Lprint" '(T *) 'T NIL NIL)
(DEFSYSFUN 'CDDAAR "Lcddaar" '(T) 'T NIL NIL)
(DEFSYSFUN 'CDADAR "Lcdadar" '(T) 'T NIL NIL)
@@ -187,7 +178,6 @@
NIL)
(DEFSYSFUN 'COPY-ALIST "Lcopy_alist" '(T) 'T NIL NIL)
(DEFSYSFUN 'ATAN "Latan" '(T *) 'T NIL NIL)
-(DEFSYSFUN 'DELETE-FILE "Ldelete_file" '(T) 'T NIL NIL)
(DEFSYSFUN 'FLOAT-RADIX "Lfloat_radix" '(T) 'FIXNUM NIL NIL)
(DEFSYSFUN 'SYMBOL-NAME "Lsymbol_name" '(T) 'STRING NIL NIL)
(DEFSYSFUN 'CLEAR-INPUT "Lclear_input" '(*) 'T NIL NIL)
@@ -215,8 +205,6 @@
(DEFSYSFUN 'SXHASH "Lsxhash" '(T) 'FIXNUM NIL NIL)
(DEFSYSFUN 'LISTEN "Llisten" '(*) 'T NIL NIL)
(DEFSYSFUN 'ARRAYP "Larrayp" '(T) 'T NIL T)
-(DEFSYSFUN 'MAKE-PATHNAME "Lmake_pathname" '(*) 'T NIL NIL)
-(DEFSYSFUN 'PATHNAME-TYPE "Lpathname_type" '(T) 'T NIL NIL)
(DEFSYSFUN 'FUNCALL "Lfuncall" '(T *) 'T NIL NIL)
(DEFSYSFUN 'CLRHASH "Lclrhash" '(T) 'T NIL NIL)
(DEFSYSFUN 'GRAPHIC-CHAR-P "Lgraphic_char_p" '(T) 'T NIL T)
@@ -227,14 +215,12 @@
(DEFSYSFUN 'SUBST-IF "Lsubst_if" '(T T T *) 'T NIL NIL)
(DEFSYSFUN 'COMPLEXP "Lcomplexp" '(T) 'T NIL T)
(DEFSYSFUN 'READ-LINE "Lread_line" '(*) '(VALUES T T) NIL NIL)
-(DEFSYSFUN 'PATHNAMEP "Lpathnamep" '(T) 'T NIL T)
(DEFSYSFUN 'MAX "Lmax" '(T *) 'T NIL NIL)
(DEFSYSFUN 'IN-PACKAGE "Lin_package" '(T *) 'T NIL NIL)
(DEFSYSFUN 'READTABLEP "Lreadtablep" '(T) 'T NIL T)
(DEFSYSFUN 'FLOAT-SIGN "Lfloat_sign" '(T *) 'T NIL NIL)
(DEFSYSFUN 'CHARACTERP "Lcharacterp" '(T) 'T NIL T)
(DEFSYSFUN 'READ "Lread" '(*) 'T NIL NIL)
-(DEFSYSFUN 'NAMESTRING "Lnamestring" '(T) 'T NIL NIL)
(DEFSYSFUN 'UNREAD-CHAR "Lunread_char" '(T *) 'T NIL NIL)
(DEFSYSFUN 'CDAAR "Lcdaar" '(T) 'T NIL NIL)
(DEFSYSFUN 'CADAR "Lcadar" '(T) 'T NIL NIL)
@@ -267,10 +253,8 @@
(DEFSYSFUN 'PACKAGEP "Lpackagep" '(T) 'T NIL T)
(DEFSYSFUN 'INPUT-STREAM-P "Linput_stream_p" '(T) 'T NIL T)
(DEFSYSFUN '>= "Lmonotonically_nonincreasing" '(T *) 'T NIL T)
-(DEFSYSFUN 'PATHNAME "Lpathname" '(T) 'T NIL NIL)
;(DEFSYSFUN 'EQ "Leq" '(T T) 'T NIL T)
(DEFSYSFUN 'MAKE-CHAR "Lmake_char" '(T *) 'CHARACTER NIL NIL)
-(DEFSYSFUN 'FILE-NAMESTRING "Lfile_namestring" '(T) 'STRING NIL NIL)
(DEFSYSFUN 'CHARACTER "Lcharacter" '(T) 'CHARACTER NIL NIL)
(DEFSYSFUN 'SYMBOL-FUNCTION "Lsymbol_function" '(T) 'T NIL NIL)
(DEFSYSFUN 'CONSTANTP "Lconstantp" '(T) 'T NIL T)
@@ -307,13 +291,9 @@
(DEFSYSFUN 'NUMBERP "Lnumberp" '(T) 'T NIL T)
(DEFSYSFUN 'COPY-READTABLE "Lcopy_readtable" '(*) 'T NIL NIL)
(DEFSYSFUN 'RANDOM-STATE-P "Lrandom_state_p" '(T) 'T NIL T)
-(DEFSYSFUN 'DIRECTORY-NAMESTRING "Ldirectory_namestring" '(T) 'STRING
- NIL NIL)
(DEFSYSFUN 'STANDARD-CHAR-P "Lstandard_char_p" '(T) 'T NIL T)
-(DEFSYSFUN 'TRUENAME "Ltruename" '(T) 'T NIL NIL)
(DEFSYSFUN 'IDENTITY "Lidentity" '(T) 'T NIL NIL)
(DEFSYSFUN 'NREVERSE "Lnreverse" '(T) 'T NIL NIL)
-(DEFSYSFUN 'PATHNAME-DEVICE "Lpathname_device" '(T) 'T NIL NIL)
(DEFSYSFUN 'UNINTERN "Lunintern" '(T *) 'T NIL NIL)
(DEFSYSFUN 'UNEXPORT "Lunexport" '(T *) 'T NIL NIL)
(DEFSYSFUN 'FLOAT-PRECISION "Lfloat_precision" '(T) 'FIXNUM NIL NIL)
@@ -324,7 +304,7 @@
(DEFSYSFUN 'READ-CHAR-NO-HANG "Lread_char_no_hang" '(*) 'T NIL NIL)
(DEFSYSFUN 'FRESH-LINE "Lfresh_line" '(*) 'T NIL NIL)
(DEFSYSFUN 'WRITE-CHAR "Lwrite_char" '(T *) 'T NIL NIL)
-(DEFSYSFUN 'PARSE-NAMESTRING "Lparse_namestring" '(T *) 'T NIL NIL)
+;(DEFSYSFUN 'PARSE-NAMESTRING "Lparse_namestring" '(T *) 'T NIL NIL)
(DEFSYSFUN 'STRING-NOT-LESSP "Lstring_not_lessp" '(T T *) 'T NIL NIL)
(DEFSYSFUN 'CHAR "Lchar" '(T T) 'CHARACTER NIL NIL)
(DEFSYSFUN 'AREF "Laref" '(T *) 'T NIL NIL)
@@ -338,7 +318,6 @@
(DEFSYSFUN 'DIGIT-CHAR-P "Ldigit_char_p" '(T *) 'T NIL NIL)
;; #-clcs (DEFSYSFUN 'ERROR "Lerror" '(T *) 'T NIL NIL)
(DEFSYSFUN 'CHAR/= "Lchar_neq" '(T *) 'T NIL T)
-(DEFSYSFUN 'PATHNAME-DIRECTORY "Lpathname_directory" '(T) 'T NIL NIL)
(DEFSYSFUN 'CDAAAR "Lcdaaar" '(T) 'T NIL NIL)
(DEFSYSFUN 'CADAAR "Lcadaar" '(T) 'T NIL NIL)
(DEFSYSFUN 'CAADAR "Lcaadar" '(T) 'T NIL NIL)
@@ -349,7 +328,6 @@
(DEFSYSFUN 'FORMAT "Lformat" '(T T *) 'T NIL NIL)
(DEFSYSFUN 'COMPILED-FUNCTION-P "Lcompiled_function_p" '(T) 'T NIL T)
(DEFSYSFUN 'SUBLIS "Lsublis" '(T T *) 'T NIL NIL)
-(DEFSYSFUN 'PATHNAME-NAME "Lpathname_name" '(T) 'T NIL NIL)
(DEFSYSFUN 'IMPORT "Limport" '(T *) 'T NIL NIL)
(DEFSYSFUN 'LOGXOR "Llogxor" '(*) 'T NIL NIL)
(DEFSYSFUN 'RASSOC-IF-NOT "Lrassoc_if_not" '(T T) 'T NIL NIL)
@@ -366,9 +344,7 @@
(DEFSYSFUN 'GET-PROPERTIES "Lget_properties" '(T T) '* NIL NIL)
(DEFSYSFUN 'STRING<= "Lstring_le" '(T T *) 'T NIL NIL)
(DEFSYSFUN 'EVALHOOK "siLevalhook" '(T T T *) 'T NIL NIL)
-(DEFSYSFUN 'FILE-WRITE-DATE "Lfile_write_date" '(T) 'T NIL NIL)
(DEFSYSFUN 'LOGCOUNT "Llogcount" '(T) 'T NIL NIL)
-(DEFSYSFUN 'MERGE-PATHNAMES "Lmerge_pathnames" '(T *) 'T NIL NIL)
(DEFSYSFUN 'MEMBER-IF "Lmember_if" '(T T *) 'T NIL NIL)
(DEFSYSFUN 'READ-BYTE "Lread_byte" '(T *) 'T NIL NIL)
(DEFSYSFUN 'SIMPLE-VECTOR-P "Lsimple_vector_p" '(T) 'T NIL T)
@@ -381,10 +357,8 @@
(DEFSYSFUN 'GET "Lget" '(T T *) 'T NIL NIL)
(DEFSYSFUN 'MOD "Lmod" '(T T) 'T NIL NIL)
(DEFSYSFUN 'DIGIT-CHAR "Ldigit_char" '(T *) 'CHARACTER NIL NIL)
-(DEFSYSFUN 'PROBE-FILE "Lprobe_file" '(T) 'T NIL NIL)
(DEFSYSFUN 'STRING-LEFT-TRIM "Lstring_left_trim" '(T T) 'STRING NIL
NIL)
-(DEFSYSFUN 'PATHNAME-VERSION "Lpathname_version" '(T) 'T NIL NIL)
(DEFSYSFUN 'WRITE-LINE "Lwrite_line" '(T *) 'T NIL NIL)
(DEFSYSFUN 'EVAL "Leval" '(T) 'T NIL NIL)
(DEFSYSFUN 'ATOM "Latom" '(T) 'T NIL T)
--- gcl-2.6.12.orig/configure
+++ gcl-2.6.12/configure
@@ -4183,7 +4183,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
#fi
# subst GCC not only under 386-linux, but where available -- CM
-TCFLAGS="-fsigned-char"
+TCFLAGS="-fsigned-char -fno-builtin-malloc -fno-builtin-free"
if test "$GCC" = "yes" ; then
--- gcl-2.6.12.orig/configure.in
+++ gcl-2.6.12/configure.in
@@ -483,7 +483,7 @@ AC_SUBST(CC)
#fi
# subst GCC not only under 386-linux, but where available -- CM
-TCFLAGS="-fsigned-char"
+TCFLAGS="-fsigned-char -fno-builtin-malloc -fno-builtin-free"
if test "$GCC" = "yes" ; then
--- gcl-2.6.12.orig/h/att_ext.h
+++ gcl-2.6.12/h/att_ext.h
@@ -116,25 +116,14 @@ float object_to_float();
double object_to_double();
/* error.c */
-EXTER object sKerror;
-EXTER object sKwrong_type_argument;
EXTER object sKcatch;
EXTER object sKprotect;
EXTER object sKcatchall;
-EXTER object sKtoo_few_arguments;
-EXTER object sKtoo_many_arguments;
-EXTER object sKunexpected_keyword;
-EXTER object sKinvalid_form;
-EXTER object sKunbound_variable;
-EXTER object sKinvalid_variable;
-EXTER object sKundefined_function;
-EXTER object sKinvalid_function;
EXTER object sKdatum;
EXTER object sKexpected_type;
EXTER object sKpackage;
EXTER object sKformat_control;
EXTER object sKformat_arguments;
-EXTER object sKpackage_error;
object wrong_type_argument();
EXTER object sSuniversal_error_handler;
@@ -394,10 +383,11 @@ EXTER object sKname;
EXTER object sKtype;
EXTER object sKversion;
EXTER object sKdefaults;
-EXTER object sKroot;
-EXTER object sKcurrent;
-EXTER object sKparent;
-EXTER object sKper;
+
+EXTER object sKabsolute;
+EXTER object sKrelative;
+EXTER object sKup;
+
/* object parse_namestring(); */
object coerce_to_pathname();
/* object default_device(); */
--- gcl-2.6.12.orig/h/compdefs.h
+++ gcl-2.6.12/h/compdefs.h
@@ -115,3 +115,5 @@ SIGNED_CHAR(x)
FEerror(x,y...)
FEwrong_type_argument(x,y)
BIT_ENDIAN(x)
+pathname_designatorp(x)
+pathnamep(x)
--- gcl-2.6.12.orig/h/error.h
+++ gcl-2.6.12/h/error.h
@@ -22,6 +22,7 @@ PFN(numberp)
PFN(characterp)
PFN(symbolp)
PFN(stringp)
+PFN(pathnamep)
PFN(string_symbolp)
PFN(packagep)
PFN(consp)
@@ -52,6 +53,7 @@ PFN(functionp)
#define check_type_character(a_) TPE(a_,characterp_fn,sLcharacter)
#define check_type_sym(a_) TPE(a_,symbolp_fn,sLsymbol)
#define check_type_string(a_) TPE(a_,stringp_fn,sLstring)
+#define check_type_pathname(a_) TPE(a_,pathnamep_fn,sLpathname)
#define check_type_or_string_symbol(a_) TPE(a_,string_symbolp_fn,TSor_symbol_string)
#define check_type_or_symbol_string(a_) TPE(a_,string_symbolp_fn,TSor_symbol_string)
#define check_type_or_pathname_string_symbol_stream(a_) TPE(a_,pathname_string_symbol_streamp_fn,TSor_pathname_string_symbol_stream)
@@ -79,12 +81,6 @@ PFN(functionp)
set_type_of((a_),t_fixnum);\
(a_)->FIX.FIXVAL=(b_);}
-/*FIXME the stack stuff is dangerous It works for error handling, but
- simple errors may evan pass the format tring up the stack as a slot
- in ansi*/
-/* #define TYPE_ERROR(a_,b_) {stack_string(tp_err,"~S is not of type ~S.");\ */
-/* Icall_error_handler(sKwrong_type_argument,tp_err,2,(a_),(b_));} */
-
object ihs_top_function_name(ihs_ptr h);
#define FEerror(a_,b_...) Icall_error_handler(sLerror,null_string,\
4,sKformat_control,make_simple_string(a_),sKformat_arguments,list(b_))
--- gcl-2.6.12.orig/h/lu.h
+++ gcl-2.6.12/h/lu.h
@@ -301,7 +301,7 @@ struct pathname {
object pn_name;
object pn_type;
object pn_version;
- SPAD;
+ object pn_namestring;
};
struct cfun {
--- gcl-2.6.12.orig/h/notcomp.h
+++ gcl-2.6.12/h/notcomp.h
@@ -47,12 +47,6 @@ EXTER object user_package;
else *__p++ = va_arg(ap,object);} \
va_end(ap)
-/* #undef endp */
-
-/* #define endp(obje) ((enum type)((endp_temp = (obje))->d.t) == t_cons ? \ */
-/* FALSE : endp_temp == Cnil ? TRUE : \ */
-/* endp1(endp_temp)) */
-
#ifndef NO_DEFUN
#undef DEFUN
#define DEFUN(string,ret,fname,pack,min,max, flags, ret0a0,a12,a34,a56,doc) ret fname
@@ -234,7 +228,7 @@ EXTER bool left_trim;
EXTER bool right_trim;
int (*casefun)();
-#define Q_SIZE 128
+#define Q_SIZE 256
#define IS_SIZE 256
struct printStruct {
@@ -300,6 +294,8 @@ gcl_init_cmp_anon(void);
#include "gmp_wrappers.h"
+char FN1[PATH_MAX],FN2[PATH_MAX],FN3[PATH_MAX],FN4[PATH_MAX],FN5[PATH_MAX];
+
#include <errno.h>
#define massert(a_) ({errno=0;if (!(a_)||errno) assert_error(#a_,__LINE__,__FILE__,__FUNCTION__);})
--- gcl-2.6.12.orig/h/object.h
+++ gcl-2.6.12/h/object.h
@@ -163,24 +163,6 @@ enum aelttype { /* array element type
#define STREF(type,x,i) (*((type *)(((char *)((x)->str.str_self))+(i))))
#define STSET(type,x,i,val) do{SGC_TOUCH(x);STREF(type,x,i) = (val);} while(0)
-
-
-enum smmode { /* stream mode */
- smm_input, /* input */
- smm_output, /* output */
- smm_io, /* input-output */
- smm_probe, /* probe */
- smm_synonym, /* synonym */
- smm_broadcast, /* broadcast */
- smm_concatenated, /* concatenated */
- smm_two_way, /* two way */
- smm_echo, /* echo */
- smm_string_input, /* string input */
- smm_string_output, /* string output */
- smm_user_defined, /* for user defined */
- smm_socket /* Socket stream */
-};
-
/* for any stream that takes writec_char, directly (not two_way or echo)
ie. smm_output,smm_io, smm_string_output, smm_socket
*/
@@ -217,9 +199,9 @@ enum gcl_sm_flags {
gcl_sm_tcp_async,
gcl_sm_input,
gcl_sm_output,
+ gcl_sm_closed,
gcl_sm_had_error
-
};
enum chattrib { /* character attribute */
@@ -496,8 +478,11 @@ object make_si_sfun();
Used by the C function to set optionals */
#define VFUN_NARGS fcall.argd
+#define RETURN4(x,y,z,w) do{/* object _x = (void *) x; */ \
+ fcall.values[1]=y;fcall.values[2]=z;fcall.values[3]=w;fcall.nvalues=4; \
+ return (x) ;} while(0)
#define RETURN2(x,y) do{/* object _x = (void *) x; */\
- fcall.values[2]=y;fcall.nvalues=2; \
+ fcall.values[1]=y;fcall.nvalues=2; \
return (x) ;} while(0)
#define RETURN1(x) do{fcall.nvalues=1; return (x) ;} while(0)
#define RETURN0 do{fcall.nvalues=0; return Cnil ;} while(0)
--- gcl-2.6.12.orig/h/protoize.h
+++ gcl-2.6.12/h/protoize.h
@@ -88,7 +88,7 @@
/* big.c:85:OF */ extern void zero_big (object x); /* (x) object x; */
/* bind.c:74:OF */ extern void lambda_bind (object *arg_top); /* (arg_top) object *arg_top; */
/* bind.c:564:OF */ extern void bind_var (object var, object val, object spp); /* (var, val, spp) object var; object val; object spp; */
-/* bind.c:610:OF */ extern object find_special (object body, struct bind_temp *start, struct bind_temp *end); /* (body, start, end) object body; struct bind_temp *start; struct bind_temp *end; */
+/* bind.c:610:OF */ extern object find_special (object body, struct bind_temp *start, struct bind_temp *end,object *s); /* (body, start, end) object body; struct bind_temp *start; struct bind_temp *end; */
/* bind.c:670:OF */ extern object let_bind (object body, struct bind_temp *start, struct bind_temp *end); /* (body, start, end) object body; struct bind_temp *start; struct bind_temp *end; */
/* bind.c:688:OF */ extern object letA_bind (object body, struct bind_temp *start, struct bind_temp *end); /* (body, start, end) object body; struct bind_temp *start; struct bind_temp *end; */
/* bind.c:712:OF */ extern void parse_key (object *base, bool rest, bool allow_other_keys, register int n, ... );
--- gcl-2.6.12.orig/h/type.h
+++ gcl-2.6.12/h/type.h
@@ -7,6 +7,7 @@ enum type {
t_shortfloat,
t_longfloat,
t_complex,
+ t_stream,
t_pathname,
t_string,
t_bitvector,
@@ -17,7 +18,6 @@ enum type {
t_character,
t_symbol,
t_package,
- t_stream,
t_random,
t_readtable,
t_cfun,
@@ -36,6 +36,23 @@ enum type {
};
+enum smmode { /* stream mode */
+ smm_input, /* input */
+ smm_output, /* output */
+ smm_io, /* input-output */
+ smm_probe, /* probe */
+ smm_file_synonym, /* synonym stream to file_stream */
+ smm_synonym, /* synonym */
+ smm_broadcast, /* broadcast */
+ smm_concatenated, /* concatenated */
+ smm_two_way, /* two way */
+ smm_echo, /* echo */
+ smm_string_input, /* string input */
+ smm_string_output, /* string output */
+ smm_user_defined, /* for user defined */
+ smm_socket /* Socket stream */
+};
+
#define Zcdr(a_) (*(object *)(a_))/* ((a_)->c.c_cdr) */ /*FIXME*/
#ifndef WIDE_CONS
@@ -82,7 +99,7 @@ enum type {
#else
#define TYPEWORD_TYPE_P(y_) (y_!=t_cons)
#endif
-
+
/*Note preserve sgc flag here VVV*/
#define set_type_of(x,y) ({object _x=(object)(x);enum type _y=(y);_x->d.f=0;\
if (TYPEWORD_TYPE_P(_y)) {_x->d.e=1;_x->d.t=_y;_x->fw|=(fixnum)OBJNULL;}})
@@ -113,6 +130,7 @@ enum type {
#define randomp(a_) SPP(a_,random)
#define characterp(a_) SPP(a_,character)
#define symbolp(a_) SPP(a_,symbol)
+#define pathnamep(a_) SPP(a_,pathname)
#define stringp(a_) SPP(a_,string)
#define fixnump(a_) SPP(a_,fixnum)
#define readtablep(a_) SPP(a_,readtable)
@@ -133,3 +151,6 @@ enum type {
|| _tp == t_symbol;})
#define pathname_string_symbol_streamp(a_) ({enum type _tp=type_of(a_); _tp==t_pathname || _tp == t_string\
|| _tp == t_symbol || _tp==t_stream;})
+
+#define pathname_designatorp(a_) ({object _a=(a_);enum type _tp=type_of(a_);\
+ _tp==t_pathname||_tp==t_string||(_tp==t_stream && _a->sm.sm_mode>=smm_input && _a->sm.sm_mode<=smm_file_synonym);})
--- gcl-2.6.12.orig/lsp/gcl_autoload.lsp
+++ gcl-2.6.12/lsp/gcl_autoload.lsp
@@ -410,10 +410,3 @@ Good luck! The GCL Development Team"
(setf (get 'with-open-file 'si:pretty-print-format) 1)
(setf (get 'with-open-stream 'si:pretty-print-format) 1)
(setf (get 'with-output-to-string 'si:pretty-print-format) 1)
-
-
-(in-package :si)
-
-(defvar *lib-directory* (namestring (truename "../")))
-
-(import '(*lib-directory* *load-path* *system-directory*) :user)
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_directory.lsp
@@ -0,0 +1,67 @@
+(in-package :si)
+
+(defconstant +d-type-alist+ (d-type-list))
+
+(defun ?push (x tp)
+ (when (and x (eq tp :directory)) (vector-push-extend #\/ x))
+ x)
+
+(defun wreaddir (x s &optional y (ls (length s) lsp) &aux (y (if (rassoc y +d-type-alist+) y :unknown)))
+ (when lsp (setf (fill-pointer s) ls))
+ (let ((r (readdir x (car (rassoc y +d-type-alist+)) s)))
+ (typecase r
+ (fixnum (wreaddir x (adjust-array s (+ 100 (ash (array-dimension s 0) 1))) y))
+ (cons (let ((tp (cdr (assoc (cdr r) +d-type-alist+)))) (cons (?push (car r) tp) tp)))
+ (otherwise (?push r y)))))
+
+(defun dot-dir-p (r l) (member-if (lambda (x) (string= x r :start2 l)) '("./" "../")))
+
+(defun vector-push-string (x s &optional (ss 0) (lx (length x)) &aux (ls (- (length s) ss)))
+ (let ((x (if (> ls (- (array-dimension x 0) lx)) (adjust-array x (+ ls (ash lx 1))) x)))
+ (setf (fill-pointer x) (+ lx ls))
+ (replace x s :start1 lx :start2 ss)))
+
+(defun walk-dir (s e f &optional (y :unknown) (d (opendir s)) (l (length s)) (le (length e))
+ &aux (r (wreaddir d s y l)))
+ (cond (r (unless (dot-dir-p r l) (funcall f r (vector-push-string e r l le) l))
+ (walk-dir s e f y d l le))
+ ((setf (fill-pointer s) l (fill-pointer e) le) (closedir d))))
+
+(defun recurse-dir (x y f)
+ (funcall f x y)
+ (walk-dir x y (lambda (x y l) (declare (ignore l)) (recurse-dir x y f)) :directory))
+
+(defun make-frame (s &aux (l (length s)))
+ (replace (make-array l :element-type 'character :adjustable t :fill-pointer l) s))
+
+(defun expand-wild-directory (l f zz &optional (yy (make-frame zz)))
+ (let* ((x (member-if 'wild-dir-element-p l))
+ (s (namestring (make-pathname :directory (ldiff l x))))
+ (z (vector-push-string zz s))
+ (l (length yy))
+ (y (link-expand (vector-push-string yy s) l))
+ (y (if (eq y yy) y (make-frame y))))
+ (when (or (eq (stat z) :directory) (zerop (length z)))
+ (cond ((eq (car x) :wild-inferiors) (recurse-dir z y f))
+ (x (walk-dir z y (lambda (q e l)
+ (declare (ignore l))
+ (expand-wild-directory (cons :relative (cdr x)) f q e)) :directory));FIXME
+ ((funcall f z y))))))
+
+(defun directory (p &key &aux (p (translate-logical-pathname p))(d (pathname-directory p))
+ (c (unless (eq (car d) :absolute) (make-frame (concatenate 'string (getcwd) "/"))))
+ (lc (when c (length c)))
+ (filesp (or (pathname-name p) (pathname-type p)))
+ (v (compile-regexp (to-regexp p)))(*up-key* :back) r)
+ (expand-wild-directory d
+ (lambda (dir exp &aux (pexp (pathname (if c (vector-push-string c exp 0 lc) exp))))
+ (if filesp
+ (walk-dir dir exp
+ (lambda (dir exp pos)
+ (declare (ignore exp))
+ (when (pathname-match-p dir v)
+ (push (merge-pathnames (parse-namestring dir nil *default-pathname-defaults* :start pos) pexp nil) r)))
+ :file)
+ (when (pathname-match-p dir v) (push pexp r))))
+ (make-frame (if c "./" "")))
+ r)
--- gcl-2.6.12.orig/lsp/gcl_fpe.lsp
+++ gcl-2.6.12/lsp/gcl_fpe.lsp
@@ -60,7 +60,7 @@
(defun rf (addr w)
- (ecase w (4 (*float addr)) (8 (*double addr))))
+ (ecase w (4 (*float addr 0 nil nil)) (8 (*double addr 0 nil nil))))
(defun ref (addr p w &aux (i -1))
(if p
@@ -71,7 +71,7 @@
(f (eql #\F (aref z 0))))
(ref addr (unless f (eql (aref z (- lz 2)) #\P)) (if (or f (eql (aref z (1- lz)) #\D)) 8 4)))
-(defun reg-lookup (x) (*fixnum (+ (car *context*) (symbol-value x))))
+(defun reg-lookup (x) (*fixnum (+ (car *context*) (symbol-value x)) 0 nil nil))
(defun st-lookup (x) (fld (+ (cadr *context*) (symbol-value x))))
(defun xmm-lookup (x) (gref (+ (caddr *context*) (symbol-value x))))
--- gcl-2.6.12.orig/lsp/gcl_fpe_test.lsp
+++ gcl-2.6.12/lsp/gcl_fpe_test.lsp
@@ -1,6 +1,6 @@
-#.`(defun test-fpe (f a r &optional chk &aux cc (o (mapcan (lambda (x) (list x t)) (si::break-on-floating-point-exceptions))))
+#.`(defun test-fpe (f a r &optional chk &aux cc (o (mapcan (lambda (x) (list x t)) (break-on-floating-point-exceptions))))
(flet ((set-break (x) (when (keywordp r)
- (apply 'si::break-on-floating-point-exceptions (append (unless x o) (list r x))))))
+ (apply 'break-on-floating-point-exceptions (append (unless x o) (list r x))))))
(let* ((rr (handler-case (unwind-protect (progn (set-break t) (apply f a)) (set-break nil))
,@(mapcar (lambda (x &aux (x (car x))) `(,x (c) (setq cc c) ,(intern (symbol-name x) :keyword)))
(append si::+fe-list+ '((arithmetic-error)(error)))))))
--- gcl-2.6.12.orig/lsp/gcl_info.lsp
+++ gcl-2.6.12/lsp/gcl_info.lsp
@@ -8,28 +8,6 @@
(,op (the fixnum ,x) (the fixnum ,y))))
(defmacro fcr (x) `(load-time-value (compile-regexp ,x))))
-(eval-when (compile eval load)
-(defun sharp-u-reader (stream subchar arg)
- subchar arg
- (let ((tem (make-array 10 :element-type 'character :fill-pointer 0)))
- (or (eql (read-char stream) #\")
- (error "sharp-u-reader reader needs a \" right after it"))
- (loop
- (let ((ch (read-char stream)))
- (cond ((eql ch #\") (return tem))
- ((eql ch #\\)
- (setq ch (read-char stream))
- (setq ch (or (cdr (assoc ch '((#\n . #\newline)
- (#\t . #\tab)
- (#\r . #\return))))
- ch))))
- (vector-push-extend ch tem)))
- tem))
-
-(set-dispatch-macro-character #\# #\u 'sharp-u-reader)
-
-)
-
(defconstant +crlu+ (compile-regexp #u""))
(defconstant +crnp+ (compile-regexp #u"[]"))
--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp
+++ gcl-2.6.12/lsp/gcl_iolib.lsp
@@ -1,3 +1,4 @@
+;; -*-Lisp-*-
;; Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa
;; This file is part of GNU Common Lisp, herein referred to as GCL
@@ -24,130 +25,229 @@
(in-package :si)
-(proclaim '(optimize (safety 2) (space 3)))
+(defun concatenated-stream-streams (stream)
+ (declare (optimize (safety 2)))
+ (check-type stream concatenated-stream)
+ (c-stream-object0 stream))
+(defun broadcast-stream-streams (stream)
+ (declare (optimize (safety 2)))
+ (check-type stream broadcast-stream)
+ (c-stream-object0 stream))
+(defun two-way-stream-input-stream (stream)
+ (declare (optimize (safety 2)))
+ (check-type stream two-way-stream)
+ (c-stream-object0 stream))
+(defun echo-stream-input-stream (stream)
+ (declare (optimize (safety 2)))
+ (check-type stream echo-stream)
+ (c-stream-object0 stream))
+(defun two-way-stream-output-stream (stream)
+ (declare (optimize (safety 2)))
+ (check-type stream two-way-stream)
+ (c-stream-object1 stream))
+(defun echo-stream-output-stream (stream)
+ (declare (optimize (safety 2)))
+ (check-type stream echo-stream)
+ (c-stream-object1 stream))
+(defun synonym-stream-symbol (stream)
+ (declare (optimize (safety 2)))
+ (check-type stream synonym-stream)
+ (c-stream-object0 stream))
+(defun maybe-clear-input (&optional (x *standard-input*))
+ (typecase x
+ (synonym-stream (maybe-clear-input (symbol-value (synonym-stream-symbol x))))
+ (two-way-stream (maybe-clear-input (two-way-stream-input-stream x)))
+ (stream (when (terminal-input-stream-p x) (clear-input t)))))
(defmacro with-open-stream ((var stream) . body)
- (multiple-value-bind (ds b)
- (find-declarations body)
+ (declare (optimize (safety 1)))
+ (multiple-value-bind (ds b) (find-declarations body)
`(let ((,var ,stream))
,@ds
(unwind-protect
- (progn ,@b)
+ (progn ,@b)
(close ,var)))))
-
(defmacro with-input-from-string ((var string &key index start end) . body)
- (let ((x (sgen "X")))
- (multiple-value-bind (ds b)
- (find-declarations body)
- `(let ((,var (make-string-input-stream ,string ,start ,end)))
- ,@ds
- (unwind-protect
- ,(let ((f `(progn ,@b)))
- (if index
- `(let ((,x (multiple-value-list ,f))) (setf ,index (get-string-input-stream-index ,var)) (values-list ,x))
- f))
- (close ,var))))))
+ (declare (optimize (safety 1)))
+ (multiple-value-bind (ds b) (find-declarations body)
+ `(let ((,var (make-string-input-stream ,string ,start ,end)))
+ ,@ds
+ (unwind-protect
+ (multiple-value-prog1
+ (progn ,@b)
+ ,@(when index `((setf ,index (get-string-input-stream-index ,var)))))
+ (close ,var)))))
(defmacro with-output-to-string ((var &optional string &key element-type) . body)
- (let ((s (sgen "STRING"))(bl (sgen "BLOCK"))(e (sgen "ELEMENT-TYPE"))(x (sgen "X")))
- (multiple-value-bind (ds b)
- (find-declarations body)
- `(let* ((,s ,string)(,e ,element-type)
- (,var (if ,s (make-string-output-stream-from-string ,s) (make-string-output-stream :element-type ,e))))
+ (declare (optimize (safety 1)))
+ (let ((s (sgen "STRING")))
+ (multiple-value-bind (ds b) (find-declarations body)
+ `(let* ((,s ,string)
+ (,var (if ,s (make-string-output-stream-from-string ,s) (make-string-output-stream :element-type ,element-type))))
,@ds
(unwind-protect
- (let ((,x (multiple-value-list (progn ,@b)))) (if ,s (values-list ,x) (get-output-stream-string ,var)))
+ (block nil
+ (multiple-value-prog1
+ (progn ,@b)
+ (unless ,s (return (get-output-stream-string ,var)))))
(close ,var))))))
-(defun read-from-string (string
- &optional (eof-error-p t) eof-value
- &key (start 0) (end (length string))
- preserve-whitespace)
- (let ((stream (make-string-input-stream string start end)))
- (if preserve-whitespace
- (values (read-preserving-whitespace stream eof-error-p eof-value)
- (si:get-string-input-stream-index stream))
- (values (read stream eof-error-p eof-value)
- (si:get-string-input-stream-index stream)))))
-
+(defun read-from-string (string &optional (eof-error-p t) eof-value
+ &key (start 0) end preserve-whitespace)
+ (declare (optimize (safety 1)))
+ (check-type string string)
+ (check-type start seqind)
+ (check-type end (or null seqind))
+ (let ((stream (make-string-input-stream string start (or end (length string)))))
+ (values (if preserve-whitespace
+ (read-preserving-whitespace stream eof-error-p eof-value)
+ (read stream eof-error-p eof-value))
+ (get-string-input-stream-index stream))))
+
+;; (defun write (x &key stream
+;; (array *print-array*)
+;; (base *print-base*)
+;; (case *print-case*)
+;; (circle *print-circle*)
+;; (escape *print-escape*)
+;; (gensym *print-gensym*)
+;; (length *print-length*)
+;; (level *print-level*)
+;; (lines *print-lines*)
+;; (miser-width *print-miser-width*)
+;; (pprint-dispatch *print-pprint-dispatch*)
+;; (pretty *print-pretty*)
+;; (radix *print-radix*)
+;; (readably *print-readably*)
+;; (right-margin *print-right-margin*))
+;; (write-int x stream array base case circle escape gensym
+;; length level lines miser-width pprint-dispatch
+;; pretty radix readably right-margin))
(defun write-to-string (object &rest rest
- &key escape radix base
- circle pretty level length
- case gensym array
- &aux (stream (make-string-output-stream)))
- (declare (ignore escape radix base
- circle pretty level length
- case gensym array))
+ &key (escape *print-escape*)(radix *print-radix*)(base *print-base*)
+ (circle *print-circle*)(pretty *print-pretty*)(level *print-level*)
+ (length *print-length*)(case *print-case*)(gensym *print-gensym*)
+ (array *print-array*)(lines *print-lines*)(miser-width *print-miser-width*)
+ (pprint-dispatch *print-pprint-dispatch*)(readably *print-readably*)
+ (right-margin *print-right-margin*)
+ &aux (stream (make-string-output-stream))
+ (*print-escape* escape)(*print-radix* radix)(*print-base* base)
+ (*print-circle* circle)(*print-pretty* pretty)(*print-level* level)
+ (*print-length* length)(*print-case* case)(*print-gensym* gensym)
+ (*print-array* array)(*print-lines* lines)(*print-miser-width* miser-width)
+ (*print-pprint-dispatch* pprint-dispatch)(*print-readably* readably )
+ (*print-right-margin* right-margin))
+ (declare (optimize (safety 1))(dynamic-extent rest))
(apply #'write object :stream stream rest)
(get-output-stream-string stream))
+(defun prin1-to-string (object &aux (stream (make-string-output-stream)))
+ (declare (optimize (safety 1)))
+ (prin1 object stream)
+ (get-output-stream-string stream))
-(defun prin1-to-string (object
- &aux (stream (make-string-output-stream)))
- (prin1 object stream)
- (get-output-stream-string stream))
-
-
-(defun princ-to-string (object
- &aux (stream (make-string-output-stream)))
+(defun princ-to-string (object &aux (stream (make-string-output-stream)))
+ (declare (optimize (safety 1)))
(princ object stream)
(get-output-stream-string stream))
+;; (defun file-string-length (ostream object)
+;; (declare (optimize (safety 2)))
+;; (let ((ostream (if (typep ostream 'broadcast-stream)
+;; (car (last (broadcast-stream-streams ostream)))
+;; ostream)))
+;; (cond ((not ostream) 1)
+;; ((subtypep1 (stream-element-type ostream) 'character)
+;; (length (let ((*print-escape* nil)) (write-to-string object)))))))
+
+;; (defmacro with-temp-file ((s pn) (tmp ext) &rest body)
+;; (multiple-value-bind
+;; (doc decls ctps body)
+;; (parse-body-header body)
+;; (declare (ignore doc))
+;; `(let* ((,s (temp-stream ,tmp ,ext))
+;; (,pn (stream-object1 ,s)))
+;; ,@decls
+;; ,@ctps
+;; (unwind-protect (progn ,@body) (progn (close ,s) (delete-file ,s))))))
+
(defmacro with-open-file ((stream . filespec) . body)
- (multiple-value-bind (ds b)
- (find-declarations body)
+ (declare (optimize (safety 1)))
+ (multiple-value-bind (ds b) (find-declarations body)
`(let ((,stream (open ,@filespec)))
,@ds
(unwind-protect
- (progn ,@b)
- (if ,stream (close ,stream))))))
+ (progn ,@b)
+ (when ,stream (close ,stream))))))
+;; (defun pprint-dispatch (obj &optional (table *print-pprint-dispatch*))
+;; (declare (optimize (safety 2)))
+;; (let ((fun (si:get-pprint-dispatch obj table)))
+;; (if fun (values fun t) (values 'si:default-pprint-object nil))))
+
+;; (setq *print-pprint-dispatch* '(pprint-dispatch . nil))
+
+;; (defun set-pprint-dispatch (type-spec function &optional
+;; (priority 0)
+;; (table *print-pprint-dispatch*))
+;; (declare (optimize (safety 2)))
+;; (unless (typep priority 'real)
+;; (error 'type-error :datum priority :expected-type 'real))
+;; (let ((a (assoc type-spec (cdr table) :test 'equal)))
+;; (if a (setf (cdr a) (list function priority))
+;; (rplacd (last table) `((,type-spec ,function ,priority)))))
+;; nil)
+
+;; (defun copy-pprint-dispatch (&optional table)
+;; (declare (optimize (safety 2)))
+;; (unless table
+;; (setq table *print-pprint-dispatch*))
+;; (unless (and (eq (type-of table) 'cons)
+;; (eq (car table) 'pprint-dispatch))
+;; (error 'type-error :datum table :expected-type 'pprint-dispatch))
+;; (copy-seq table ))
-(defun y-or-n-p (&optional string &rest args)
- (do ((reply))
- (nil)
- (when string (format *query-io* "~&~? (Y or N) " string args))
- (setq reply (read *query-io*))
- (cond ((string-equal (symbol-name reply) "Y")
- (return-from y-or-n-p t))
- ((string-equal (symbol-name reply) "N")
- (return-from y-or-n-p nil)))))
+(defun y-or-n-p (&optional string &rest args)
+ (declare (optimize (safety 1)))
+ (when string (format *query-io* "~&~? (Y or N) " string args))
+ (let ((reply (symbol-name (read *query-io*))))
+ (cond ((string-equal reply "Y") t)
+ ((string-equal reply "N") nil)
+ ((apply 'y-or-n-p string args)))))
(defun yes-or-no-p (&optional string &rest args)
- (do ((reply))
- (nil)
- (when string (format *query-io* "~&~? (Yes or No) " string args))
- (setq reply (read *query-io*))
- (cond ((string-equal (symbol-name reply) "YES")
- (return-from yes-or-no-p t))
- ((string-equal (symbol-name reply) "NO")
- (return-from yes-or-no-p nil)))))
-
+ (declare (optimize (safety 1)))
+ (when string (format *query-io* "~&~? (Yes or No) " string args))
+ (let ((reply (symbol-name (read *query-io*))))
+ (cond ((string-equal reply "YES") t)
+ ((string-equal reply "NO") nil)
+ ((apply 'yes-or-no-p string args)))))
(defun sharp-a-reader (stream subchar arg)
(declare (ignore subchar))
(let ((initial-contents (read stream nil nil t)))
- (if *read-suppress*
- nil
- (do ((i 0 (1+ i))
- (d nil (cons (length ic) d))
- (ic initial-contents (if (zerop (length ic)) ic (elt ic 0))))
- ((>= i arg)
- (make-array (nreverse d)
- :initial-contents initial-contents))))))
+ (unless *read-suppress*
+ (do ((i 0 (1+ i))
+ (d nil (cons (length ic) d))
+ (ic initial-contents (if (zerop (length ic)) ic (elt ic 0))))
+ ((>= i arg) (make-array (nreverse d) :initial-contents initial-contents))))))
(set-dispatch-macro-character #\# #\a 'sharp-a-reader)
+(set-dispatch-macro-character #\# #\a 'sharp-a-reader (standard-readtable))
(set-dispatch-macro-character #\# #\A 'sharp-a-reader)
+(set-dispatch-macro-character #\# #\A 'sharp-a-reader (standard-readtable))
;; defined in defstruct.lsp
(set-dispatch-macro-character #\# #\s 'sharp-s-reader)
+(set-dispatch-macro-character #\# #\s 'sharp-s-reader (standard-readtable))
(set-dispatch-macro-character #\# #\S 'sharp-s-reader)
+(set-dispatch-macro-character #\# #\S 'sharp-s-reader (standard-readtable))
(defvar *dribble-stream* nil)
(defvar *dribble-io* nil)
@@ -155,6 +255,7 @@
(defvar *dribble-saved-terminal-io* nil)
(defun dribble (&optional (pathname "DRIBBLE.LOG" psp) (f :supersede))
+ (declare (optimize (safety 1)))
(cond ((not psp)
(when (null *dribble-stream*) (error "Not in dribble."))
(if (eq *dribble-io* *terminal-io*)
@@ -183,73 +284,18 @@
(format t "~&Starts dribbling to ~A (~d/~d/~d, ~d:~d:~d)."
namestring year month day hour min sec))))))
-(defconstant char-length 8)
-
-(defun get-byte-stream-nchars (s)
- (check-type s stream)
- (let* ((tp (stream-element-type s))
- (tp (if (consp tp) (cadr tp) char-length))
- (nc (ceiling tp char-length)))
- nc))
-
-(defun write-byte (j s)
- (declare (optimize (safety 1)))
- (let ((nc (get-byte-stream-nchars s))
- (ff (1- (expt 2 char-length))))
- (do ((k 0 (1+ k))(i j (ash i (- char-length)))) ((>= k nc) j)
- (write-char (code-char (logand i ff)) s))))
-
-(defun read-byte (s &optional (eof-error-p t) eof-value)
- (declare (optimize (safety 1)))
- (let ((nc (get-byte-stream-nchars s)))
- (do ((j 0 (1+ j))
- (i 0 (logior i
- (ash (char-code (let ((ch (read-char s eof-error-p eof-value)))
- (if (and (not eof-error-p) (eq ch eof-value))
- (return-from read-byte ch)
- ch))) (* j char-length)))))
- ((>= j nc) i))))
-
-
-(defun read-sequence (seq strm &key (start 0) end)
- (declare (optimize (safety 1)))
- (check-type seq sequence)
- (check-type start (integer 0))
- (check-type end (or null (integer 0)))
- (let* ((start (min start array-dimension-limit))
- (end (if end (min end array-dimension-limit) (length seq)))
- (l (listp seq))
- (seq (if (and l (> start 0)) (nthcdr start seq) seq))
- (tp (subtypep (stream-element-type strm) 'character)))
- (do ((i start (1+ i))(seq seq (if l (cdr seq) seq)))
- ((or (>= i end) (when l (endp seq))) i)
- (declare (fixnum i))
- (let ((el (if tp (read-char strm nil 'eof) (read-byte strm nil 'eof))))
- (when (eq el 'eof) (return i))
- (if l (setf (car seq) el) (setf (aref seq i) el))))))
-
+;; (defmacro formatter ( control-string )
+;; (declare (optimize (safety 2)))
+;; `(progn
+;; (lambda (*standard-output* &rest arguments)
+;; (let ((*format-unused-args* nil))
+;; (apply 'format t ,control-string arguments)
+;; *format-unused-args*))))
-(defun write-sequence (seq strm &key (start 0) end)
+(defun stream-external-format (s)
(declare (optimize (safety 1)))
- (check-type seq sequence)
- (check-type start (integer 0))
- (check-type end (or null (integer 0)))
- (let* ((start (min start array-dimension-limit))
- (end (if end (min end array-dimension-limit) (length seq)))
- (l (listp seq))
- (tp (subtypep (stream-element-type strm) 'character)))
- (do ((i start (1+ i))
- (seq (if (and l (> start 0)) (nthcdr start seq) seq) (if l (cdr seq) seq)))
- ((or (>= i end) (when l (endp seq))))
- (declare (fixnum i))
- (let ((el (if l (car seq) (aref seq i))))
- (if tp (write-char el strm) (write-byte el strm))))
- seq))
-
-(defmacro with-compilation-unit (opt &rest body)
- (declare (optimize (safety 2)))
- (declare (ignore opt))
- `(progn ,@body))
+ (check-type s stream)
+ :default)
(defvar *print-lines* nil)
(defvar *print-miser-width* nil)
@@ -257,7 +303,7 @@
(defvar *print-right-margin* nil)
(defmacro with-standard-io-syntax (&body body)
- (declare (optimize (safety 2)))
+ (declare (optimize (safety 1)))
`(let* ((*package* (find-package :cl-user))
(*print-array* t)
(*print-base* 10)
@@ -269,7 +315,7 @@
(*print-level* nil)
(*print-lines* nil)
(*print-miser-width* nil)
- (*print-pprint-dispatch* *print-pprint-dispatch*)
+ (*print-pprint-dispatch* *print-pprint-dispatch*);FIXME
(*print-pretty* nil)
(*print-radix* nil)
(*print-readably* t)
@@ -278,37 +324,163 @@
(*read-default-float-format* 'single-float)
(*read-eval* t)
(*read-suppress* nil)
- (*readtable* (copy-readtable (si::standard-readtable))));FIXME copy?
+ (*readtable* (copy-readtable (standard-readtable))))
,@body))
+;; (defmacro print-unreadable-object
+;; ((object stream &key type identity) &body body)
+;; (declare (optimize (safety 2)))
+;; (let ((q `(princ " " ,stream)))
+;; `(if *print-readably*
+;; (error 'print-not-readable :object ,object)
+;; (progn
+;; (princ "#<" ,stream)
+;; ,@(when type `((prin1 (type-of ,object) ,stream) ,q))
+;; ,@body
+;; ,@(when identity
+;; (let ((z `(princ (address ,object) ,stream)))
+;; (if (and (not body) type) (list z) (list q z))))
+;; (princ ">" ,stream)
+;; nil))))
+
+;; (defmacro with-compile-file-syntax (&body body)
+;; `(let ((*print-radix* nil)
+;; (*print-base* 10)
+;; (*print-circle* t)
+;; (*print-pretty* nil)
+;; (*print-level* nil)
+;; (*print-length* nil)
+;; (*print-case* :downcase)
+;; (*print-gensym* t)
+;; (*print-array* t)
+;; (*print-package* t)
+;; (*print-structure* t))
+;; ,@body))
+
+(defmacro with-compilation-unit (opt &rest body)
+ (declare (optimize (safety 1)))
+ (declare (ignore opt))
+ `(progn ,@body))
+
+(defconstant char-length 8)
+
+(defun get-byte-stream-nchars (s)
+ (let* ((tp (stream-element-type s)))
+ (ceiling (if (consp tp) (cadr tp) char-length) char-length)))
+
+;; (defun parse-integer (s &key start end (radix 10) junk-allowed)
+;; (declare (optimize (safety 1)))
+;; (parse-integer-int s start end radix junk-allowed))
+
+(defun write-byte (j s &aux (i j))
+ (declare (optimize (safety 1)))
+ (check-type j integer)
+ (check-type s stream)
+ (dotimes (k (get-byte-stream-nchars s) j)
+ (write-char (code-char (logand i #.(1- (ash 1 char-length)))) s)
+ (setq i (ash i #.(- char-length)))))
+
+
+(defun read-byte (s &optional (eof-error-p t) eof-value &aux (i 0))
+ (declare (optimize (safety 1)))
+ (check-type s stream)
+ (dotimes (k (get-byte-stream-nchars s) i)
+ (setq i (logior i (ash (let ((ch (read-char s eof-error-p eof-value)))
+ (if (eq ch eof-value) (return ch) (char-code ch)))
+ (* k char-length))))))
+
+
+(defun read-sequence (seq strm &rest r &key (start 0) end
+ &aux (l (listp seq))(seqp (when l (nthcdr start seq)))
+ (cp (eq (stream-element-type strm) 'character)))
+ (declare (optimize (safety 1))(dynamic-extent r))
+ (check-type seq sequence)
+ (check-type strm stream)
+ (check-type start (integer 0))
+ (check-type end (or null (integer 0)))
+ (apply 'reduce (lambda (y x &aux (z (if cp (read-char strm nil 'eof) (read-byte strm nil 'eof))))
+ (declare (seqind y)(ignorable x))
+ (when (eq z 'eof) (return-from read-sequence y))
+ (if l (setf (car seqp) z seqp (cdr seqp)) (setf (aref seq y) z))
+ (1+ y)) seq :initial-value start r))
+
+
+(defun write-sequence (seq strm &rest r &key (start 0) end
+ &aux (l (listp seq))(cp (eq (stream-element-type strm) 'character)))
+ (declare (optimize (safety 1))(dynamic-extent r))
+ (check-type seq sequence)
+ (check-type strm stream)
+ (check-type start (integer 0))
+ (check-type end (or null (integer 0)))
+ (apply 'reduce (lambda (y x)
+ (declare (seqind y))
+ (if cp (write-char x strm) (write-byte x strm))
+ (1+ y)) seq :initial-value start r)
+ seq)
+
+(defun restrict-stream-element-type (tp)
+ (cond ((or (member tp '(character :default)) (subtypep tp 'character)) 'character)
+ ((subtypep tp 'integer)
+ (let* ((ntp (car (expand-ranges (normalize-type tp))))
+ (min (or (cadr ntp) '*))(max (or (caddr ntp) '*))
+ (s (if (or (eq min '*) (< min 0)) 'signed-byte 'unsigned-byte))
+ (lim (unless (or (eq min '*) (eq max '*)) (max (integer-length min) (integer-length max))))
+ (lim (if (and lim (eq s 'signed-byte)) (1+ lim) lim)))
+ (if lim `(,s ,lim) s)))
+ ((check-type tp (member character integer)))))
+
+(defun open (f &key (direction :input)
+ (element-type 'character)
+ (if-exists nil iesp)
+ (if-does-not-exist nil idnesp)
+ (external-format :default) &aux (pf (pathname f)))
+ (declare (optimize (safety 1)))
+ (check-type f pathname-designator)
+ (when (wild-pathname-p pf)
+ (error 'file-error :pathname pf :format-control "Pathname is wild."))
+ (let* ((s (open-int (namestring (translate-logical-pathname pf)) direction
+ (restrict-stream-element-type element-type)
+ if-exists iesp if-does-not-exist idnesp external-format)))
+ (when (typep s 'stream) (c-set-stream-object1 s pf) s)))
+
+(defun load-pathname (p print if-does-not-exist external-format
+ &aux (pp (merge-pathnames p))
+ (epp (reduce (lambda (y x) (or y (probe-file (translate-pathname x "" p))))
+ '(#P".o" #P".lsp" #P".lisp" #P"") :initial-value nil)));FIXME newest?
+ (if epp
+ (let* ((*load-pathname* pp)(*load-truename* epp))
+ (with-open-file
+ (s epp :external-format external-format)
+ (if (member (peek-char nil s nil 'eof) '#.(mapcar 'code-char (list 127 #xfe #xff #x4c)))
+ (load-fasl s print)
+ (let ((*standard-input* s)) (load-stream s print)))))
+ (when if-does-not-exist
+ (error 'file-error :pathname pp :format-control "File does not exist."))))
+
+(defun load (p &key (verbose *load-verbose*) (print *load-print*) (if-does-not-exist :error)
+ (external-format :default) &aux (*readtable* *readtable*)(*package* *package*))
+ (declare (optimize (safety 1)))
+ (check-type p (or stream pathname-designator))
+ (when verbose (format t ";; Loading ~s~%" p))
+ (prog1
+ (typecase p
+ (pathname-designator (load-pathname (pathname p) print if-does-not-exist external-format))
+ (stream (load-stream p print)))
+ (when verbose (format t ";; Finished loading ~s~%" p))))
+
(defun ensure-directories-exist (ps &key verbose &aux created)
+ (declare (optimize (safety 1)))
+ (check-type ps pathname-designator)
(when (wild-pathname-p ps)
(error 'file-error :pathname ps :format-control "Pathname is wild"))
- (labels ((d (x y &aux (z (ldiff x y)) (p (make-pathname :directory z)))
+ (labels ((d (x y &aux (z (ldiff x y)) (n (namestring (make-pathname :directory z))))
(when (when z (stringp (car (last z))))
- (unless (eq :directory (car (stat p)))
- (mkdir (namestring p))
+ (unless (eq :directory (stat n))
+ (mkdir n)
(setq created t)
- (when verbose (format *standard-output* "Creating directory ~s~%" p))))
+ (when verbose (format *standard-output* "Creating directory ~s~%" n))))
(when y (d x (cdr y)))))
(let ((pd (pathname-directory ps)))
(d pd (cdr pd)))
(values ps created)))
-#.(let ((g '(:host :device :directory :name :type :version)))
- `(defun wild-pathname-p (pd &optional f &aux (p (pathname pd)))
- (declare (optimize (safety 1)))
- (check-type f (or null (member ,@g)))
- (labels ((w-f (x)
- (case x
- ,@(mapcar (lambda (x &aux (f (intern (string-concatenate "PATHNAME-" (string-upcase x)))))
- `(,x ,(if (eq x :directory) `(when (member :wild (,f p)) t) `(eq :wild (,f p))))) g))))
- (if f
- (w-f f)
- (reduce (lambda (z x) (or z (w-f x))) ',g :initial-value nil)))))
-
-(defun maybe-clear-input (&optional (x *standard-input*))
- (cond ((not (typep x 'stream)) nil)
- ((typep x 'synonym-stream) (maybe-clear-input (symbol-value (synonym-stream-symbol x))))
- ((typep x 'two-way-stream) (maybe-clear-input (two-way-stream-input-stream x)))
- ((terminal-input-stream-p x) (clear-input t))))
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_logical_pathname_translations.lsp
@@ -0,0 +1,28 @@
+(in-package :si)
+
+(defvar *pathname-logical* nil)
+
+(defun setf-logical-pathname-translations (v k)
+ (declare (optimize (safety 1)))
+ (check-type v list)
+ (check-type k string)
+ (setf (cdr (or (assoc k *pathname-logical* :test 'string-equal) (car (push (cons k t) *pathname-logical*)))) ;(cons k nil)
+ (mapcar (lambda (x) (list (parse-namestring (car x) k) (parse-namestring (cadr x)))) v)))
+
+(defsetf logical-pathname-translations (x) (y) `(setf-logical-pathname-translations ,y ,x))
+(remprop 'logical-pathname-translations 'si::setf-update-fn)
+
+(defun logical-pathname-translations (k)
+ (declare (optimize (safety 1)))
+ (check-type k string)
+ (cdr (assoc k *pathname-logical* :test 'string-equal)))
+
+
+(defun load-logical-pathname-translations (k)
+ (declare (optimize (safety 1)))
+ (unless (logical-pathname-translations k)
+ (error "No translations found for ~s" k)))
+
+(defun logical-pathname-host-p (host)
+ (when host
+ (logical-pathname-translations host)))
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_make_pathname.lsp
@@ -0,0 +1,155 @@
+(in-package :si)
+
+;; (defun pathnamep (x)
+;; (declare (optimize (safety 1)))
+;; (when (typep x 'pathname) t))
+
+(defun msub (a x) (if a (msub (cdr a) (substitute (caar a) (cdar a) x)) x))
+
+(defvar *glob-to-regexp-alist* (list (cons #v"{[^}]*}" (lambda (x) (msub '((#\| . #\,)(#\( . #\{)(#\) . #\})) x)))
+ (cons #v"\\[[^\\]*\\]" (lambda (x)
+ (concatenate 'string "("
+ (substitute #\^ #\! (subseq x 0 2))
+ (subseq x 2) ")")))
+ (cons #v"\\*" (lambda (x) "([^/.]*)"))
+ (cons #v"\\?" (lambda (x) "([^/.])"))
+ (cons #v"\\." (lambda (x) "\\."))))
+
+(defun mglist (x &optional (b 0))
+ (let* ((y (mapcan (lambda (z &aux (w (string-match (car z) x b)))
+ (unless (eql w -1)
+ (list (list w (match-end 0) z))))
+ *glob-to-regexp-alist*))
+ (z (when y (reduce (lambda (y x) (if (< (car x) (car y)) x y)) y))))
+ (when z
+ (cons z (mglist x (cadr z))))))
+
+(defun mgsub (x &optional (l (mglist x)) (b 0) &aux (w (pop l)))
+ (if w
+ (concatenate 'string
+ (subseq x b (car w))
+ (funcall (cdaddr w) (subseq x (car w) (cadr w)))
+ (mgsub x l (cadr w)))
+ (subseq x b)))
+
+
+(defun elsub (el x rp lp &aux (y x) (pref (pop y))(dflt (pop y))(post (pop y)))
+; (destructuring-bind (pref dflt post &rest y) x
+ (etypecase el
+ (string (let ((x (list pref el post))) (unless (zerop (length dflt)) (if rp (mapcar 'mgsub x) x))))
+ (integer (elsub (write-to-string el) x rp lp))
+ ((eql :wild-inferiors) (if rp (list "(" dflt "*)") (elsub "**" x rp lp)))
+ ((eql :wild) (if rp (list dflt) (elsub "*" x rp lp)))
+ ((eql :newest) (elsub (if rp "(newest|NEWEST)" "NEWEST") x rp lp))
+ ((member :up :back) (elsub ".." x rp lp))
+ ((member nil :unspecific) (when rp (list dflt)))
+ (cons (cons
+ (if (eq (car el) :absolute) (if lp "" "/") (if lp ";" ""))
+ (mapcan (lambda (z) (elsub z y rp lp)) (cdr el)))))
+; )
+)
+
+(defconstant +physical-pathname-defaults+ '(("" "" "")
+ ("" "" "")
+ ("" "(/?([^/]+/)*)" "" "" "([^/]+/)" "/")
+ ("" "([^/.]*)" "")
+ ("." "(\\.[^/]*)?" "")
+ ("" "" "")))
+(defconstant +logical-pathname-defaults+ '(("" "([-0-9A-Z]+:)?" ":")
+ ("" "" "")
+ ("" "(;?((\\*?([-0-9A-Z]+\\*?)+|\\*|\\*\\*);)*)" "" "" "((\\*?([-0-9A-Z]+\\*?)+|\\*);)" ";")
+ ("" "(\\*?([-0-9A-Z]+\\*?)+|\\*)?" "")
+ ("." "(\\.(\\*?([-0-9A-Z]+\\*?)+|\\*))?" "")
+ ("." "(\\.([1-9][0-9]*|newest|NEWEST|\\*))?" "")))
+
+(defun to-regexp-or-namestring (x rp lp)
+ (apply 'concatenate 'string
+ (mapcan (lambda (x y) (elsub x y rp lp))
+ x (if lp +logical-pathname-defaults+ +physical-pathname-defaults+))))
+
+(defun directory-list-check (l)
+ (when (listp l)
+ (when (member (car l) '(:absolute :relative))
+ (mapl (lambda (x &aux (c (car x))(d (cadr x)))
+ (when (and (member d '(:up :back)) (member c '(:absolute :wild-inferiors)))
+ (return-from directory-list-check nil))) l))))
+
+(defun canonicalize-pathname-directory (l)
+ (cond ((eq l :wild) (canonicalize-pathname-directory '(:absolute :wild-inferiors)))
+ ((stringp l) (canonicalize-pathname-directory (list :absolute l)))
+ ((mapl (lambda (x &aux (c (car x)))
+ (when (and (or (stringp c) (eq c :wild)) (eq (cadr x) :back))
+ (return-from canonicalize-pathname-directory
+ (canonicalize-pathname-directory (nconc (ldiff l x) (cddr x)))))) l))))
+
+(defvar *default-pathname-defaults* (init-pathname nil nil nil nil nil nil ""))
+(declaim (type pathname *default-pathname-defaults*))
+
+(defun toggle-case (x)
+ (cond ((symbolp x) x)
+ ((listp x) (mapcar 'toggle-case x))
+ ((find-if 'upper-case-p x) (if (find-if 'lower-case-p x) x (string-downcase x)))
+ ((find-if 'lower-case-p x) (string-upcase x))
+ (x)))
+
+(defun logical-pathname (spec &aux (p (pathname spec)))
+ (declare (optimize (safety 1)))
+ (check-type spec pathname-designator)
+ (check-type p logical-pathname)
+ p)
+
+(eval-when (compile eval)
+ (defun strsym (p &rest r)
+ (declare (:dynamic-extent r))
+ (intern (apply 'concatenate 'string (mapcar 'string-upcase r)) p)))
+
+#.`(defun make-pathname (&key (host nil hostp) (device nil devicep) (directory nil directoryp)
+ (name nil namep) (type nil typep) (version nil versionp)
+ defaults (case :local) namestring &aux defaulted (def (when defaults (pathname defaults))))
+ (declare (optimize (safety 1)))
+ (check-type host (or (member nil :unspecific) string))
+ (check-type device (member nil :unspecific))
+ (check-type directory (or (member nil :unspecific :wild) string list))
+ (check-type name (or string (member nil :unspecific :wild)))
+ (check-type type (or string (member nil :unspecific :wild)))
+ (check-type version (or (integer 1) (member nil :unspecific :wild :newest)))
+ (check-type defaults (or null pathname-designator))
+ (check-type case (member :common :local))
+ ,(flet ((def? (k) `(let* (,@(when (eq k 'host) `((def (or def *default-pathname-defaults*))))
+ (nk (if ,(strsym :si k "P") ,k (progn (setq defaulted t) (when def (,(strsym :si "C-PATHNAME-" k) def)))))
+ (nk (if (eq case :local) nk (progn (setq defaulted t) (toggle-case nk)))))
+ nk)))
+ `(let* ((h ,(def? 'host))
+ (h (let ((h1 (when (logical-pathname-host-p h) h))) (unless (eq h h1) (setq defaulted t)) h1))
+ (dev ,(def? 'device))
+ (d ,(def? 'directory))
+ (d (let ((d1 (canonicalize-pathname-directory d))) (unless (eq d d1) (setq defaulted t)) d1))
+ (n ,(def? 'name))
+ (typ ,(def? 'type))
+ (v ,(def? 'version))
+ (p (init-pathname h dev d n typ v
+ (or (unless defaulted namestring) (to-regexp-or-namestring (list h dev d n typ v) nil h)))))
+ (when h (c-set-t-tt p 1))
+ (unless (eq d (directory-list-check d))
+ (error 'file-error :pathname p :format-control "Bad directory list"))
+ p)))
+
+(macrolet ((pn-accessor (k &aux (f (strsym :si "PATHNAME-" k)) (c (strsym :si "C-PATHNAME-" k)))
+ `(defun ,f (p &key (case :local) &aux (pn (pathname p)))
+ (declare (optimize (safety 1)))
+ (check-type p pathname-designator)
+ (let ((x (,c pn))) (if (eq case :local) x (toggle-case x))))))
+ (pn-accessor host)
+ (pn-accessor device)
+ (pn-accessor directory)
+ (pn-accessor name)
+ (pn-accessor type)
+ (pn-accessor version))
+
+(defconstant +pathname-keys+ '(:host :device :directory :name :type :version))
+
+#.`(defun mlp (p)
+ (list ,@(mapcar (lambda (x) `(,(strsym :si "C-PATHNAME-" x) p)) +pathname-keys+)))
+
+(defun pnl1 (x) (list* (pop x) (pop x) (append (pop x) x)))
+(defun lnp (x) (list* (pop x) (pop x) (let ((q (last x 3))) (cons (ldiff x q) q))))
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_merge_pathnames.lsp
@@ -0,0 +1,18 @@
+(in-package :si)
+
+(defun merge-pathnames (p &optional (def *default-pathname-defaults*) (def-v :newest)
+ &aux dflt (pn (pathname p))(def-pn (pathname def)))
+ (declare (optimize (safety 1)))
+ (check-type p pathname-designator)
+ (check-type def pathname-designator)
+ (check-type def-v (or null (eql :newest) seqind))
+ (labels ((def (x) (when x (setq dflt t) x)))
+ (make-pathname
+ :host (or (pathname-host pn) (def (pathname-host def-pn)))
+ :device (or (pathname-device pn) (def (pathname-device def-pn)))
+ :directory (let ((d (pathname-directory pn))(defd (pathname-directory def-pn)))
+ (or (def (when (and defd (eq (car d) :relative)) (append defd (cdr d)))) d (def defd)))
+ :name (or (pathname-name pn) (def (pathname-name def-pn)))
+ :type (or (pathname-type pn) (def (pathname-type def-pn)))
+ :version (or (pathname-version pn) (def (unless (pathname-name pn) (pathname-version def-pn))) (def def-v))
+ :version (unless dflt (return-from merge-pathnames pn)))))
--- gcl-2.6.12.orig/lsp/gcl_mislib.lsp
+++ gcl-2.6.12/lsp/gcl_mislib.lsp
@@ -114,13 +114,15 @@
(* (+ h tz) 3600) (* min 60) sec))
(defun compile-file-pathname (pathname)
-(make-pathname :defaults pathname :type "o"))
+ (make-pathname :defaults pathname :type "o"))
+
(defun constantly (x)
-#'(lambda (&rest args)
+ (lambda (&rest args)
(declare (ignore args) (:dynamic-extent args))
-x))
+ x))
+
(defun complement (fn)
-#'(lambda (&rest args) (not (apply fn args))))
+ (lambda (&rest args) (not (apply fn args))))
(defun default-system-banner ()
(let (gpled-modules)
--- gcl-2.6.12.orig/lsp/gcl_module.lsp
+++ gcl-2.6.12/lsp/gcl_module.lsp
@@ -40,13 +40,13 @@
(defun require (module-name
&optional (pathname (string-downcase (string module-name))))
- (let ((*default-pathname-defaults* #""))
+ (let ((*default-pathname-defaults* (make-pathname)))
(unless (member (string module-name)
*modules*
:test #'string=)
(if (atom pathname)
(load pathname)
- (do ((p pathname (cdr p)))
+ (do ((p pathname (cdr p)))
((endp p))
(load (car p)))))))
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_namestring.lsp
@@ -0,0 +1,39 @@
+(in-package :si)
+
+(defun namestring (x)
+ (declare (optimize (safety 1)))
+ (check-type x pathname-designator)
+ (typecase x
+ (string x)
+ (pathname (c-pathname-namestring x))
+ (stream (namestring (c-stream-object1 x)))))
+
+(defun file-namestring (x &aux (px (pathname x)))
+ (declare (optimize (safety 1)))
+ (check-type x pathname-designator)
+ (namestring (make-pathname :name (pathname-name px) :type (pathname-type px) :version (pathname-version px))))
+
+(defun directory-namestring (x &aux (px (pathname x)))
+ (declare (optimize (safety 1)))
+ (check-type x pathname-designator)
+ (namestring (make-pathname :directory (pathname-directory px))))
+
+(defun host-namestring (x &aux (px (pathname x)))
+ (declare (optimize (safety 1)))
+ (check-type x pathname-designator)
+ (or (pathname-host px) ""))
+
+#.`(defun enough-namestring (x &optional (def *default-pathname-defaults*) &aux (px (pathname x))(pdef (pathname def)))
+ (declare (optimize (safety 1)))
+ (check-type x pathname-designator)
+ (check-type def pathname-designator)
+ ,(labels ((new? (k &aux (f (intern (concatenate 'string "PATHNAME-" (string k)) :si)))
+ `(let ((k (,f px))) (unless (equal k (,f pdef)) k))))
+ `(namestring (make-pathname
+ ,@(mapcan (lambda (x) (list x (new? x))) +pathname-keys+)))))
+
+(defun faslink (file name &aux (pfile (namestring (merge-pathnames (make-pathname :type "o") (pathname file))))(*package* *package*));FIXME
+ (declare (optimize (safety 1)))
+ (check-type file pathname-designator)
+ (check-type name string)
+ (faslink-int pfile name))
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_parse_namestring.lsp
@@ -0,0 +1,139 @@
+(in-package :si)
+
+(deftype seqind nil `fixnum)
+
+(defun match-beginning (i &aux (v *match-data*))
+ (declare ((vector fixnum) v)(seqind i))
+ (the (or (integer -1 -1 ) seqind) (aref v i)))
+(defun match-end (i &aux (v *match-data*))
+ (declare ((vector fixnum) v)(seqind i))
+ (the (or (integer -1 -1 ) seqind) (aref v (+ i (ash (length v) -1)))))
+
+(declaim (inline match-beginning match-end))
+
+(defun dir-conj (x) (if (eq x :relative) :absolute :relative))
+
+(defvar *up-key* :up)
+
+(defun mfr (x b i) (subseq x b i)); (make-array (- i b) :element-type 'character :displaced-to x :displaced-index-offset b)
+
+(defvar *sym-sub-alist* '((:host . nil)
+ (:device . nil)
+ (:directory . (("." . nil)(".." . :up)("*" . :wild)("**" . :wild-inferiors)))
+ (:name . (("*" . :wild)))
+ (:type . (("*" . :wild)))
+ (:version . (("*" . :wild)("NEWEST" . :newest)))))
+
+(defun element (x b i key)
+ (let* ((z (when (> i b) (mfr x b i)))
+ (w (assoc z (cdr (assoc key *sym-sub-alist*)) :test 'string-equal))
+ (z (if w (cdr w) z)))
+ (if (eq z :up) *up-key* z)))
+
+(defun dir-parse (x sep sepfirst &optional (b 0))
+ (when (stringp x)
+ (let ((i (search sep x :start2 b)));string-match spoils outer match results
+ (when i
+ (let* ((y (dir-parse x sep sepfirst (1+ i)))
+ (z (element x b i :directory))
+ (y (if z (cons z y) y)))
+ (if (zerop b)
+ (cons (if (zerop i) sepfirst (dir-conj sepfirst)) y)
+ y))))))
+
+(defun match-component (x i k &optional (boff 0) (eoff 0))
+ (element x (+ (match-beginning i) boff) (+ (match-end i) eoff) k))
+
+(defun version-parse (x)
+ (typecase x
+ (string (version-parse (parse-integer x)))
+; (integer (locally (check-type x (integer 1)) x))
+ (otherwise x)))
+
+(defconstant +generic-logical-pathname-regexp+ (compile-regexp (to-regexp-or-namestring (make-list (length +logical-pathname-defaults+)) t t)))
+
+(defun expand-home-dir (dir)
+ (cond ((and (eq (car dir) :relative) (stringp (cadr dir)) (eql #\~ (aref (cadr dir) 0)))
+ (append (dir-parse (home-namestring (cadr dir)) "/" :absolute) (cddr dir)))
+ (dir)))
+
+(defun logical-pathname-parse (x &optional host def (b 0) (e (length x)))
+ (when (and (eql b (string-match +generic-logical-pathname-regexp+ x b e)) (eql (match-end 0) e))
+ (let ((mhost (match-component x 1 :host 0 -1)))
+ (when (and host mhost)
+ (unless (string-equal host mhost)
+ (error 'error :format-control "Host part of ~s does not match ~s" :format-arguments (list x host))))
+ (let ((host (or host mhost (pathname-host def))))
+ (when (logical-pathname-host-p host)
+ (let* ((dir (dir-parse (match-component x 2 :none) ";" :relative))
+ (edir (expand-home-dir dir)))
+ (make-pathname :host host
+ :device :unspecific
+ :directory edir
+ :name (match-component x 6 :name)
+ :type (match-component x 8 :type 1)
+ :version (version-parse (match-component x 11 :version 1))
+ :namestring (when (and mhost (eql b 0) (eql e (length x)) (eq dir edir)) x))))))))
+
+(defconstant +generic-physical-pathname-regexp+ (compile-regexp (to-regexp-or-namestring (make-list (length +physical-pathname-defaults+)) t nil)))
+
+(defun pathname-parse (x b e)
+ (when (and (eql b (string-match +generic-physical-pathname-regexp+ x b e)) (eql (match-end 0) e))
+ (let* ((dir (dir-parse (match-component x 1 :none) "/" :absolute))
+ (edir (expand-home-dir dir)))
+ (make-pathname :directory edir
+ :name (match-component x 3 :name)
+ :type (match-component x 4 :type 1)
+ :namestring (when (and (eql b 0) (eql e (length x)) (eq dir edir)) x)))))
+
+
+(defun path-stream-name (x)
+ (check-type x pathname-designator)
+ (typecase x
+ (synonym-stream (path-stream-name (symbol-value (synonym-stream-symbol x))))
+ (stream (path-stream-name (c-stream-object1 x)))
+ (otherwise x)))
+
+(defun parse-namestring (thing &optional host (default-pathname *default-pathname-defaults*) &rest r &key (start 0) end junk-allowed)
+ (declare (optimize (safety 1))(dynamic-extent r))
+ (check-type thing pathname-designator)
+ (check-type host (or null (satisfies logical-pathname-translations)))
+ (check-type default-pathname pathname-designator)
+ (check-type start seqind)
+ (check-type end (or null seqind))
+
+ (typecase thing
+ (string (let* ((e (or end (length thing)))
+ (l (logical-pathname-parse thing host default-pathname start e))
+ (l (or l (unless host (pathname-parse thing start e)))))
+ (cond (junk-allowed (values l (max 0 (match-end 0))))
+ (l (values l e))
+ ((error 'parse-error :format-control "~s is not a valid pathname on host ~s" :format-arguments (list thing host))))))
+ (stream (apply 'parse-namestring (path-stream-name thing) host default-pathname r))
+ (pathname
+ (when host
+ (unless (string-equal host (pathname-host thing))
+ (error 'file-error :pathname thing :format-control "Host does not match ~s" :format-arguments (list host))))
+ (values thing start))))
+
+(defun pathname (spec)
+ (declare (optimize (safety 1)))
+ (check-type spec pathname-designator)
+ (if (typep spec 'pathname) spec (values (parse-namestring spec))))
+
+(defun sharp-p-reader (stream subchar arg)
+ (declare (ignore subchar arg))
+ (let ((x (parse-namestring (read stream)))) x))
+
+(defun sharp-dq-reader (stream subchar arg);FIXME arg && read-suppress
+ (declare (ignore subchar arg))
+ (unread-char #\" stream)
+ (let ((x (parse-namestring (read stream)))) x))
+
+(set-dispatch-macro-character #\# #\p 'sharp-p-reader)
+(set-dispatch-macro-character #\# #\p 'sharp-p-reader (standard-readtable))
+(set-dispatch-macro-character #\# #\P 'sharp-p-reader)
+(set-dispatch-macro-character #\# #\P 'sharp-p-reader (standard-readtable))
+(set-dispatch-macro-character #\# #\" 'sharp-dq-reader)
+(set-dispatch-macro-character #\# #\" 'sharp-dq-reader (standard-readtable))
+
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_pathname_match_p.lsp
@@ -0,0 +1,14 @@
+(in-package :si)
+
+(defun to-regexp (x &optional (rp t) &aux (px (pathname x))(lp (typep px 'logical-pathname)))
+ (to-regexp-or-namestring (mlp px) rp lp))
+
+(deftype compiled-regexp nil `(vector unsigned-char))
+
+(defun pathname-match-p (p w &aux (s (namestring p)))
+ (declare (optimize (safety 1)))
+ (check-type p pathname-designator)
+ (check-type w (or compiled-regexp pathname-designator))
+ (and (zerop (string-match (if (typep w 'compiled-regexp) w (to-regexp w)) s))
+ (eql (match-end 0) (length s))))
+
--- gcl-2.6.12.orig/lsp/gcl_predlib.lsp
+++ gcl-2.6.12/lsp/gcl_predlib.lsp
@@ -110,6 +110,7 @@
(not (array-has-fill-pointer-p x))
(not (si:displaced-array-p x))))
+(defun logical-pathnamep (x) (when (pathnamep x) (eql (c-t-tt x) 1)))
(do ((l '((null . null)
(symbol . symbolp)
@@ -124,7 +125,15 @@
(character . characterp)
(package . packagep)
(stream . streamp)
+ (file-stream . file-stream-p)
+ (synonym-stream . synonym-stream-p)
+ (broadcast-stream . broadcast-stream-p)
+ (concatenated-stream . concatenated-stream-p)
+ (two-way-stream . two-way-stream-p)
+ (echo-stream . echo-stream-p)
(pathname . pathnamep)
+ (pathname-designator . pathname-designatorp)
+ (logical-pathname . logical-pathnamep)
(readtable . readtablep)
(hash-table . hash-table-p)
(random-state . random-state-p)
@@ -196,6 +205,8 @@
((null l) t)
(unless (typep object (car l)) (return nil))))
(satisfies (funcall (car i) object))
+ (eql (eql (car i) object))
+ (member (member object i))
((t) t)
((nil) nil)
(boolean (or (eq object 't) (eq object 'nil)))
@@ -280,6 +291,40 @@
(typep object (apply tem i)))))))
+
+(defun minmax (i1 i2 low-p e &aux (fn (if low-p (if e '< '>) (if e '> '<))))
+ (cond ((eq i1 '*) (if e i1 i2))
+ ((eq i2 '*) (if e i2 i1))
+ ((funcall fn i1 i2) i1)
+ (i2)))
+
+(defun expand-range (low high bottom top)
+ (let ((low (minmax low bottom t t))(high (minmax high top nil t)))
+ (when (or (eq low '*) (eq high '*) (<= low high)) (list low high))))
+
+(defun nc (tp)
+ (when (consp tp)
+ (case (car tp)
+ ;; (immfix (let ((m (cadr tp))(x (caddr tp))
+ ;; (list (list 'integer (if (eq m '*) most-negative-immfix m) (if (eq x '*) most-positive-immfix x)))))
+ ;; (bfix (let* ((m (cadr tp))(x (caddr tp))(m (if (eq m '*) most-negative-fixnum m))(x (if (eq x '*) most-positive-fixnum x)))
+ ;; (if (< (* m x) 0)
+ ;; `((integer ,m ,(1- most-negative-immfix))(integer ,(1+ most-positive-immfix) ,x))
+ ;; `((integer ,m ,x)))))
+ ;; (bignum (let* ((m (cadr tp))(x (caddr tp))(sm (or (eq m '*) (< m 0)))(sx (or (eq x '*) (>= x 0))))
+ ;; (if (and sm sx)
+ ;; `((integer ,m ,(1- most-negative-fixnum))(integer ,(1+ most-positive-fixnum) ,x))
+ ;; `((integer ,m ,x)))))
+ ((integer ratio short-float long-float) (list tp))
+ (otherwise (append (nc (car tp)) (nc (cdr tp)))))))
+
+
+(defun expand-ranges (type)
+ (reduce (lambda (y x &aux (z (assoc (car x) y)))
+ (if z (subst (cons (car z) (apply 'expand-range (cadr x) (caddr x) (cdr z))) z y)
+ (cons x y))) (nc type) :initial-value nil))
+
+
;;; NORMALIZE-TYPE normalizes the type using the DEFTYPE definitions.
;;; The result is always a list.
(defun normalize-type (type &aux tp i )
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_rename_file.lsp
@@ -0,0 +1,47 @@
+(in-package :si)
+
+(defun set-path-stream-name (x y)
+ (check-type x pathname-designator)
+ (typecase x
+ (synonym-stream (set-path-stream-name (symbol-value (synonym-stream-symbol x)) y))
+ (stream (c-set-stream-object1 x y))))
+
+(defun rename-file (f n &aux (pf (pathname f))(pn (merge-pathnames n pf nil))
+ (tpf (truename pf))(nf (namestring tpf))
+ (tpn (translate-logical-pathname pn))(nn (namestring tpn)))
+ (declare (optimize (safety 1)))
+ (check-type f pathname-designator)
+ (check-type n (and pathname-designator (not stream)))
+ (unless (rename nf nn)
+ (error 'file-error :pathname pf :format-control "Cannot rename ~s to ~s." :format-arguments (list nf nn)))
+ (set-path-stream-name f pn)
+ (values pn tpf (truename tpn)))
+
+(defun user-homedir-pathname (&optional (host :unspecific hostp))
+ (declare (optimize (safety 1)))
+ (check-type host (or string list (eql :unspecific)))
+ (unless hostp
+ (pathname (home-namestring "~"))))
+
+(defun delete-file (f &aux (pf (truename f))(nf (namestring pf)))
+ (declare (optimize (safety 1)))
+ (check-type f pathname-designator)
+ (unless (if (eq :directory (stat nf)) (rmdir nf) (unlink nf))
+ (error 'file-error :pathname (pathname nf) :format-control "Cannot delete pathname."))
+ t)
+
+(defun file-write-date (spec)
+ (declare (optimize (safety 1)))
+ (check-type spec pathname-designator)
+ (multiple-value-bind
+ (tp sz tm) (stat (namestring (truename spec)))
+ (+ tm (* (+ 17 (* 70 365)) (* 24 60 60)))))
+
+
+(defun file-author (spec)
+ (declare (optimize (safety 1)))
+ (check-type spec pathname-designator)
+ (multiple-value-bind
+ (tp sz tm uid) (stat (namestring (truename spec)))
+ (uid-to-name uid)))
+
--- gcl-2.6.12.orig/lsp/gcl_sharp.lsp
+++ gcl-2.6.12/lsp/gcl_sharp.lsp
@@ -61,4 +61,6 @@
(otherwise x)))
(set-dispatch-macro-character #\# #\= #'sharp-eq-reader)
+(set-dispatch-macro-character #\# #\= #'sharp-eq-reader (standard-readtable))
(set-dispatch-macro-character #\# #\# #'sharp-sharp-reader)
+(set-dispatch-macro-character #\# #\# #'sharp-sharp-reader (standard-readtable))
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_sharp_uv.lsp
@@ -0,0 +1,29 @@
+(in-package :si)
+
+(defun regexp-conv (stream)
+
+ (let ((tem (make-array 10 :element-type 'character :fill-pointer 0)))
+ (or (eql (read-char stream) #\")
+ (error "sharp-u-reader reader needs a \" right after it"))
+ (loop
+ (let ((ch (read-char stream)))
+ (cond ((eql ch #\") (return tem))
+ ((eql ch #\\)
+ (setq ch (read-char stream))
+ (setq ch (or (cdr (assoc ch '((#\n . #\newline)
+ (#\t . #\tab)
+ (#\r . #\return))))
+ ch))))
+ (vector-push-extend ch tem)))
+ tem))
+
+(defun sharp-u-reader (stream subchar arg)
+ (declare (ignore subchar arg))
+ (regexp-conv stream))
+
+(defun sharp-v-reader (stream subchar arg)
+ (declare (ignore subchar arg))
+ `(load-time-value (compile-regexp ,(regexp-conv stream))))
+
+(set-dispatch-macro-character #\# #\u 'sharp-u-reader)
+(set-dispatch-macro-character #\# #\v 'sharp-v-reader)
--- gcl-2.6.12.orig/lsp/gcl_top.lsp
+++ gcl-2.6.12/lsp/gcl_top.lsp
@@ -83,7 +83,7 @@
(progn
(cond
(*multiply-stacks* (setq *multiply-stacks* nil))
- ((probe-file "init.lsp") (load "init.lsp"))))
+ ((when (fboundp 'probe-file) (probe-file "init.lsp")) (load "init.lsp"))))
(when (if (symbolp *top-level-hook*) (fboundp *top-level-hook*) (functionp *top-level-hook*))
(funcall *top-level-hook*)))
@@ -122,6 +122,8 @@
(defvar *error-p* nil)
+(defvar *lib-directory* nil)
+
(defun process-some-args (args &optional compile &aux *load-verbose*)
(when args
(let ((x (pop args)))
@@ -148,7 +150,7 @@
(file (cdr (assoc :compile compile)))
(o (cdr (assoc :o compile)))
(compile (remove :o (remove :compile compile :key 'car) :key 'car))
- (compile (cons (cons :output-file (or o file)) compile))
++ (compile (cons (cons :output-file (or o (merge-pathnames ".o" file))) compile))
(result (system:error-set `(apply 'compile-file ,file ',(mapcan (lambda (x) (list (car x) (cdr x))) compile)))))
(bye (if (or *error-p* (equal result '(nil))) 1 0)))))
@@ -520,15 +522,12 @@ add a new one, add a 'si::break-command
;;make sure '/' terminated
-(defun coerce-slash-terminated (v )
- (declare (string v))
- (or (stringp v) (error "not a string ~a" v))
+(defun coerce-slash-terminated (v)
(let ((n (length v)))
- (declare (fixnum n))
- (unless (and (> n 0) (eql
- (the character(aref v (the fixnum (- n 1)))) #\/))
- (setf v (format nil "~a/" v))))
- v)
+ (if (and (> n 0) (eql (aref v (1- n)) #\/))
+ v
+ (string-concatenate v "/"))))
+
(defun fix-load-path (l)
(when (not (equal l *fixed-load-path*))
(do ((x l (cdr x)) )
@@ -587,19 +586,17 @@ First directory is checked for first nam
(when (and s (symbol-value s))
(list *system-directory*))))
-
-(defun get-temp-dir nil
- (dolist (x `(,@(wine-tmp-redirect) ,@(mapcar 'getenv '("TMPDIR" "TMP" "TEMP")) "/tmp" ""))
- (when (or (stringp x) (pathnamep x))
- (let* ((x (truename (pathname x)))
- (y (namestring (make-pathname :name (pathname-name x) :type (pathname-type x) :version (pathname-version x))))
- (y (unless (zerop (length y)) (list y))))
- (when (eq :directory (car (stat x)))
- (return-from get-temp-dir
- (namestring
- (make-pathname
- :device (pathname-device x)
- :directory (append (pathname-directory x) y)))))))))
+(defun ensure-dir-string (str)
+ (if (eq (stat str) :directory)
+ (coerce-slash-terminated str)
+ str))
+
+(defun get-temp-dir ()
+ (dolist (x `(,@(wine-tmp-redirect) ,@(mapcar 'si::getenv '("TMPDIR" "TMP" "TEMP")) "/tmp" ""))
+ (when x
+ (let ((x (coerce-slash-terminated x)))
+ (when (eq (stat x) :directory)
+ (return-from get-temp-dir x))))))
(defun get-path (s &aux (m (string-match "([^/ ]*)( |$)" s))(b (match-beginning 1))(e (match-end 1))
(r (with-open-file (s (concatenate 'string "|which " (subseq s b e))) (read s nil 'eof))))
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_translate_pathname.lsp
@@ -0,0 +1,90 @@
+(in-package :si)
+
+(defun lenel (x lp)
+ (case x (:wild 1)(:wild-inferiors 2)(:absolute (if lp -1 0))(:relative (if lp 0 -1))
+ ((:unspecific nil :newest) -1)(otherwise (length x))))
+
+(defun next-match (&optional (i 1) (k -1) (m (1- (ash (length *match-data*) -1))))
+ (cond ((< k (match-beginning i) (match-end i)) i)
+ ((< i m) (next-match (1+ i) k m))
+ (i)))
+
+(defun mme2 (s lel lp &optional (b 0) (i (next-match)) r el
+ &aux (e (+ b (lenel (car lel) lp)))(j (match-beginning i))(k (match-end i)))
+ (cond
+ ((< (- b 2) j k (+ e 2))
+ (let* ((z (car lel))(b1 (max b j))(e1 (min k e))
+ (z (if (or (< b b1) (< e1 e)) (subseq z (- b1 b) (- e1 b)) z))
+ (r (if el r (cons nil r))))
+ (mme2 s lel lp b (next-match i k) (cons (cons z (car r)) (cdr r)) (or el (car lel)))))
+ ((< (1- j) b e (1+ k))
+ (let ((r (if el r (cons nil r))))
+ (mme2 s (cdr lel) lp (1+ e) i (cons (cons (car lel) (car r)) (cdr r)) (or el (list (car lel))))))
+ ((consp el)
+ (let* ((cr (nreverse (car r))))
+ (mme2 s lel lp b (next-match i k) (cons (cons (car el) (list cr)) (cdr r)))))
+ (el
+ (let* ((cr (nreverse (car r))))
+ (mme2 s (cdr lel) lp (1+ e) i (cons (cons el cr) (cdr r)))))
+ (lel (mme2 s (cdr lel) lp (1+ e) i (cons (car lel) r)))
+ ((nreverse r))))
+
+(defun do-repl (x y)
+ (labels ((r (x l &optional (b 0) &aux (f (string-match #v"\\*" x b)))
+ (if (eql f -1) (if (eql b 0) x (subseq x b))
+ (concatenate 'string (subseq x b f) (or (car l) "") (r x (cdr l) (1+ f))))))
+ (r y x)))
+
+(defun dir-p (x) (when (consp x) (member (car x) '(:absolute :relative))))
+
+(defun source-portion (x y)
+ (cond
+ ((or (dir-p x) (dir-p y))
+ (mapcan (lambda (z &aux (w (source-portion
+ (if y (when (wild-dir-element-p z) (setf x (member-if 'listp x)) (pop x)) z)
+ (when y z))))
+ (if (listp w) w (list w))) (or y x)))
+ ((if y (eq y :wild-inferiors) t) (if (listp x) (if (listp (cadr x)) (cadr x) (car x)) x));(or y)
+ ((eq y :wild) (if (listp x) (car x) x));(or y)
+ ((stringp y) (do-repl (when (listp x) (unless (listp (cadr x)) (cdr x))) y))
+ (y)))
+
+(defun list-toggle-case (x f)
+ (typecase x
+ (string (funcall f x))
+ (cons (mapcar (lambda (x) (list-toggle-case x f)) x))
+ (otherwise x)))
+
+(defun mme3 (sx px flp tlp)
+ (list-toggle-case
+ (lnp (mme2 sx (pnl1 (mlp px)) flp))
+ (cond ((eq flp tlp) 'identity)
+ (flp 'string-downcase)
+ (tlp 'string-upcase))))
+
+(defun translate-pathname (source from to &key
+ &aux (psource (pathname source))
+ (pto (pathname to))
+ (match (pathname-match-p source from)))
+ (declare (optimize (safety 1)))
+ (check-type source pathname-designator)
+ (check-type from pathname-designator)
+ (check-type to pathname-designator)
+ (check-type match (not null))
+ (apply 'make-pathname :host (pathname-host pto) :device (pathname-device pto)
+ (mapcan 'list +pathname-keys+
+ (mapcar 'source-portion
+ (mme3 (namestring source) psource (typep psource 'logical-pathname) (typep pto 'logical-pathname))
+ (mlp pto)))))
+
+(defun translate-logical-pathname (spec &key &aux (p (pathname spec)))
+ (declare (optimize (safety 1)))
+ (check-type spec pathname-designator)
+ (typecase p
+ (logical-pathname
+ (let ((rules (assoc p (logical-pathname-translations (pathname-host p)) :test 'pathname-match-p)))
+ (unless rules
+ (error 'file-error :pathname p :format-control "No matching translations"))
+ (translate-logical-pathname (apply 'translate-pathname p rules))))
+ (otherwise p)))
+
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_truename.lsp
@@ -0,0 +1,43 @@
+(in-package :si)
+
+(defun link-expand (str &optional (b 0) (n (length str)) fr)
+ (labels ((frame (b e) (make-array (- n b) :element-type 'character
+ :displaced-to str :displaced-index-offset b :fill-pointer (- e b)))
+ (set-fr (fr e &aux (fr (or fr (frame 0 b)))) (setf (fill-pointer fr) e) fr))
+ (let* ((i (string-match #v"/" str b))
+ (fr (set-fr fr (if (eql i -1) n i)))
+ (l (when (eq (stat fr) :link) (readlinkat 0 fr))))
+ (cond (l (let ((b (if (eql #\/ (aref l 0)) 0 b)))
+ (link-expand (concatenate 'string (set-fr fr b) l (frame (if (eql i -1) n i) n)) b)))
+ ((eql i -1) str)
+ ((link-expand str (1+ i) n fr))))))
+
+(defun logical-pathname-designator-p (x)
+ (typecase x
+ (string (logical-pathname-parse x))
+ (pathname (typep x 'logical-pathname))
+ (stream (logical-pathname-designator-p (pathname x)))))
+
+;(defvar *current-dir* (pathname (concatenate 'string (getcwd) "/"))) FIXME sync with chdir
+
+(defun truename (pd &aux (ppd (translate-logical-pathname pd))(ns (namestring ppd)))
+ (declare (optimize (safety 1)))
+ (check-type pd pathname-designator)
+ (when (wild-pathname-p ns)
+ (error 'file-error :pathname pd :format-control "Pathname is wild"))
+ (let* ((ns (ensure-dir-string (link-expand ns))))
+ (unless (or (zerop (length ns)) (stat ns))
+ (error 'file-error :pathname ns :format-control "Pathname does not exist"))
+ (let* ((d (pathname-directory ppd))
+ (d1 (subst :back :up d))
+ (ppd (if (eq d d1) ppd (make-pathname :directory d1 :defaults ppd))))
+ (if (eq (car d) :absolute) ppd (merge-pathnames ppd (concatenate 'string (getcwd) "/") nil)))))
+
+
+(defun probe-file (pd &aux (pn (translate-logical-pathname pd)))
+ (declare (optimize (safety 1)))
+ (check-type pd pathname-designator)
+ (when (wild-pathname-p pn)
+ (error 'file-error :pathname pn :format-control "Pathname is wild"))
+ (when (eq (stat (namestring pn)) :file)
+ (truename pn)))
--- /dev/null
+++ gcl-2.6.12/lsp/gcl_wild_pathname_p.lsp
@@ -0,0 +1,28 @@
+(in-package :si)
+
+(defun wild-namestring-p (x)
+ (when (stringp x) (>= (string-match #v"(\\*|\\?|\\[|\\{)" x) 0)))
+
+(defun wild-dir-element-p (x)
+ (or (eq x :wild) (eq x :wild-inferiors) (wild-namestring-p x)))
+
+(defun wild-path-element-p (x)
+ (or (eq x :wild) (wild-namestring-p x)))
+
+#.`(defun wild-pathname-p (pd &optional f)
+ (declare (optimize (safety 1)))
+ (check-type pd pathname-designator)
+ (check-type f (or null (member ,@+pathname-keys+)))
+ (case f
+ ((nil) (or (wild-namestring-p (namestring pd))
+ (when (typep pd 'pathname);FIXME stream
+ (eq :wild (pathname-version pd)))))
+ ;; ((nil) (if (stringp pd) (wild-namestring-p pd)
+ ;; (let ((p (pathname pd)))
+ ;; (when (member-if (lambda (x) (wild-pathname-p p x)) +pathname-keys+) t))))
+ ((:host :device) nil)
+ (:directory (when (member-if 'wild-dir-element-p (pathname-directory pd)) t))
+ (:name (wild-path-element-p (pathname-name pd)))
+ (:type (wild-path-element-p (pathname-type pd)))
+ (:version (wild-path-element-p (pathname-version pd)))))
+
--- gcl-2.6.12.orig/lsp/makefile
+++ gcl-2.6.12/lsp/makefile
@@ -13,9 +13,12 @@ OBJS = gcl_sharp.o gcl_arraylib.o gcl_as
gcl_describe.o gcl_evalmacros.o gcl_fpe.o \
gcl_iolib.o gcl_listlib.o gcl_mislib.o gcl_module.o gcl_numlib.o \
gcl_packlib.o gcl_predlib.o \
+ gcl_parse_namestring.o gcl_make_pathname.o gcl_namestring.o gcl_translate_pathname.o\
+ gcl_logical_pathname_translations.o gcl_directory.o gcl_merge_pathnames.o gcl_truename.o gcl_sharp_uv.o\
gcl_seq.o gcl_seqlib.o gcl_setf.o gcl_top.o gcl_trace.o gcl_sloop.o \
gcl_debug.o gcl_info.o gcl_serror.o gcl_restart.o \
- gcl_destructuring_bind.o gcl_defpackage.o gcl_make_defpackage.o gcl_loop.o $(EXTRA_LOBJS)
+ gcl_rename_file.o gcl_pathname_match_p.o gcl_wild_pathname_p.o \
+ gcl_destructuring_bind.o gcl_defpackage.o gcl_make_defpackage.o gcl_loop.o $(EXTRA_LOBJS)
# export.o autoload.o auto_new.o
LISP=$(PORTDIR)/saved_pre_gcl$(EXE)
--- gcl-2.6.12.orig/lsp/sys-proclaim.lisp
+++ gcl-2.6.12/lsp/sys-proclaim.lisp
@@ -2,361 +2,223 @@
(COMMON-LISP::IN-PACKAGE "SYSTEM")
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T)
- ANSI-LOOP::LOOP-EMIT-FINAL-VALUE SYSTEM::INSPECT-CHARACTER
- SYSTEM::INSPECT-STRUCTURE SYSTEM::PRINT-IHS SYSTEM::DBL-RPL-LOOP
- SYSTEM::RESTART-FUNCTION COMMON-LISP::TANH COMMON-LISP::FIFTH
- SLOOP::PARSE-LOOP-INITIALLY SYSTEM::NEXT-STACK-FRAME
- SYSTEM::IDESCRIBE SYSTEM::PROCESS-ARGS SYSTEM::LEAP-YEAR-P
- SLOOP::AVERAGING-SLOOP-MACRO SYSTEM::FIX-LOAD-PATH
- SLOOP::SUBSTITUTE-SLOOP-BODY SYSTEM::RESTART-REPORT-FUNCTION
- COMMON-LISP::NINTH SLOOP::SLOOP-SLOOP-MACRO
- SYSTEM::S-DATA-CONSTRUCTORS SYSTEM::FREEZE-DEFSTRUCT
- COMMON-LISP::EIGHTH SYSTEM::FIND-DOCUMENTATION
- ANSI-LOOP::LOOP-PSEUDO-BODY COMMON-LISP::RATIONAL
- ANSI-LOOP::LOOP-EMIT-BODY COMMON-LISP::ASIN
- COMMON-LISP::COMPILE-FILE-PATHNAME SYSTEM::S-DATA-P
- SYSTEM::BKPT-FUNCTION SYSTEM::TRACE-ONE-PREPROCESS
- COMMON-LISP::LOGNOT SYSTEM::SIMPLE-ARRAY-P SYSTEM::BKPT-FILE
- SYSTEM::S-DATA-STATICP COMMON-LISP::ISQRT SYSTEM::INSTREAM-P
- COMMON-LISP::SEVENTH SYSTEM::S-DATA-NAMED
- ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS SYSTEM::INSPECT-NUMBER
- COMMON-LISP::ATANH SYSTEM::RESTART-TEST-FUNCTION
- SYSTEM::S-DATA-INCLUDES SYSTEM::S-DATA-HAS-HOLES
- SYSTEM::CONTEXT-VEC FPE::XMM-LOOKUP SYSTEM::S-DATA-RAW
- ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS
- SYSTEM::RESTART-INTERACTIVE-FUNCTION
- ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS
- ANSI-LOOP::LOOP-COLLECTOR-NAME ANSI-LOOP::LOOP-PATH-NAMES
- ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE
- SYSTEM::S-DATA-INCLUDED SYSTEM::S-DATA-SLOT-DESCRIPTIONS
- SYSTEM::S-DATA-OFFSET SLOOP::REPEAT-SLOOP-MACRO
- SYSTEM::S-DATA-PRINT-FUNCTION ANSI-LOOP::LOOP-PATH-USER-DATA
- COMMON-LISP::FIND-ALL-SYMBOLS COMMON-LISP::FIRST
- SYSTEM::GET-BYTE-STREAM-NCHARS SYSTEM::BKPT-FORM
- SYSTEM::NODES-FROM-INDEX SYSTEM::INSPECT-SYMBOL
- SYSTEM::KNOWN-TYPE-P ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE
- SYSTEM::MAKE-DEFPACKAGE-FORM COMMON-LISP::ARRAY-DIMENSIONS
- SYSTEM::INSERT-BREAK-POINT SLOOP::PARSE-LOOP
- ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED
- ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS SYSTEM::SHORT-NAME
- SYSTEM::CHECK-TRACE-SPEC ANSI-LOOP::DESTRUCTURING-SIZE
- SYSTEM::BEST-ARRAY-ELEMENT-TYPE SYSTEM::CONTEXT-HASH
- COMMON-LISP::SIXTH SYSTEM::IHS-VISIBLE SYSTEM::INSPECT-ARRAY
- COMMON-LISP::BYTE-SIZE ANSI-LOOP::LOOP-COLLECTOR-CLASS
- ANSI-LOOP::LOOP-HACK-ITERATION
- ANSI-LOOP::LOOP-CONSTRUCT-RETURN SYSTEM::S-DATA-SLOT-POSITION
- ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE SYSTEM::INSPECT-STRING
- COMMON-LISP::PROVIDE COMMON-LISP::CIS
- ANSI-LOOP::LOOP-MINIMAX-OPERATIONS
- SYSTEM::BREAK-BACKWARD-SEARCH-STACK
- ANSI-LOOP::LOOP-COLLECTOR-DTYPE
- SYSTEM::IHS-NOT-INTERPRETED-ENV SYSTEM::SEARCH-STACK
- COMMON-LISP::TENTH ANSI-LOOP::LOOP-DO-THEREIS
- ANSI-LOOP::LOOP-MAXMIN-COLLECTION
- ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA
- ANSI-LOOP::LOOP-MAKE-PSETQ SYSTEM::ADD-TO-HOTLIST
- SYSTEM::INSPECT-CONS ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS
- SYSTEM::INSPECT-VECTOR COMMON-LISP::CONSTANTLY
- SYSTEM::REWRITE-RESTART-CASE-CLAUSE SYSTEM::DM-BAD-KEY
- SYSTEM::PRINT-SYMBOL-APROPOS SYSTEM::FRS-KIND FPE::ST-LOOKUP
- COMMON-LISP::FOURTH SYSTEM::TERMINAL-INTERRUPT
- SYSTEM::DM-KEY-NOT-ALLOWED SYSTEM::UNIQUE-ID
- SYSTEM::S-DATA-FROZEN SLOOP::POINTER-FOR-COLLECT
- SYSTEM::INSPECT-PACKAGE SYSTEM::DBL-EVAL
- ANSI-LOOP::LOOP-MINIMAX-TYPE ANSI-LOOP::LOOP-UNIVERSE-ANSI
- ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS SYSTEM::DWIM
- SYSTEM::INSTREAM-STREAM-NAME SLOOP::RETURN-SLOOP-MACRO
- SYSTEM::PATCH-SHARP SYSTEM::CONTEXT-P SYSTEM::INFO-GET-FILE
- SYSTEM::RESTART-P COMMON-LISP::COSH COMMON-LISP::SINH
- SYSTEM::GET-NEXT-VISIBLE-FUN SYSTEM::CHECK-DECLARATIONS
- SYSTEM::GET-INSTREAM
- ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD SYSTEM::S-DATA-NAME
- ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS
- SYSTEM::S-DATA-DOCUMENTATION SYSTEM::SHOW-BREAK-POINT
- COMMON-LISP::ACOS COMMON-LISP::INVOKE-DEBUGGER
- SYSTEM::BKPT-FILE-LINE ANSI-LOOP::LOOP-COLLECTOR-DATA
- COMMON-LISP::THIRD SYSTEM::S-DATA-CONC-NAME
- COMMON-LISP::SIGNUM
- ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED
- SYSTEM::NORMALIZE-TYPE ANSI-LOOP::LOOP-TYPED-INIT
- ANSI-LOOP::LOOP-PATH-FUNCTION SYSTEM::INFO-NODE-FROM-POSITION
- COMMON-LISP::ASINH SYSTEM::RE-QUOTE-STRING
- SLOOP::LOOP-COLLECT-KEYWORD-P SYSTEM::PRINT-FRS
- SYSTEM::EVAL-FEATURE ANSI-LOOP::LOOP-COLLECTOR-P
- ANSI-LOOP::LOOP-COLLECTOR-HISTORY
- ANSI-LOOP::LOOP-LIST-COLLECTION
- SYSTEM::BREAK-FORWARD-SEARCH-STACK COMMON-LISP::RESTART-NAME
- SLOOP::PARSE-NO-BODY ANSI-LOOP::LOOP-UNIVERSE-P
- SYSTEM::NUMBER-OF-DAYS-FROM-1900 SYSTEM::NODE-OFFSET
- ANSI-LOOP::LOOP-MINIMAX-P SYSTEM::IHS-FNAME FPE::LOOKUP
- SLOOP::LOOP-LET-BINDINGS FPE::GREF COMMON-LISP::PHASE
- COMMON-LISP::BYTE-POSITION SYSTEM::INSTREAM-STREAM
- ANSI-LOOP::LOOP-PATH-P SYSTEM::SEQTYPE COMMON-LISP::ACOSH
- COMMON-LISP::ABS COMMON-LISP::COMPLEMENT
- ANSI-LOOP::LOOP-CONSTANTP SYSTEM::WALK-THROUGH
- SYSTEM::SETUP-INFO SYSTEM::COMPUTING-ARGS-P
- SYSTEM::CONTEXT-SPICE SYSTEM::MAKE-KCL-TOP-RESTART
- COMMON-LISP::COMPILER-MACRO-FUNCTION
- ANSI-LOOP::LOOP-MAKE-DESETQ SYSTEM::SHOW-ENVIRONMENT
- SLOOP::TRANSLATE-NAME SYSTEM::INFO-GET-TAGS
- COMMON-LISP::SECOND SYSTEM::RESET-TRACE-DECLARATIONS
- SYSTEM::S-DATA-TYPE SYSTEM::FIND-KCL-TOP-RESTART
- ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE SYSTEM::DO-F
- ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS COMMON-LISP::VECTOR-POP))
+ (COMMON-LISP::FUNCTION
+ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER
+ COMMON-LISP::*)
+ (COMMON-LISP::INTEGER -9223372036854775808
+ 9223372036854775807))
+ COMMON-LISP::FIXNUM)
+ SYSTEM::ATOI))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*)
- SYSTEM::IHS-BACKTRACE SYSTEM::BREAK-NEXT SYSTEM::BREAK-QUIT
- SYSTEM::SHOW-BREAK-VARIABLES SYSTEM::BREAK-BDS
- COMMON-LISP::MUFFLE-WARNING SYSTEM::BREAK-PREVIOUS
- SYSTEM::INFO-ERROR ANSI-LOOP::LOOP-OPTIONAL-TYPE
- SYSTEM::DBL-BACKTRACE SYSTEM::BREAK-LOCAL SYSTEM::BREAK-VS
- COMMON-LISP::CONTINUE))
+ (COMMON-LISP::FUNCTION (COMMON-LISP::T)
+ (COMMON-LISP::OR COMMON-LISP::NULL
+ COMMON-LISP::HASH-TABLE))
+ SYSTEM::CONTEXT-HASH))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM)
- COMMON-LISP::FIXNUM)
- SYSTEM::DBL-WHAT-FRAME FPE::FE-ENABLE))
+ (COMMON-LISP::FUNCTION
+ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
+ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*)
+ COMMON-LISP::*)
+ SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST SYSTEM::PARSE-DEFMACRO))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*)
COMMON-LISP::*)
- COMMON-LISP::SUBTYPEP COMMON-LISP::REDUCE SYSTEM::PARSE-BODY
- COMMON-LISP::STABLE-SORT COMMON-LISP::SORT
- SLOOP::FIND-IN-ORDERED-LIST))
+ COMMON-LISP::SUBTYPEP COMMON-LISP::REDUCE
+ SLOOP::FIND-IN-ORDERED-LIST SYSTEM::PARSE-BODY
+ COMMON-LISP::STABLE-SORT COMMON-LISP::SORT))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T)
COMMON-LISP::*)
- SYSTEM::VERIFY-KEYWORDS SYSTEM::RESTART-PRINT
- ANSI-LOOP::LOOP-GET-COLLECTION-INFO SYSTEM::LIST-MERGE-SORT
- SYSTEM::READ-INSPECT-COMMAND SYSTEM::SHARP---READER
- SYSTEM::SHARP-+-READER SYSTEM::SHARP-S-READER))
+ SYSTEM::SHARP-+-READER SYSTEM::SHARP---READER
+ SYSTEM::SHARP-S-READER ANSI-LOOP::LOOP-GET-COLLECTION-INFO
+ SYSTEM::VERIFY-KEYWORDS SYSTEM::LIST-MERGE-SORT
+ SYSTEM::RESTART-PRINT SYSTEM::READ-INSPECT-COMMAND))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::T COMMON-LISP::T)
+ COMMON-LISP::T)
COMMON-LISP::*)
- SYSTEM::PUSH-OPTIONAL-BINDING))
+ SYSTEM::TRACE-CALL))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*)
+ COMMON-LISP::*)
COMMON-LISP::*)
- SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST SYSTEM::PARSE-DEFMACRO))
+ SYSTEM::EXPAND-WILD-DIRECTORY SYSTEM::MASET))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
COMMON-LISP::T)
COMMON-LISP::*)
- SYSTEM::TRACE-CALL))
+ SYSTEM::MME3))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::*)
- COMMON-LISP::*)
- SYSTEM::MASET))
-(COMMON-LISP::PROCLAIM
- '(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM)
- FPE::REG-LOOKUP SYSTEM::INSTREAM-LINE SYSTEM::THE-START
- SYSTEM::S-DATA-LENGTH SYSTEM::S-DATA-SIZE))
-(COMMON-LISP::PROCLAIM
- '(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T)
- SYSTEM::PUSH-CONTEXT SYSTEM::GET-CONTEXT))
-(COMMON-LISP::PROCLAIM
- '(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*)
- SYSTEM::BREAK-CURRENT SYSTEM::GCL-TOP-LEVEL
- SYSTEM::BREAK-MESSAGE SYSTEM::BREAK-RESUME
- ANSI-LOOP::LOOP-DO-FOR SYSTEM::SIMPLE-BACKTRACE
- SYSTEM::BREAK-HELP))
-(COMMON-LISP::PROCLAIM
- '(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::STRING) COMMON-LISP::T)
- SYSTEM::COERCE-SLASH-TERMINATED SYSTEM::RESET-SYS-PATHS))
-(COMMON-LISP::PROCLAIM
- '(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*)
- COMMON-LISP::T)
- COMMON-LISP::BIT COMMON-LISP::READ-BYTE
- COMMON-LISP::CONCATENATE SYSTEM::INFO-SEARCH
- COMMON-LISP::ARRAY-IN-BOUNDS-P ANSI-LOOP::LOOP-ERROR
- ANSI-LOOP::LOOP-WARN COMMON-LISP::REMOVE-DUPLICATES
- SYSTEM::BAD-SEQ-LIMIT SYSTEM::PROCESS-SOME-ARGS
- ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES
- SLOOP::LOOP-ADD-TEMPS COMMON-LISP::BIT-NOT COMMON-LISP::SIGNAL
- SYSTEM::NTH-STACK-FRAME COMMON-LISP::ARRAY-ROW-MAJOR-INDEX
- COMMON-LISP::MAKE-ARRAY SYSTEM::FILE-SEARCH
- SYSTEM::LIST-MATCHES COMMON-LISP::FIND-RESTART
- SYSTEM::BREAK-LEVEL COMMON-LISP::DELETE-DUPLICATES
- SLOOP::ADD-FROM-DATA COMMON-LISP::ERROR COMMON-LISP::WARN
- SYSTEM::FILE-TO-STRING
- COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE COMMON-LISP::SBIT))
-(COMMON-LISP::PROCLAIM
- '(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T)
+ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
+ COMMON-LISP::T COMMON-LISP::T)
COMMON-LISP::*)
- SYSTEM::FIND-DOC SYSTEM::RESTART-REPORT
- ANSI-LOOP::ESTIMATE-CODE-SIZE-1 SYSTEM::NEWLINE
- ANSI-LOOP::ESTIMATE-CODE-SIZE SYSTEM::NEW-SEMI-COLON-READER))
+ SYSTEM::PUSH-OPTIONAL-BINDING))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION (COMMON-LISP::T)
(COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T))
SYSTEM::MAKE-KEYWORD))
-(COMMON-LISP::MAPC
- (COMMON-LISP::LAMBDA (COMPILER::X)
- (COMMON-LISP::SETF
- (COMMON-LISP::GET COMPILER::X 'SYSTEM::PROCLAIMED-CLOSURE)
- COMMON-LISP::T))
- '(SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::SI-CLASSP
- SYSTEM::SIMPLE-CONDITION-CLASS-P SYSTEM::UNTRACE-ONE
- SYSTEM::CONDITIONP SYSTEM::CONDITION-CLASS-P
- SYSTEM::MAKE-ACCESS-FUNCTION SYSTEM::SI-CLASS-NAME
- SYSTEM::AUTOLOAD-MACRO SYSTEM::AUTOLOAD SYSTEM::SI-CLASS-OF
- SYSTEM::WARNINGP SYSTEM::DEFINE-STRUCTURE
- FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS SYSTEM::SI-FIND-CLASS
- SYSTEM::TRACE-ONE))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
- (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM
+ (COMMON-LISP::T
+ (COMMON-LISP::INTEGER -9223372036854775808
+ 9223372036854775807)
+ (COMMON-LISP::INTEGER -9223372036854775808
+ 9223372036854775807)
COMMON-LISP::T COMMON-LISP::T)
COMMON-LISP::T)
SYSTEM::QUICK-SORT))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
- (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::T
- COMMON-LISP::T)
+ (COMMON-LISP::T
+ (COMMON-LISP::INTEGER -9223372036854775808
+ 9223372036854775807)
+ COMMON-LISP::T COMMON-LISP::T)
COMMON-LISP::T)
SYSTEM::BIGNTHCDR))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
+ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*)
+ COMMON-LISP::T)
+ COMMON-LISP::EVERY COMMON-LISP::SET-DIFFERENCE
+ SYSTEM::VECTOR-PUSH-STRING SYSTEM::PROCESS-ERROR
+ COMMON-LISP::POSITION-IF-NOT COMMON-LISP::FIND-IF
+ SLOOP::LOOP-ADD-BINDING COMMON-LISP::BIT-ORC1
+ COMMON-LISP::READ-SEQUENCE SYSTEM::INTERNAL-COUNT-IF
+ COMMON-LISP::COUNT COMMON-LISP::MISMATCH
+ COMMON-LISP::ADJUST-ARRAY COMMON-LISP::INTERSECTION
+ COMMON-LISP::UNION COMMON-LISP::DELETE-IF-NOT
+ COMMON-LISP::NINTERSECTION COMMON-LISP::BIT-ANDC1
+ COMMON-LISP::REMOVE-IF-NOT COMMON-LISP::TYPEP
+ COMMON-LISP::NUNION COMMON-LISP::WRITE-SEQUENCE
+ COMMON-LISP::VECTOR-PUSH-EXTEND COMMON-LISP::REMOVE
+ COMMON-LISP::BIT-IOR SLOOP::PARSE-LOOP-MACRO
+ COMMON-LISP::SEARCH COMMON-LISP::SUBSETP
+ COMMON-LISP::SET-EXCLUSIVE-OR SYSTEM::WREADDIR
+ COMMON-LISP::POSITION-IF COMMON-LISP::DELETE
+ COMMON-LISP::BIT-EQV COMMON-LISP::BIT-ANDC2
+ COMMON-LISP::BIT-AND COMMON-LISP::NSET-EXCLUSIVE-OR
+ SLOOP::IN-ARRAY-SLOOP-FOR ANSI-LOOP::LOOP-CHECK-DATA-TYPE
+ COMMON-LISP::POSITION COMMON-LISP::MAKE-SEQUENCE
+ COMMON-LISP::NOTEVERY COMMON-LISP::MAP-INTO
+ COMMON-LISP::REPLACE COMMON-LISP::NSET-DIFFERENCE
+ COMMON-LISP::FIND-IF-NOT COMMON-LISP::BIT-ORC2
+ COMMON-LISP::DELETE-IF COMMON-LISP::CERROR
+ COMMON-LISP::BIT-XOR COMMON-LISP::FIND COMMON-LISP::FILL
+ SYSTEM::INTERNAL-COUNT-IF-NOT COMMON-LISP::REMOVE-IF
+ COMMON-LISP::BIT-NAND COMMON-LISP::BIT-NOR COMMON-LISP::SOME
+ COMMON-LISP::COUNT-IF SYSTEM::BREAK-CALL
+ COMMON-LISP::COUNT-IF-NOT SYSTEM::FIND-IHS COMMON-LISP::NOTANY
+ SYSTEM::INTERNAL-COUNT))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T)
COMMON-LISP::T)
- ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE ANSI-LOOP::LOOP-FOR-IN
- SYSTEM::DEFMACRO* SYSTEM::APPLY-DISPLAY-FUN
- SYSTEM::WARN-VERSION ANSI-LOOP::HIDE-VARIABLE-REFERENCE
- SYSTEM::SHARP-U-READER ANSI-LOOP::LOOP-FOR-ACROSS
- SYSTEM::DM-VL SYSTEM::GET-SLOT-POS
+ SYSTEM::PATHNAME-PARSE ANSI-LOOP::LOOP-TRANSLATE
+ SYSTEM::CHECK-S-DATA SYSTEM::MFR FPE::REF
+ ANSI-LOOP::LOOP-STANDARD-EXPANSION ANSI-LOOP::LOOP-FOR-ON
+ ANSI-LOOP::LOOP-SUM-COLLECTION SYSTEM::SHARP-DQ-READER
+ COMMON-LISP::DPB SYSTEM::CHECK-TRACE-ARGS
+ SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS SYSTEM::RECURSE-DIR
+ SYSTEM::SHARP-U-READER SYSTEM::FLOATING-POINT-ERROR
+ ANSI-LOOP::LOOP-FOR-IN ANSI-LOOP::HIDE-VARIABLE-REFERENCE
+ SYSTEM::GET-SLOT-POS SYSTEM::APPLY-DISPLAY-FUN
SYSTEM::RESTART-CASE-EXPRESSION-CONDITION
- SYSTEM::CHECK-TRACE-ARGS ANSI-LOOP::LOOP-FOR-ON FPE::REF
- ANSI-LOOP::PRINT-LOOP-UNIVERSE ANSI-LOOP::LOOP-ANSI-FOR-EQUALS
- SYSTEM::SETF-EXPAND-1 ANSI-LOOP::LOOP-SUM-COLLECTION
- ANSI-LOOP::LOOP-STANDARD-EXPANSION SYSTEM::MAKE-T-TYPE
- COMMON-LISP::DEPOSIT-FIELD SYSTEM::MAKE-BREAK-POINT
- ANSI-LOOP::LOOP-FOR-BEING ANSI-LOOP::LOOP-TRANSLATE
- SYSTEM::SHARP-A-READER COMMON-LISP::DPB
- SYSTEM::FLOATING-POINT-ERROR SYSTEM::CHECK-S-DATA
- SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS))
+ SYSTEM::MAKE-BREAK-POINT SYSTEM::TO-REGEXP-OR-NAMESTRING
+ COMMON-LISP::DEPOSIT-FIELD SYSTEM::SHARP-V-READER
+ SYSTEM::MAKE-T-TYPE ANSI-LOOP::LOOP-FOR-ACROSS
+ ANSI-LOOP::LOOP-ANSI-FOR-EQUALS ANSI-LOOP::PRINT-LOOP-UNIVERSE
+ ANSI-LOOP::LOOP-FOR-BEING SYSTEM::SHARP-P-READER SYSTEM::DM-VL
+ SYSTEM::SHARP-A-READER ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE
+ SYSTEM::DEFMACRO* SYSTEM::SETF-EXPAND-1 SYSTEM::WARN-VERSION))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::T)
+ COMMON-LISP::*)
COMMON-LISP::T)
- SLOOP::FIRST-USE-SLOOP-FOR SYSTEM::COERCE-TO-CONDITION SYSTEM::DO-BREAK-LEVEL
- SLOOP::FIRST-SLOOP-FOR ANSI-LOOP::LOOP-FOR-ARITHMETIC
- SYSTEM::MAYBE-BREAK SYSTEM::SETF-STRUCTURE-ACCESS
- SYSTEM::CALL-TEST SYSTEM::FIND-LINE-IN-FUN))
+ SYSTEM::MME2 COMMON-LISP::NSUBSTITUTE SYSTEM::MATCH-COMPONENT
+ SYSTEM::COMPLETE-PROP SYSTEM::WALK-DIR
+ COMMON-LISP::TRANSLATE-PATHNAME ANSI-LOOP::ADD-LOOP-PATH
+ SYSTEM::DIR-PARSE ANSI-LOOP::LOOP-MAKE-VARIABLE
+ COMMON-LISP::SUBSTITUTE-IF COMMON-LISP::NSUBSTITUTE-IF
+ SYSTEM::PUSH-LET-BINDING COMMON-LISP::SUBSTITUTE
+ ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH COMMON-LISP::MAP
+ COMMON-LISP::SUBSTITUTE-IF-NOT COMMON-LISP::NSUBSTITUTE-IF-NOT
+ ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH
+ SLOOP::LOOP-DECLARE-BINDING
+ ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH
+ SYSTEM::CHECK-TYPE-SYMBOL))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*)
+ (COMMON-LISP::T COMMON-LISP::T
+ (COMMON-LISP::INTEGER -9223372036854775808
+ 9223372036854775807))
COMMON-LISP::T)
- COMMON-LISP::COUNT-IF COMMON-LISP::BIT-ANDC2
- COMMON-LISP::REMOVE SYSTEM::INTERNAL-COUNT-IF
- SLOOP::LOOP-ADD-BINDING COMMON-LISP::MAP-INTO
- COMMON-LISP::FIND-IF COMMON-LISP::NSET-DIFFERENCE
- COMMON-LISP::UNION COMMON-LISP::NUNION
- COMMON-LISP::MAKE-SEQUENCE COMMON-LISP::NOTANY
- COMMON-LISP::POSITION COMMON-LISP::DELETE-IF
- COMMON-LISP::BIT-ORC2 COMMON-LISP::REPLACE COMMON-LISP::DELETE
- SYSTEM::BREAK-CALL COMMON-LISP::NINTERSECTION
- COMMON-LISP::POSITION-IF SYSTEM::FIND-IHS COMMON-LISP::BIT-AND
- COMMON-LISP::DELETE-IF-NOT ANSI-LOOP::LOOP-CHECK-DATA-TYPE
- COMMON-LISP::REMOVE-IF COMMON-LISP::READ-SEQUENCE
- SLOOP::PARSE-LOOP-MACRO COMMON-LISP::BIT-NAND
- SYSTEM::INTERNAL-COUNT-IF-NOT COMMON-LISP::SUBSETP
- COMMON-LISP::VECTOR-PUSH-EXTEND COMMON-LISP::EVERY
- COMMON-LISP::SOME COMMON-LISP::WRITE-SEQUENCE
- COMMON-LISP::MISMATCH COMMON-LISP::SET-EXCLUSIVE-OR
- COMMON-LISP::REMOVE-IF-NOT COMMON-LISP::BIT-NOR
- COMMON-LISP::BIT-XOR COMMON-LISP::BIT-EQV COMMON-LISP::SEARCH
- COMMON-LISP::SET-DIFFERENCE COMMON-LISP::FILL
- COMMON-LISP::CERROR COMMON-LISP::ADJUST-ARRAY
- COMMON-LISP::BIT-ORC1 SYSTEM::INTERNAL-COUNT
- COMMON-LISP::TYPEP SYSTEM::PROCESS-ERROR
- COMMON-LISP::COUNT-IF-NOT COMMON-LISP::INTERSECTION
- SLOOP::IN-ARRAY-SLOOP-FOR COMMON-LISP::FIND-IF-NOT
- COMMON-LISP::BIT-ANDC1 COMMON-LISP::POSITION-IF-NOT
- COMMON-LISP::NOTEVERY COMMON-LISP::NSET-EXCLUSIVE-OR
- COMMON-LISP::FIND COMMON-LISP::COUNT COMMON-LISP::BIT-IOR))
+ SYSTEM::SHARP-EQ-READER SYSTEM::SHARP-SHARP-READER))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T)
+ COMMON-LISP::T)
COMMON-LISP::T)
- SYSTEM::PUSH-SUB-LIST-BINDING SYSTEM::DO-ARG-COUNT-ERROR))
+ SYSTEM::ELSUB SLOOP::FIRST-USE-SLOOP-FOR
+ SLOOP::FIRST-SLOOP-FOR SYSTEM::SETF-STRUCTURE-ACCESS
+ SYSTEM::FIND-LINE-IN-FUN SYSTEM::COERCE-TO-CONDITION
+ ANSI-LOOP::LOOP-FOR-ARITHMETIC SYSTEM::MAYBE-BREAK
+ SYSTEM::ELEMENT SYSTEM::DO-BREAK-LEVEL SYSTEM::CALL-TEST))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::*)
+ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
+ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
+ COMMON-LISP::T)
COMMON-LISP::T)
- ANSI-LOOP::ADD-LOOP-PATH COMMON-LISP::MAP
- ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH
- ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH
- COMMON-LISP::SUBSTITUTE COMMON-LISP::NSUBSTITUTE
- COMMON-LISP::NSUBSTITUTE-IF-NOT ANSI-LOOP::LOOP-MAKE-VARIABLE
- COMMON-LISP::SUBSTITUTE-IF-NOT
- ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH
- SYSTEM::PUSH-LET-BINDING COMMON-LISP::SUBSTITUTE-IF
- SYSTEM::CHECK-TYPE-SYMBOL SLOOP::LOOP-DECLARE-BINDING
- SYSTEM::COMPLETE-PROP COMMON-LISP::NSUBSTITUTE-IF))
+ ANSI-LOOP::LOOP-SEQUENCER))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
COMMON-LISP::T COMMON-LISP::T)
COMMON-LISP::T)
- SYSTEM::MAKE-PREDICATE
- SYSTEM::MAKE-CONSTRUCTOR))
+ SYSTEM::MAKE-CONSTRUCTOR SYSTEM::MAKE-PREDICATE))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*)
- COMMON-LISP::T)
- SYSTEM::UNIVERSAL-ERROR-HANDLER))
-(COMMON-LISP::PROCLAIM
- '(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION
- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::FIXNUM)
+ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T)
COMMON-LISP::T)
- SYSTEM::SHARP-SHARP-READER SYSTEM::SHARP-EQ-READER))
+ SYSTEM::PUSH-SUB-LIST-BINDING SYSTEM::DO-ARG-COUNT-ERROR))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
COMMON-LISP::T COMMON-LISP::*)
COMMON-LISP::T)
- SLOOP::DEF-LOOP-INTERNAL SYSTEM::PRINT-STACK-FRAME
- COMMON-LISP::MERGE))
+ SLOOP::DEF-LOOP-INTERNAL COMMON-LISP::MERGE
+ SYSTEM::PRINT-STACK-FRAME))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
@@ -369,154 +231,389 @@
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
(COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T
- COMMON-LISP::T)
+ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*)
COMMON-LISP::T)
- ANSI-LOOP::LOOP-SEQUENCER))
+ SYSTEM::UNIVERSAL-ERROR-HANDLER))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*)
+ COMMON-LISP::T)
+ COMMON-LISP::MERGE-PATHNAMES
+ COMMON-LISP::TRANSLATE-LOGICAL-PATHNAME ANSI-LOOP::LOOP-ERROR
+ COMMON-LISP::WILD-PATHNAME-P SLOOP::LOOP-ADD-TEMPS
+ SYSTEM::FILE-SEARCH SYSTEM::INFO-SEARCH
+ COMMON-LISP::PATHNAME-VERSION COMMON-LISP::WARN SYSTEM::MGSUB
+ COMMON-LISP::ARRAY-ROW-MAJOR-INDEX
+ COMMON-LISP::REMOVE-DUPLICATES COMMON-LISP::PATHNAME-NAME
+ COMMON-LISP::BIT COMMON-LISP::FIND-RESTART SYSTEM::TO-REGEXP
+ SYSTEM::PROCESS-SOME-ARGS COMMON-LISP::ERROR
+ COMMON-LISP::REQUIRE COMMON-LISP::OPEN
+ COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE SLOOP::ADD-FROM-DATA
+ SYSTEM::BREAK-LEVEL SYSTEM::LIST-MATCHES
+ COMMON-LISP::DELETE-DUPLICATES ANSI-LOOP::LOOP-WARN
+ COMMON-LISP::PATHNAME-DEVICE COMMON-LISP::LOAD
+ COMMON-LISP::PATHNAME-HOST COMMON-LISP::SBIT SYSTEM::NLOAD
+ COMMON-LISP::BIT-NOT COMMON-LISP::ENOUGH-NAMESTRING
+ COMMON-LISP::SIGNAL COMMON-LISP::ARRAY-IN-BOUNDS-P
+ COMMON-LISP::PATHNAME-TYPE SYSTEM::FILE-TO-STRING
+ SYSTEM::LOGICAL-PATHNAME-PARSE SYSTEM::NTH-STACK-FRAME
+ ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES SYSTEM::MGLIST
+ COMMON-LISP::DIRECTORY SYSTEM::BAD-SEQ-LIMIT
+ COMMON-LISP::PATHNAME-DIRECTORY COMMON-LISP::READ-BYTE
+ SYSTEM::LINK-EXPAND COMMON-LISP::CONCATENATE
+ COMMON-LISP::MAKE-ARRAY))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T)
+ COMMON-LISP::*)
+ SYSTEM::NEWLINE SYSTEM::LIST-TOGGLE-CASE
+ COMMON-LISP::RENAME-FILE ANSI-LOOP::ESTIMATE-CODE-SIZE
+ SYSTEM::SOURCE-PORTION SYSTEM::RESTART-REPORT SYSTEM::DO-REPL
+ SYSTEM::FIND-DOC ANSI-LOOP::ESTIMATE-CODE-SIZE-1
+ SYSTEM::NEW-SEMI-COLON-READER))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
- (COMMON-LISP::STRING COMMON-LISP::FIXNUM)
+ ((COMMON-LISP::INTEGER -9223372036854775808
+ 9223372036854775807))
COMMON-LISP::FIXNUM)
- SYSTEM::ATOI))
+ FPE::FE-ENABLE SYSTEM::DBL-WHAT-FRAME))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*)
+ COMMON-LISP::*)
+ SYSTEM::INFO SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE
+ COMMON-LISP::FTRUNCATE COMMON-LISP::USE-VALUE
+ COMMON-LISP::INVOKE-RESTART COMMON-LISP::WRITE-TO-STRING
+ COMMON-LISP::FCEILING COMMON-LISP::FROUND
+ COMMON-LISP::READ-FROM-STRING COMMON-LISP::FFLOOR
+ SYSTEM::PARSE-BODY-HEADER SYSTEM::BREAK-FUNCTION
+ SYSTEM::APROPOS-DOC COMMON-LISP::APROPOS
+ COMMON-LISP::APROPOS-LIST
+ ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE
+ COMMON-LISP::GET-SETF-EXPANSION SYSTEM::PRINT-DOC
+ COMMON-LISP::PARSE-NAMESTRING
+ COMMON-LISP::ENSURE-DIRECTORIES-EXIST
+ COMMON-LISP::DECODE-UNIVERSAL-TIME SYSTEM::SHOW-INFO
+ COMMON-LISP::STORE-VALUE SYSTEM::STEPPER))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T)
+ COMMON-LISP::T)
+ COMMON-LISP::VECTOR-PUSH SYSTEM::DM-NTH COMMON-LISP::LOGORC1
+ SLOOP::L-EQUAL SLOOP::NEVER-SLOOP-COLLECT
+ COMMON-LISP::LDB-TEST COMMON-LISP::LDB COMMON-LISP::LOGORC2
+ SLOOP::COUNT-SLOOP-COLLECT SLOOP::MAXIMIZE-SLOOP-COLLECT
+ SYSTEM::ALL-MATCHES ANSI-LOOP::LOOP-TMEMBER SLOOP::THE-TYPE
+ SYSTEM::?PUSH SYSTEM::INCREMENT-CURSOR SYSTEM::SET-DIR
+ SYSTEM::DM-NTH-CDR SYSTEM::IN-INTERVAL-P SLOOP::MAKE-VALUE
+ SYSTEM::DBL-UP COMMON-LISP::COERCE SYSTEM::MATCH-DIMENSIONS
+ COMMON-LISP::LOGNAND SLOOP::=-SLOOP-FOR
+ SYSTEM::KEYWORD-SUPPLIED-P SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS
+ SYSTEM::LEFT-PARENTHESIS-READER
+ ANSI-LOOP::LOOP-MAYBE-BIND-FORM SYSTEM::COERCE-TO-STRING
+ SYSTEM::ADD-FILE SLOOP::PARSE-LOOP-MAP COMMON-LISP::LOGNOR
+ SYSTEM::MSUB SYSTEM::SET-BACK SYSTEM::SUPER-GO
+ SYSTEM::SUBSTRINGP ANSI-LOOP::LOOP-TEQUAL
+ ANSI-LOOP::LOOP-DO-WHILE SYSTEM::GET-LINE-OF-FORM
+ FPE::READ-INSTRUCTION SYSTEM::SUB-INTERVAL-P
+ SYSTEM::CHECK-SEQ-START-END SYSTEM::*BREAK-POINTS*
+ ANSI-LOOP::MAKE-LOOP-MINIMAX SLOOP::IN-PACKAGE-SLOOP-MAP
+ SYSTEM::DM-V SYSTEM::INFO-AUX
+ ANSI-LOOP::HIDE-VARIABLE-REFERENCES
+ SLOOP::COLLATE-SLOOP-COLLECT COMMON-LISP::PATHNAME-MATCH-P
+ SYSTEM::SET-PATH-STREAM-NAME SLOOP::SUM-SLOOP-COLLECT
+ ANSI-LOOP::LOOP-LOOKUP-KEYWORD
+ ANSI-LOOP::LOOP-DECLARE-VARIABLE SYSTEM::BREAK-STEP-NEXT
+ FPE::RF SLOOP::IN-TABLE-SLOOP-MAP SYSTEM::OBJLT
+ FPE::READ-OPERANDS SYSTEM::BREAK-STEP-INTO COMMON-LISP::BYTE
+ SYSTEM::SEQUENCE-CURSOR SYSTEM::LIST-DELQ
+ SYSTEM::SETF-LOGICAL-PATHNAME-TRANSLATIONS
+ SYSTEM::CONDITION-PASS SYSTEM::SETF-HELPER FPE::0-READER
+ SYSTEM::DISPLAY-COMPILED-ENV COMMON-LISP::NTH
+ COMPILER::COMPILER-DEF-HOOK SYSTEM::DOT-DIR-P
+ COMMON-LISP::LOGTEST SYSTEM::QUOTATION-READER
+ SYSTEM::ITERATE-OVER-BKPTS COMMON-LISP::LOGANDC1
+ SLOOP::ALWAYS-SLOOP-COLLECT SLOOP::DESETQ1
+ SYSTEM::GET-INFO-CHOICES COMMON-LISP::WRITE-BYTE
+ ANSI-LOOP::LOOP-DO-IF ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION
+ ANSI-LOOP::LOOP-TASSOC SLOOP::IN-CAREFULLY-SLOOP-FOR
+ COMMON-LISP::DOCUMENTATION FPE::PAREN-READER SYSTEM::GET-NODES
+ SYSTEM::PARSE-SLOT-DESCRIPTION SLOOP::IN-FRINGE-SLOOP-MAP
+ SYSTEM::SAFE-EVAL SYSTEM::DISPLAY-ENV FPE::%-READER
+ SLOOP::THEREIS-SLOOP-COLLECT SYSTEM::LOOKUP-KEYWORD
+ COMMON-LISP::LOGANDC2 COMMON-LISP::NTHCDR
+ SLOOP::MINIMIZE-SLOOP-COLLECT SYSTEM::GET-MATCH
+ SYSTEM::SETF-EXPAND SLOOP::LOGXOR-SLOOP-COLLECT
+ ANSI-LOOP::LOOP-DO-ALWAYS))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION
+ ((COMMON-LISP::INTEGER -9223372036854775808
+ 9223372036854775807)
+ (COMMON-LISP::INTEGER -9223372036854775808
+ 9223372036854775807))
+ COMMON-LISP::FIXNUM)
+ SYSTEM::ROUND-UP))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T)
- SYSTEM::DESCRIBE-ENVIRONMENT SYSTEM::STEP-NEXT
- COMMON-LISP::BREAK COMMON-LISP::ABORT SYSTEM::MAKE-S-DATA
- ANSI-LOOP::MAKE-LOOP-COLLECTOR SLOOP::PARSE-LOOP-DECLARE
- ANSI-LOOP::LOOP-GENTEMP SYSTEM::MAKE-INSTREAM
- SYSTEM::MAYBE-CLEAR-INPUT
- ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL COMMON-LISP::Y-OR-N-P
- SYSTEM::CURRENT-STEP-FUN ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL
- COMMON-LISP::DRIBBLE SYSTEM::MAKE-RESTART
- SLOOP::PARSE-LOOP-WITH SYSTEM::LOC COMMON-LISP::YES-OR-NO-P
- SYSTEM::TRANSFORM-KEYWORDS SYSTEM::MAKE-CONTEXT
- COMMON-LISP::COMPUTE-RESTARTS SYSTEM::DBL-READ
- SYSTEM::STEP-INTO ANSI-LOOP::MAKE-LOOP-UNIVERSE
- SYSTEM::BREAK-LOCALS ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE
- COMMON-LISP::VECTOR ANSI-LOOP::MAKE-LOOP-PATH))
+ COMMON-LISP::Y-OR-N-P COMMON-LISP::YES-OR-NO-P
+ COMMON-LISP::DRIBBLE COMMON-LISP::VECTOR SYSTEM::NEXT-MATCH
+ SYSTEM::MAKE-S-DATA SYSTEM::LOC SYSTEM::BREAK-LOCALS
+ SLOOP::PARSE-LOOP-WITH COMMON-LISP::USER-HOMEDIR-PATHNAME
+ SYSTEM::STEP-INTO SYSTEM::MAYBE-CLEAR-INPUT
+ ANSI-LOOP::MAKE-LOOP-PATH SYSTEM::STEP-NEXT
+ ANSI-LOOP::LOOP-GENTEMP COMMON-LISP::COMPUTE-RESTARTS
+ SYSTEM::CURRENT-STEP-FUN SYSTEM::MAKE-INSTREAM
+ ANSI-LOOP::MAKE-LOOP-COLLECTOR SYSTEM::MAKE-RESTART
+ SYSTEM::DESCRIBE-ENVIRONMENT SYSTEM::TRANSFORM-KEYWORDS
+ COMMON-LISP::ABORT ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE
+ ANSI-LOOP::MAKE-LOOP-UNIVERSE SLOOP::PARSE-LOOP-DECLARE
+ COMMON-LISP::BREAK ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL
+ SYSTEM::MAKE-CONTEXT SYSTEM::DBL-READ
+ COMMON-LISP::MAKE-PATHNAME
+ ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*)
- ANSI-LOOP::LOOP-LIST-STEP SYSTEM::INSPECT-OBJECT
- COMMON-LISP::DESCRIBE ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES
- SYSTEM::BREAK-GO SYSTEM::GET-&ENVIRONMENT
- COMMON-LISP::PRINC-TO-STRING SYSTEM::WAITING
- SYSTEM::INSTREAM-NAME ANSI-LOOP::NAMED-VARIABLE
- COMMON-LISP::PRIN1-TO-STRING SYSTEM::INFO-SUBFILE
- COMMON-LISP::INSPECT SYSTEM::END-WAITING
- SYSTEM::FIND-DECLARATIONS
- COMMON-LISP::INVOKE-RESTART-INTERACTIVELY
- SYSTEM::BREAK-LEVEL-INVOKE-RESTART SYSTEM::ALOAD))
+ ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES SYSTEM::BREAK-GO
+ COMMON-LISP::FILE-AUTHOR SYSTEM::ENSURE-DIR-STRING
+ SYSTEM::INFO-SUBFILE COMMON-LISP::DESCRIBE SYSTEM::END-WAITING
+ COMMON-LISP::PRIN1-TO-STRING SYSTEM::FIND-DECLARATIONS
+ COMMON-LISP::INSPECT ANSI-LOOP::NAMED-VARIABLE
+ SYSTEM::GET-&ENVIRONMENT SYSTEM::INSPECT-OBJECT
+ COMMON-LISP::PRINC-TO-STRING ANSI-LOOP::LOOP-LIST-STEP
+ SYSTEM::INSTREAM-NAME SYSTEM::BREAK-LEVEL-INVOKE-RESTART
+ SYSTEM::WAITING COMMON-LISP::INVOKE-RESTART-INTERACTIVELY))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T)
+ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T)
+ SYSTEM::IHS-NOT-INTERPRETED-ENV COMMON-LISP::NINTH
+ SYSTEM::FIND-KCL-TOP-RESTART COMMON-LISP::TRUENAME
+ SYSTEM::DIRECTORY-LIST-CHECK SYSTEM::REAL-ASINH
+ SYSTEM::SHOW-ENVIRONMENT SYSTEM::PRINT-FRS
+ SYSTEM::REWRITE-RESTART-CASE-CLAUSE
+ COMMON-LISP::TWO-WAY-STREAM-OUTPUT-STREAM
+ ANSI-LOOP::LOOP-COLLECTOR-DATA SLOOP::POINTER-FOR-COLLECT
+ SYSTEM::MLP SYSTEM::WILD-PATH-ELEMENT-P SYSTEM::LNP
+ ANSI-LOOP::LOOP-MINIMAX-OPERATIONS SYSTEM::FRS-KIND
+ SYSTEM::BKPT-FILE COMMON-LISP::FIFTH
+ ANSI-LOOP::LOOP-COLLECTOR-P ANSI-LOOP::LOOP-UNIVERSE-ANSI
+ ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS SYSTEM::IDESCRIBE
+ ANSI-LOOP::LOOP-CONSTANTP
+ ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS COMMON-LISP::PROBE-FILE
+ ANSI-LOOP::LOOP-UNIVERSE-P COMMON-LISP::SINH SYSTEM::RESTART-P
+ SYSTEM::S-DATA-DOCUMENTATION
+ COMMON-LISP::ECHO-STREAM-OUTPUT-STREAM
+ SYSTEM::FIND-DOCUMENTATION SYSTEM::INFO-GET-FILE
+ SLOOP::PARSE-NO-BODY COMMON-LISP::FILE-NAMESTRING
+ COMMON-LISP::COMPILER-MACRO-FUNCTION SYSTEM::PROCESS-ARGS
+ ANSI-LOOP::LOOP-COLLECTOR-DTYPE COMMON-LISP::PHASE
+ SYSTEM::MAKE-FRAME SYSTEM::INSTREAM-STREAM
+ ANSI-LOOP::LOOP-COLLECTOR-HISTORY SYSTEM::FIX-LOAD-PATH
+ SYSTEM::COMPUTING-ARGS-P
+ ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE COMMON-LISP::TENTH
+ ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE SYSTEM::WILD-NAMESTRING-P
+ SYSTEM::BEST-ARRAY-ELEMENT-TYPE SYSTEM::DM-BAD-KEY
+ SYSTEM::TERMINAL-INTERRUPT SYSTEM::REGEXP-CONV
+ COMMON-LISP::FILE-WRITE-DATE SLOOP::PARSE-LOOP
+ ANSI-LOOP::LOOP-CONSTRUCT-RETURN SYSTEM::DWIM
+ ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS
+ SLOOP::RETURN-SLOOP-MACRO SLOOP::AVERAGING-SLOOP-MACRO
+ SYSTEM::S-DATA-NAME SYSTEM::CHECK-TRACE-SPEC
+ SYSTEM::RESTRICT-STREAM-ELEMENT-TYPE SLOOP::TRANSLATE-NAME
+ SYSTEM::ADD-TO-HOTLIST SYSTEM::S-DATA-CONC-NAME
+ ANSI-LOOP::LOOP-MINIMAX-TYPE SYSTEM::PRINT-IHS
+ SYSTEM::DBL-RPL-LOOP SYSTEM::CANONICALIZE-PATHNAME-DIRECTORY
+ SYSTEM::INSPECT-CONS SYSTEM::INSTREAM-STREAM-NAME
+ SYSTEM::S-DATA-P SYSTEM::EVAL-FEATURE
+ COMMON-LISP::ARRAY-DIMENSIONS SYSTEM::IHS-VISIBLE
+ ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE
+ SYSTEM::CHECK-DECLARATIONS COMMON-LISP::TANH
+ ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS
+ COMMON-LISP::COMPILE-FILE-PATHNAME SYSTEM::INSPECT-PACKAGE
+ SLOOP::LOOP-LET-BINDINGS COMMON-LISP::CIS SYSTEM::SETUP-INFO
+ SYSTEM::NORMALIZE-TYPE ANSI-LOOP::LOOP-PSEUDO-BODY
+ SYSTEM::PATH-STREAM-NAME SYSTEM::INFO-GET-TAGS FPE::ST-LOOKUP
+ SYSTEM::BREAK-BACKWARD-SEARCH-STACK
+ ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE SYSTEM::SIMPLE-ARRAY-P
+ SYSTEM::S-DATA-TYPE COMMON-LISP::CONCATENATED-STREAM-STREAMS
+ SYSTEM::INSPECT-CHARACTER ANSI-LOOP::DESTRUCTURING-SIZE
+ SYSTEM::GET-BYTE-STREAM-NCHARS ANSI-LOOP::LOOP-PATH-P
+ COMMON-LISP::FIRST COMMON-LISP::SECOND
+ COMMON-LISP::TWO-WAY-STREAM-INPUT-STREAM
+ SYSTEM::MAKE-DEFPACKAGE-FORM SYSTEM::INSPECT-SYMBOL
+ SYSTEM::INSPECT-VECTOR
+ COMMON-LISP::LOAD-LOGICAL-PATHNAME-TRANSLATIONS
+ SYSTEM::RESTART-INTERACTIVE-FUNCTION SYSTEM::INSPECT-STRING
+ SYSTEM::DIR-P ANSI-LOOP::LOOP-COLLECTOR-CLASS
+ SYSTEM::S-DATA-CONSTRUCTORS SYSTEM::NODES-FROM-INDEX
+ SYSTEM::VERSION-PARSE SYSTEM::BKPT-FILE-LINE COMMON-LISP::ABS
+ SYSTEM::IHS-FNAME ANSI-LOOP::LOOP-MAKE-PSETQ
+ SYSTEM::LEAP-YEAR-P ANSI-LOOP::LOOP-EMIT-FINAL-VALUE
+ SYSTEM::GET-PATH SYSTEM::ALOAD SYSTEM::DM-KEY-NOT-ALLOWED
+ SYSTEM::MAKE-KCL-TOP-RESTART SYSTEM::S-DATA-SLOT-DESCRIPTIONS
+ COMMON-LISP::VECTOR-POP ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS
+ ANSI-LOOP::LOOP-PATH-USER-DATA SYSTEM::S-DATA-SLOT-POSITION
+ COMMON-LISP::BROADCAST-STREAM-STREAMS
+ SYSTEM::LOGICAL-PATHNAMEP SYSTEM::BREAK-FORWARD-SEARCH-STACK
+ SLOOP::SLOOP-SLOOP-MACRO COMMON-LISP::SIGNUM
+ SYSTEM::RESET-TRACE-DECLARATIONS SYSTEM::CONTEXT-P
+ SYSTEM::S-DATA-FROZEN SYSTEM::NUMBER-OF-DAYS-FROM-1900
+ SYSTEM::S-DATA-STATICP ANSI-LOOP::LOOP-PATH-FUNCTION
+ SYSTEM::KNOWN-TYPE-P COMMON-LISP::PROVIDE SYSTEM::PNL1
+ ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD
+ SYSTEM::COERCE-SLASH-TERMINATED COMMON-LISP::LOGICAL-PATHNAME
+ SYSTEM::DIR-CONJ SYSTEM::BKPT-FORM
+ SYSTEM::LOGICAL-PATHNAME-HOST-P SYSTEM::INSPECT-STRUCTURE
+ ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED
+ COMMON-LISP::FIND-ALL-SYMBOLS
+ ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS
+ ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED
+ COMMON-LISP::LOGICAL-PATHNAME-TRANSLATIONS
+ SYSTEM::TRACE-ONE-PREPROCESS COMMON-LISP::CONSTANTLY
+ COMMON-LISP::ACOS SYSTEM::S-DATA-OFFSET COMMON-LISP::ASINH
+ SYSTEM::SHORT-NAME SYSTEM::S-DATA-INCLUDED SYSTEM::DBL-EVAL
+ SYSTEM::BKPT-FUNCTION SYSTEM::INSPECT-NUMBER
+ SYSTEM::GET-INSTREAM SYSTEM::SHOW-BREAK-POINT FPE::LOOKUP
+ SYSTEM::NEXT-STACK-FRAME SYSTEM::INSPECT-ARRAY
+ SYSTEM::S-DATA-RAW ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA
+ SYSTEM::RESTART-REPORT-FUNCTION SYSTEM::TOGGLE-CASE
+ SYSTEM::NODE-OFFSET SYSTEM::INSTREAM-P
+ ANSI-LOOP::LOOP-PATH-NAMES SYSTEM::FREEZE-DEFSTRUCT
+ COMMON-LISP::SEVENTH SYSTEM::SEARCH-STACK COMMON-LISP::SIXTH
+ ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS FPE::GREF
+ FPE::XMM-LOOKUP COMMON-LISP::HOST-NAMESTRING
+ ANSI-LOOP::LOOP-TYPED-INIT
+ SYSTEM::LOGICAL-PATHNAME-DESIGNATOR-P
+ ANSI-LOOP::LOOP-DO-THEREIS COMMON-LISP::EIGHTH
+ SYSTEM::UNIQUE-ID COMMON-LISP::THIRD
+ COMMON-LISP::BYTE-POSITION COMMON-LISP::SYNONYM-STREAM-SYMBOL
+ SYSTEM::PATCH-SHARP SYSTEM::PRINT-SYMBOL-APROPOS
+ COMMON-LISP::LOGNOT SLOOP::REPEAT-SLOOP-MACRO
+ COMMON-LISP::FOURTH SLOOP::SUBSTITUTE-SLOOP-BODY
+ COMMON-LISP::ATANH SLOOP::LOOP-COLLECT-KEYWORD-P
+ SYSTEM::SEQTYPE SYSTEM::RE-QUOTE-STRING COMMON-LISP::ISQRT
+ SYSTEM::DO-F SYSTEM::S-DATA-HAS-HOLES
+ ANSI-LOOP::LOOP-HACK-ITERATION ANSI-LOOP::LOOP-COLLECTOR-NAME
+ COMMON-LISP::RESTART-NAME COMMON-LISP::DIRECTORY-NAMESTRING
+ ANSI-LOOP::LOOP-EMIT-BODY COMMON-LISP::ACOSH
+ SYSTEM::RESTART-FUNCTION SYSTEM::INFO-NODE-FROM-POSITION
+ COMMON-LISP::ASIN ANSI-LOOP::LOOP-LIST-COLLECTION
+ SYSTEM::S-DATA-INCLUDES SYSTEM::GET-NEXT-VISIBLE-FUN
+ COMMON-LISP::BYTE-SIZE COMMON-LISP::PATHNAME
+ ANSI-LOOP::LOOP-MINIMAX-P SLOOP::PARSE-LOOP-INITIALLY
+ COMMON-LISP::COSH SYSTEM::EXPAND-HOME-DIR
+ COMMON-LISP::ECHO-STREAM-INPUT-STREAM
+ SYSTEM::INSERT-BREAK-POINT SYSTEM::RESTART-TEST-FUNCTION
+ SYSTEM::S-DATA-PRINT-FUNCTION SYSTEM::WILD-DIR-ELEMENT-P
+ SYSTEM::S-DATA-NAMED COMMON-LISP::INVOKE-DEBUGGER
+ COMMON-LISP::NAMESTRING ANSI-LOOP::LOOP-MAKE-DESETQ
+ COMMON-LISP::COMPLEMENT SYSTEM::WALK-THROUGH
+ COMMON-LISP::RATIONAL ANSI-LOOP::LOOP-MAXMIN-COLLECTION
+ COMMON-LISP::DELETE-FILE ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*)
+ SYSTEM::BREAK-QUIT SYSTEM::BREAK-BDS SYSTEM::DBL-BACKTRACE
+ SYSTEM::BREAK-LOCAL SYSTEM::INFO-ERROR
+ SYSTEM::SHOW-BREAK-VARIABLES SYSTEM::BREAK-VS
+ COMMON-LISP::CONTINUE COMMON-LISP::MUFFLE-WARNING
+ SYSTEM::IHS-BACKTRACE ANSI-LOOP::LOOP-OPTIONAL-TYPE
+ SYSTEM::BREAK-PREVIOUS SYSTEM::BREAK-NEXT))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION
+ ((COMMON-LISP::INTEGER -9223372036854775808
+ 9223372036854775807)
+ COMMON-LISP::T)
COMMON-LISP::T)
- ANSI-LOOP::MAKE-LOOP-MINIMAX COMMON-LISP::LDB
- SYSTEM::LIST-DELQ FPE::RF SLOOP::L-EQUAL
- ANSI-LOOP::LOOP-DECLARE-VARIABLE SYSTEM::DISPLAY-COMPILED-ENV
- SYSTEM::SET-BACK ANSI-LOOP::HIDE-VARIABLE-REFERENCES
- SYSTEM::GET-LINE-OF-FORM SYSTEM::BREAK-STEP-INTO
- SLOOP::THE-TYPE SLOOP::COUNT-SLOOP-COLLECT
- SYSTEM::KEYWORD-SUPPLIED-P COMMON-LISP::LOGANDC2
- ANSI-LOOP::LOOP-MAYBE-BIND-FORM SYSTEM::SET-DIR
- SYSTEM::COERCE-TO-STRING COMMON-LISP::VECTOR-PUSH
- SYSTEM::DM-NTH-CDR SLOOP::IN-FRINGE-SLOOP-MAP
- SLOOP::MAXIMIZE-SLOOP-COLLECT SYSTEM::ADD-FILE
- SYSTEM::ALL-MATCHES SYSTEM::DM-NTH
- SLOOP::IN-CAREFULLY-SLOOP-FOR SYSTEM::PARSE-SLOT-DESCRIPTION
- ANSI-LOOP::LOOP-LOOKUP-KEYWORD FPE::0-READER
- ANSI-LOOP::LOOP-TMEMBER COMPILER::COMPILER-DEF-HOOK
- SYSTEM::INFO-AUX COMMON-LISP::NTH SYSTEM::QUOTATION-READER
- SYSTEM::CHECK-SEQ-START-END COMMON-LISP::LOGNAND
- SYSTEM::SUBSTRINGP COMMON-LISP::LOGORC2
- ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION SYSTEM::SAFE-EVAL
- ANSI-LOOP::LOOP-DO-IF SLOOP::THEREIS-SLOOP-COLLECT
- SYSTEM::MATCH-DIMENSIONS SYSTEM::GET-MATCH
- SYSTEM::SUB-INTERVAL-P FPE::PAREN-READER
- SLOOP::IN-TABLE-SLOOP-MAP COMMON-LISP::LOGTEST
- SLOOP::LOGXOR-SLOOP-COLLECT SYSTEM::DM-V
- SYSTEM::GET-INFO-CHOICES SLOOP::COLLATE-SLOOP-COLLECT
- SYSTEM::BREAK-STEP-NEXT ANSI-LOOP::LOOP-TEQUAL
- COMMON-LISP::WRITE-BYTE COMMON-LISP::NTHCDR
- SYSTEM::SETF-HELPER SLOOP::NEVER-SLOOP-COLLECT SLOOP::DESETQ1
- ANSI-LOOP::LOOP-DO-WHILE COMMON-LISP::DOCUMENTATION
- FPE::%-READER SYSTEM::IN-INTERVAL-P SLOOP::SUM-SLOOP-COLLECT
- SYSTEM::OBJLT COMMON-LISP::LDB-TEST SLOOP::PARSE-LOOP-MAP
- SYSTEM::GET-NODES SLOOP::MAKE-VALUE SYSTEM::CONDITION-PASS
- SLOOP::IN-PACKAGE-SLOOP-MAP SYSTEM::INCREMENT-CURSOR
- ANSI-LOOP::LOOP-DO-ALWAYS SYSTEM::DISPLAY-ENV SYSTEM::SUPER-GO
- SLOOP::MINIMIZE-SLOOP-COLLECT COMMON-LISP::LOGNOR
- COMMON-LISP::LOGANDC1 COMMON-LISP::BYTE SYSTEM::DBL-UP
- SYSTEM::ITERATE-OVER-BKPTS COMMON-LISP::LOGORC1
- FPE::READ-OPERANDS SLOOP::ALWAYS-SLOOP-COLLECT
- SYSTEM::SETF-EXPAND SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS
- SYSTEM::*BREAK-POINTS* SYSTEM::LOOKUP-KEYWORD
- ANSI-LOOP::LOOP-TASSOC SYSTEM::LEFT-PARENTHESIS-READER
- SLOOP::=-SLOOP-FOR FPE::READ-INSTRUCTION COMMON-LISP::COERCE
- SYSTEM::SEQUENCE-CURSOR))
+ SYSTEM::SMALLNTHCDR))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*)
- COMMON-LISP::*)
- COMMON-LISP::FFLOOR SYSTEM::BREAK-FUNCTION
- COMMON-LISP::APROPOS-LIST COMMON-LISP::DECODE-UNIVERSAL-TIME
- SYSTEM::STEPPER COMMON-LISP::REQUIRE SYSTEM::APROPOS-DOC
- SYSTEM::PRINT-DOC SYSTEM::INFO COMMON-LISP::USE-VALUE
- COMMON-LISP::WRITE-TO-STRING COMMON-LISP::FCEILING
- SYSTEM::GET-SETF-METHOD
- ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE SYSTEM::NLOAD
- COMMON-LISP::ENSURE-DIRECTORIES-EXIST
- COMMON-LISP::WILD-PATHNAME-P COMMON-LISP::FTRUNCATE
- COMMON-LISP::FROUND SYSTEM::PARSE-BODY-HEADER
- COMMON-LISP::INVOKE-RESTART SYSTEM::SHOW-INFO
- COMMON-LISP::READ-FROM-STRING
- SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE COMMON-LISP::APROPOS
- COMMON-LISP::STORE-VALUE))
+ (COMMON-LISP::FUNCTION (COMMON-LISP::T)
+ COMMON-LISP::HASH-TABLE)
+ SYSTEM::CONTEXT-SPICE))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T)
- ANSI-LOOP::LOOP-DO-WITH SYSTEM::WINE-TMP-REDIRECT
- SLOOP::PARSE-ONE-WHEN-CLAUSE COMMON-LISP::TYPE-ERROR
- SYSTEM::INSPECT-INDENT SYSTEM::SET-CURRENT SYSTEM::TEST-ERROR
- SLOOP::LOOP-POP ANSI-LOOP::LOOP-DO-REPEAT
- ANSI-LOOP::LOOP-GET-PROGN SYSTEM::DM-TOO-FEW-ARGUMENTS
- ANSI-LOOP::LOOP-CONTEXT SYSTEM::READ-EVALUATED-FORM
- SYSTEM::ALL-TRACE-DECLARATIONS
- COMMON-LISP::LISP-IMPLEMENTATION-VERSION
- SYSTEM::DEFAULT-SYSTEM-BANNER ANSI-LOOP::LOOP-DO-RETURN
- SYSTEM::INSPECT-INDENT-1 SYSTEM::STEP-READ-LINE
- SYSTEM::SET-ENV SYSTEM::DM-TOO-MANY-ARGUMENTS
- ANSI-LOOP::LOOP-BIND-BLOCK SLOOP::PARSE-LOOP1
- ANSI-LOOP::LOOP-DO-NAMED SLOOP::PARSE-LOOP-COLLECT
- SYSTEM::KCL-TOP-RESTARTS SYSTEM::INSPECT-READ-LINE
- SYSTEM::SET-UP-TOP-LEVEL SYSTEM::SHOW-RESTARTS SYSTEM::DBL
- SLOOP::PARSE-LOOP-FOR ANSI-LOOP::LOOP-ITERATION-DRIVER
- ANSI-LOOP::LOOP-WHEN-IT-VARIABLE ANSI-LOOP::LOOP-DO-DO
- SYSTEM::DEFAULT-INFO-HOTLIST SYSTEM::GET-TEMP-DIR
- ANSI-LOOP::LOOP-POP-SOURCE SLOOP::LOOP-UN-POP
- SYSTEM::TOP-LEVEL ANSI-LOOP::LOOP-DO-FINALLY
- ANSI-LOOP::LOOP-DO-INITIALLY SYSTEM::GET-INDEX-NODE
- SYSTEM::SETUP-LINEINFO SLOOP::PARSE-LOOP-WHEN SYSTEM::CLEANUP
- ANSI-LOOP::LOOP-GET-FORM SLOOP::PARSE-LOOP-DO
- SYSTEM::INIT-BREAK-POINTS SLOOP::LOOP-PEEK
- SYSTEM::GET-SIG-FN-NAME SYSTEM::ILLEGAL-BOA))
+ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM)
+ SYSTEM::S-DATA-SIZE FPE::REG-LOOKUP SYSTEM::INSTREAM-LINE
+ SYSTEM::S-DATA-LENGTH SYSTEM::THE-START))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM COMMON-LISP::T)
+ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T)
+ SYSTEM::MATCH-BEGINNING SYSTEM::MATCH-END))
+(COMMON-LISP::MAPC
+ (COMMON-LISP::LAMBDA (COMPILER::X)
+ (COMMON-LISP::SETF
+ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE)
+ COMMON-LISP::T))
+ '(SYSTEM::CONDITION-CLASS-P SYSTEM::WARNINGP SYSTEM::SI-CLASS-OF
+ SYSTEM::SI-FIND-CLASS SYSTEM::DEFINE-STRUCTURE
+ FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS
+ SYSTEM::SIMPLE-CONDITION-CLASS-P SYSTEM::AUTOLOAD
+ SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::SI-CLASS-NAME
+ SYSTEM::TRACE-ONE SYSTEM::MAKE-ACCESS-FUNCTION
+ SYSTEM::UNTRACE-ONE SYSTEM::SI-CLASSP SYSTEM::CONDITIONP
+ SYSTEM::AUTOLOAD-MACRO))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION
+ ((COMMON-LISP::INTEGER -9223372036854775808
+ 9223372036854775807))
COMMON-LISP::T)
- SYSTEM::SMALLNTHCDR))
+ SYSTEM::GET-CONTEXT SYSTEM::PUSH-CONTEXT))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T)
COMMON-LISP::FIXNUM)
- SYSTEM::THE-END ANSI-LOOP::DUPLICATABLE-CODE-P
- SYSTEM::RELATIVE-LINE SYSTEM::GET-NODE-INDEX))
+ SYSTEM::RELATIVE-LINE SYSTEM::LENEL SYSTEM::THE-END
+ ANSI-LOOP::DUPLICATABLE-CODE-P SYSTEM::FASLINK
+ SYSTEM::GET-NODE-INDEX))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T)
+ SLOOP::PARSE-ONE-WHEN-CLAUSE ANSI-LOOP::LOOP-DO-FINALLY
+ SLOOP::LOOP-PEEK ANSI-LOOP::LOOP-DO-INITIALLY SLOOP::LOOP-POP
+ ANSI-LOOP::LOOP-GET-PROGN SYSTEM::KCL-TOP-RESTARTS
+ SYSTEM::INSPECT-READ-LINE SLOOP::PARSE-LOOP-WHEN
+ ANSI-LOOP::LOOP-GET-FORM SYSTEM::DEFAULT-SYSTEM-BANNER
+ SYSTEM::SET-UP-TOP-LEVEL SYSTEM::GET-INDEX-NODE
+ ANSI-LOOP::LOOP-DO-DO ANSI-LOOP::LOOP-WHEN-IT-VARIABLE
+ SYSTEM::SETUP-LINEINFO COMMON-LISP::TYPE-ERROR
+ SYSTEM::READ-EVALUATED-FORM SYSTEM::INSPECT-INDENT-1
+ SLOOP::LOOP-UN-POP SLOOP::PARSE-LOOP-DO
+ ANSI-LOOP::LOOP-DO-WITH SYSTEM::INSPECT-INDENT
+ SYSTEM::GET-TEMP-DIR ANSI-LOOP::LOOP-ITERATION-DRIVER
+ SYSTEM::WINE-TMP-REDIRECT SLOOP::PARSE-LOOP-COLLECT
+ SYSTEM::DEFAULT-INFO-HOTLIST SLOOP::PARSE-LOOP1
+ SYSTEM::CLEANUP ANSI-LOOP::LOOP-DO-NAMED SYSTEM::DBL
+ SYSTEM::ALL-TRACE-DECLARATIONS SYSTEM::TEST-ERROR
+ ANSI-LOOP::LOOP-BIND-BLOCK ANSI-LOOP::LOOP-DO-REPEAT
+ SYSTEM::ILLEGAL-BOA SYSTEM::SET-ENV SYSTEM::SET-CURRENT
+ SYSTEM::INIT-BREAK-POINTS SYSTEM::GET-SIG-FN-NAME
+ ANSI-LOOP::LOOP-DO-RETURN ANSI-LOOP::LOOP-CONTEXT
+ SYSTEM::SHOW-RESTARTS SYSTEM::STEP-READ-LINE
+ SLOOP::PARSE-LOOP-FOR SYSTEM::DM-TOO-MANY-ARGUMENTS
+ COMMON-LISP::LISP-IMPLEMENTATION-VERSION SYSTEM::TOP-LEVEL
+ ANSI-LOOP::LOOP-POP-SOURCE SYSTEM::DM-TOO-FEW-ARGUMENTS))
(COMMON-LISP::PROCLAIM
'(COMMON-LISP::FTYPE
(COMMON-LISP::FUNCTION
- (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM)
- COMMON-LISP::FIXNUM)
- SYSTEM::ROUND-UP))
+ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER
+ COMMON-LISP::*))
+ COMMON-LISP::T)
+ SYSTEM::RESET-SYS-PATHS))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION (COMMON-LISP::T)
+ (COMMON-LISP::VECTOR COMMON-LISP::T))
+ SYSTEM::CONTEXT-VEC))
+(COMMON-LISP::PROCLAIM
+ '(COMMON-LISP::FTYPE
+ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*)
+ SYSTEM::BREAK-HELP SYSTEM::BREAK-MESSAGE
+ SYSTEM::SIMPLE-BACKTRACE ANSI-LOOP::LOOP-DO-FOR
+ SYSTEM::BREAK-CURRENT SYSTEM::GCL-TOP-LEVEL
+ SYSTEM::BREAK-RESUME))
\ No newline at end of file
--- gcl-2.6.12.orig/o/alloc.c
+++ gcl-2.6.12/o/alloc.c
@@ -447,7 +447,6 @@ set_tm_maxpage(struct typemanager *tm,fi
fixnum r=tm->tm_type==t_relocatable,j=tm->tm_maxpage,z=(n-j)*(r ? 2 : 1);
if (z>available_pages) return 0;
- if (r && 2*n+page(rb_start)>real_maxpage) return 0;
available_pages-=z;
tm->tm_adjgbccnt*=((double)j+1)/(n+1);
tm->tm_maxpage=n;
@@ -909,7 +908,7 @@ alloc_after_reclaiming_pages(struct type
fixnum m=tpage(tm,n),reloc_min;
- if (tm->tm_type>=t_end) return NULL;
+ if (tm->tm_type>t_end) return NULL;
reloc_min=npage(rb_pointer-rb_start);
@@ -925,6 +924,8 @@ alloc_after_reclaiming_pages(struct type
}
+ if (tm->tm_type>=t_end) return NULL;
+
maybe_reallocate_page(tm,tm->tm_percent_free*tm->tm_npage);
return alloc_from_freelist(tm,n);
@@ -1093,8 +1094,7 @@ DEFUNM_NEW("ALLOCATED",object,fSallocate
RV(make_fixnum(tm->tm_maxpage)),
RV(make_fixnum(tm->tm_nppage)),
RV(make_fixnum(tm->tm_gbccount)),
- RV(make_fixnum(tm->tm_npage*tm->tm_nppage-tm->tm_nfree))
- ));
+ RV(make_fixnum(tm->tm_npage*tm->tm_nppage-tm->tm_nfree))));
}
#ifdef SGC_CONT_DEBUG
@@ -1658,7 +1658,7 @@ DEFUN_NEW("GPROF-QUIT",object,fSgprof_qu
massert(getcwd(b,sizeof(b)));
massert(!chdir(P_tmpdir));
_mcleanup();
- massert(snprintf(b1,sizeof(b1),"gprof %s",kcl_self)>0);
+ massert(snprintf(b1,sizeof(b1),"gprof '%s'",kcl_self)>0);
massert((pp=popen(b1,"r")));
while ((n=fread(b1,1,sizeof(b1),pp)))
massert(fwrite(b1,1,n,stdout));
--- gcl-2.6.12.orig/o/array.c
+++ gcl-2.6.12/o/array.c
@@ -1139,9 +1139,9 @@ Icheck_displaced(object displaced_list,
/* } */
/* } */
-DEFUNO_NEW("REPLACE-ARRAY",object,fSreplace_array,SI,2,2,NONE,
- OO,OO,OO,OO,void,siLreplace_array,(object old,object new),"")
-{ struct dummy fw ;
+DEFUN_NEW("REPLACE-ARRAY",object,fSreplace_array,SI,2,2,NONE,OO,OO,OO,OO,(object old,object new),"") {
+
+ struct dummy fw;
fw = old->d;
old = IisArray(old);
--- gcl-2.6.12.orig/o/bind.c
+++ gcl-2.6.12/o/bind.c
@@ -24,7 +24,6 @@ Foundation, 675 Mass Ave, Cambridge, MA
*/
#include "include.h"
-#include <string.h>
static void
illegal_lambda(void);
@@ -95,17 +94,19 @@ lambda_bind(object *arg_top)
struct aux *aux=NULL;
int naux;
bool special_processed;
+ object s[1],ss;
vs_mark;
bds_check;
lambda = vs_head;
- if (type_of(lambda) != t_cons)
+ if (!consp(lambda))
FEerror("No lambda list.", 0);
lambda_list = lambda->c.c_car;
body = lambda->c.c_cdr;
required = (struct required *)vs_top;
nreq = 0;
+ s[0]=Cnil;
for (;;) {
if (endp(lambda_list))
goto REQUIRED_ONLY;
@@ -152,7 +153,7 @@ OPTIONAL:
goto SEARCH_DECLARE;
x = lambda_list->c.c_car;
lambda_list = lambda_list->c.c_cdr;
- if (type_of(x) == t_cons) {
+ if (consp(x)) {
check_symbol(x->c.c_car);
check_var(x->c.c_car);
vs_push(x->c.c_car);
@@ -226,9 +227,9 @@ KEYWORD:
goto SEARCH_DECLARE;
x = lambda_list->c.c_car;
lambda_list = lambda_list->c.c_cdr;
- if (type_of(x) == t_cons) {
- if (type_of(x->c.c_car) == t_cons) {
- if (!keywordp(x->c.c_car->c.c_car))
+ if (consp(x)) {
+ if (consp(x->c.c_car)) {
+ if (type_of(x->c.c_car->c.c_car)!=t_symbol)
/* FIXME better message */
FEunexpected_keyword(x->c.c_car->c.c_car);
vs_push(x->c.c_car->c.c_car);
@@ -296,7 +297,7 @@ AUX_L:
goto SEARCH_DECLARE;
x = lambda_list->c.c_car;
lambda_list = lambda_list->c.c_cdr;
- if (type_of(x) == t_cons) {
+ if (consp(x)) {
check_symbol(x->c.c_car);
check_var(x->c.c_car);
vs_push(x->c.c_car);
@@ -336,10 +337,10 @@ SEARCH_DECLARE:
break;
continue;
}
- if (type_of(form)!=t_cons || !isdeclare(form->c.c_car))
+ if (!consp(form) || !isdeclare(form->c.c_car))
break;
for (ds = form->c.c_cdr; !endp(ds); ds = ds->c.c_cdr) {
- if (type_of(ds->c.c_car) != t_cons)
+ if (!consp(ds->c.c_car))
illegal_declare(form);
if (ds->c.c_car->c.c_car == sLspecial) {
vs = ds->c.c_car->c.c_cdr;
@@ -381,8 +382,7 @@ SEARCH_DECLARE:
}
if (special_processed)
continue;
- /* lex_special_bind(v); */
- lex_env[0] = MMcons(MMcons(v, Cnil), lex_env[0]);
+ s[0] = MMcons(MMcons(v, Cnil), s[0]);
/**/
}
@@ -437,17 +437,20 @@ SEARCH_DECLARE:
bind_var(rest->rest_var, vs_head, rest->rest_spp);
}
if (key_flag) {
+ int allow_other_keys_found=0;
i = narg - nreq - nopt;
if (i >= 0 && i%2 != 0)
/* FIXME better message */
FEunexpected_keyword(Cnil);
other_keys_appeared = FALSE;
for (i = nreq + nopt; i < narg; i += 2) {
- if (!keywordp(base[i]))
+ if (type_of(base[i])!=t_symbol)
FEunexpected_keyword(base[i]);
- if (base[i] == sKallow_other_keys &&
- base[i+1] != Cnil)
+ if (base[i] == sKallow_other_keys && !allow_other_keys_found) {
+ allow_other_keys_found=1;
+ if (base[i+1] != Cnil)
allow_other_keys_flag = TRUE;
+ }
for (j = 0; j < nkey; j++) {
if (keyword[j].key_word == base[i]) {
if (keyword[j].key_svar_val
@@ -460,7 +463,8 @@ SEARCH_DECLARE:
goto NEXT_ARG;
}
}
- other_keys_appeared = TRUE;
+ if (base[i] != sKallow_other_keys)
+ other_keys_appeared = TRUE;
NEXT_ARG:
continue;
@@ -492,7 +496,7 @@ SEARCH_DECLARE:
eval_assign(temporary, aux[i].aux_init);
bind_var(aux[i].aux_var, temporary, aux[i].aux_spp);
}
- if (type_of(body) != t_cons || body->c.c_car == form) {
+ if (!consp(body) || body->c.c_car == form) {
vs_reset;
vs_head = body;
} else {
@@ -500,6 +504,13 @@ SEARCH_DECLARE:
vs_reset;
vs_head = body;
}
+
+ if (s[0]!=Cnil) {
+ for (ss=s[0];ss->c.c_cdr!=Cnil;ss=ss->c.c_cdr);
+ ss->c.c_cdr=lex_env[0];
+ lex_env[0]=s[0];
+ }
+
return;
REQUIRED_ONLY:
@@ -515,10 +526,10 @@ REQUIRED_ONLY:
break;
continue;
}
- if (type_of(form)!=t_cons || !isdeclare(form->c.c_car))
+ if (!consp(form) || !isdeclare(form->c.c_car))
break;
for (ds = form->c.c_cdr; !endp(ds); ds = ds->c.c_cdr) {
- if (type_of(ds->c.c_car) != t_cons)
+ if (!consp(ds->c.c_car))
illegal_declare(form);
if (ds->c.c_car->c.c_car == sLspecial) {
vs = ds->c.c_car->c.c_cdr;
@@ -537,7 +548,7 @@ REQUIRED_ONLY:
continue;
/* lex_special_bind(v); */
temporary = MMcons(v, Cnil);
- lex_env[0] = MMcons(temporary, lex_env[0]);
+ s[0] = MMcons(temporary, s[0]);
/**/
}
@@ -555,7 +566,7 @@ REQUIRED_ONLY:
bind_var(required[i].req_var,
base[i],
required[i].req_spp);
- if (type_of(body) != t_cons || body->c.c_car == form) {
+ if (!consp(body) || body->c.c_car == form) {
vs_reset;
vs_head = body;
} else {
@@ -563,6 +574,13 @@ REQUIRED_ONLY:
vs_reset;
vs_head = body;
}
+
+ if (s[0]!=Cnil) {
+ for (ss=s[0];ss->c.c_cdr!=Cnil;ss=ss->c.c_cdr);
+ ss->c.c_cdr=lex_env[0];
+ lex_env[0]=s[0];
+ }
+
}
void
@@ -612,7 +630,7 @@ struct bind_temp {
*/
object
-find_special(object body, struct bind_temp *start, struct bind_temp *end)
+find_special(object body, struct bind_temp *start, struct bind_temp *end,object *s)
{
object temporary;
object form=Cnil;
@@ -622,6 +640,7 @@ find_special(object body, struct bind_te
vs_mark;
vs_push(Cnil);
+ s=s ? s : lex_env;
for (; !endp(body); body = body->c.c_cdr) {
form = body->c.c_car;
@@ -634,10 +653,10 @@ find_special(object body, struct bind_te
break;
continue;
}
- if (type_of(form)!=t_cons || !isdeclare(form->c.c_car))
+ if (!consp(form) || !isdeclare(form->c.c_car))
break;
for (ds = form->c.c_cdr; !endp(ds); ds = ds->c.c_cdr) {
- if (type_of(ds->c.c_car) != t_cons)
+ if (!consp(ds->c.c_car))
illegal_declare(form);
if (ds->c.c_car->c.c_car == sLspecial) {
vs = ds->c.c_car->c.c_cdr;
@@ -655,14 +674,14 @@ find_special(object body, struct bind_te
continue;
/* lex_special_bind(v); */
temporary = MMcons(v, Cnil);
- lex_env[0] = MMcons(temporary, lex_env[0]);
+ s[0] = MMcons(temporary, s[0]);
/**/
}
}
}
}
- if (body != Cnil && body->c.c_car != form)
+ if (body != Cnil && body->c.c_car != form && type_of(form)==t_cons && isdeclare(form->c.c_car))/*FIXME*/
body = make_cons(form, body->c.c_cdr);
vs_reset;
return(body);
@@ -674,10 +693,10 @@ let_bind(object body, struct bind_temp *
struct bind_temp *bt;
bds_check;
- vs_push(find_special(body, start, end));
for (bt = start; bt < end; bt++) {
eval_assign(bt->bt_init, bt->bt_init);
}
+ vs_push(find_special(body, start, end,NULL));
for (bt = start; bt < end; bt++) {
bind_var(bt->bt_var, bt->bt_init, bt->bt_spp);
}
@@ -688,13 +707,20 @@ object
letA_bind(object body, struct bind_temp *start, struct bind_temp *end)
{
struct bind_temp *bt;
-
+ object s[1],ss;
+
bds_check;
- vs_push(find_special(body, start, end));
+ s[0]=Cnil;
+ vs_push(find_special(body, start, end,s));
for (bt = start; bt < end; bt++) {
eval_assign(bt->bt_init, bt->bt_init);
bind_var(bt->bt_var, bt->bt_init, bt->bt_spp);
}
+ if (s[0]!=Cnil) {
+ for (ss=s[0];ss->c.c_cdr!=Cnil;ss=ss->c.c_cdr);
+ ss->c.c_cdr=lex_env[0];
+ lex_env[0]=s[0];
+ }
return(vs_pop);
}
@@ -703,12 +729,12 @@ letA_bind(object body, struct bind_temp
#endif
-#define NOT_YET 10
-#define FOUND 11
+#define NOT_YET stp_ordinary
+#define FOUND stp_special
#define NOT_KEYWORD 1
void
-parse_key(object *base, bool rest, bool allow_other_keys,int n, ...)
+parse_key(object *base, bool rest, bool allow_other_keys, int n, ...)
{
object temporary;
va_list ap;
@@ -735,7 +761,7 @@ parse_key(object *base, bool rest, bool
FEunexpected_keyword(Cnil);
if (narg == 2) {
k = base[0];
- if (!keywordp(k))
+ if (type_of(k)!=t_symbol)
FEunexpected_keyword(k);
if (k == sKallow_other_keys && ! allow_other_keys_found) {
allow_other_keys_found=1;
@@ -777,7 +803,7 @@ parse_key(object *base, bool rest, bool
va_end(ap);
for (v = base; v < vs_top; v += 2) {
k = v[0];
- if (!keywordp(k)) {
+ if (type_of(k)!=t_symbol) {
error_flag = NOT_KEYWORD;
other_key = k;
continue;
@@ -827,16 +853,19 @@ check_other_key(object l, int n, ...)
object k;
int i;
bool allow_other_keys = FALSE;
+ int allow_other_keys_found=0;
for (; !endp(l); l = l->c.c_cdr->c.c_cdr) {
k = l->c.c_car;
- if (!keywordp(k))
+ if (type_of(k)!=t_symbol)
FEunexpected_keyword(k);
if (endp(l->c.c_cdr))
/* FIXME better message */
FEunexpected_keyword(Cnil);
- if (k == sKallow_other_keys && l->c.c_cdr->c.c_car != Cnil) {
- allow_other_keys = TRUE;
+ if (k == sKallow_other_keys && !allow_other_keys_found) {
+ allow_other_keys_found=1;
+ if (l->c.c_cdr->c.c_car != Cnil)
+ allow_other_keys = TRUE;
} else {
char buf [100];
bzero(buf,n);
@@ -1110,7 +1139,7 @@ gcl_init_bind(void)
make_cons(make_ordinary("&BODY"), Cnil)))))))));
make_constant("LAMBDA-PARAMETERS-LIMIT",
- make_fixnum(64));
+ make_fixnum(MAX_ARGS+1));
--- gcl-2.6.12.orig/o/error.c
+++ gcl-2.6.12/o/error.c
@@ -490,49 +490,78 @@ vfun_wrong_number_of_args(object x)
void
-check_arg_range(int n, int m)
-{
- object x,x1;
+check_arg_range(int n, int m) {
- x=make_fixnum(n);
- x1=make_fixnum(VFUN_NARGS);
if (VFUN_NARGS < n)
- Icall_error_handler(
- sKtoo_few_arguments,
- make_simple_string("Needed at least ~D args, but received ~d"),
- 2,x,x1);
- else if (VFUN_NARGS > m)
- Icall_error_handler(
- sKtoo_many_arguments,
- make_simple_string("Needed no more than ~D args, but received ~d"),
- 2,x,x1);
- }
+ FEtoo_few_arguments(0,VFUN_NARGS);
+ if (VFUN_NARGS > m)
+ FEtoo_many_arguments(0,VFUN_NARGS);
+
+}
DEF_ORDINARY("TERMINAL-INTERRUPT",sSterminal_interrupt,SI,"");
-DEF_ORDINARY("WRONG-TYPE-ARGUMENT",sKwrong_type_argument,KEYWORD,"");
-DEF_ORDINARY("TOO-FEW-ARGUMENTS",sKtoo_few_arguments,KEYWORD,"");
-DEF_ORDINARY("TOO-MANY-ARGUMENTS",sKtoo_many_arguments,KEYWORD,"");
-DEF_ORDINARY("UNEXPECTED-KEYWORD",sKunexpected_keyword,KEYWORD,"");
-DEF_ORDINARY("INVALID-FORM",sKinvalid_form,KEYWORD,"");
-DEF_ORDINARY("UNBOUND-VARIABLE",sKunbound_variable,KEYWORD,"");
-DEF_ORDINARY("INVALID-VARIABLE",sKinvalid_variable,KEYWORD,"");
-DEF_ORDINARY("UNDEFINED-FUNCTION",sKundefined_function,KEYWORD,"");
-DEF_ORDINARY("INVALID-FUNCTION",sKinvalid_function,KEYWORD,"");
-DEF_ORDINARY("PACKAGE-ERROR",sKpackage_error,KEYWORD,"");
-DEF_ORDINARY("DATUM",sKdatum,KEYWORD,"");
-DEF_ORDINARY("EXPECTED-TYPE",sKexpected_type,KEYWORD,"");
-DEF_ORDINARY("PACKAGE",sKpackage,KEYWORD,"");
-DEF_ORDINARY("FORMAT-CONTROL",sKformat_control,KEYWORD,"");
-DEF_ORDINARY("FORMAT-ARGUMENTS",sKformat_arguments,KEYWORD,"");
DEF_ORDINARY("CATCH",sKcatch,KEYWORD,"");
DEF_ORDINARY("PROTECT",sKprotect,KEYWORD,"");
DEF_ORDINARY("CATCHALL",sKcatchall,KEYWORD,"");
+DEF_ORDINARY("CONDITION",sLcondition,LISP,"");
+DEF_ORDINARY("SERIOUS-CONDITION",sLserious_condition,LISP,"");
+DEF_ORDINARY("SIMPLE-CONDITION",sLsimple_condition,LISP,"");
+
+DEF_ORDINARY("ERROR",sLerror,LISP,"");
+DEF_ORDINARY("SIMPLE-ERROR",sLsimple_error,LISP,"");
+DEF_ORDINARY("FORMAT-CONTROL",sKformat_control,KEYWORD,"");
+DEF_ORDINARY("FORMAT-ARGUMENTS",sKformat_arguments,KEYWORD,"");
+
+DEF_ORDINARY("TYPE-ERROR",sLtype_error,LISP,"");
+DEF_ORDINARY("DATUM",sKdatum,KEYWORD,"");
+DEF_ORDINARY("EXPECTED-TYPE",sKexpected_type,KEYWORD,"");
+DEF_ORDINARY("SIMPLE-TYPE-ERROR",sLsimple_type_error,LISP,"");
+
+DEF_ORDINARY("PROGRAM-ERROR",sLprogram_error,LISP,"");
+DEF_ORDINARY("CONTROL-ERROR",sLcontrol_error,LISP,"");
+DEF_ORDINARY("PACKAGE-ERROR",sLpackage_error,LISP,"");
+DEF_ORDINARY("PACKAGE",sKpackage,KEYWORD,"");
+
+DEF_ORDINARY("STREAM-ERROR",sLstream_error,LISP,"");
+DEF_ORDINARY("STREAM",sKstream,KEYWORD,"");
+DEF_ORDINARY("END-OF-FILE",sLend_of_file,LISP,"");
+
+DEF_ORDINARY("FILE-ERROR",sLfile_error,LISP,"");
+DEF_ORDINARY("PATHNAME",sKpathname,KEYWORD,"");
+
+DEF_ORDINARY("CELL-ERROR",sLcell_error,LISP,"");
+DEF_ORDINARY("NAME",sKname,KEYWORD,"");
+DEF_ORDINARY("UNBOUND-SLOT",sLunbound_slot,LISP,"");
+DEF_ORDINARY("UNBOUND-VARIABLE",sLunbound_variable,LISP,"");
+DEF_ORDINARY("UNDEFINED-FUNCTION",sLundefined_function,LISP,"");
+
+DEF_ORDINARY("ARITHMETIC-ERROR",sLarithmetic_error,LISP,"");
+DEF_ORDINARY("OPERATION",sKoperation,KEYWORD,"");
+DEF_ORDINARY("OPERANDS",sKoperands,KEYWORD,"");
+DEF_ORDINARY("DIVISION-BY-ZERO",sLdivision_by_zero,LISP,"");
+DEF_ORDINARY("FLOATING-POINT-OVERFLOW",sLfloating_point_overflow,LISP,"");
+DEF_ORDINARY("FLOATING-POINT-UNDERFLOW",sLfloating_point_underflow,LISP,"");
+DEF_ORDINARY("FLOATING-POINT-INEXACT",sLfloating_point_inexact,LISP,"");
+DEF_ORDINARY("FLOATING-POINT-INVALID-OPERATION",sLfloating_point_invalid_operation,LISP,"");
+
+DEF_ORDINARY("PARSE-ERROR",sLparse_error,LISP,"");
+
+DEF_ORDINARY("PRINT-NOT-READABLE",sLprint_not_readable,LISP,"");
+
+DEF_ORDINARY("READER-ERROR",sLreader_error,LISP,"");
+DEF_ORDINARY("PATHNAME-ERROR",sLpathname_error,SI,"");
+
+DEF_ORDINARY("STORAGE-CONDITION",sLstorage_condition,LISP,"");
+
+DEF_ORDINARY("WARNING",sLwarning,LISP,"");
+DEF_ORDINARY("SIMPLE-WARNING",sLsimple_warning,LISP,"");
+DEF_ORDINARY("STYLE-WARNING",sLstyle_warning,LISP,"");
+
void
-gcl_init_error(void)
-{
- null_string = make_simple_string("");
- enter_mark_origin(&null_string);
+gcl_init_error(void) {
+ null_string = make_simple_string("");
+ enter_mark_origin(&null_string);
}
--- gcl-2.6.12.orig/o/fasdump.c
+++ gcl-2.6.12/o/fasdump.c
@@ -1501,14 +1501,12 @@ read_fasl_vector(object in)
object d;
int tem;
if (((tem=getc(((FILE *)in->sm.sm_fp))) == EOF) && feof(((FILE *)in->sm.sm_fp)))
- { d = coerce_to_pathname(in);
- d = make_pathname(d->pn.pn_host,
- d->pn.pn_device,
- d->pn.pn_directory,
- d->pn.pn_name,
- make_simple_string("data"),
- d->pn.pn_version);
- d = coerce_to_namestring(d);
+ { char *pf;
+ coerce_to_filename(in,FN1);
+ for (pf=FN1+strlen(FN1);pf>FN1 && pf[-1]!='.';pf--);
+ if (pf==FN1) {pf=FN1+strlen(FN1);*pf++='.';}
+ snprintf(pf,sizeof(FN1)-(pf-FN1),"data");
+ d=make_simple_string(FN1);
in = open_stream(d,smm_input,Cnil,Cnil);
if (in == Cnil)
FEerror("Can't open file ~s",1,d);
--- gcl-2.6.12.orig/o/file.d
+++ gcl-2.6.12/o/file.d
@@ -138,7 +138,7 @@ void
end_of_stream(strm)
object strm;
{
- FEerror("Unexpected end of ~S.", 1, strm);
+ END_OF_FILE(strm);
}
/*
@@ -167,6 +167,7 @@ BEGIN:
case smm_probe:
return(FALSE);
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -223,6 +224,7 @@ BEGIN:
case smm_probe:
return(FALSE);
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -270,6 +272,7 @@ BEGIN:
case smm_socket:
return (sLcharacter);
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -341,220 +344,208 @@ cannot_create(object);
Fn is a namestring.
*/
object
-open_stream(fn, smm, if_exists, if_does_not_exist)
-object fn;
-enum smmode smm;
-object if_exists, if_does_not_exist;
-{
- object x;
- FILE *fp=NULL;
- char fname[PATH_MAX];
- object unzipped = 0;
- vs_mark;
+open_stream(object fn,enum smmode smm, object if_exists, object if_does_not_exist) {
-/*
- if (type_of(fn) != t_string)
- FEwrong_type_argument(sLstring, fn);
-*/
- /* if (fn->st.st_fillp > BUFSIZ - 1) */
- /* too_long_file_name(fn); */
- /* for (i = 0; i < fn->st.st_fillp; i++) */
- /* fname[i] = fn->st.st_self[i]; */
-
- /* fname[i] = '\0'; */
- coerce_to_filename(fn,fname);
- if (smm == smm_input || smm == smm_probe) {
- if(fname[0]=='|')
- fp = popen(fname+1,"r");
- else
- fp = fopen_not_dir(fname, "r");
-
- AGAIN:
- if (fp == NULL) {
- if (sSAallow_gzipped_fileA->s.s_dbind != sLnil)
- {
- static struct string st;
- char buf[256];
- if (snprintf(buf,sizeof(buf),"%s.gz",fname)<=0)
- FEerror("Cannot write .gz filename",0);
- st.st_self=buf;
- st.st_dim=st.st_fillp=strlen(buf);
- set_type_of(&st,t_string);
- if (file_exists((object)&st)) {
- FILE *pp;
- int n;
- if (!(fp=tmpfile()))
- FEerror("Cannot create temporary file",0);
- if (snprintf(buf,sizeof(buf),"zcat %s.gz",fname)<=0)
- FEerror("Cannot write zcat pipe name",0);
- if (!(pp=popen(buf,"r")))
- FEerror("Cannot open zcat pipe",0);
- while((n=fread(buf,1,sizeof(buf),pp)))
- if (!fwrite(buf,1,n,fp))
- FEerror("Cannot write pipe output to temporary file",0);
- if (pclose(pp)<0)
- FEerror("Cannot close zcat pipe",0);
- if (fseek(fp,0,SEEK_SET))
- FEerror("Cannot rewind temporary file\n",0);
- goto AGAIN;
- }
- }
-
-/* fp = fopen_not_dir(buf,"r"); */
-/* if (fp) */
-/* { */
-/* #ifdef NO_MKSTEMP */
-/* char *tmp; */
-/* #else */
-/* char tmp[200]; */
-/* #endif */
-/* char command [500]; */
-/* fclose(fp); */
-/* #ifdef NO_MKSTEMP */
-/* tmp = tmpnam(0); */
-/* #else */
-/* snprintf(tmp,sizeof(tmp),"uzipXXXXXX"); */
- /* mkstemp(tmp); */ /* fixme: catch errors */
-/* #endif */
-/* unzipped = make_simple_string(tmp); */
-/* sprintf(command,"gzip -dc %s > %s",buf,tmp); */
-/* fp = 0; */
-/* if (0 == system(command)) */
-/* { */
-/* fp = fopen_not_dir(tmp,"r"); */
-/* if (fp) */
-/* goto AGAIN; */
-/* /\* should not get here *\/ */
-/* else { unlink(tmp);}} */
-/* }} */
- if (if_does_not_exist == sKerror)
- cannot_open(fn);
- else if (if_does_not_exist == sKcreate) {
- fp = fopen_not_dir(fname, "w");
- if (fp == NULL)
- cannot_create(fn);
- fclose(fp);
- fp = fopen_not_dir(fname, "r");
- if (fp == NULL)
- cannot_open(fn);
- } else if (if_does_not_exist == Cnil)
- return(Cnil);
- else
- FEerror("~S is an illegal IF-DOES-NOT-EXIST option.",
- 1, if_does_not_exist);
- }
- } else if (smm == smm_output || smm == smm_io) {
- if (if_exists == sKnew_version && if_does_not_exist == sKcreate)
- goto CREATE;
- fp = fopen_not_dir(fname, "r");
- if (fp != NULL) {
- fclose(fp);
- if (if_exists == sKerror)
- FEerror("The file ~A already exists.", 1, fn);
- else if (if_exists == sKrename) {
- if (smm == smm_output)
- fp = backup_fopen(fname, "w");
- else
- fp = backup_fopen(fname, "w+");
- if (fp == NULL)
- cannot_create(fn);
- } else if (if_exists == sKrename_and_delete ||
- if_exists == sKnew_version ||
- if_exists == sKsupersede) {
- if (smm == smm_output)
- fp = fopen_not_dir(fname, "w");
- else
- fp = fopen_not_dir(fname, "w+");
- if (fp == NULL)
- cannot_create(fn);
- } else if (if_exists == sKoverwrite) {
- fp = fopen_not_dir(fname, "r+");
- if (fp == NULL)
- cannot_open(fn);
- } else if (if_exists == sKappend) {
- if (smm == smm_output)
- fp = fopen_not_dir(fname, "a");
- else
- fp = fopen_not_dir(fname, "a+");
- if (fp == NULL)
- FEerror("Cannot append to the file ~A.",1,fn);
- } else if (if_exists == Cnil)
- return(Cnil);
- else
- FEerror("~S is an illegal IF-EXISTS option.",
- 1, if_exists);
- } else {
- if (if_does_not_exist == sKerror)
- FEerror("The file ~A does not exist.", 1, fn);
- else if (if_does_not_exist == sKcreate) {
- CREATE:
- if (smm == smm_output)
- {
- if(fname[0]=='|')
- fp = popen(fname+1,"w");
- else
- fp = fopen_not_dir(fname, "w");
- }
- else
- fp = fopen_not_dir(fname, "w+");
- if (fp == NULL)
- cannot_create(fn);
- } else if (if_does_not_exist == Cnil)
- return(Cnil);
- else
- FEerror("~S is an illegal IF-DOES-NOT-EXIST option.",
- 1, if_does_not_exist);
- }
+ object x;
+ FILE *fp=NULL;
+ vs_mark;
+
+ coerce_to_filename(fn,FN1);
+ if (smm == smm_input || smm == smm_probe) {
+ if(FN1[0]=='|')
+ fp = popen(FN1+1,"r");
+ else
+ fp = fopen_not_dir(FN1, "r");
+
+ if ((fp == NULL) &&
+ (sSAallow_gzipped_fileA->s.s_dbind != sLnil)) {
+ union lispunion st;
+ char buf[256];
+ if (snprintf(buf,sizeof(buf),"%s.gz",FN1)<=0)
+ FEerror("Cannot write .gz filename",0);
+ st.st.st_self=buf;
+ st.st.st_dim=st.st.st_fillp=strlen(buf);
+ set_type_of(&st,t_string);
+ if (fSstat((object)&st)!=Cnil) {
+ FILE *pp;
+ int n;
+ if (!(fp=tmpfile()))
+ FEerror("Cannot create temporary file",0);
+ if (snprintf(buf,sizeof(buf),"zcat %s.gz",FN1)<=0)
+ FEerror("Cannot write zcat pipe name",0);
+ if (!(pp=popen(buf,"r")))
+ FEerror("Cannot open zcat pipe",0);
+ while((n=fread(buf,1,sizeof(buf),pp)))
+ if (!fwrite(buf,1,n,fp))
+ FEerror("Cannot write pipe output to temporary file",0);
+ if (pclose(pp)<0)
+ FEerror("Cannot close zcat pipe",0);
+ if (fseek(fp,0,SEEK_SET))
+ FEerror("Cannot rewind temporary file\n",0);
+ }
+ }
+ if (fp == NULL) {
+ if (if_does_not_exist == sKerror)
+ cannot_open(fn);
+ else if (if_does_not_exist == sKcreate) {
+ fp = fopen_not_dir(FN1, "w");
+ if (fp == NULL)
+ cannot_create(fn);
+ fclose(fp);
+ fp = fopen_not_dir(FN1, "r");
+ if (fp == NULL)
+ cannot_open(fn);
+ } else if (if_does_not_exist == Cnil)
+ return(Cnil);
+ else
+ FEerror("~S is an illegal IF-DOES-NOT-EXIST option.",
+ 1, if_does_not_exist);
+ }
+ } else if (smm == smm_output || smm == smm_io) {
+ if (FN1[0] == '|')
+ fp = NULL;
+ else
+ fp = fopen_not_dir(FN1, "r");
+ if (fp != NULL) {
+ fclose(fp);
+ if (if_exists == sKerror)
+ FILE_ERROR(fn,"File exists");
+ else if (if_exists == sKrename) {
+ massert(snprintf(FN2,sizeof(FN2),"%s.BAK",FN1)>=0);
+ massert(!rename(FN1,FN2));
+ if (smm == smm_output)
+ fp = fopen(FN1, "w");
+ else
+ fp = fopen(FN1, "w+");
+ if (fp == NULL)
+ cannot_create(fn);
+ } else if (if_exists == sKrename_and_delete ||
+ if_exists == sKnew_version ||
+ if_exists == sKsupersede) {
+ if (smm == smm_output)
+ fp = fopen_not_dir(FN1, "w");
+ else
+ fp = fopen_not_dir(FN1, "w+");
+ if (fp == NULL)
+ cannot_create(fn);
+ } else if (if_exists == sKoverwrite) {
+ fp = fopen_not_dir(FN1, "r+");
+ if (fp == NULL)
+ cannot_open(fn);
+ } else if (if_exists == sKappend) {
+ if (smm == smm_output)
+ fp = fopen_not_dir(FN1, "a");
+ else
+ fp = fopen_not_dir(FN1, "a+");
+ if (fp == NULL)
+ FEerror("Cannot append to the file ~A.",1,fn);
+ } else if (if_exists == Cnil)
+ return(Cnil);
+ else
+ FEerror("~S is an illegal IF-EXISTS option.",
+ 1, if_exists);
+ } else {
+ if (if_does_not_exist == sKerror)
+ FILE_ERROR(fn,"The file does not exist");
+ else if (if_does_not_exist == sKcreate) {
+ if (smm == smm_output) {
+ if(FN1[0]=='|')
+ fp = popen(FN1+1,"w");
+ else
+ fp = fopen_not_dir(FN1, "w");
} else
- error("illegal stream mode");
- x = alloc_object(t_stream);
- x->sm.sm_mode = (short)smm;
- x->sm.sm_fp = fp;
+ fp = fopen_not_dir(FN1, "w+");
+ if (fp == NULL)
+ cannot_create(fn);
+ } else if (if_does_not_exist == Cnil)
+ return(Cnil);
+ else
+ FEerror("~S is an illegal IF-DOES-NOT-EXIST option.",
+ 1, if_does_not_exist);
+ }
+ } else
+ FEerror("Illegal open mode for ~S.",1,fn);
+
+ vs_push(make_simple_string(FN1));
+ x = alloc_object(t_stream);
+ x->sm.sm_mode = (short)smm;
+ x->sm.sm_fp = fp;
+ x->sm.sm_buffer = 0;
+ x->sm.sm_object0 = sLcharacter;
+ x->sm.sm_object1 = vs_head;
+ x->sm.sm_int0 = x->sm.sm_int1 = 0;
+ x->sm.sm_flags=0;
+ vs_push(x);
+
+ setup_stream_buffer(x);
+ vs_reset;
+
+ if (smm==smm_probe)
+ close_stream(x);
+
+ return(x);
- x->sm.sm_buffer = 0;
- x->sm.sm_object0 = (unzipped ? make_cons(sSAallow_gzipped_fileA,unzipped) : sLcharacter);
- x->sm.sm_object1 = fn;
- x->sm.sm_int0 = x->sm.sm_int1 = 0;
- vs_push(x);
- setup_stream_buffer(x);
- vs_reset;
- return(x);
}
static void
gclFlushSocket(object);
+DEFUN_NEW("OPEN-INT",object,fSopen_int,SI,8,8,NONE,OO,OO,OO,OO,
+ (object fn,object direction,object element_type,object if_exists,
+ object iesp,object if_does_not_exist,object idnesp,
+ object external_format),"") {
+
+ enum smmode smm=0;
+ vs_mark;
+ object strm,filename;
+
+ filename=fn;
+ if (direction == sKinput) {
+ smm = smm_input;
+ if (idnesp==Cnil)
+ if_does_not_exist = sKerror;
+ } else if (direction == sKoutput) {
+ smm = smm_output;
+ if (iesp==Cnil)
+ if_exists = sKnew_version;
+ if (idnesp==Cnil) {
+ if (if_exists == sKoverwrite ||
+ if_exists == sKappend)
+ if_does_not_exist = sKerror;
+ else
+ if_does_not_exist = sKcreate;
+ }
+ } else if (direction == sKio) {
+ smm = smm_io;
+ if (iesp==Cnil)
+ if_exists = sKnew_version;
+ if (idnesp==Cnil) {
+ if (if_exists == sKoverwrite ||
+ if_exists == sKappend)
+ if_does_not_exist = sKerror;
+ else
+ if_does_not_exist = sKcreate;
+ }
+ } else if (direction == sKprobe) {
+ smm = smm_probe;
+ if (idnesp==Cnil)
+ if_does_not_exist = Cnil;
+ } else
+ FEerror("~S is an illegal DIRECTION for OPEN.", 1, direction);
+ strm = open_stream(filename, smm, if_exists, if_does_not_exist);
+ if (type_of(strm) == t_stream) {
+ strm->sm.sm_object0 = element_type;
+ strm->sm.sm_object1 = fn;
+ }
+ vs_reset;
+ RETURN1(strm);
+}
DEFUN_NEW("OPEN-STREAM-P",object,fLopen_stream_p,LISP,1,1,NONE,OO,OO,OO,OO,(object x),"") {
check_type_stream(&x);
- switch(x->sm.sm_mode) {
- case smm_output:
- case smm_input:
- case smm_io:
- case smm_probe:
- case smm_socket:
- case smm_string_input:
- case smm_string_output:
- return x->d.tt==1 ? Cnil : Ct;
- case smm_synonym:
- return FFN(fLopen_stream_p)(symbol_value(x->sm.sm_object0));
- case smm_broadcast:
- case smm_concatenated:
- for (x=x->sm.sm_object0;!endp(x);x=x->c.c_cdr)
- if (!FFN(fLopen_stream_p)(x))
- return Cnil;
- return Ct;
- case smm_two_way:
- case smm_echo:
- if (FFN(fLopen_stream_p)(STREAM_INPUT_STREAM(x))==Cnil)
- return Cnil;
- return FFN(fLopen_stream_p)(STREAM_OUTPUT_STREAM(x));
- default:
- error("illegal stream mode");
- return Cnil;
- }
+ return GET_STREAM_FLAG(x,gcl_sm_closed) ? Cnil : Ct;
}
/*
@@ -562,94 +553,132 @@ DEFUN_NEW("OPEN-STREAM-P",object,fLopen_
The abort_flag is not used now.
*/
void
-close_stream(strm)
-object strm;
-/*bool abort_flag; */ /* Not used now! */
-{
- object x;
+close_stream(object strm) {
-BEGIN:
- strm->d.tt=1;
+ object x;
- switch (strm->sm.sm_mode) {
- case smm_output:
- if (strm->sm.sm_fp == stdout)
- FEerror("Cannot close the standard output.", 0);
- if (strm->sm.sm_fp == NULL) break;
- fflush(strm->sm.sm_fp);
- deallocate_stream_buffer(strm);
- fclose(strm->sm.sm_fp);
- strm->sm.sm_fp = NULL;
- break;
+ if (FFN(fLopen_stream_p)(strm)==Cnil)
+ return;
+ switch (strm->sm.sm_mode) {
+ case smm_output:
+ if (strm->sm.sm_fp == stdout)
+ FEerror("Cannot close the standard output.", 0);
+ fflush(strm->sm.sm_fp);
+ deallocate_stream_buffer(strm);
+ fclose(strm->sm.sm_fp);
+ strm->sm.sm_fp = NULL;
+ strm->sm.sm_fd = -1;
+ break;
- case smm_socket:
- if (SOCKET_STREAM_FD(strm) < 2)
- emsg("tried Closing %d ! as socket \n",SOCKET_STREAM_FD(strm));
- else {
+ case smm_socket:
+ if (SOCKET_STREAM_FD(strm) < 2)
+ emsg("tried Closing %d ! as socket \n",SOCKET_STREAM_FD(strm));
+ else {
#ifdef HAVE_NSOCKET
- if (GET_STREAM_FLAG(strm,gcl_sm_output))
- {
- gclFlushSocket(strm);
- /* there are two for one fd so close only one */
- tcpCloseSocket(SOCKET_STREAM_FD(strm));
- }
+ if (GET_STREAM_FLAG(strm,gcl_sm_output)) {
+ gclFlushSocket(strm);
+ /* there are two for one fd so close only one */
+ tcpCloseSocket(SOCKET_STREAM_FD(strm));
+ }
#endif
- SOCKET_STREAM_FD(strm)=-1;
- }
+ SOCKET_STREAM_FD(strm)=-1;
+ }
- case smm_input:
- if (strm->sm.sm_fp == stdin)
- FEerror("Cannot close the standard input.", 0);
-
- case smm_io:
- case smm_probe:
- if (strm->sm.sm_fp == NULL) break;
- deallocate_stream_buffer(strm);
- if (strm->sm.sm_object1 &&
- type_of(strm->sm.sm_object1)==t_string &&
- strm->sm.sm_object1->st.st_self[0] =='|')
- pclose(strm->sm.sm_fp);
- else
- fclose(strm->sm.sm_fp);
- strm->sm.sm_fp = NULL;
- if (strm->sm.sm_object0 &&
- type_of(strm->sm.sm_object0 ) == t_cons &&
- Mcar(strm->sm.sm_object0 ) == sSAallow_gzipped_fileA)
- fLdelete_file(Mcdr(strm->sm.sm_object0));
- break;
+ case smm_input:
+ if (strm->sm.sm_fp == stdin)
+ FEerror("Cannot close the standard input.", 0);
- case smm_synonym:
- strm = symbol_value(strm->sm.sm_object0);
- if (type_of(strm) != t_stream)
- FEwrong_type_argument(sLstream, strm);
- goto BEGIN;
+ case smm_io:
+ case smm_probe:
+ deallocate_stream_buffer(strm);
+ if (strm->sm.sm_object1 &&
+ type_of(strm->sm.sm_object1)==t_string &&
+ strm->sm.sm_object1->st.st_self[0] =='|')
+ pclose(strm->sm.sm_fp);
+ else
+ fclose(strm->sm.sm_fp);
+ strm->sm.sm_fp = NULL;
+ strm->sm.sm_fd = -1;
+ if (strm->sm.sm_object0 &&
+ type_of(strm->sm.sm_object0 )==t_cons &&
+ Mcar(strm->sm.sm_object0)==sSAallow_gzipped_fileA)
+ ifuncall1(sLdelete_file,Mcdr(strm->sm.sm_object0));
+ break;
- case smm_broadcast:
- for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr)
- close_stream(x->c.c_car);
- break;
+ case smm_file_synonym:
+ case smm_synonym:
+ strm = symbol_value(strm->sm.sm_object0);
+ if (type_of(strm) != t_stream)
+ TYPE_ERROR(strm,sLstream);
+ close_stream(strm);
+ break;
- case smm_concatenated:
- for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr)
- close_stream(x->c.c_car);
- break;
+ case smm_broadcast:
+ case smm_concatenated:
+ for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr)
+ close_stream(x->c.c_car);
+ break;
- case smm_two_way:
- case smm_echo:
- close_stream(STREAM_INPUT_STREAM(strm));
- close_stream(STREAM_OUTPUT_STREAM(strm));
- break;
+ case smm_two_way:
+ case smm_echo:
+ close_stream(STREAM_INPUT_STREAM(strm));
+ close_stream(STREAM_OUTPUT_STREAM(strm));
+ break;
- case smm_string_input:
- break; /* There is nothing to do. */
+ case smm_string_input:
+ case smm_string_output:
+ break;
- case smm_string_output:
- break; /* There is nothing to do. */
+ default:
+ error("Illegal stream mode");
+ }
+
+ SET_STREAM_FLAG(strm,gcl_sm_closed,1);
+
+}
+
+DEFUN_NEW("INTERACTIVE-STREAM-P",object,fLinteractive_stream_p,LISP,1,1,NONE,OO,OO,OO,OO,(object strm),"") {
+
+ check_type_stream(&strm);
+
+ switch (strm->sm.sm_mode) {
+ case smm_output:
+ case smm_input:
+ case smm_io:
+ case smm_probe:
+ if ((strm->sm.sm_fp == stdin) ||
+ (strm->sm.sm_fp == stdout) ||
+ (strm->sm.sm_fp == stderr))
+ return Ct;
+ return Cnil;
+ break;
+ case smm_file_synonym:
+ case smm_synonym:
+ strm = symbol_value(strm->sm.sm_object0);
+ if (type_of(strm) != t_stream)
+ FEwrong_type_argument(sLstream, strm);
+ break;
+
+ case smm_broadcast:
+ case smm_concatenated:
+ if (( consp(strm->sm.sm_object0) ) &&
+ ( type_of(strm->sm.sm_object0->c.c_car) == t_stream ))
+ strm=strm->sm.sm_object0->c.c_car;
+ else
+ return Cnil;
+ break;
+
+ case smm_two_way:
+ case smm_echo:
+ strm=STREAM_INPUT_STREAM(strm);
+ break;
+ default:
+ return Cnil;
+ }
+
+ return Cnil;
- default:
- error("illegal stream mode");
- }
}
object
@@ -665,6 +694,7 @@ object istrm, ostrm;
STREAM_INPUT_STREAM(strm) = istrm;
STREAM_OUTPUT_STREAM(strm) = ostrm;
strm->sm.sm_int0 = strm->sm.sm_int1 = 0;
+ strm->sm.sm_flags=0;
return(strm);
}
@@ -694,6 +724,7 @@ int istart, iend;
strm->sm.sm_object1 = OBJNULL;
STRING_INPUT_STREAM_NEXT(strm)= istart;
STRING_INPUT_STREAM_END(strm)= iend;
+ strm->sm.sm_flags=0;
return(strm);
}
@@ -729,6 +760,7 @@ int line_length;
STRING_STREAM_STRING(strm) = strng;
strm->sm.sm_object1 = OBJNULL;
strm->sm.sm_int0 = STREAM_FILE_COLUMN(strm) = 0;
+ strm->sm.sm_flags=0;
vs_reset;
return(strm);
}
@@ -782,6 +814,7 @@ BEGIN:
/* strm->sm.sm_int0++; */
return(c==EOF ? c : (c&0377));
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -884,6 +917,7 @@ BEGIN:
/* --strm->sm.sm_int0; */ /* use ftell now for position */
break;
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -985,6 +1019,7 @@ BEGIN:
break;
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -1095,6 +1130,7 @@ BEGIN:
#endif
closed_stream(strm);
break;
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -1183,6 +1219,7 @@ BEGIN:
case smm_probe:
return(FALSE);
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
check_stream(strm);
@@ -1308,6 +1345,7 @@ BEGIN:
#endif
return TRUE;
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -1363,6 +1401,7 @@ BEGIN:
case smm_string_output:
return(STRING_STREAM_STRING(strm)->st.st_fillp);
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -1412,6 +1451,7 @@ BEGIN:
}
return(0);
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -1448,6 +1488,7 @@ BEGIN:
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -1487,6 +1528,7 @@ BEGIN:
case smm_two_way:
strm=STREAM_OUTPUT_STREAM(strm);
goto BEGIN;
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -1553,6 +1595,22 @@ load(const char *s) {
+static int
+file_synonym_stream_p(object x) {
+ switch(x->sm.sm_mode) {
+ case smm_input:
+ case smm_output:
+ case smm_io:
+ case smm_probe:
+ case smm_file_synonym:
+ return 1;
+ case smm_synonym:
+ return file_synonym_stream_p(x->sm.sm_object0->s.s_dbind);
+ default:
+ return 0;
+ }
+}
+
LFD(Lmake_synonym_stream)()
{
object x;
@@ -1560,12 +1618,13 @@ LFD(Lmake_synonym_stream)()
check_arg(1);
check_type_sym(&vs_base[0]);
x = alloc_object(t_stream);
- x->sm.sm_mode = (short)smm_synonym;
+ x->sm.sm_mode = file_synonym_stream_p(vs_base[0]) ? (short)smm_file_synonym : (short)smm_synonym;
x->sm.sm_fp = NULL;
x->sm.sm_buffer = 0;
x->sm.sm_object0 = vs_base[0];
x->sm.sm_object1 = OBJNULL;
x->sm.sm_int0 = x->sm.sm_int1 = 0;
+ x->sm.sm_flags=0;
vs_base[0] = x;
}
@@ -1589,6 +1648,7 @@ LFD(Lmake_broadcast_stream)()
x->sm.sm_object0 = vs_base[0];
x->sm.sm_object1 = OBJNULL;
x->sm.sm_int0 = x->sm.sm_int1 = 0;
+ x->sm.sm_flags=0;
vs_base[0] = x;
}
@@ -1612,6 +1672,7 @@ LFD(Lmake_concatenated_stream)()
x->sm.sm_object0 = vs_base[0];
x->sm.sm_object1 = OBJNULL;
x->sm.sm_int0 = x->sm.sm_int1 = 0;
+ x->sm.sm_flags=0;
vs_base[0] = x;
}
@@ -1700,6 +1761,38 @@ LFD(siLoutput_stream_string)()
vs_base[0] = vs_base[0]->sm.sm_object0;
}
+DEFUN_NEW("FILE-STREAM-P",object,fSfile_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(type_of(x)==t_stream &&
+ (x->sm.sm_mode==smm_input || x->sm.sm_mode==smm_output || x->sm.sm_mode==smm_io || x->sm.sm_mode==smm_probe)
+ ? Ct : Cnil);
+}
+
+DEFUN_NEW("SYNONYM-STREAM-P",object,fSsynonym_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(type_of(x)==t_stream && (x->sm.sm_mode==smm_file_synonym || x->sm.sm_mode==smm_synonym) ? Ct : Cnil);
+}
+
+DEFUN_NEW("TERMINAL-INPUT-STREAM-P",object,fSterminal_input_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_input && x->sm.sm_fp && isatty(fileno((FILE *)x->sm.sm_fp)) ? Ct : Cnil);
+}
+
+DEFUN_NEW("BROADCAST-STREAM-P",object,fSbroadcast_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_broadcast ? Ct : Cnil);
+}
+
+DEFUN_NEW("ECHO-STREAM-P",object,fSecho_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_echo ? Ct : Cnil);
+}
+
+DEFUN_NEW("TWO-WAY-STREAM-P",object,fStwo_way_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_two_way ? Ct : Cnil);
+}
+
+DEFUN_NEW("CONCATENATED-STREAM-P",object,fSconcatenated_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_concatenated ? Ct : Cnil);
+}
+
+
+
LFD(Lstreamp)()
{
check_arg(1);
@@ -1747,54 +1840,6 @@ LFD(Lstream_element_type)()
@(return Ct)
@)
-@(static defun open (filename
- &key (direction sKinput)
- (element_type sLcharacter)
- (if_exists Cnil iesp)
- (if_does_not_exist Cnil idnesp)
- &aux strm)
- enum smmode smm=0;
-@
- check_type_or_pathname_string_symbol_stream(&filename);
- filename = coerce_to_namestring(filename);
- if (direction == sKinput) {
- smm = smm_input;
- if (!idnesp)
- if_does_not_exist = sKerror;
- } else if (direction == sKoutput) {
- smm = smm_output;
- if (!iesp)
- if_exists = sKnew_version;
- if (!idnesp) {
- if (if_exists == sKoverwrite ||
- if_exists == sKappend)
- if_does_not_exist = sKerror;
- else
- if_does_not_exist = sKcreate;
- }
- } else if (direction == sKio) {
- smm = smm_io;
- if (!iesp)
- if_exists = sKnew_version;
- if (!idnesp) {
- if (if_exists == sKoverwrite ||
- if_exists == sKappend)
- if_does_not_exist = sKerror;
- else
- if_does_not_exist = sKcreate;
- }
- } else if (direction == sKprobe) {
- smm = smm_probe;
- if (!idnesp)
- if_does_not_exist = Cnil;
- } else
- FEerror("~S is an illegal DIRECTION for OPEN.",
- 1, direction);
- strm = open_stream(filename, smm, if_exists, if_does_not_exist);
- if (type_of(strm) == t_stream)
- strm->sm.sm_object0 = element_type;
- @(return strm)
-@)
@(defun file_position (file_stream &o position)
int i=0;
@@ -1838,175 +1883,72 @@ object sLAload_pathnameA;
DEFVAR("*COLLECT-BINARY-MODULES*",sSAcollect_binary_modulesA,SI,sLnil,"");
DEFVAR("*BINARY-MODULES*",sSAbinary_modulesA,SI,Cnil,"");
-@(static defun load (pathname
- &key (verbose `symbol_value(sLAload_verboseA)`)
- print
- (if_does_not_exist sKerror)
- &aux pntype fasl_filename lsp_filename filename
- defaults strm stdoutput x
- package)
- bds_ptr old_bds_top;
- int i;
- object strm1;
-@
- check_type_or_pathname_string_symbol_stream(&pathname);
- pathname = coerce_to_pathname(pathname);
- defaults = symbol_value(Vdefault_pathname_defaults);
- defaults = coerce_to_pathname(defaults);
- pathname = merge_pathnames(pathname, defaults, sKnewest);
- pntype = pathname->pn.pn_type;
- filename = coerce_to_namestring(pathname);
- if (user_match(filename->st.st_self,filename->st.st_fillp))
- @(return Cnil)
- old_bds_top=bds_top;
- if (pntype == Cnil || pntype == sKwild ||
- (type_of(pntype) == t_string &&
-#ifdef UNIX
- string_eq(pntype, FASL_string))) {
-#endif
-#ifdef AOSVS
+DEFUN_NEW("LOAD-STREAM",object,fSload_stream,SI,2,2,NONE,OO,OO,OO,OO,(object strm,object print),"") {
-#endif
- pathname->pn.pn_type = FASL_string;
- fasl_filename = coerce_to_namestring(pathname);
- }
- if (pntype == Cnil || pntype == sKwild ||
- (type_of(pntype) == t_string &&
-#ifdef UNIX
- string_eq(pntype, LSP_string))) {
-#endif
-#ifdef AOSVS
+ object x;
-#endif
- pathname->pn.pn_type = LSP_string;
- lsp_filename = coerce_to_namestring(pathname);
- }
- if (fasl_filename != Cnil && file_exists(fasl_filename)) {
- if (verbose != Cnil) {
- SETUP_PRINT_DEFAULT(fasl_filename);
- if (file_column(PRINTstream) != 0)
- write_str("\n");
- write_str("Loading ");
- PRINTescape = FALSE;
- write_object(fasl_filename, 0);
- write_str("\n");
- CLEANUP_PRINT_DEFAULT;
- flush_stream(PRINTstream);
- }
- package = symbol_value(sLApackageA);
- bds_bind(sLApackageA, package);
- bds_bind(sLAload_pathnameA,fasl_filename);
- if (sSAcollect_binary_modulesA->s.s_dbind==Ct) {
- object _x=sSAbinary_modulesA->s.s_dbind;
- object _y=Cnil;
- while (_x!=Cnil) {
- _y=_x;
- _x=_x->c.c_cdr;
- }
- if (_y==Cnil)
- sSAbinary_modulesA->s.s_dbind=make_cons(fasl_filename,Cnil);
- else
- _y->c.c_cdr=make_cons(fasl_filename,Cnil);
- }
- i = fasload(fasl_filename);
- if (print != Cnil) {
- SETUP_PRINT_DEFAULT(Cnil);
- vs_top = PRINTvs_top;
- if (file_column(PRINTstream) != 0)
- write_str("\n");
- write_str("Fasload successfully ended.");
- write_str("\n");
- CLEANUP_PRINT_DEFAULT;
- flush_stream(PRINTstream);
- }
- bds_unwind(old_bds_top);
- if (verbose != Cnil) {
- SETUP_PRINT_DEFAULT(fasl_filename);
- if (file_column(PRINTstream) != 0)
- write_str("\n");
- write_str("Finished loading ");
- PRINTescape = FALSE;
- write_object(fasl_filename, 0);
- write_str("\n");
- CLEANUP_PRINT_DEFAULT;
- flush_stream(PRINTstream);
- }
- @(return `make_fixnum(i)`)
- }
- if (lsp_filename != Cnil && file_exists(lsp_filename)) {
- filename = lsp_filename;
- }
- if (if_does_not_exist != Cnil)
- if_does_not_exist = sKerror;
- strm1 = strm
- = open_stream(filename, smm_input, Cnil, if_does_not_exist);
- if (strm == Cnil)
- @(return Cnil)
- if (verbose != Cnil) {
- SETUP_PRINT_DEFAULT(filename);
- if (file_column(PRINTstream) != 0)
- write_str("\n");
- write_str("Loading ");
- PRINTescape = FALSE;
- write_object(filename, 0);
- write_str("\n");
- CLEANUP_PRINT_DEFAULT;
- flush_stream(PRINTstream);
- }
- package = symbol_value(sLApackageA);
- bds_bind(sLAload_pathnameA,pathname);
- bds_bind(sLApackageA, package);
- bds_bind(sLAstandard_inputA, strm);
- frs_push(FRS_PROTECT, Cnil);
- if (nlj_active) {
- close_stream(strm1);
- nlj_active = FALSE;
- frs_pop();
- bds_unwind(old_bds_top);
- unwind(nlj_fr, nlj_tag);
- }
- for (;;) {
- preserving_whitespace_flag = FALSE;
- detect_eos_flag = TRUE;
- x = read_object_non_recursive(strm);
- if (x == OBJNULL)
- break;
- {
- object *base = vs_base, *top = vs_top, *lex = lex_env;
- object xx;
-
- lex_new();
- eval(x);
- xx = vs_base[0];
- lex_env = lex;
- vs_top = top;
- vs_base = base;
- x = xx;
- }
- if (print != Cnil) {
- SETUP_PRINT_DEFAULT(x);
- write_object(x, 0);
- write_str("\n");
- CLEANUP_PRINT_DEFAULT;
- flush_stream(PRINTstream);
- }
- }
- close_stream(strm);
- frs_pop();
- bds_unwind(old_bds_top);
- if (verbose != Cnil) {
- SETUP_PRINT_DEFAULT(filename);
- if (file_column(PRINTstream) != 0)
- write_str("\n");
- write_str("Finished loading ");
- PRINTescape = FALSE;
- write_object(filename, 0);
- write_str("\n");
- CLEANUP_PRINT_DEFAULT;
- flush_stream(PRINTstream);
- }
- @(return Ct)
-@)
+ for (;;) {
+ preserving_whitespace_flag = FALSE;
+ detect_eos_flag = TRUE;
+ x = read_object_non_recursive(strm);
+ if (x == OBJNULL)
+ break;
+ {
+ object *base = vs_base, *top = vs_top, *lex = lex_env;
+ object xx;
+
+ lex_new();
+ eval(x);
+ xx = vs_base[0];
+ lex_env = lex;
+ vs_top = top;
+ vs_base = base;
+ x = xx;
+ }
+ if (print != Cnil) {
+ SETUP_PRINT_DEFAULT(x);
+ write_object(x, 0);
+ write_str("\n");
+ CLEANUP_PRINT_DEFAULT;
+ flush_stream(PRINTstream);
+ }
+ }
+
+ RETURN1(Ct);
+
+}
+
+DEFUN_NEW("LOAD-FASL",object,fSload_fasl,SI,2,2,NONE,OO,OO,OO,OO,(object fasl_filename,object print),"") {
+
+ int i;
+
+ if (sSAcollect_binary_modulesA->s.s_dbind==Ct) {
+ object _x=sSAbinary_modulesA->s.s_dbind;
+ object _y=Cnil;
+ while (_x!=Cnil) {
+ _y=_x;
+ _x=_x->c.c_cdr;
+ }
+ if (_y==Cnil)
+ sSAbinary_modulesA->s.s_dbind=make_cons(fasl_filename,Cnil);
+ else
+ _y->c.c_cdr=make_cons(fasl_filename,Cnil);
+ }
+ i = fasload(fasl_filename);
+ if (print != Cnil) {
+ SETUP_PRINT_DEFAULT(Cnil);
+ vs_top = PRINTvs_top;
+ if (file_column(PRINTstream) != 0)
+ write_str("\n");
+ write_str(";; Fasload successfully ended.");
+ write_str("\n");
+ CLEANUP_PRINT_DEFAULT;
+ flush_stream(PRINTstream);
+ }
+
+ RETURN1(make_fixnum(i));
+
+}
static void
FFN(siLget_string_input_stream_index)()
@@ -2018,9 +1960,6 @@ FFN(siLget_string_input_stream_index)()
vs_base[0] = make_fixnum(STRING_INPUT_STREAM_NEXT(vs_base[0]));
}
-DEFUN_NEW("TERMINAL-INPUT-STREAM-P",object,fSterminal_input_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
- RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_input && x->sm.sm_fp && isatty(fileno((FILE *)x->sm.sm_fp)) ? Ct : Cnil);
-}
LFD(siLmake_string_output_stream_from_string)()
{
@@ -2038,6 +1977,7 @@ LFD(siLmake_string_output_stream_from_st
strm->sm.sm_object1 = OBJNULL;
/* strm->sm.sm_int0 = strng->st.st_fillp; */
STREAM_FILE_COLUMN(strm) = 0;
+ strm->sm.sm_flags=0;
vs_base[0] = strm;
}
@@ -2071,14 +2011,14 @@ static void
cannot_open(fn)
object fn;
{
- FEerror("Cannot open the file ~A.", 1, fn);
+ FILE_ERROR(fn,"Cannot open");
}
static void
cannot_create(fn)
object fn;
{
- FEerror("Cannot create the file ~A.", 1, fn);
+ FILE_ERROR(fn,"Cannot create");
}
static void
@@ -2141,6 +2081,7 @@ int out;
if (type_of(strm) != t_stream)
FEwrong_type_argument(sLstream, strm);
switch (strm->sm.sm_mode){
+ case smm_file_synonym:
case smm_synonym:
strm = symbol_value(strm->sm.sm_object0);
if (type_of(strm) != t_stream)
@@ -2566,6 +2507,7 @@ gcl_init_file(void)
#endif
standard_input->sm.sm_int0 = 0; /* unused */
standard_input->sm.sm_int1 = 0; /* unused */
+ standard_input->sm.sm_flags=0;
standard_output = alloc_object(t_stream);
standard_output->sm.sm_mode = (short)smm_output;
@@ -2578,18 +2520,20 @@ gcl_init_file(void)
#endif
standard_output->sm.sm_int0 = 0; /* unused */
STREAM_FILE_COLUMN(standard_output) = 0;
+ standard_output->sm.sm_flags=0;
terminal_io = standard
= make_two_way_stream(standard_input, standard_output);
enter_mark_origin(&terminal_io);
x = alloc_object(t_stream);
- x->sm.sm_mode = (short)smm_synonym;
+ x->sm.sm_mode = (short)smm_file_synonym;
x->sm.sm_fp = NULL;
x->sm.sm_buffer = 0;
x->sm.sm_object0 = sLAterminal_ioA;
x->sm.sm_object1 = OBJNULL;
x->sm.sm_int0 = x->sm.sm_int1 = 0; /* unused */
+ x->sm.sm_flags=0;
standard_io = x;
enter_mark_origin(&standard_io);
@@ -2597,7 +2541,9 @@ gcl_init_file(void)
DEFVAR("*IGNORE-EOF-ON-TERMINAL-IO*",sSAignore_eof_on_terminal_ioA,SI,Cnil,"");
DEFVAR("*LOAD-PATHNAME*",sLAload_pathnameA,LISP,Cnil,"");
+DEFVAR("*LOAD-TRUENAME*",sSAload_truenameA,LISP,Cnil,"");
DEFVAR("*LOAD-VERBOSE*",sLAload_verboseA,LISP,Ct,"");
+DEFVAR("*LOAD-PRINT*",sLAload_printA,LISP,Cnil,"");
DEF_ORDINARY("ABORT",sKabort,KEYWORD,"");
DEF_ORDINARY("APPEND",sKappend,KEYWORD,"");
@@ -2622,6 +2568,7 @@ DEF_ORDINARY("SUPERSEDE",sKsupersede,KEY
DEF_ORDINARY("VERBOSE",sKverbose,KEYWORD,"");
+DEF_ORDINARY("DELETE-FILE",sLdelete_file,LISP,"");
void
@@ -2673,13 +2620,9 @@ gcl_init_file_function()
make_function("STREAM-ELEMENT-TYPE", Lstream_element_type);
make_function("CLOSE", Lclose);
- make_function("OPEN", Lopen);
-
make_function("FILE-POSITION", Lfile_position);
make_function("FILE-LENGTH", Lfile_length);
- make_function("LOAD", Lload);
-
make_si_function("GET-STRING-INPUT-STREAM-INDEX",
siLget_string_input_stream_index);
make_si_function("MAKE-STRING-OUTPUT-STREAM-FROM-STRING",
--- gcl-2.6.12.orig/o/gbc.c
+++ gcl-2.6.12/o/gbc.c
@@ -57,7 +57,7 @@ mark_contblock(void *, int);
since this is more portable and faster lets use them --W. Schelter
These assume that DBEGIN is divisible by 32, or else we should have
#define Shamt(x) (((((int) x -DBEGIN) >> 2) & ~(~0 << 5)))
-*/
+*/
#define LOG_BITS_CHAR 3
#if CPTR_SIZE == 8
@@ -72,7 +72,7 @@ void *
cb_in(void *p) {
struct contblock **cbpp;
int i;
-
+
for (cbpp=&cb_pointer,i=0;*cbpp;cbpp=&((*cbpp)->cb_link),i++) {
if ((void *)*cbpp<=p && ((void *)(*cbpp)+(*cbpp)->cb_size) >p)
return *cbpp;
@@ -84,7 +84,7 @@ int
cb_print(void) {
struct contblock **cbpp;
int i;
-
+
for (cbpp=&cb_pointer,i=0;*cbpp;cbpp=&((*cbpp)->cb_link),i++)
emsg("%lu at %p\n",(*cbpp)->cb_size,*cbpp);
emsg("%u blocks\n",i);
@@ -146,7 +146,7 @@ pageinfo_p(void *v) {
(!pi->next || (void *)pi->next>=v+(pi->type==t_contiguous ? pi->in_use : 1)*PAGESIZE);
}
-
+
static inline char
get_bit(char *v,struct pageinfo *pi,void *x) {
void *ve=CB_DATA_START(pi);
@@ -157,16 +157,6 @@ get_bit(char *v,struct pageinfo *pi,void
return (v[i]>>s)&0x1;
}
-/* static inline void */
-/* set_bit(char *v,struct pageinfo *pi,void *x) { */
-/* void *ve=CB_DATA_START(pi); */
-/* fixnum off=(x-ve)>>LOG_BYTES_CONTBLOCK,i=off>>LOG_BITS_CHAR,s=off&~(~0UL<<LOG_BITS_CHAR); */
-/* #ifdef CONTBLOCK_MARK_DEBUG */
-/* off_check(v,ve,i,pi); */
-/* #endif */
-/* v[i]|=(1UL<<s); */
-/* } */
-
#define bit_get(v,i,s) ((v[i]>>s)&0x1)
#define bit_set(v,i,s) (v[i]|=(1UL<<s))
#define ptr_get(v,i,s) (v+(((i<<LOG_BITS_CHAR)|s)<<LOG_BYTES_CONTBLOCK))
@@ -226,11 +216,6 @@ get_mark_bit(struct pageinfo *pi,void *x
return get_bit(CB_MARK_START(pi),pi,x);
}
-/* static inline void */
-/* set_mark_bit(struct pageinfo *pi,void *x) { */
-/* set_bit(CB_MARK_START(pi),pi,x); */
-/* } */
-
static inline void *
get_mark_bits(struct pageinfo *pi,void *x) {
return get_bits(CB_MARK_START(pi),pi,x);
@@ -248,11 +233,6 @@ get_sgc_bit(struct pageinfo *pi,void *x)
return get_bit(CB_SGCF_START(pi),pi,x);
}
-/* static inline void */
-/* set_sgc_bit(struct pageinfo *pi,void *x) { */
-/* set_bit(CB_SGCF_START(pi),pi,x); */
-/* } */
-
static inline void *
get_sgc_bits(struct pageinfo *pi,void *x) {
return get_bits(CB_SGCF_START(pi),pi,x);
@@ -438,16 +418,16 @@ mark_leaf_data(object x,void **pp,ufixnu
if (!marking(p)||!collecting(p))
return;
- if (what_to_collect!=t_contiguous &&
+ if (what_to_collect!=t_contiguous &&
x && x->d.st>=ngc_thresh &&
(dp=alloc_contblock_no_gc(s,static_promotion_limit))) {
-
+
*pp=memcpy(dp,p,s);
x->d.st=0;
return;
- }
+ }
if (x && x->d.st<rst.d.st) x->d.st++;
@@ -460,7 +440,7 @@ mark_leaf_data(object x,void **pp,ufixnu
static void mark_object1(object);
#define mark_object(x) if (marking(x)) mark_object1(x)
-
+
static inline void
mark_object_address(object *o,int f) {
@@ -468,7 +448,7 @@ mark_object_address(object *o,int f) {
static ufixnum lr;
ufixnum p=page(o);
-
+
if (lp!=p || !f) {
lp=p;
lr=
@@ -496,7 +476,7 @@ mark_object_array(object *o,object *oe)
static void
mark_object1(object x) {
-
+
fixnum i,j=0;/*FIXME*/
if (is_marked_or_free(x))
@@ -567,7 +547,7 @@ mark_object1(object x) {
break;
case t_array:
- MARK_LEAF_DATA(x,x->a.a_dims,sizeof(int)*x->a.a_rank);
+ MARK_LEAF_DATA(x,x->a.a_dims,sizeof(*x->a.a_dims)*x->a.a_rank);
case t_vector:
case t_bitvector:
@@ -615,7 +595,7 @@ mark_object1(object x) {
x->v.v_self=p;
adjust_displaced(x,j);
}
- }
+ }
mark_object(x->v.v_displaced);
break;
@@ -627,7 +607,7 @@ mark_object1(object x) {
mark_object(x->str.str_def);
if (x->str.str_self)
for (i=0,j=S_DATA(def)->length;i<j;i++)
- if (s_type[i]==0)
+ if (s_type[i]==aet_object)
mark_object_address(&STREF(object,x,s_pos[i]),i);
MARK_LEAF_DATA(x,x->str.str_self,S_DATA(def)->size);
}
@@ -646,7 +626,8 @@ mark_object1(object x) {
MARK_LEAF_DATA(x,x->sm.sm_buffer,BUFSIZ);
}
break;
-
+
+ case smm_file_synonym:
case smm_synonym:
mark_object(x->sm.sm_object0);
break;
@@ -676,7 +657,7 @@ mark_object1(object x) {
error("mark stream botch");
}
break;
-
+
case t_random:
MARK_LEAF_DATA_ALIGNED(x,x->rnd.rnd_state._mp_seed->_mp_d,x->rnd.rnd_state._mp_seed->_mp_alloc*MP_LIMB_SIZE,MP_LIMB_SIZE);
break;
@@ -700,6 +681,7 @@ mark_object1(object x) {
mark_object(x->pn.pn_name);
mark_object(x->pn.pn_type);
mark_object(x->pn.pn_version);
+ mark_object(x->pn.pn_namestring);
break;
case t_closure:
@@ -854,24 +836,6 @@ mark_phase(void) {
}
#endif
- /*
- if (what_to_collect != t_symbol &&
- (int)what_to_collect < (int)t_contiguous) {
- */
-
- /* {int size; */
-
- /* for (pp = pack_pointer; pp != NULL; pp = pp->p_link) { */
- /* size = pp->p_internal_size; */
- /* if (pp->p_internal != NULL) */
- /* for (i = 0; i < size; i++) */
- /* mark_object(pp->p_internal[i]); */
- /* size = pp->p_external_size; */
- /* if (pp->p_external != NULL) */
- /* for (i = 0; i < size; i++) */
- /* mark_object(pp->p_external[i]); */
- /* }} */
-
/* mark the c stack */
#ifndef N_RECURSION_REQD
#define N_RECURSION_REQD 2
@@ -979,15 +943,15 @@ mark_c_stack(jmp_buf env1, int n, void (
extern void * __libc_ia64_register_backing_store_base;
void * bst=GC_save_regs_in_stack();
void * bsb=__libc_ia64_register_backing_store_base;
-
+
if (bsb>bst)
(*fn)(bsb,bst,C_GC_OFFSET);
else
(*fn)(bst,bsb,C_GC_OFFSET);
-
+
}
#endif
-
+
}
static void
@@ -1035,7 +999,7 @@ contblock_sweep_phase(void) {
struct pageinfo *v;
STATIC char *s, *e, *p, *q;
ufixnum i;
-
+
reset_contblock_freelist();
for (i=0;i<contblock_array->v.v_fillp && (v=(void *)contblock_array->v.v_self[i]);i++) {
@@ -1045,7 +1009,7 @@ contblock_sweep_phase(void) {
#ifdef SGC
if (sgc_enabled && !(v->sgc_flags&SGC_PAGE_FLAG)) continue;
#endif
-
+
s=CB_DATA_START(v);
e=(void *)v+v->in_use*PAGESIZE;
@@ -1070,25 +1034,6 @@ contblock_sweep_phase(void) {
int (*GBC_enter_hook)() = NULL;
int (*GBC_exit_hook)() = NULL;
-/* void */
-/* ttss(void) { */
-
-/* struct typemanager *tm; */
-/* void *x,*y; */
-
-/* for (tm=tm_table;tm<tm_table+t_end;tm++) { */
-
-/* for (x=tm->tm_free;x!=OBJNULL;x=(void *)((struct freelist *)x)->f_link) { */
-/* if (x==Cnil) */
-/* printf("barr\n"); */
-/* /\* for (y=(void *)((struct freelist *)x)->f_link;y!=OBJNULL && y!=x;y=(void *)((struct freelist *)y)->f_link); *\/ */
-/* /\* if (y==x) *\/ */
-/* /\* printf("circle\n"); *\/ */
-/* } */
-/* } */
-
-/* } */
-
fixnum fault_pages=0;
static ufixnum
@@ -1102,7 +1047,7 @@ count_contblocks(void) {
return ncb;
}
-
+
void
GBC(enum type t) {
@@ -1120,7 +1065,7 @@ GBC(enum type t) {
ngc_thresh=fix(sSAleaf_collection_thresholdA->s.s_dbind);
recent_allocation=0;
-
+
if (in_signal_handler && t == t_relocatable)
error("cant gc relocatable in signal handler");
@@ -1146,7 +1091,6 @@ GBC(enum type t) {
close_stream(o);
}
- /* t = t_relocatable; */
gc_time = -1;
}
@@ -1265,54 +1209,6 @@ GBC(enum type t) {
#endif
}
-
-/* { */
-/* static int promoting; */
-/* if (!promoting && promotion_pointer>promotion_pointer1) { */
-/* object *p,st; */
-/* promoting=1; */
-/* st=alloc_simple_string(""); */
-/* for (p=promotion_pointer1;p<promotion_pointer;p++) { */
-/* fixnum j; */
-/* object x=*p; */
-
-/* if (type_of(x)==t_string) */
-
-/* j=x->st.st_dim; */
-
-/* else switch (x->v.v_elttype) { */
-
-/* case aet_lf: */
-/* j=sizeof(longfloat)*x->v.v_dim; */
-/* break; */
-/* case aet_bit: */
-/* #define W_SIZE (8*sizeof(fixnum)) */
-/* j=sizeof(fixnum)*((BV_OFFSET(x) + x->bv.bv_dim + W_SIZE -1)/W_SIZE); */
-/* break; */
-/* case aet_char: */
-/* case aet_uchar: */
-/* j=sizeof(char)*x->v.v_dim; */
-/* break; */
-/* case aet_short: */
-/* case aet_ushort: */
-/* j=sizeof(short)*x->v.v_dim; */
-/* break; */
-/* default: */
-/* j=sizeof(fixnum)*x->v.v_dim; */
-/* } */
-
-/* st->st.st_dim=j; */
-/* st->st.st_self=alloc_contblock(st->st.st_dim); */
-/* fprintf(stderr,"Promoting vector leaf bytes %lu at %p, %p -> %p\n",j,x,x->v.v_self,st->st.st_self); */
-/* fflush(stderr); */
-/* memcpy(st->st.st_self,x->v.v_self,st->st.st_dim); */
-/* x->v.v_self=(void *)st->st.st_self; */
-/* } */
-/* promoting=0; */
-/* } */
-/* } */
-
-
#ifdef DEBUG
if (debug) {
int i,j;
@@ -1361,8 +1257,6 @@ GBC(enum type t) {
CHECK_INTERRUPT;
- /* ttss(); */
-
}
static void
@@ -1472,7 +1366,7 @@ mark_contblock(void *p, int s) {
STATIC char *q;
STATIC char *x, *y;
struct pageinfo *v;
-
+
if (NULL_OR_ON_C_STACK(p))
return;
@@ -1495,17 +1389,17 @@ DEFUN_NEW("CONTIGUOUS-REPORT",object,fSc
ufixnum i,j,k,s;
struct typemanager *tm=tm_of(t_cfdata);
void *p;
-
+
for (i=j=0,cbpp=&cb_pointer;(*cbpp);) {
for (k=0,s=(*cbpp)->cb_size,p=*cbpp;*cbpp && (*cbpp)->cb_size==s;i+=(*cbpp)->cb_size,j++,k++,cbpp=&(*cbpp)->cb_link);
emsg("%lu %lu starting at %p\n",k,s,p);
}
emsg("\nTotal free %lu in %lu pieces\n\n",i,j);
-
- for (i=j=k=0;k<contblock_array->v.v_fillp && (v=(void *)contblock_array->v.v_self[k]);k++,i+=v->in_use,j++)
+
+ for (i=j=k=0;k<contblock_array->v.v_fillp && (v=(void *)contblock_array->v.v_self[k]);k++,i+=v->in_use,j++)
emsg("%lu pages at %p\n",(unsigned long)v->in_use,v);
emsg("\nTotal pages %lu in %lu pieces\n\n",i,j);
-
+
for (i=j=0,v=cell_list_head;v;v=v->next)
if (tm->tm_type==v->type) {
void *p;
@@ -1520,7 +1414,7 @@ DEFUN_NEW("CONTIGUOUS-REPORT",object,fSc
}
}
emsg("\nTotal code bytes %lu in %lu pieces\n",i,j);
-
+
for (i=j=0,v=cell_list_head;v;v=v->next) {
struct typemanager *tm=tm_of(v->type);
void *p;
@@ -1589,15 +1483,13 @@ DEFUN_NEW("CONTIGUOUS-REPORT",object,fSc
}
}
emsg("\nTotal leaf bytes %lu in %lu pieces\n",i,j);
-
+
return Cnil;
}
DEFUN_NEW("GBC",object,fSgbc,SI,1,1,NONE,OO,OO,OO,OO,(object x0),"") {
- /* 1 args */
-
if (x0 == Ct) {
tm_table[t_contiguous].tm_adjgbccnt--;
GBC(t_other);
@@ -1644,5 +1536,5 @@ gcl_init_GBC(void) {
#ifdef SGC
make_si_function("SGC-ON",siLsgc_on);
#endif
-
+
}
--- gcl-2.6.12.orig/o/iteration.c
+++ gcl-2.6.12/o/iteration.c
@@ -95,7 +95,7 @@ do_var_list(object var_list)
- if (type_of(x) != t_cons)
+ if (!consp(x))
FEinvalid_form("The index, ~S, is illegal.", x);
y = MMcar(x);
check_var(y);
@@ -326,7 +326,7 @@ FFN(Fdolist)(VOL object arg)
}
eval_assign(start->bt_init, listform);
- body = find_special(MMcdr(arg), start, start+1);
+ body = find_special(MMcdr(arg), start, start+1,NULL); /*?*/
vs_push(body);
bind_var(start->bt_var, Cnil, start->bt_spp);
if ((enum stype)start->bt_var->s.s_stype != stp_ordinary)
@@ -410,7 +410,7 @@ FFN(Fdotimes)(VOL object arg)
if (type_of(start->bt_init) != t_fixnum &&
type_of(start->bt_init) != t_bignum)
FEwrong_type_argument(sLinteger, start->bt_init);
- body = find_special(MMcdr(arg), start, start+1);
+ body = find_special(MMcdr(arg), start, start+1,NULL); /*?*/
vs_push(body);
bind_var(start->bt_var, make_fixnum(0), start->bt_spp);
if ((enum stype)start->bt_var->s.s_stype != stp_ordinary) {
--- gcl-2.6.12.orig/o/let.c
+++ gcl-2.6.12/o/let.c
@@ -151,7 +151,7 @@ FFN(Fmultiple_value_bind)(object form)
}
{
object *vt = vs_top;
- vs_push(find_special(body, start, (struct bind_temp *)vt));
+ vs_push(find_special(body, start, (struct bind_temp *)vt,NULL)); /*?*/
}
for (i = 0; i < n; i++)
bind_var(start[i].bt_var,
@@ -230,7 +230,7 @@ is an illegal function definition in FLE
lex_fun_bind(MMcar(def), top[0]);
def_list = MMcdr(def_list);
}
- vs_push(find_special(MMcdr(args), NULL, NULL));
+ vs_push(find_special(MMcdr(args), NULL, NULL,NULL));
Fprogn(vs_head);
lex_env = lex;
}
@@ -271,7 +271,7 @@ is an illegal function definition in LAB
MMcaar(closure_list) = lex_env[1];
closure_list = MMcdr(closure_list);
}
- vs_push(find_special(MMcdr(args), NULL, NULL));
+ vs_push(find_special(MMcdr(args), NULL, NULL,NULL));
Fprogn(vs_head);
lex_env = lex;
}
@@ -304,7 +304,7 @@ is an illegal macro definition in MACROF
lex_macro_bind(MMcar(def), MMcaddr(top[0]));
def_list = MMcdr(def_list);
}
- vs_push(find_special(MMcdr(args), NULL, NULL));
+ vs_push(find_special(MMcdr(args), NULL, NULL,NULL));
Fprogn(vs_head);
lex_env = lex;
}
--- gcl-2.6.12.orig/o/pathname.d
+++ gcl-2.6.12/o/pathname.d
@@ -28,744 +28,93 @@ Foundation, 675 Mass Ave, Cambridge, MA
#include <string.h>
#include "include.h"
+DEFUN_NEW("C-SET-T-TT",object,fSc_set_t_tt,SI,2,2,NONE,OO,IO,OO,OO,(object x,fixnum y),"") {
+ x->d.tt=y;
+ RETURN1(x);
+}
+
+
+DEFUN_NEW("C-T-TT",object,fSc_t_tt,SI,1,1,NONE,IO,OO,OO,OO,(object x),"") {
+ RETURN1((object)(fixnum)x->d.tt);
+}
+
+
+DEFUN_NEW("C-SET-PATHNAME-NAMESTRING",object,fSc_set_pathname_namestring,SI,2,2,NONE,OO,OO,OO,OO,(object x,object y),"") {
+ check_type_pathname(&x);
+ x->pn.pn_namestring=y;
+ RETURN1(x);
+}
+
+DEFUN_NEW("C-PATHNAME-HOST",object,fSc_pathname_host,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ check_type_pathname(&x);
+ RETURN1(x->pn.pn_host);
+}
+DEFUN_NEW("C-PATHNAME-DEVICE",object,fSc_pathname_device,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ check_type_pathname(&x);
+ RETURN1(x->pn.pn_device);
+}
+DEFUN_NEW("C-PATHNAME-DIRECTORY",object,fSc_pathname_directory,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ check_type_pathname(&x);
+ RETURN1(x->pn.pn_directory);
+}
+DEFUN_NEW("C-PATHNAME-NAME",object,fSc_pathname_name,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ check_type_pathname(&x);
+ RETURN1(x->pn.pn_name);
+}
+DEFUN_NEW("C-PATHNAME-TYPE",object,fSc_pathname_type,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ check_type_pathname(&x);
+ RETURN1(x->pn.pn_type);
+}
+DEFUN_NEW("C-PATHNAME-VERSION",object,fSc_pathname_version,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ check_type_pathname(&x);
+ RETURN1(x->pn.pn_version);
+}
+DEFUN_NEW("C-PATHNAME-NAMESTRING",object,fSc_pathname_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ check_type_pathname(&x);
+ RETURN1(x->pn.pn_namestring);
+}
-object
-make_pathname(host, device, directory, name, type, version)
-object host, device, directory, name, type, version;
-{
- object x;
-
- x = alloc_object(t_pathname);
- x->pn.pn_host = host;
- x->pn.pn_device = device;
- x->pn.pn_directory = directory;
- x->pn.pn_name = name;
- x->pn.pn_type = type;
- x->pn.pn_version = version;
- return(x);
-}
-
-static void
-make_one(s, end)
-char *s;
-int end;
-{
- int i;
-
-#ifdef UNIX
- for (i = 0; i < end; i++)
- token->st.st_self[i] = s[i];
-#endif
-#ifdef AOSVS
-
-
-
-#endif
- token->st.st_fillp = end;
- vs_push(copy_simple_string(token));
-}
-
-/* The function below does not attempt to handle DOS pathnames
- which use backslashes as directory separators. It needs
- TLC from someone who feels pedantic. MJT */
-
-/* !!!!! Bug Fix. NLG */
-object
-parse_namestring(s, start, end, ep)
-object s;
-int start, end, *ep;
-{
- int i, j, k, founddosdev = FALSE, oldstart=start, oldend=end, justdevice = FALSE;
- int d;
- object *vsp;
- object x;
- vs_mark;
-
-#ifndef IS_DIR_SEPARATOR
-#define IS_DIR_SEPARATOR(x) (x == '/')
-#endif
-
- *ep=oldend;
- vsp = vs_top + 1;
- for (;--end >= start && isspace((int)s->st.st_self[end]););
-
- /* Check for a DOS path and process later */
- if ( ( (start+1) <= end) && (s->st.st_self[start+1] == ':' )) {
- start+=2;
- founddosdev = TRUE;
- }
- if ( start > end ) {
- make_one(&s->st.st_self[0], 0);
- justdevice = TRUE;
- } else {
- for (i = j = start; i <= end; ) {
-#ifdef UNIX
- if (IS_DIR_SEPARATOR(s->st.st_self[i])) {
-#endif
- if (j == start && i == start) {
- i++;
- vs_push(sKroot);
- j = i;
- continue;
- }
-#ifdef UNIX
- if (i-j == 1 && s->st.st_self[j] == '.') {
- vs_push(sKcurrent);
- } else if (i-j == 1 && s->st.st_self[j] == '*') {
- vs_push(sKwild);
- } else if (i-j==2 && s->st.st_self[j]=='.' && s->st.st_self[j+1]=='.') {
- vs_push(sKparent);
- } else {
- make_one(&s->st.st_self[j], i-j);
- }
-#endif
- i++;
- j = i;
- } else {
- i++;
- }
- }
- *ep = i;
- vs_push(Cnil);
- while (vs_top > vsp)
- stack_cons();
- if (i == j) {
- /* no file and no type */
- vs_push(Cnil);
- vs_push(Cnil);
- goto L;
- }
- for (k = j, d = -1; k < i; k++)
- if (s->st.st_self[k] == '.')
- d = k;
- if (d == -1) {
- /* no file type */
-#ifdef UNIX
- if (i-j == 1 && s->st.st_self[j] == '*')
-#endif
- vs_push(sKwild);
- else
- make_one(&s->st.st_self[j], i-j);
-
- vs_push(Cnil);
- } else if (d == j) {
- /* no file name */
- vs_push(Cnil);
-#ifdef UNIX
- if (i-d-1 == 1 && s->st.st_self[d+1] == '*')
-#endif
- vs_push(sKwild);
- else
- make_one(&s->st.st_self[d+1], i-d-1);
- } else {
- /* file name and file type */
-#ifdef UNIX
- if (d-j == 1 && s->st.st_self[j] == '*')
-#endif
- vs_push(sKwild);
- else {
- make_one(&s->st.st_self[j], d-j);
- }
-#ifdef UNIX
- if (i-d-1 == 1 && s->st.st_self[d+1] == '*')
-#endif
- vs_push(sKwild);
- else
- make_one(&s->st.st_self[d+1], i-d-1);
- }
- }
-L:
- /* Process DOS device name found earlier, build a string in a list and push it */
- if ( founddosdev ) {
- /* Drive letter */
- token->st.st_self[0] = s->st.st_self[oldstart];
- /* Colon */
- token->st.st_self[1] = s->st.st_self[oldstart+1];
- /* Fill pointer */
- token->st.st_fillp = 2;
- /* Push */
- vs_push(make_cons(copy_simple_string(token),Cnil));
- } else {
- /* No device name */
- vs_push(Cnil);
- }
- if ( justdevice ) {
- x = make_pathname ( Cnil, vs_top[-1], Cnil, Cnil, Cnil, Cnil );
- } else {
- x = make_pathname ( Cnil, vs_top[-1], vs_top[-4], vs_top[-3], vs_top[-2], Cnil );
- }
- vs_reset;
- return(x);
-}
-
-object
-coerce_to_pathname(x)
-object x;
-{
- object y;
- int e;
-
-L:
- switch (type_of(x)) {
- case t_symbol:
- case t_string:
- /* !!!!! Bug Fix. NLG */
- y = parse_namestring(x, 0, x->st.st_fillp, &e);
- if (y == OBJNULL || e != x->st.st_fillp)
- goto CANNOT_COERCE;
- return(y);
-
- case t_pathname:
- return(x);
-
- case t_stream:
- switch (x->sm.sm_mode) {
- case smm_input:
- case smm_output:
- case smm_probe:
- case smm_io:
- x = x->sm.sm_object1;
- /*
- The file was stored in sm.sm_object1.
- See open.
- */
- goto L;
-
- case smm_synonym:
- x = symbol_value(x->sm.sm_object0);
- goto L;
-
- default:
- goto CANNOT_COERCE;
- }
-
- default:
- CANNOT_COERCE:
- FEerror("~S cannot be coerced to a pathname.", 1, x);
- return(Cnil);
- }
-}
-
-static object
-default_device(host)
-object host;
-{
- return(Cnil);
- /* not implemented yet */
-}
-
-object
-merge_pathnames(path, defaults, default_version)
-object path, defaults, default_version;
-{
- object host, device, directory, name, type, version;
-
- if (path->pn.pn_host == Cnil)
- host = defaults->pn.pn_host;
- else
- host = path->pn.pn_host;
- if (path->pn.pn_device == Cnil)
- if (path->pn.pn_host == Cnil)
- device = defaults->pn.pn_device;
- else if (path->pn.pn_host == defaults->pn.pn_host)
- device = defaults->pn.pn_device;
- else
- device = default_device(path->pn.pn_host);
- else
- device = path->pn.pn_device;
-
- if (defaults->pn.pn_directory==Cnil ||
- (type_of(path->pn.pn_directory)==t_cons
- && path->pn.pn_directory->c.c_car==sKroot))
- directory=path->pn.pn_directory;
- else
- directory=path->pn.pn_directory==Cnil ?
- defaults->pn.pn_directory :
- append(defaults->pn.pn_directory,path->pn.pn_directory);
-
- if (path->pn.pn_name == Cnil)
- name = defaults->pn.pn_name;
- else
- name = path->pn.pn_name;
- if (path->pn.pn_type == Cnil)
- type = defaults->pn.pn_type;
- else
- type = path->pn.pn_type;
- version = Cnil;
- /*
- In this implimentation, version is not counted
- */
- return(make_pathname(host,device,directory,name,type,version));
-}
-
-/*
- Namestring(x) converts a pathname to a namestring.
-*/
-object
-namestring(x)
-object x;
-{
-
- int i, j;
- object l, y;
-
- i = 0;
-
- l = x->pn.pn_device;
- if (endp(l)) {
- goto D;
- }
- y = l->c.c_car;
- y = coerce_to_string(y);
- for (j = 0; j < y->st.st_fillp; j++) {
- token->st.st_self[i++] = y->st.st_self[j];
- }
-
-D: l = x->pn.pn_directory;
- if (endp(l))
- goto L;
- y = l->c.c_car;
- if (y == sKroot) {
-#ifdef UNIX
- token->st.st_self[i++] = '/';
-#endif
- l = l->c.c_cdr;
- }
- for (; !endp(l); l = l->c.c_cdr) {
- y = l->c.c_car;
-#ifdef UNIX
- if (y == sKcurrent) {
- token->st.st_self[i++] = '.';
- token->st.st_self[i++] = '/';
- continue;
- } else if (y == sKwild) {
- token->st.st_self[i++] = '*';
- token->st.st_self[i++] = '/';
- continue;
- } else if (y == sKparent) {
- token->st.st_self[i++] = '.';
- token->st.st_self[i++] = '.';
- token->st.st_self[i++] = '/';
- continue;
- }
-#endif
- y = coerce_to_string(y);
- for (j = 0; j < y->st.st_fillp; j++)
- token->st.st_self[i++]
- = y->st.st_self[j];
-#ifdef UNIX
- token->st.st_self[i++] = '/';
-#endif
-#ifdef AOSVS
-
-#endif
- }
-L:
- y = x->pn.pn_name;
- if (y == Cnil)
- goto M;
- if (y == sKwild) {
-#ifdef UNIX
- token->st.st_self[i++] = '*';
-#endif
-#ifdef AOSVS
-
-#endif
- goto M;
- }
- if (type_of(y) != t_string)
- FEerror("~S is an illegal pathname name.", 1, y);
- for (j = 0; j < y->st.st_fillp; j++)
- token->st.st_self[i++] = y->st.st_self[j];
-M:
- y = x->pn.pn_type;
- if (y == Cnil)
- goto N;
- if (y == sKwild) {
- token->st.st_self[i++] = '.';
-#ifdef UNIX
- token->st.st_self[i++] = '*';
-#endif
-#ifdef AOSVS
-
-#endif
- goto N;
- }
- if (type_of(y) != t_string)
- FEerror("~S is an illegal pathname name.", 1, y);
- token->st.st_self[i++] = '.';
- for (j = 0; j < y->st.st_fillp; j++)
- token->st.st_self[i++] = y->st.st_self[j];
-N:
- token->st.st_fillp = i;
-#ifdef FIX_FILENAME
- {char buf[MAXPATHLEN];
- if (i > MAXPATHLEN-1) i =MAXPATHLEN-1;
- memcpy(buf,token->st.st_self,i);
- buf[i]=0;
- FIX_FILENAME(x,buf);
- return (make_simple_string(buf));
- }
-#endif
- return(copy_simple_string(token));
-}
-
-object
-coerce_to_namestring(x)
-object x;
-{
-
-L:
- switch (type_of(x)) {
- case t_symbol:
- {BEGIN_NO_INTERRUPT;
- vs_push(alloc_simple_string(x->s.s_fillp));
- /* By Nick Gall */
- vs_head->st.st_self = alloc_relblock(x->s.s_fillp);
- {
- int i;
- for (i = 0; i < x->s.s_fillp; i++)
- vs_head->st.st_self[i] = x->s.s_self[i];
- }
- END_NO_INTERRUPT;}
- return(vs_pop);
-
- case t_string:
- return(x);
-
- case t_pathname:
- return(namestring(x));
-
- case t_stream:
- switch (x->sm.sm_mode) {
- case smm_input:
- case smm_output:
- case smm_probe:
- case smm_io:
- x = x->sm.sm_object1;
- /*
- The file was stored in sm.sm_object1.
- See open.
- */
- goto L;
-
- case smm_synonym:
- x = symbol_value(x->sm.sm_object0);
- goto L;
-
- default:
- goto CANNOT_COERCE;
- }
-
- default:
- CANNOT_COERCE:
- FEerror("~S cannot be coerced to a namestring.", 1, x);
- return(Cnil);
- }
-}
-
-LFD(Lpathname)(void)
-{
- check_arg(1);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
-}
-
-@(defun parse_namestring (thing
- &o host
- (defaults `symbol_value(Vdefault_pathname_defaults)`)
- &k start end junk_allowed
- &a x y)
- int s, e, ee;
-@
- check_type_or_pathname_string_symbol_stream(&thing);
- check_type_or_pathname_string_symbol_stream(&defaults);
- defaults = coerce_to_pathname(defaults);
- x = thing;
-L:
- switch (type_of(x)) {
- case t_symbol:
- case t_string:
- get_string_start_end(x, start, end, &s, &e);
- for (; s < e && isspace((int)x->st.st_self[s]); s++)
- ;
- y
- /* !!!!! Bug Fix. NLG */
- = parse_namestring(x,
- s,
- e - s,
- &ee);
- if (junk_allowed == Cnil) {
- for (; ee < e - s; ee++)
- if (!isspace((int)x->st.st_self[s + ee]))
- break;
- if (y == OBJNULL || ee != e - s)
- FEerror("Cannot parse the namestring ~S~%\
-from ~S to ~S.",
- 3, x, start, end);
- } else
- if (y == OBJNULL)
- @(return Cnil `make_fixnum(s + ee)`)
- start = make_fixnum(s + ee);
- break;
-
- case t_pathname:
- y = x;
- break;
-
- case t_stream:
- switch (x->sm.sm_mode) {
- case smm_input:
- case smm_output:
- case smm_probe:
- case smm_io:
- x = x->sm.sm_object1;
- /*
- The file was stored in sm.sm_object1.
- See open.
- */
- goto L;
-
- case smm_synonym:
- x = symbol_value(x->sm.sm_object0);
- goto L;
-
- default:
- goto CANNOT_PARSE;
- }
-
- default:
- CANNOT_PARSE:
- FEerror("Cannot parse the namestring ~S.", 1, x);
- }
- if (host != Cnil && y->pn.pn_host != Cnil &&
- host != y->pn.pn_host)
- FEerror("The hosts ~S and ~S do not match.",
- 2, host, y->pn.pn_host);
- @(return y start)
-@)
-
-@(defun merge_pathnames (path
- &o (defaults `symbol_value(Vdefault_pathname_defaults)`)
- (default_version sKnewest))
-@
- check_type_or_pathname_string_symbol_stream(&path);
- check_type_or_pathname_string_symbol_stream(&defaults);
- path = coerce_to_pathname(path);
- defaults = coerce_to_pathname(defaults);
- @(return `merge_pathnames(path, defaults, default_version)`)
-@)
-
-@(defun make_pathname (&key
- (host `Cnil` host_supplied_p)
- (device `Cnil` device_supplied_p)
- (directory `Cnil` directory_supplied_p)
- (name `Cnil` name_supplied_p)
- (type `Cnil` type_supplied_p)
- (version `Cnil` version_supplied_p)
- defaults
- &aux x)
-@
- if ( defaults == Cnil ) {
- defaults = symbol_value ( Vdefault_pathname_defaults );
- defaults = coerce_to_pathname ( defaults );
- defaults = make_pathname ( defaults->pn.pn_host,
- Cnil, Cnil, Cnil, Cnil, Cnil);
- } else {
- defaults = coerce_to_pathname(defaults);
- }
- x = make_pathname(host, device, directory, name, type, version);
- x = merge_pathnames(x, defaults, Cnil);
- if ( host_supplied_p) x->pn.pn_host = host;
- if (device_supplied_p) x->pn.pn_device = device;
- if (directory_supplied_p) x->pn.pn_directory = directory;
- if (name_supplied_p) x->pn.pn_name = name;
- if (type_supplied_p) x->pn.pn_type = type;
- if (version_supplied_p) x->pn.pn_version = version;
- @(return x)
-@)
-
-LFD(Lpathnamep)(void)
-{
- check_arg(1);
-
- if (type_of(vs_base[0]) == t_pathname)
- vs_base[0] = Ct;
- else
- vs_base[0] = Cnil;
-}
-
-LFD(Lpathname_host)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0] = vs_base[0]->pn.pn_host;
-}
-
-LFD(Lpathname_device)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0] = vs_base[0]->pn.pn_device;
-}
-
-LFD(Lpathname_directory)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0] = vs_base[0]->pn.pn_directory;
-}
-
-LFD(Lpathname_name)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0] = vs_base[0]->pn.pn_name;
-}
-
-LFD(Lpathname_type)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0] = vs_base[0]->pn.pn_type;
-}
-
-LFD(Lpathname_version)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0] = vs_base[0]->pn.pn_version;
-}
-
-LFD(Lnamestring)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_namestring(vs_base[0]);
-}
-
-LFD(Lfile_namestring)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0]
- = make_pathname(Cnil, Cnil, Cnil,
- vs_base[0]->pn.pn_name,
- vs_base[0]->pn.pn_type,
- vs_base[0]->pn.pn_version);
- vs_base[0] = namestring(vs_base[0]);
-}
-
-LFD(Ldirectory_namestring)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0]
- = make_pathname(Cnil, Cnil,
- vs_base[0]->pn.pn_directory,
- Cnil, Cnil, Cnil);
- vs_base[0] = namestring(vs_base[0]);
-}
-
-LFD(Lhost_namestring)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0] = vs_base[0]->pn.pn_host;
- if (vs_base[0] == Cnil || vs_base[0] == sKwild)
- vs_base[0] = make_simple_string("");
-}
-
-@(defun enough_namestring (path
- &o (defaults `symbol_value(Vdefault_pathname_defaults)`))
-@
- check_type_or_pathname_string_symbol_stream(&path);
- check_type_or_pathname_string_symbol_stream(&defaults);
- defaults = coerce_to_pathname(defaults);
- path = coerce_to_pathname(path);
- path
- = make_pathname(equalp(path->pn.pn_host, defaults->pn.pn_host) ?
- Cnil : path->pn.pn_host,
- equalp(path->pn.pn_device,
- defaults->pn.pn_device) ?
- Cnil : path->pn.pn_device,
- equalp(path->pn.pn_directory,
- defaults->pn.pn_directory) ?
- Cnil : path->pn.pn_directory,
- equalp(path->pn.pn_name, defaults->pn.pn_name) ?
- Cnil : path->pn.pn_name,
- equalp(path->pn.pn_type, defaults->pn.pn_type) ?
- Cnil : path->pn.pn_type,
- equalp(path->pn.pn_version,
- defaults->pn.pn_version) ?
- Cnil : path->pn.pn_version);
- @(return `namestring(path)`)
-@)
+
+DEFUN_NEW("C-STREAM-OBJECT0",object,fSc_stream_object0,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(x->sm.sm_object0);
+}
+
+DEFUN_NEW("C-STREAM-OBJECT1",object,fSc_stream_object1,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(x->sm.sm_object1);
+}
+
+DEFUN_NEW("C-SET-STREAM-OBJECT1",object,fSc_set_stream_object1,SI,2,2,NONE,OO,OO,OO,OO,(object x,object y),"") {
+ x->sm.sm_object1=y;
+ RETURN1(x);
+}
+
+DEFUN_NEW("INIT-PATHNAME",object,fSinit_pathname,SI,7,7,NONE,OO,OO,OO,OO,
+ (object host,object device,object directory,object name,object type,object version,object namestring),"") {
+
+ object x=alloc_object(t_pathname);
+
+ x->pn.pn_host=host;
+ x->pn.pn_device=device;
+ x->pn.pn_directory=directory;
+ x->pn.pn_name=name;
+ x->pn.pn_type=type;
+ x->pn.pn_version=version;
+ x->pn.pn_namestring=namestring;
+
+ RETURN1(x);
+
+}
+
+DEFUN_NEW("PATHNAMEP",object,fLpathnamep,LISP,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(type_of(x)==t_pathname ? Ct : Cnil);
+}
void
-gcl_init_pathname(void)
-{
- Vdefault_pathname_defaults =
- make_special("*DEFAULT-PATHNAME-DEFAULTS*",
- make_pathname(Cnil, Cnil, Cnil, Cnil, Cnil, Cnil));
-
- sKwild = make_keyword("WILD");
- sKnewest = make_keyword("NEWEST");
-
- sKstart = make_keyword("START");
- sKend = make_keyword("END");
- sKjunk_allowed = make_keyword("JUNK-ALLOWED");
-
- sKhost = make_keyword("HOST");
- sKdevice = make_keyword("DEVICE");
- sKdirectory = make_keyword("DIRECTORY");
- sKname = make_keyword("NAME");
- sKtype = make_keyword("TYPE");
- sKversion = make_keyword("VERSION");
- sKdefaults = make_keyword("DEFAULTS");
-
- sKroot = make_keyword("ROOT");
- sKcurrent = make_keyword("CURRENT");
- sKparent = make_keyword("PARENT");
- sKper = make_keyword("PER");
+gcl_init_pathname(void) {
+
}
void
-gcl_init_pathname_function()
-{
- make_function("PATHNAME", Lpathname);
- make_function("PARSE-NAMESTRING", Lparse_namestring);
- make_function("MERGE-PATHNAMES", Lmerge_pathnames);
- make_function("MAKE-PATHNAME", Lmake_pathname);
- make_function("PATHNAMEP", Lpathnamep);
- make_function("PATHNAME-HOST", Lpathname_host);
- make_function("PATHNAME-DEVICE", Lpathname_device);
- make_function("PATHNAME-DIRECTORY", Lpathname_directory);
- make_function("PATHNAME-NAME", Lpathname_name);
- make_function("PATHNAME-TYPE", Lpathname_type);
- make_function("PATHNAME-VERSION", Lpathname_version);
- make_function("NAMESTRING", Lnamestring);
- make_function("FILE-NAMESTRING", Lfile_namestring);
- make_function("DIRECTORY-NAMESTRING", Ldirectory_namestring);
- make_function("HOST-NAMESTRING", Lhost_namestring);
- make_function("ENOUGH-NAMESTRING", Lenough_namestring);
+gcl_init_pathname_function(void) {
+
}
--- gcl-2.6.12.orig/o/predicate.c
+++ gcl-2.6.12/o/predicate.c
@@ -29,6 +29,10 @@ Foundation, 675 Mass Ave, Cambridge, MA
#include <string.h>
#include "include.h"
+DEFUN_NEW("PATHNAME-DESIGNATORP",object,fSpathname_designatorp,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ RETURN1(pathname_designatorp(x) ? Ct : Cnil);
+}
+
DEFUNO_NEW("NULL",object,fLnull,LISP
,1,1,NONE,OO,OO,OO,OO,void,Lnull,(object x0),"")
{
--- gcl-2.6.12.orig/o/print.d
+++ gcl-2.6.12/o/print.d
@@ -1260,6 +1260,7 @@ int level;
write_ch('>');
break;
+ case smm_file_synonym:
case smm_synonym:
write_str("#<synonym stream to ");
write_object(x->sm.sm_object0, level);
@@ -1381,7 +1382,7 @@ int level;
if (1 || PRINTescape) {
write_ch('#');
write_ch('p');
- vs_push(namestring(x));
+ vs_push(x->pn.pn_namestring==Cnil ? make_simple_string("") : x->pn.pn_namestring);
write_object(vs_head, level);
vs_popp;
} else {
--- gcl-2.6.12.orig/o/read.d
+++ gcl-2.6.12/o/read.d
@@ -1564,38 +1564,6 @@ Ldefault_dispatch_macro()
}
/*
- #p" ... " returns the pathname with namestring ... .
-*/
-static void
-Lsharp_p_reader()
-{
- check_arg(3);
- if (vs_base[2] != Cnil && !READsuppress)
- extra_argument('p');
- vs_popp;
- vs_popp;
- vs_base[0] = read_object(vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
-}
-
-/*
- #" ... " returns the pathname with namestring ... .
-*/
-static void
-Lsharp_double_quote_reader()
-{
- check_arg(3);
-
- if (vs_base[2] != Cnil && !READsuppress)
- extra_argument('"');
- vs_popp;
- unread_char(vs_base[1], vs_base[0]);
- vs_popp;
- vs_base[0] = read_object(vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
-}
-
-/*
#$ fixnum returns a random-state with the fixnum
as its content.
*/
@@ -2369,9 +2337,6 @@ gcl_init_read()
dtab['<'] = make_cf(Lsharp_less_than_reader);
*/
dtab['|'] = make_cf(Lsharp_vertical_bar_reader);
- dtab['"'] = make_cf(Lsharp_double_quote_reader);
- dtab['p'] = make_cf(Lsharp_p_reader);
- dtab['P'] = make_cf(Lsharp_p_reader);
/* This is specific to this implimentation */
dtab['$'] = make_cf(Lsharp_dollar_reader);
/* This is specific to this implimentation */
--- gcl-2.6.12.orig/o/regexp.c
+++ gcl-2.6.12/o/regexp.c
@@ -117,7 +117,7 @@ min_initial_branch_length(regexp *, unsi
#define PLUS 11 /* node Match this (simple) thing 1 or more times. */
#define OPEN 20 /* no Mark this point in input as start of #n. */
/* OPEN+1 is number 1, etc. */
-#define CLOSE 30 /* no Analogous to OPEN. */
+#define CLOSE (OPEN+NSUBEXP) /* no Analogous to OPEN. */
/*
* Opcode notes:
@@ -1083,15 +1083,8 @@ regmatch(char *prog)
break;
case BACK:
break;
- case OPEN+1:
- case OPEN+2:
- case OPEN+3:
- case OPEN+4:
- case OPEN+5:
- case OPEN+6:
- case OPEN+7:
- case OPEN+8:
- case OPEN+9: {
+ case OPEN+1 ... OPEN+NSUBEXP-1:
+ {
register int no;
register char *save;
@@ -1112,15 +1105,8 @@ regmatch(char *prog)
}
/* NOTREACHED */
break;
- case CLOSE+1:
- case CLOSE+2:
- case CLOSE+3:
- case CLOSE+4:
- case CLOSE+5:
- case CLOSE+6:
- case CLOSE+7:
- case CLOSE+8:
- case CLOSE+9: {
+ case CLOSE+1 ... CLOSE+NSUBEXP-1:
+ {
register int no;
register char *save;
@@ -1394,27 +1380,11 @@ char *op;
case END:
p = "END";
break;
- case OPEN+1:
- case OPEN+2:
- case OPEN+3:
- case OPEN+4:
- case OPEN+5:
- case OPEN+6:
- case OPEN+7:
- case OPEN+8:
- case OPEN+9:
+ case OPEN+1 ... OPEN+NSUBEXP-1:
sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN);
p = NULL;
break;
- case CLOSE+1:
- case CLOSE+2:
- case CLOSE+3:
- case CLOSE+4:
- case CLOSE+5:
- case CLOSE+6:
- case CLOSE+7:
- case CLOSE+8:
- case CLOSE+9:
+ case CLOSE+1 ... CLOSE+NSUBEXP-1:
sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE);
p = NULL;
break;
--- gcl-2.6.12.orig/o/regexp.h
+++ gcl-2.6.12/o/regexp.h
@@ -1,7 +1,7 @@
#ifndef _REGEXP
#define _REGEXP 1
-#define NSUBEXP 10
+#define NSUBEXP 19
typedef struct regexp {
char *startp[NSUBEXP];
char *endp[NSUBEXP];
--- gcl-2.6.12.orig/o/regexpr.c
+++ gcl-2.6.12/o/regexpr.c
@@ -81,6 +81,7 @@ DEFUN_NEW("COMPILE-REGEXP",object,fScomp
res->v.v_elttype=aet_uchar;
res->v.v_adjustable=0;
res->v.v_offset=0;
+ res->v.v_self=NULL;
if (!(res->v.v_self=(void *)regcomp(tmp,&res->v.v_dim)))
FEerror("regcomp failure",0);
res->v.v_fillp=res->v.v_dim;
--- gcl-2.6.12.orig/o/run_process.c
+++ gcl-2.6.12/o/run_process.c
@@ -177,10 +177,12 @@ void run_process ( char *name )
stream_in->sm.sm_mode = smm_input;
stream_in->sm.sm_fp = ofp;
stream_in->sm.sm_buffer = 0;
+ stream_in->sm.sm_flags=0;
stream_out = (object) alloc_object(t_stream);
stream_out->sm.sm_mode = smm_output;
stream_out->sm.sm_fp = ifp;
stream_out->sm.sm_buffer = 0;
+ stream_out->sm.sm_flags=0;
setup_stream_buffer ( stream_in );
setup_stream_buffer ( stream_out );
stream = make_two_way_stream ( stream_in, stream_out );
@@ -433,6 +435,7 @@ enum smmode smm;
stream->sm.sm_object0 = sLcharacter;
stream->sm.sm_object1 = host_l;
stream->sm.sm_int0 = stream->sm.sm_int1 = 0;
+ stream->sm.sm_flags=0;
vs_push(stream);
setup_stream_buffer(stream);
vs_reset;
@@ -503,6 +506,7 @@ make_socket_pair()
stream_in->sm.sm_int0 = sockets_in[1];
stream_in->sm.sm_int1 = 0;
stream_in->sm.sm_object0=stream_in->sm.sm_object1=OBJNULL;
+ stream_in->sm.sm_flags = 0;
stream_out = (object) alloc_object(t_stream);
stream_out->sm.sm_mode = smm_output;
stream_out->sm.sm_fp = fp2;
@@ -511,6 +515,7 @@ make_socket_pair()
setup_stream_buffer(stream_out);
stream_out->sm.sm_int0 = sockets_out[1];
stream_out->sm.sm_int1 = 0;
+ stream_out->sm.sm_flags = 0;
stream_out->sm.sm_object0=stream_out->sm.sm_object1=OBJNULL;
stream = make_two_way_stream(stream_in, stream_out);
return(stream);
--- gcl-2.6.12.orig/o/sfaslcoff.c
+++ gcl-2.6.12/o/sfaslcoff.c
@@ -151,6 +151,16 @@ find_init_address(struct syment *sym,str
}
+static ul
+get_sym_value(const char *name) {
+
+ struct node *answ;
+
+ return (answ=find_sym_ptable(name)) ? answ->address :
+ ({massert(!emsg("Unrelocated non-local symbol: %s\n",name));0;});
+
+}
+
static void
relocate_symbols(struct syment *sym,struct syment *sye,struct scnhdr *sec1,char *st1) {
@@ -163,22 +173,10 @@ relocate_symbols(struct syment *sym,stru
else if (!sym->n_scnum) {
- char c=0,*s;
-
- if (sym->n.n.n_zeroes) {
- c=sym->n.n_name[8];
- sym->n.n_name[8]=0;
- s=sym->n.n_name;
- } else
- s=st1+sym->n.n.n_offset;
-
- if ((answ=find_sym_ptable(s)))
- sym->n_value=answ->address;
+ if (sym->n.n.n_zeroes)
+ STOP(sym->n.n_name,sym->n_value=get_sym_value(sym->n.n_name));
else
- massert(!emsg("Unrelocated non-local symbol: %s\n",s));
-
- if (c)
- sym->n.n_name[8]=c;
+ sym->n_value=get_sym_value(st1+sym->n.n.n_offset);
}
@@ -391,13 +389,11 @@ fasload(object faslfile) {
struct reloc *rel,*rele;
object memory, data;
FILE *fp;
- char filename[MAXPATHLEN],*st1,*ste;
+ char *st1,*ste;
int i;
ul init_address=0;
void *st,*est;
- coerce_to_filename(faslfile, filename);
- faslfile = open_stream(faslfile, smm_input, Cnil, sKerror);
fp = faslfile->sm.sm_fp;
massert(st=get_mmap(fp,&est));
@@ -427,7 +423,6 @@ fasload(object faslfile) {
data = read_fasl_vector(faslfile);
massert(!un_mmap(st,est));
- close_stream(faslfile);
#ifdef CLEAR_CACHE
CLEAR_CACHE;
--- gcl-2.6.12.orig/o/sfaslelf.c
+++ gcl-2.6.12/o/sfaslelf.c
@@ -542,15 +542,13 @@ int
fasload(object faslfile) {
FILE *fp;
- char filename[256],*sn,*st1,*dst1;
+ char *sn,*st1,*dst1;
ul init_address=0,end,gs=0,*got=&gs,*gote=got+1;
object memory,data;
Shdr *sec1,*sece;
Sym *sym1,*syme,*dsym1,*dsyme;
void *v1,*ve;
- coerce_to_filename(faslfile, filename);
- faslfile = open_stream(faslfile, smm_input, Cnil, sKerror);
fp = faslfile->sm.sm_fp;
massert(v1=get_mmap(fp,&ve));
@@ -573,7 +571,6 @@ fasload(object faslfile) {
data=feof(fp) ? 0 : read_fasl_vector(faslfile);
massert(!un_mmap(v1,ve));
- close_stream(faslfile);
massert(!clear_protect_memory(memory));
--- gcl-2.6.12.orig/o/sfaslmacho.c
+++ gcl-2.6.12/o/sfaslmacho.c
@@ -524,7 +524,6 @@ fasload(object faslfile) {
FILE *fp;
object data;
- char filename[256];
ul init_address=-1;
object memory;
void *v1,*ve,*p;
@@ -533,8 +532,6 @@ fasload(object faslfile) {
char *st1=NULL,*ste=NULL;
ul gs,*got=&gs,*gote,*io1=NULL,rls,start;
- coerce_to_filename(faslfile, filename);
- faslfile = open_stream(faslfile, smm_input, Cnil, sKerror);
fp = faslfile->sm.sm_fp;
massert(v1=get_mmap(fp,&ve));
@@ -563,7 +560,6 @@ fasload(object faslfile) {
#endif
massert(!un_mmap(v1,ve));
- close_stream(faslfile);
init_address-=(ul)memory->cfd.cfd_start;
call_init(init_address,memory,data,0);
--- gcl-2.6.12.orig/o/sgbc.c
+++ gcl-2.6.12/o/sgbc.c
@@ -717,7 +717,7 @@ sgc_start(void) {
void *p=NULL,*pe;
struct pageinfo *pi;
ufixnum i;
-
+
old_cb_pointer=cb_pointer;
reset_contblock_freelist();
@@ -774,6 +774,8 @@ sgc_start(void) {
object v=sSAwritableA->s.s_dbind;
for (i=page(v->v.v_self);i<=page(v->v.v_self+CEI(v->bv.bv_offset+v->v.v_dim-1,8*sizeof(fixnum))/(8*sizeof(fixnum)));i++)
SET_WRITABLE(i);
+ SET_WRITABLE(page(v));
+ SET_WRITABLE(page(sSAwritableA));
}
tm_of(t_relocatable)->tm_alt_npage=0;
@@ -787,7 +789,7 @@ sgc_start(void) {
Turn memory protection on for the pages which are writable.
*/
sgc_enabled=1;
- if (memory_protect(1))
+ if (memory_protect(1))
sgc_quit();
if (sSAnotify_gbcA->s.s_dbind != Cnil)
emsg("[SGC on]");
@@ -897,7 +899,7 @@ sgc_quit(void) {
for (p=pagetochar(page(v)),j=tm->tm_nppage;j>0;--j,p+=tm->tm_size)
((object) p)->d.s=SGC_NORMAL;
#endif
-
+
for (i=0;i<contblock_array->v.v_fillp &&(v=(void *)contblock_array->v.v_self[i]);i++)
if (v->sgc_flags&SGC_PAGE_FLAG)
bzero(CB_SGCF_START(v),CB_DATA_START(v)-CB_SGCF_START(v));
@@ -931,7 +933,7 @@ memprotect_handler(int sig, long code, v
#endif
if (faddr >= (void *)core_end || faddr < data_start) {
static void *old_faddr;
- if (old_faddr==faddr)
+ if (old_faddr==faddr)
if (fault_count++ > 300) error("fault count too high");
old_faddr=faddr;
INSTALL_MPROTECT_HANDLER;
@@ -1017,7 +1019,7 @@ memory_protect(int on) {
if (writable==WRITABLE_PAGE_P(i) && i<end) continue;
- if (sgc_mprotect(beg,i-beg,writable))
+ if (sgc_mprotect(beg,i-beg,writable))
return -1;
writable=1-writable;
beg=i;
--- gcl-2.6.12.orig/o/toplevel.c
+++ gcl-2.6.12/o/toplevel.c
@@ -173,7 +173,7 @@ FFN(Flocally)(object body)
object *oldlex = lex_env;
lex_copy();
- body = find_special(body, NULL, NULL);
+ body = find_special(body, NULL, NULL,NULL);
vs_push(body);
Fprogn(body);
lex_env = oldlex;
--- gcl-2.6.12.orig/o/typespec.c
+++ gcl-2.6.12/o/typespec.c
@@ -231,114 +231,71 @@ DEF_ORDINARY("SIGNED-SHORT",sSsigned_sho
DEF_ORDINARY("UNSIGNED-SHORT",sSunsigned_short,SI,"");
DEF_ORDINARY("*",sLA,LISP,"");
DEF_ORDINARY("PLUSP",sLplusp,LISP,"");
-DEF_ORDINARY("DIVISION-BY-ZERO",sLdivision_by_zero,LISP,"");
-DEF_ORDINARY("FLOATING-POINT-INEXACT",sLfloating_point_inexact,LISP,"");
-DEF_ORDINARY("FLOATING-POINT-INVALID-OPERATION",sLfloating_point_invalid_operation,LISP,"");
-DEF_ORDINARY("FLOATING-POINT-OVERFLOW",sLfloating_point_overflow,LISP,"");
-DEF_ORDINARY("FLOATING-POINT-UNDERFLOW",sLfloating_point_underflow,LISP,"");
-DEF_ORDINARY("PROGRAM-ERROR",sLprogram_error,LISP,"");
-DEF_ORDINARY("UNDEFINED-FUNCTION",sLundefined_function,LISP,"");
-DEF_ORDINARY("UNBOUND-VARIABLE",sLunbound_variable,LISP,"");
-DEF_ORDINARY("PACKAGE-ERROR",sLpackage_error,LISP,"");
DEF_ORDINARY("METHOD-COMBINATION",sLmethod_combination,LISP,"");
-DEF_ORDINARY("ARITHMETIC-ERROR",sLarithmetic_error,LISP,"");
DEF_ORDINARY("BASE-CHAR",sLbase_char,LISP,"");
DEF_ORDINARY("BASE-STRING",sLbase_string,LISP,"");
DEF_ORDINARY("BROADCAST-STREAM",sLbroadcast_stream,LISP,"");
DEF_ORDINARY("BUILT-IN-CLASS",sLbuilt_in_class,LISP,"");
-DEF_ORDINARY("CELL-ERROR",sLcell_error,LISP,"");
DEF_ORDINARY("CLASS",sLclass,LISP,"");
DEF_ORDINARY("CONCATENATED-STREAM",sLconcatenated_stream,LISP,"");
-DEF_ORDINARY("CONDITION",sLcondition,LISP,"");
-DEF_ORDINARY("CONTROL-ERROR",sLcontrol_error,LISP,"");
DEF_ORDINARY("ECHO-STREAM",sLecho_stream,LISP,"");
-DEF_ORDINARY("END-OF-FILE",sLend_of_file,LISP,"");
-DEF_ORDINARY("ERROR",sLerror,LISP,"");
DEF_ORDINARY("EXTENDED-CHAR",sLextended_char,LISP,"");
-DEF_ORDINARY("FILE-ERROR",sLfile_error,LISP,"");
DEF_ORDINARY("FILE-STREAM",sLfile_stream,LISP,"");
DEF_ORDINARY("GENERIC-FUNCTION",sLgeneric_function,LISP,"");
DEF_ORDINARY("LOGICAL-PATHNAME",sLlogical_pathname,LISP,"");
DEF_ORDINARY("METHOD",sLmethod,LISP,"");
/* FIXME -- need this for types in predlib.lsp, why can't we use the keyword sKpackage_error ? */
-DEF_ORDINARY("PARSE-ERROR",sLparse_error,LISP,"");
-DEF_ORDINARY("PRINT-NOT-READABLE",sLprint_not_readable,LISP,"");
-DEF_ORDINARY("READER-ERROR",sLreader_error,LISP,"");
-DEF_ORDINARY("SERIOUS-CONDITION",sLserious_condition,LISP,"");
DEF_ORDINARY("SIMPLE-BASE-STRING",sLsimple_base_string,LISP,"");
-DEF_ORDINARY("SIMPLE-CONDITION",sLsimple_condition,LISP,"");
-DEF_ORDINARY("SIMPLE-TYPE-ERROR",sLsimple_type_error,LISP,"");
-DEF_ORDINARY("SIMPLE-WARNING",sLsimple_warning,LISP,"");
DEF_ORDINARY("STANDARD-CLASS",sLstandard_class,LISP,"");
DEF_ORDINARY("STANDARD-GENERIC-FUNCTION",sLstandard_generic_function,LISP,"");
DEF_ORDINARY("STANDARD-METHOD",sLstandard_method,LISP,"");
DEF_ORDINARY("STANDARD-OBJECT",sLstandard_object,LISP,"");
-DEF_ORDINARY("STORAGE-CONDITION",sLstorage_condition,LISP,"");
-DEF_ORDINARY("STREAM-ERROR",sLstream_error,LISP,"");
DEF_ORDINARY("STRING-STREAM",sLstring_stream,LISP,"");
DEF_ORDINARY("STRUCTURE-CLASS",sLstructure_class,LISP,"");
DEF_ORDINARY("STRUCTURE-OBJECT",sLstructure_object,LISP,"");
-DEF_ORDINARY("STYLE-WARNING",sLstyle_warning,LISP,"");
DEF_ORDINARY("SYNONYM-STREAM",sLsynonym_stream,LISP,"");
DEF_ORDINARY("TWO-WAY-STREAM",sLtwo_way_stream,LISP,"");
-DEF_ORDINARY("TYPE-ERROR",sLtype_error,LISP,"");
-DEF_ORDINARY("UNBOUND-SLOT",sLunbound_slot,LISP,"");
-DEF_ORDINARY("WARNING",sLwarning,LISP,"");
DEFCONST("CHAR-SIZE",sSchar_size,SI,small_fixnum(CHAR_SIZE),"Size in bits of a character");
DEFCONST("SHORT-SIZE",sSshort_size,SI,small_fixnum(CHAR_SIZE*sizeof(short)),"Size in bits of a short integer");
void
-gcl_init_typespec(void)
-{
+gcl_init_typespec(void) {
}
void
-gcl_init_typespec_function(void)
-{
- TSor_symbol_string
- = make_cons(sLor, make_cons(sLsymbol, make_cons(sLstring, Cnil)));
- enter_mark_origin(&TSor_symbol_string);
- TSor_string_symbol
- = make_cons(sLor, make_cons(sLstring, make_cons(sLsymbol, Cnil)));
- enter_mark_origin(&TSor_string_symbol);
- TSor_symbol_string_package
- = make_cons(sLor,
- make_cons(sLsymbol,
- make_cons(sLstring,
- make_cons(sLpackage, Cnil))));
- enter_mark_origin(&TSor_symbol_string_package);
-
- TSnon_negative_integer
- = make_cons(sLinteger,
- make_cons(make_fixnum(0), make_cons(sLA, Cnil)));
- enter_mark_origin(&TSnon_negative_integer);
- TSpositive_number = make_cons(sLsatisfies, make_cons(sLplusp, Cnil));
- enter_mark_origin(&TSpositive_number);
- TSor_integer_float
- = make_cons(sLor, make_cons(sLinteger, make_cons(sLfloat, Cnil)));
- enter_mark_origin(&TSor_integer_float);
- TSor_rational_float
- = make_cons(sLor, make_cons(sLrational, make_cons(sLfloat, Cnil)));
- enter_mark_origin(&TSor_rational_float);
+gcl_init_typespec_function(void) {
+
+ TSor_symbol_string=make_cons(sLor, make_cons(sLsymbol, make_cons(sLstring, Cnil)));
+ enter_mark_origin(&TSor_symbol_string);
+
+ TSor_string_symbol=make_cons(sLor, make_cons(sLstring, make_cons(sLsymbol, Cnil)));
+ enter_mark_origin(&TSor_string_symbol);
+
+ TSor_symbol_string_package=make_cons(sLor,make_cons(sLsymbol,make_cons(sLstring,make_cons(sLpackage, Cnil))));
+ enter_mark_origin(&TSor_symbol_string_package);
+
+ TSnon_negative_integer= make_cons(sLinteger,make_cons(make_fixnum(0), make_cons(sLA, Cnil)));
+ enter_mark_origin(&TSnon_negative_integer);
+
+ TSpositive_number=make_cons(sLsatisfies, make_cons(sLplusp, Cnil));
+ enter_mark_origin(&TSpositive_number);
+
+ TSor_integer_float=make_cons(sLor, make_cons(sLinteger, make_cons(sLfloat, Cnil)));
+ enter_mark_origin(&TSor_integer_float);
+
+ TSor_rational_float=make_cons(sLor, make_cons(sLrational, make_cons(sLfloat, Cnil)));
+ enter_mark_origin(&TSor_rational_float);
+
#ifdef UNIX
- TSor_pathname_string_symbol
- = make_cons(sLor,
- make_cons(sLpathname,
- make_cons(sLstring,
- make_cons(sLsymbol,
- Cnil))));
- enter_mark_origin(&TSor_pathname_string_symbol);
+ TSor_pathname_string_symbol=make_cons(sLor,make_cons(sLpathname,make_cons(sLstring,make_cons(sLsymbol,Cnil))));
+ enter_mark_origin(&TSor_pathname_string_symbol);
#endif
- TSor_pathname_string_symbol_stream
- = make_cons(sLor,
- make_cons(sLpathname,
- make_cons(sLstring,
- make_cons(sLsymbol,
- make_cons(sLstream,
- Cnil)))));
- enter_mark_origin(&TSor_pathname_string_symbol_stream);
- make_function("TYPE-OF", Ltype_of);
+ TSor_pathname_string_symbol_stream=make_cons(sLor,make_cons(sLpathname,make_cons(sLstring,make_cons(sLsymbol,make_cons(sLstream,Cnil)))));
+ enter_mark_origin(&TSor_pathname_string_symbol_stream);
+
+ make_function("TYPE-OF", Ltype_of);
+
}
--- gcl-2.6.12.orig/o/unexec-19.29.c
+++ gcl-2.6.12/o/unexec-19.29.c
@@ -936,7 +936,7 @@ copy_text_and_data (int new, int a_out)
/* The use of _execname is incompatible with RISCiX 1.1 */
- sprintf (command, "nm %s | fgrep mcount", _execname);
+ sprintf (command, "nm '%s' | fgrep mcount", _execname);
if ( (pfile = popen(command, "r")) == NULL)
{
--- gcl-2.6.12.orig/o/unexec.c
+++ gcl-2.6.12/o/unexec.c
@@ -937,7 +937,7 @@ copy_text_and_data (int new, int a_out)
/* The use of _execname is incompatible with RISCiX 1.1 */
- sprintf (command, "nm %s | fgrep mcount", _execname);
+ sprintf (command, "nm '%s' | fgrep mcount", _execname);
if ( (pfile = popen(command, "r")) == NULL)
{
--- gcl-2.6.12.orig/o/unixfasl.c
+++ gcl-2.6.12/o/unixfasl.c
@@ -279,9 +279,7 @@ AGAIN:
#define FASLINK
#ifndef PRIVATE_FASLINK
-static int
-faslink(object faslfile, object ldargstring)
-{
+DEFUN_NEW("FASLINK-INT",object,fSfaslink_int,SI,2,2,NONE,II,OO,OO,OO,(object faslfile, object ldargstring),"") {
#if defined(__ELF__) || defined(DARWIN)
FEerror("faslink() not supported for ELF or DARWIN yet",0);
return 0;
@@ -381,36 +379,10 @@ SEEK_TO_END_OFILE(faslfile->sm.sm_fp);
#endif
-static void
-FFN(siLfaslink)(void)
-{
- bds_ptr old_bds_top;
- int i;
- object package;
-
- check_arg(2);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- check_type_string(&vs_base[1]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0]->pn.pn_type = FASL_string;
- vs_base[0] = namestring(vs_base[0]);
- package = symbol_value(sLApackageA);
- old_bds_top = bds_top;
- bds_bind(sLApackageA, package);
- i = faslink(vs_base[0], vs_base[1]);
- bds_unwind(old_bds_top);
- vs_top = vs_base;
- vs_push(make_fixnum(i));
-}
-
#endif
#endif/* svr4 */
#endif /* UNIXFASL */
void
-gcl_init_unixfasl(void)
-{
-#ifdef FASLINK
- make_si_function("FASLINK", siLfaslink);
-#endif
+gcl_init_unixfasl(void) {
}
--- gcl-2.6.12.orig/o/unixfsys.c
+++ gcl-2.6.12/o/unixfsys.c
@@ -44,10 +44,6 @@ Foundation, 675 Mass Ave, Cambridge, MA
#define HAVE_RENAME
#endif
-void Ldirectory(void);
-
-
-
#ifdef NEED_GETWD
#include <sys/dir.h>
@@ -168,17 +164,41 @@ getwd(char *buffer) {
b_[_c+_d]=0;\
})
+static object
+get_string(object x) {
+ switch(type_of(x)) {
+ case t_symbol:
+ case t_string:
+ return x;
+ case t_pathname:
+ return x->pn.pn_namestring;
+ case t_stream:
+ switch(x->sm.sm_mode) {
+ case smm_input:
+ case smm_output:
+ case smm_probe:
+ case smm_io:
+ return get_string(x->sm.sm_object1);
+ case smm_file_synonym:
+ case smm_synonym:
+ return get_string(x->sm.sm_object0->s.s_dbind);
+ }
+ }
+ return Cnil;
+}
+
+
void
coerce_to_filename(object pathname,char *p) {
- object namestring=coerce_to_namestring(pathname);
+ object namestring=get_string(pathname);
unsigned e=namestring->st.st_fillp;
- char *q=namestring->st.st_self,*qe=q+e;;
+ char *q=namestring->st.st_self,*qe=q+e;
- if (pathname==Cnil)
+ if (pathname==Cnil||namestring==Cnil)
FEerror ( "NIL argument.", 1, pathname );
- if (*q=='~') {
+ if (*q=='~' && e) {
unsigned m=0;
char *s=++q,*c;
@@ -224,134 +244,6 @@ coerce_to_filename(object pathname,char
}
-object
-truename(object pathname)
-{
- register char *p, *q;
- char filename[MAXPATHLEN];
- char truefilename[MAXPATHLEN];
- char current_directory[MAXPATHLEN];
- char directory[MAXPATHLEN];
-#ifdef __MINGW32__
- DWORD current_directory_length =
- GetCurrentDirectory ( MAXPATHLEN, current_directory );
- if ( MAXPATHLEN < current_directory_length ) {
- FEerror ( "truename got a current directory name larger than MAXPATHLEN", 1, "" );
- }
- if ( 0 == current_directory_length ) {
- FEerror ( "truename could not determine the current directory.", 1, "" );
- }
-#else
- massert(current_directory==getcwd(current_directory,sizeof(current_directory)));
-#endif
-
- coerce_to_filename(pathname, filename);
-
-#ifdef S_IFLNK
- {
-
- struct stat filestatus;
- int islinkcount=8;
-
- if (lstat(filename, &filestatus) >= 0)
-
- while (((filestatus.st_mode&S_IFMT) == S_IFLNK) && (--islinkcount>0)) {
-
- char newname[MAXPATHLEN];
- int newlen;
-
- newlen=readlink(filename,newname,MAXPATHLEN-1);
- if (newlen < 0)
- return((FEerror("Symlink broken at ~S.",1,pathname),Cnil));
-
- for (p = filename, q = 0; *p != '\0'; p++)
- if (*p == '/') q = p;
- if (q == 0 || *newname == '/')
- q = filename;
- else
- q++;
-
- memcpy(q,newname,newlen);
- q[newlen]=0;
- if (lstat(filename, &filestatus) < 0)
- islinkcount=0; /* It would be ANSI to do the following :
- return(file_error("Symlink broken at ~S.",pathname));
- but this would break DIRECTORY if a file points to nowhere */
- }
- }
-#endif
-
- for (p = filename, q = 0; *p != '\0'; p++)
- if (*p == '/')
- q = p;
- if (q == filename) {
- q++;
- p = "/";
- } else if (q == 0) {
- q = filename;
- p = current_directory;
- } else
-#ifdef __MINGW32__
- if ( ( q > filename ) && ( q[-1] == ':' ) ) {
- int current = (q++, q[0]);
- q[0]=0;
- if (chdir(filename) < 0)
- FEerror("Cannot get the truename of ~S.", 1, pathname);
- current_directory_length =
- GetCurrentDirectory ( MAXPATHLEN, directory );
- if ( MAXPATHLEN < current_directory_length ) {
- FEerror ( "truename got a current directory name larger than MAXPATHLEN", 1, "" );
- }
- if ( 0 == current_directory_length ) {
- FEerror ( "truename could not determine the current directory.", 1, "" );
- }
- p = directory;
- if ( p[1]==':' && ( p[2]=='\\' || p[2]=='/' ) && p[3]==0 ) p[2]=0;
- q[0]=current;
- }
- else
-#endif
- {
- *q++ = '\0';
- if (chdir(filename) < 0)
- FEerror("Cannot get the truename of ~S.", 1, pathname);
-#ifdef __MINGW32__
- current_directory_length = GetCurrentDirectory ( MAXPATHLEN, directory );
- if ( MAXPATHLEN < current_directory_length ) {
- FEerror ( "truename got a current directory name larger than MAXPATHLEN", 1, "" );
- }
- if ( 0 == current_directory_length ) {
- FEerror ( "truename could not determine the current directory.", 1, "" );
- }
- p = directory;
-#else
- p = getcwd(directory,sizeof(directory));
-#endif
- }
- if (p[0] == '/' && p[1] == '\0') {
- if (strcmp(q, "..") == 0)
- strcpy(truefilename, "/.");
- else
- sprintf(truefilename, "/%s", q);
- } else if (strcmp(q, ".") == 0)
- strcpy(truefilename, p);
- else if (strcmp(q, "..") == 0) {
- for (q = p + strlen(p); *--q != '/';) ;
- if (p == q)
- strcpy(truefilename, "/.");
- else {
- *q = '\0';
- strcpy(truefilename, p);
- *q = '/';
- }
- } else
- sprintf(truefilename, "%s/%s", p, q);
- massert(!chdir(current_directory));
- vs_push(make_simple_string(truefilename));
- pathname = coerce_to_pathname(vs_head);
- vs_popp;
- return(pathname);
-}
object sSAallow_gzipped_fileA;
bool
@@ -429,41 +321,6 @@ file_len(FILE *fp)
else return 0;
}
-LFD(Ltruename)(void)
-{
- check_arg(1);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = truename(vs_base[0]);
-}
-
-LFD(Lrename_file)(void)
-{
- char filename[MAXPATHLEN];
- char newfilename[MAXPATHLEN];
-
- check_arg(2);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- check_type_or_Pathname_string_symbol(&vs_base[1]);
- coerce_to_filename(vs_base[0], filename);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[1] = coerce_to_pathname(vs_base[1]);
- vs_base[1] = merge_pathnames(vs_base[1], vs_base[0], Cnil);
- coerce_to_filename(vs_base[1], newfilename);
-#ifdef HAVE_RENAME
- if (rename(filename, newfilename) < 0)
- FEerror("Cannot rename the file ~S to ~S.",
- 2, vs_base[0], vs_base[1]);
-#else
- sprintf(command, "mv %s %s", filename, newfilename);
- msystem(command);
-#endif
- vs_push(vs_base[1]);
- vs_push(truename(vs_base[0]));
- vs_push(truename(vs_base[1]));
- vs_base += 2;
-}
-
-
DEF_ORDINARY("DIRECTORY",sKdirectory,KEYWORD,"");
DEF_ORDINARY("LINK",sKlink,KEYWORD,"");
DEF_ORDINARY("FILE",sKfile,KEYWORD,"");
@@ -500,33 +357,28 @@ int gcl_putc(int i,void *v) {return putc
-DEFUN_NEW("STAT",object,fSstat,SI,1,1,NONE,OO,OO,OO,OO,(object path),"") {
+DEFUNM_NEW("STAT",object,fSstat,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
- char filename[4096];
struct stat ss;
-
- bzero(filename,sizeof(filename));
- coerce_to_filename(path,filename);
+ check_type_string(&x);
+ coerce_to_filename(x,FN1);
+
#ifdef __MINGW32__
{
- char *p=filename+strlen(filename)-1;
- for (;p>filename && *p=='/';p--)
+ char *p=FN1+strlen(FN1)-1;
+ for (;p>FN1 && *p=='/';p--)
*p=0;
}
#endif
- if (lstat(filename,&ss))
+ if (lstat(FN1,&ss))
RETURN1(Cnil);
- else {/* ctime_r insufficiently portable */
- /* int j;
- ctime_r(&ss.st_ctime,filename);
- j=strlen(filename);
- if (isspace(filename[j-1]))
- filename[j-1]=0;*/
- RETURN1(list(3,S_ISDIR(ss.st_mode) ? sKdirectory :
- (S_ISLNK(ss.st_mode) ? sKlink : sKfile),
- make_fixnum(ss.st_size),make_fixnum(ss.st_ctime)));
- }
+ else
+ RETURN4(S_ISDIR(ss.st_mode) ? sKdirectory :
+ (S_ISLNK(ss.st_mode) ? sKlink : sKfile),
+ make_fixnum(ss.st_size),
+ make_fixnum(ss.st_ctime),
+ make_fixnum(ss.st_uid));
}
DEFUN_NEW("SETENV",object,fSsetenv,SI,2,2,NONE,OO,OO,OO,OO,(object variable,object value),"Set environment VARIABLE to VALUE")
@@ -551,266 +403,6 @@ DEFUN_NEW("SETENV",object,fSsetenv,SI,2,
RETURN1((res == 0 ? Ct : Cnil ));
}
-DEFUNO_NEW("DELETE-FILE",object,fLdelete_file,LISP
- ,1,1,NONE,OO,OO,OO,OO,void,Ldelete_file,(object path),"")
-
-{
- char filename[MAXPATHLEN];
-
- /* 1 args */
- check_type_or_pathname_string_symbol_stream(&path);
- coerce_to_filename(path, filename);
- if (unlink(filename) < 0 && rmdir(filename) < 0)
- FEerror("Cannot delete the file ~S: ~s.", 2, path, make_simple_string(strerror(errno)));
- path = Ct;
- RETURN1(path);
-}
-#ifdef STATIC_FUNCTION_POINTERS
-object
-fLdelete_file(object path) {
- return FFN(fLdelete_file)(path);
-}
-#endif
-
-LFD(Lprobe_file)(void)
-{
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- if (file_exists(vs_base[0]))
- vs_base[0] = truename(vs_base[0]);
- else
- vs_base[0] = Cnil;
-}
-
-LFD(Lfile_write_date)(void)
-{
- char filename[MAXPATHLEN];
- struct stat filestatus;
-
- check_arg(1);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- coerce_to_filename(vs_base[0], filename);
- if (stat(filename, &filestatus) < 0 || S_ISDIR(filestatus.st_mode))
- { vs_base[0] = Cnil; return;}
- vs_base[0] = unix_time_to_universal_time(filestatus.st_mtime);
-}
-
-LFD(Lfile_author)(void)
-{
-#if !defined(NO_PWD_H) && !defined(STATIC_LINKING)
- char filename[MAXPATHLEN];
- struct stat filestatus;
- struct passwd *pwent;
-#ifndef __STDC__
- extern struct passwd *getpwuid();
-#endif
-
- check_arg(1);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- coerce_to_filename(vs_base[0], filename);
- if (stat(filename, &filestatus) < 0 || S_ISDIR(filestatus.st_mode))
- { vs_base[0] = Cnil; return;}
- pwent = getpwuid(filestatus.st_uid);
- vs_base[0] = make_simple_string(pwent->pw_name);
-#else
- vs_base[0] = Cnil; return;
-#endif
-
-}
-
-static void
-FFN(Luser_homedir_pathname)(void)
-{
-
- char filename[MAXPATHLEN];
-
- coerce_to_filename(make_simple_string("~/"),filename);
- vs_base[0]=coerce_to_pathname(make_simple_string(filename));
- vs_top = vs_base+1;
-
-}
-
-
-#ifdef BSD
-LFD(Ldirectory)(void)
-{
- char filename[MAXPATHLEN];
- char command[MAXPATHLEN * 2];
- FILE *fp;
- register int i, c;
- object *top = vs_top;
- char iobuffer[BUFSIZ];
- extern FILE *popen(const char *, const char *);
-
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- if (vs_base[0]->pn.pn_name==Cnil && vs_base[0]->pn.pn_type==Cnil) {
- coerce_to_filename(vs_base[0], filename);
- strcat(filename, "*");
- } else if (vs_base[0]->pn.pn_name==Cnil) {
- vs_base[0]->pn.pn_name = sKwild;
- coerce_to_filename(vs_base[0], filename);
- vs_base[0]->pn.pn_name = Cnil;
- } else if (vs_base[0]->pn.pn_type==Cnil) {
- coerce_to_filename(vs_base[0], filename);
- strcat(filename, "*");
- } else
- coerce_to_filename(vs_base[0], filename);
- sprintf(command, "ls -d %s 2> /dev/null", filename);
- fp = popen(command, "r");
- setbuf(fp, iobuffer);
- for (;;) {
- for (i = 0; (c = getc(fp)); i++)
- if (c <= 0)
- goto L;
- else if (c == '\n')
- break;
- else
- filename[i] = c;
- filename[i] = '\0';
- vs_push(make_simple_string(filename));
- vs_head = truename(vs_head);
- }
-L:
- pclose(fp);
- vs_push(Cnil);
- while (vs_top > top + 1)
- stack_cons();
- vs_base = top;
-}
-#endif
-
-
-#ifdef ATT
-LFD(Ldirectory)()
-{
- object name, type;
- char filename[MAXPATHLEN];
- FILE *fp;
- object *top = vs_top;
- char iobuffer[BUFSIZ];
- struct direct dir;
- int i;
-
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_push(vs_base[0]->pn.pn_name);
- vs_push(vs_base[0]->pn.pn_type);
- vs_base[0]->pn.pn_name = Cnil;
- vs_base[0]->pn.pn_type = Cnil;
- coerce_to_filename(vs_base[0], filename);
- type = vs_base[0]->pn.pn_type = vs_pop;
- name = vs_base[0]->pn.pn_name = vs_pop;
- i = strlen(filename);
- if (i > 1 && filename[i-1] == '/')
- filename[i-1] = '\0';
- if (i == 0)
- strcpy(filename, ".");
- fp = fopen(filename, "r");
- if (fp == NULL) {
- vs_push(make_simple_string(filename));
- FEerror("Can't open the directory ~S.", 1, vs_head);
- }
- setbuf(fp, iobuffer);
- fread(&dir, sizeof(struct direct), 1, fp);
- fread(&dir, sizeof(struct direct), 1, fp);
- filename[DIRSIZ] = '\0';
- for (;;) {
- if (fread(&dir, sizeof(struct direct), 1, fp) <=0)
- break;
- if (dir.d_ino == 0)
- continue;
- strncpy(filename, dir.d_name, DIRSIZ);
- vs_push(make_simple_string(filename));
- vs_head = coerce_to_pathname(vs_head);
- if ((name == Cnil || name == sKwild ||
- equal(name, vs_head->pn.pn_name)) &&
- (type == Cnil || type == sKwild ||
- equal(type, vs_head->pn.pn_type))) {
- vs_head->pn.pn_directory
- = vs_base[0]->pn.pn_directory;
- vs_head = truename(vs_head);
- } else
- vs_pop;
- }
- fclose(fp);
- vs_push(Cnil);
- while (vs_top > top + 1)
- stack_cons();
- vs_base = top;
-}
-#endif
-
-
-#ifdef E15
-#include <sys/dir.h>
-
-LFD(Ldirectory)()
-{
- object name, type;
- char filename[MAXPATHLEN];
- FILE *fp;
- object *top = vs_top;
- char iobuffer[BUFSIZ];
- struct direct dir;
- int i;
-
- check_arg(1);
-
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_push(vs_base[0]->pn.pn_name);
- vs_push(vs_base[0]->pn.pn_type);
- vs_base[0]->pn.pn_name = Cnil;
- vs_base[0]->pn.pn_type = Cnil;
- coerce_to_filename(vs_base[0], filename);
- type = vs_base[0]->pn.pn_type = vs_pop;
- name = vs_base[0]->pn.pn_name = vs_pop;
- i = strlen(filename);
- if (i > 1 && filename[i-1] == '/')
- filename[i-1] = '\0';
- if (i == 0)
- strcpy(filename, ".");
- fp = fopen(filename, "r");
- if (fp == NULL) {
- vs_push(make_simple_string(filename));
- FEerror("Can't open the directory ~S.", 1, vs_head);
- }
- setbuf(fp, iobuffer);
- fread(&dir, sizeof(struct direct), 1, fp);
- fread(&dir, sizeof(struct direct), 1, fp);
- filename[DIRSIZ] = '\0';
- for (;;) {
- if (fread(&dir, sizeof(struct direct), 1, fp) <=0)
- break;
- if (dir.d_ino == 0)
- continue;
- strncpy(filename, dir.d_name, DIRSIZ);
- vs_push(make_simple_string(filename));
- vs_head = coerce_to_pathname(vs_head);
- if ((name == Cnil || name == sKwild ||
- equal(name, vs_head->pn.pn_name)) &&
- (type == Cnil || type == sKwild ||
- equal(type, vs_head->pn.pn_type))) {
- vs_head->pn.pn_directory
- = vs_base[0]->pn.pn_directory;
- vs_head = truename(vs_head);
- } else
- vs_pop;
- }
- fclose(fp);
- vs_push(Cnil);
- while (vs_top > top + 1)
- stack_cons();
- vs_base = top;
-}
-#endif
-
#include <sys/types.h>
#include <dirent.h>
@@ -840,17 +432,31 @@ DEFUN_NEW("D-TYPE-LIST",object,fSd_type_
}
#endif
-DEFUN_NEW("READDIR",object,fSreaddir,SI,2,2,NONE,OI,IO,OO,OO,(fixnum x,fixnum y),"") {
+DEFUN_NEW("READDIR",object,fSreaddir,SI,3,3,NONE,OI,IO,OO,OO,(fixnum x,fixnum y,object s),"") {
struct dirent *e;
object z;
+ long tl;
+ size_t l;
if (!x) RETURN1(Cnil);
- e=readdir((DIR *)x);
- RETURN1(e ? make_simple_string(e->d_name) : Cnil);
+ tl=telldir((DIR *)x);
#ifdef HAVE_D_TYPE
for (;(e=readdir((DIR *)x)) && y!=DT_UNKNOWN && e->d_type!=y;);
#endif
if (!e) RETURN1(Cnil);
- z=make_simple_string(e->d_name);
+ if (s==Cnil)
+ z=make_simple_string(e->d_name);
+ else {
+ check_type_string(&s);
+ l=strlen(e->d_name);
+ if (s->st.st_dim-s->st.st_fillp>=l) {
+ memcpy(s->st.st_self+s->st.st_fillp,e->d_name,l);
+ s->st.st_fillp+=l;
+ z=s;
+ } else {
+ seekdir((DIR *)x,tl);
+ RETURN1(make_fixnum(l));
+ }
+ }
#ifdef HAVE_D_TYPE
if (y==DT_UNKNOWN) z=MMcons(z,make_fixnum(e->d_type));
#endif
@@ -882,7 +488,126 @@ DEFUN_NEW("MKDIR",object,fSmkdir,SI,1,1,
}
+DEFUN_NEW("RMDIR",object,fSrmdir,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+ check_type_string(&x);
+
+ coerce_to_filename(x,FN1);
+
+ RETURN1(rmdir(FN1) ? Cnil : Ct);
+
+}
+
+
+
+#include <sys/types.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+DEFUN_NEW("READLINKAT",object,fSreadlinkat,SI,2,2,NONE,OI,OO,OO,OO,(fixnum d,object s),"") {
+ char *b1,*b2=NULL;
+ ssize_t l,z1,z2;
+ check_type_string(&s);
+ /* l=s->st.st_hasfillp ? s->st.st_fillp : s->st.st_dim; */
+ z1=length(s);
+ massert((b1=alloca(z1+1)));
+ memcpy(b1,s->st.st_self,z1);
+ b1[z1]=0;
+ for (l=z2=0;l>=z2;) {
+ memset(b2,0,z2);
+ z2+=z2+10;
+ massert((b2=alloca(z2)));
+ massert((l=readlinkat(d ? dirfd((DIR *)d) : AT_FDCWD,b1,b2,z2))>=0);
+ }
+ b2[l]=0;
+ s=make_simple_string(b2);
+ memset(b1,0,z1);
+ memset(b2,0,z2);
+ RETURN1(s);
+}
+
+DEFUN_NEW("GETCWD",object,fSgetcwd,SI,0,0,NONE,OO,OO,OO,OO,(void),"") {
+ char *b=NULL;
+ size_t z;
+ object s;
+
+ for (z=0;!(errno=0) && !getcwd(b,z) && errno==ERANGE;b=memset(b,0,z),z+=z+10,({massert((b=alloca(z)));}));
+ massert((b=getcwd(b,z)));
+ s=make_simple_string(b);
+ memset(b,0,z);
+ RETURN1(s);
+
+}
+
+DEFUN_NEW("UID-TO-NAME",object,fSuid_to_name,SI,1,1,NONE,OI,OO,OO,OO,(fixnum uid),"") {
+ struct passwd *pwent,pw;
+ char *b;
+ long r;
+
+ massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0);
+ massert(b=alloca(r));
+
+ massert(!getpwuid_r(uid,&pw,b,r,&pwent));
+
+ RETURN1(make_simple_string(pwent->pw_name));
+
+}
+
+DEFUN_NEW("HOME-NAMESTRING",object,fShome_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object nm),"") {
+
+ struct passwd *pwent,pw;
+ char *b;
+ long r;
+
+ massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0);
+ massert(b=alloca(r));
+ if (nm->st.st_fillp==1)
+
+ if ((pw.pw_dir=getenv("HOME")))
+ pwent=&pw;
+ else
+ massert(!getpwuid_r(getuid(),&pw,b,r,&pwent));
+
+ else {
+
+ char *name;
+
+ massert(name=alloca(nm->st.st_fillp));
+ memcpy(name,nm->st.st_self+1,nm->st.st_fillp-1);
+ name[nm->st.st_fillp-1]=0;
+
+ massert(!getpwnam_r(name,&pw,b,r,&pwent));
+
+ }
+
+ massert((b=alloca(strlen(pwent->pw_dir)+2)));
+ memcpy(b,pwent->pw_dir,strlen(pwent->pw_dir));
+ b[strlen(pwent->pw_dir)]='/';
+ b[strlen(pwent->pw_dir)+1]=0;
+ RETURN1(make_simple_string(b));
+
+}
+
+DEFUN_NEW("RENAME",object,fSrename,SI,2,2,NONE,OO,OO,OO,OO,(object x,object y),"") {
+
+ check_type_string(&x);
+ check_type_string(&y);
+
+ coerce_to_filename(x,FN1);
+ coerce_to_filename(y,FN2);
+
+ RETURN1(rename(FN1,FN2) ? Cnil : Ct);
+
+}
+
+DEFUN_NEW("UNLINK",object,fSunlink,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
+
+ coerce_to_filename(x,FN1);
+
+ RETURN1(unlink(FN1) ? Cnil : Ct);
+
+}
static void
@@ -900,16 +625,8 @@ FFN(siLchdir)(void)
}
void
-gcl_init_unixfsys(void)
-{
- make_function("TRUENAME", Ltruename);
- make_function("RENAME-FILE", Lrename_file);
- make_function("DELETE-FILE", Ldelete_file);
- make_function("PROBE-FILE", Lprobe_file);
- make_function("FILE-WRITE-DATE", Lfile_write_date);
- make_function("FILE-AUTHOR", Lfile_author);
- make_function("USER-HOMEDIR-PATHNAME", Luser_homedir_pathname);
- make_function("DIRECTORY", Ldirectory);
+gcl_init_unixfsys(void) {
+
+ make_si_function("CHDIR", siLchdir);
- make_si_function("CHDIR", siLchdir);
}
--- gcl-2.6.12.orig/o/usig.c
+++ gcl-2.6.12/o/usig.c
@@ -148,13 +148,15 @@ DEFUN_NEW("FLD",object,fSfld,SI,1,1,NONE
#endif
-DEFUN_NEW("*FIXNUM",fixnum,fSAfixnum,SI,1,1,NONE,II,OO,OO,OO,(fixnum addr),"") {
- RETURN1(*(fixnum *)addr);
+/* For now ignore last three args governing offsets and data modification, just to
+ support fpe sync with master*/
+DEFUN_NEW("*FIXNUM",object,fSAfixnum,SI,4,4,NONE,OI,OO,OO,OO,(fixnum addr,object x,object y,object z),"") {
+ RETURN1((object)*(fixnum *)addr);
}
-DEFUN_NEW("*FLOAT",object,fSAfloat,SI,1,1,NONE,OI,OO,OO,OO,(fixnum addr),"") {
+DEFUN_NEW("*FLOAT",object,fSAfloat,SI,4,4,NONE,OI,OO,OO,OO,(fixnum addr,object x,object y,object z),"") {
RETURN1(make_shortfloat(*(float *)addr));
}
-DEFUN_NEW("*DOUBLE",object,fSAdouble,SI,1,1,NONE,OI,OO,OO,OO,(fixnum addr),"") {
+DEFUN_NEW("*DOUBLE",object,fSAdouble,SI,4,4,NONE,OI,OO,OO,OO,(fixnum addr,object x,object y,object z),"") {
RETURN1(make_longfloat(*(double *)addr));
}
@@ -264,7 +266,6 @@ sigpipe(void)
FEerror("Broken pipe", 0);
}
-
void
sigint(void)
{
@@ -272,8 +273,6 @@ sigint(void)
terminal_interrupt(1);
}
-
-
static void
sigalrm(void)
{
--- gcl-2.6.12.orig/unixport/sys_ansi_gcl.c
+++ gcl-2.6.12/unixport/sys_ansi_gcl.c
@@ -41,7 +41,6 @@ gcl_init_system(object no_init)
#ifdef HAVE_JAPI_H
ar_check_init(gcl_japi,no_init);
#endif
- ar_check_init(gcl_iolib,no_init);
ar_check_init(gcl_listlib,no_init);
ar_check_init(gcl_mislib,no_init);
ar_check_init(gcl_numlib,no_init);
@@ -56,9 +55,23 @@ gcl_init_system(object no_init)
ar_check_init(gcl_defpackage,no_init);
ar_check_init(gcl_make_defpackage,no_init);
ar_check_init(gcl_sharp,no_init);
- ar_check_init(gcl_fpe,no_init);
+ ar_check_init(gcl_sharp_uv,no_init);
+ ar_check_init(gcl_namestring,no_init);
+ ar_check_init(gcl_logical_pathname_translations,no_init);
+ ar_check_init(gcl_make_pathname,no_init);
+ ar_check_init(gcl_parse_namestring,no_init);
+ ar_check_init(gcl_translate_pathname,no_init);
+ ar_check_init(gcl_directory,no_init);
+ ar_check_init(gcl_merge_pathnames,no_init);
+ ar_check_init(gcl_truename,no_init);
+ ar_check_init(gcl_rename_file,no_init);
+ ar_check_init(gcl_wild_pathname_p,no_init);
+ ar_check_init(gcl_pathname_match_p,no_init);
+ ar_check_init(gcl_iolib,no_init);
+ ar_check_init(gcl_fpe,no_init);
+
ar_check_init(gcl_cmpinline,no_init);
ar_check_init(gcl_cmputil,no_init);
@@ -107,6 +120,7 @@ gcl_init_system(object no_init)
ar_check_init(gcl_index,no_init);
#endif
+ lsp_init("../pcl/package.lisp");
ar_check_init(gcl_pcl_pkg,no_init);
ar_check_init(gcl_pcl_walk,no_init);
ar_check_init(gcl_pcl_iterate,no_init);
@@ -142,6 +156,7 @@ gcl_init_system(object no_init)
ar_check_init(gcl_pcl_precom1,no_init);
ar_check_init(gcl_pcl_precom2,no_init);
+ lsp_init("../clcs/package.lisp");
ar_check_init(gcl_clcs_precom,no_init);
ar_check_init(gcl_clcs_handler,no_init);
ar_check_init(gcl_clcs_conditions,no_init);
--- gcl-2.6.12.orig/unixport/sys_gcl.c
+++ gcl-2.6.12/unixport/sys_gcl.c
@@ -34,7 +34,6 @@ gcl_init_system(object no_init) {
#ifdef HAVE_JAPI_H
ar_check_init(gcl_japi,no_init);
#endif
- ar_check_init(gcl_iolib,no_init);
ar_check_init(gcl_listlib,no_init);
ar_check_init(gcl_mislib,no_init);
ar_check_init(gcl_numlib,no_init);
@@ -49,9 +48,23 @@ gcl_init_system(object no_init) {
ar_check_init(gcl_defpackage,no_init);
ar_check_init(gcl_make_defpackage,no_init);
ar_check_init(gcl_sharp,no_init);
- ar_check_init(gcl_fpe,no_init);
+ ar_check_init(gcl_sharp_uv,no_init);
+ ar_check_init(gcl_namestring,no_init);
+ ar_check_init(gcl_logical_pathname_translations,no_init);
+ ar_check_init(gcl_make_pathname,no_init);
+ ar_check_init(gcl_parse_namestring,no_init);
+ ar_check_init(gcl_translate_pathname,no_init);
+ ar_check_init(gcl_directory,no_init);
+ ar_check_init(gcl_merge_pathnames,no_init);
+ ar_check_init(gcl_truename,no_init);
+ ar_check_init(gcl_rename_file,no_init);
+ ar_check_init(gcl_wild_pathname_p,no_init);
+ ar_check_init(gcl_pathname_match_p,no_init);
+ ar_check_init(gcl_iolib,no_init);
+ ar_check_init(gcl_fpe,no_init);
+
ar_check_init(gcl_cmpinline,no_init);
ar_check_init(gcl_cmputil,no_init);
--- gcl-2.6.12.orig/unixport/sys_init.lsp.in
+++ gcl-2.6.12/unixport/sys_init.lsp.in
@@ -9,9 +9,6 @@
(in-package :system)
(use-package :fpe)
-#+(or pcl ansi-cl)(load "../pcl/package.lisp")
-#+ansi-cl(load "../clcs/package.lisp")
-
(init-system)
(in-package :si)
(gbc t)
@@ -20,7 +17,7 @@
(setq *link-array* (make-array (ash 1 11) :element-type 'character :fill-pointer 0)))
(use-fast-links t)
-(let* ((x (append (pathname-directory *system-directory*) (list :parent)))
+(let* ((x (append (pathname-directory *system-directory*) (list :back)))
(lsp (append x (list "lsp")))
(cmpnew (append x (list "cmpnew")))
(h (append x (list "h")))
@@ -59,6 +56,7 @@
(fmakunbound 'init-cmp-anon)
(when (fboundp 'user-init) (user-init))
+
(in-package :compiler)
(setq *cc* @LI-CC@
*ld* @LI-LD@
@@ -79,7 +77,9 @@
#-ansi-cl(do-symbols (s :cltl1-compat) (export s :lisp)))
#+ansi-cl (use-package :pcl :user)
-#+ansi-cl (import 'si::(clines defentry defcfun object void int double quit bye gbc system) :user)
+
+(import 'si::(clines defentry defcfun object void int double quit bye gbc system
+ *lib-directory* *system-directory*) :user)
(let* ((i 4096)(j (si::equal-tail-recursion-check i)))
(unless (<= (ash i -1) j)
--- gcl-2.6.12.orig/unixport/sys_pcl_gcl.c
+++ gcl-2.6.12/unixport/sys_pcl_gcl.c
@@ -41,7 +41,6 @@ gcl_init_system(object no_init)
#ifdef HAVE_JAPI_H
ar_check_init(gcl_japi,no_init);
#endif
- ar_check_init(gcl_iolib,no_init);
ar_check_init(gcl_listlib,no_init);
ar_check_init(gcl_mislib,no_init);
ar_check_init(gcl_numlib,no_init);
@@ -56,9 +55,23 @@ gcl_init_system(object no_init)
ar_check_init(gcl_defpackage,no_init);
ar_check_init(gcl_make_defpackage,no_init);
ar_check_init(gcl_sharp,no_init);
- ar_check_init(gcl_fpe,no_init);
+ ar_check_init(gcl_sharp_uv,no_init);
+ ar_check_init(gcl_namestring,no_init);
+ ar_check_init(gcl_logical_pathname_translations,no_init);
+ ar_check_init(gcl_make_pathname,no_init);
+ ar_check_init(gcl_parse_namestring,no_init);
+ ar_check_init(gcl_translate_pathname,no_init);
+ ar_check_init(gcl_directory,no_init);
+ ar_check_init(gcl_merge_pathnames,no_init);
+ ar_check_init(gcl_truename,no_init);
+ ar_check_init(gcl_rename_file,no_init);
+ ar_check_init(gcl_wild_pathname_p,no_init);
+ ar_check_init(gcl_pathname_match_p,no_init);
+ ar_check_init(gcl_iolib,no_init);
+ ar_check_init(gcl_fpe,no_init);
+
ar_check_init(gcl_cmpinline,no_init);
ar_check_init(gcl_cmputil,no_init);
@@ -107,6 +120,7 @@ gcl_init_system(object no_init)
ar_check_init(gcl_index,no_init);
#endif
+ lsp_init("../pcl/package.lisp");
ar_check_init(gcl_pcl_pkg,no_init);
ar_check_init(gcl_pcl_walk,no_init);
ar_check_init(gcl_pcl_iterate,no_init);
--- gcl-2.6.12.orig/unixport/sys_pre_gcl.c
+++ gcl-2.6.12/unixport/sys_pre_gcl.c
@@ -39,7 +39,6 @@ gcl_init_system(object no_init)
#ifdef HAVE_JAPI_H
lsp_init("../lsp/gcl_japi.lsp");
#endif
- lsp_init("../lsp/gcl_iolib.lsp");
/* lsp_init("../lsp/gcl_listlib.lsp"); */
lsp_init("../lsp/gcl_mislib.lsp");
lsp_init("../lsp/gcl_numlib.lsp");
@@ -54,6 +53,21 @@ gcl_init_system(object no_init)
lsp_init("../lsp/gcl_defpackage.lsp");
lsp_init("../lsp/gcl_make_defpackage.lsp");
lsp_init("../lsp/gcl_sharp.lsp");
+
+ lsp_init("../lsp/gcl_sharp_uv.lsp");
+ lsp_init("../lsp/gcl_logical_pathname_translations.lsp");
+ lsp_init("../lsp/gcl_make_pathname.lsp");
+ lsp_init("../lsp/gcl_parse_namestring.lsp");
+ lsp_init("../lsp/gcl_namestring.lsp");
+ lsp_init("../lsp/gcl_translate_pathname.lsp");
+ lsp_init("../lsp/gcl_directory.lsp");
+ lsp_init("../lsp/gcl_merge_pathnames.lsp");
+ lsp_init("../lsp/gcl_truename.lsp");
+ lsp_init("../lsp/gcl_rename_file.lsp");
+ lsp_init("../lsp/gcl_wild_pathname_p.lsp");
+ lsp_init("../lsp/gcl_pathname_match_p.lsp");
+
+ lsp_init("../lsp/gcl_iolib.lsp");
lsp_init("../lsp/gcl_fpe.lsp");
lsp_init("../cmpnew/gcl_cmpinline.lsp");
--- gcl-2.6.12.orig/xbin/make-fn
+++ gcl-2.6.12/xbin/make-fn
@@ -6,10 +6,13 @@ TMP=/tmp/tmpd$$
mkdir ${TMP}
cp $@ ${TMP}
-for v in $@ ;
+for v in $1 ;
do
echo '(load (format nil "~a~a" si::*system-directory* "../cmpnew/gcl_collectfn"))' \
'(compiler::emit-fn t)'\
+ "(compile-file \"${TMP}/$v\" :o-file nil)"
+echo '(load (format nil "~a~a" si::*system-directory* "../cmpnew/gcl_collectfn"))' \
+ '(compiler::emit-fn t)'\
"(compile-file \"${TMP}/$v\" :o-file nil)" | ${LISP}
done