* Added port-mode and set-port-mode! primitives. A port mode is
either the symbol ikarus-mode or the symbol r6rs-mode.
This commit is contained in:
		
							parent
							
								
									442eb1ca00
								
							
						
					
					
						commit
						543d59313b
					
				
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -1985,9 +1985,9 @@
 | 
			
		|||
  (define disp-port-index          8)
 | 
			
		||||
  (define disp-port-size          12)
 | 
			
		||||
  (define disp-port-handler       16)
 | 
			
		||||
  (define disp-port-unused1   20)
 | 
			
		||||
  (define disp-port-unused2   24)
 | 
			
		||||
  (define disp-port-unused3   28)
 | 
			
		||||
  (define disp-port-attributes    20)
 | 
			
		||||
  (define disp-port-unused1   24)
 | 
			
		||||
  (define disp-port-unused2   28)
 | 
			
		||||
  (define port-size               32)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,8 @@
 | 
			
		|||
          port-input-index   set-port-input-index!
 | 
			
		||||
          port-input-size    set-port-input-size!
 | 
			
		||||
          port-output-index  set-port-output-index!
 | 
			
		||||
          port-output-size   set-port-output-size!)
 | 
			
		||||
          port-output-size   set-port-output-size!
 | 
			
		||||
          port-mode          set-port-mode!)
 | 
			
		||||
  (import 
 | 
			
		||||
    (ikarus system $ports)
 | 
			
		||||
    (ikarus system $strings)
 | 
			
		||||
| 
						 | 
				
			
			@ -34,7 +35,8 @@
 | 
			
		|||
         port-input-index   set-port-input-index!
 | 
			
		||||
         port-input-size    set-port-input-size!
 | 
			
		||||
         port-output-index  set-port-output-index!
 | 
			
		||||
         port-output-size   set-port-output-size!))
 | 
			
		||||
         port-output-size   set-port-output-size!
 | 
			
		||||
         port-mode          set-port-mode!))
 | 
			
		||||
  ;;; GENERIC PORTS: BASIC PRIMITIVES
 | 
			
		||||
  ;;;
 | 
			
		||||
  ;;; Exports: 
 | 
			
		||||
| 
						 | 
				
			
			@ -173,7 +175,27 @@
 | 
			
		|||
                      (error 'set-port-output-size! "size is too big" i))
 | 
			
		||||
                  (error 'set-port-output-size! "size is negative" i))
 | 
			
		||||
              (error 'set-port-output-size! "not a valid size" i))
 | 
			
		||||
          (error 'set-port-output-size! "not an output-port" p)))))
 | 
			
		||||
          (error 'set-port-output-size! "not an output-port" p))))
 | 
			
		||||
  
 | 
			
		||||
  (define (port-mode p)
 | 
			
		||||
    (if (port? p)
 | 
			
		||||
        (let ([attr ($port-attributes p)])
 | 
			
		||||
          (case (fxand attr 1)
 | 
			
		||||
            [(0)  'ikarus-mode]
 | 
			
		||||
            [else 'r6rs-mode]))
 | 
			
		||||
        (error 'port-mode "not a port" p)))
 | 
			
		||||
 | 
			
		||||
  (define (set-port-mode! p m)
 | 
			
		||||
    (if (port? p)
 | 
			
		||||
        (let ([attr ($port-attributes p)]) 
 | 
			
		||||
          ($set-port-attributes! p
 | 
			
		||||
            (case m
 | 
			
		||||
              [(ikarus-mode)  (fxand attr (fxnot 1))]
 | 
			
		||||
              [(r6rs-mode)    (fxior attr 1)]
 | 
			
		||||
              [else (error 'set-port-mode! "invalid mode" m)])))
 | 
			
		||||
        (error 'port-mode "not a port" p)))
 | 
			
		||||
  
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -332,6 +332,8 @@
 | 
			
		|||
    [port-name                                   i]
 | 
			
		||||
    [input-port-name                             i]
 | 
			
		||||
    [output-port-name                            i]
 | 
			
		||||
    [port-mode                                   i]
 | 
			
		||||
    [set-port-mode!                              i]
 | 
			
		||||
    [with-input-from-string                      i]
 | 
			
		||||
    [open-output-string                          i]
 | 
			
		||||
    [open-input-string                           i r]
 | 
			
		||||
| 
						 | 
				
			
			@ -496,6 +498,8 @@
 | 
			
		|||
    [$port-size                                  $ports]
 | 
			
		||||
    [$set-port-index!                            $ports]
 | 
			
		||||
    [$set-port-size!                             $ports]
 | 
			
		||||
    [$port-attributes                            $ports]
 | 
			
		||||
    [$set-port-attributes!                       $ports]
 | 
			
		||||
    [$closure-code                               $codes]
 | 
			
		||||
    [$code->closure                              $codes]
 | 
			
		||||
    [$code-reloc-vector                          $codes]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1727,9 +1727,9 @@
 | 
			
		|||
    (prm 'mset p (K (- disp-port-index vector-tag)) (T idx/i))
 | 
			
		||||
    (prm 'mset p (K (- disp-port-size vector-tag)) (T sz/i))
 | 
			
		||||
    (prm 'mset p (K (- disp-port-handler vector-tag)) (T handler))
 | 
			
		||||
    (prm 'mset p (K (- disp-port-attributes vector-tag)) (K 0))
 | 
			
		||||
    (prm 'mset p (K (- disp-port-unused1 vector-tag)) (K 0))
 | 
			
		||||
    (prm 'mset p (K (- disp-port-unused2 vector-tag)) (K 0))
 | 
			
		||||
    (prm 'mset p (K (- disp-port-unused3 vector-tag)) (K 0))
 | 
			
		||||
    p))
 | 
			
		||||
 | 
			
		||||
(define-primop $make-port/input unsafe
 | 
			
		||||
| 
						 | 
				
			
			@ -1755,6 +1755,10 @@
 | 
			
		|||
   (seq*
 | 
			
		||||
     (prm 'mset (T x) (K (- disp-port-index vector-tag)) (K 0))
 | 
			
		||||
     (prm 'mset (T x) (K (- disp-port-size vector-tag)) (T i)))])
 | 
			
		||||
(define-primop $port-attributes unsafe
 | 
			
		||||
  [(V x) (prm 'mref (T x) (K (- disp-port-attributes vector-tag)))])
 | 
			
		||||
(define-primop $set-port-attributes! unsafe
 | 
			
		||||
  [(E x i) (prm 'mset (T x) (K (- disp-port-attributes vector-tag)) (T i))])
 | 
			
		||||
 | 
			
		||||
/section)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue