;;; This file is part of scsh.

(define (return-from-vm n)
  (with-continuation (if #t #f) (lambda () n)))

(define (startup user-context)
  (lambda (args)
    (start-new-session user-context
		       (current-input-port)
		       (current-output-port)
		       (current-error-port)
		       args
		       #t) ;batch?
    (with-interaction-environment
     (user-environment)
     (lambda ()
       (return-from-vm 0)))))

(define (s48-command command-string)
  (let* ((in (make-string-input-port command-string))
	 (s-exp (read in)))
    (if (and (not (eof-object? s-exp))
	     (eof-object? (read in)))
	(call-with-values
	 (lambda ()
	   (call-with-current-continuation
	    (lambda (k)
	      (with-handler
	       (lambda (cond more)
; 		 (display "error is "(current-error-port))
; 		 (display cond (current-error-port))
; 		 (newline (current-error-port))
		 (k cond))
	       (lambda ()
		 (eval s-exp (user-command-environment)))))))
	 (lambda args
	   (cond ((null? args) 
; 		  (display "null as result" 
; 			   (current-error-port)))
		 ((null? (cdr args))
; 		  (display "evaluated to:" (current-error-port))
; 		  (display (car args)(current-error-port))
; 		  (newline (current-error-port))
		  (car args))
		 (else
		  (display "multiple return values in s48-command" 
			   (current-error-port))
		  ))))
	(display "s48-command got not exactly one s-exp" 
		 (current-error-port)))))

;; TODO write a procedure to be called time by time to let the
;; administrative threads run

;; must be called from a running command processor
(define (dump-libscsh-image filename)
  (dump-scsh-program (startup (user-context)) filename))

(define-exported-binding "s48-command" s48-command)