File: scm-memory.scm

package info (click to toggle)
scheme48 1.8%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 14,980 kB
  • ctags: 14,127
  • sloc: lisp: 76,272; ansic: 71,514; sh: 3,026; makefile: 637
file content (127 lines) | stat: -rw-r--r-- 3,507 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
; Copyright (c) 1993-2008 by Richard Kelsey.  See file COPYING.


(define-primitive allocate-memory ((positive-integer? type/integer)) type/address)
(define-primitive deallocate-memory ((address? type/address)) type/unit)

(define-load-time-primitive (address? #f) address?)

(define-primitive address+ 
  ((address? type/address)
   (integer? type/integer))
  type/address)

(define-semi-primitive (address- address? integer?) address-
  (lambda (args node depth return?)
    (check-arg-type args 0 type/address depth node)
    (check-arg-type args 1 type/integer depth node)
    type/address)
  (lambda (x y) (address+ x (- 0 y))))

(define-primitive address-difference
  ((address? type/address)
   (address? type/address))
  type/integer)

(define-primitive address=
  ((address? type/address)
   (address? type/address))
  type/boolean)

(define-primitive address<
  ((address? type/address)
   (address? type/address))
  type/boolean)

(define-prescheme! 'null-address
  (let ((location (make-undefined-location 'null-address)))
    (set-contents! location (make-external-value "NULL" type/address))
    location)
  #f)

(define-semi-primitive (null-address? address?) null-address?
  (lambda (args node depth return)
    (check-arg-type args 0 type/address depth node)
    type/boolean)
  (lambda (x) (address= x null-address)))

(define (address-comparison-rule args node depth return?)
  (check-arg-type args 0 type/address depth node)
  (check-arg-type args 1 type/address depth node)
  type/boolean)

(define-semi-primitive (address> address? address?) address>
  address-comparison-rule
  (lambda (x y) (address< y x)))

(define-semi-primitive (address<= address? address?) address<=
  address-comparison-rule
  (lambda (x y) (not (address< y x))))

(define-semi-primitive (address>= address? address?) address>=
  address-comparison-rule
  (lambda (x y) (not (address< x y))))

(define-primitive address->integer
  ((address? type/address))
  type/integer)
   
(define-primitive integer->address
  ((integer? type/integer))
  type/address)

(define-primitive copy-memory! 
  ((address? type/address)
   (address? type/address)
   (positive-integer? type/integer))
  type/unit)

(define-primitive memory-equal? 
  ((address? type/address)
   (address? type/address)
   (positive-integer? type/integer))
  type/boolean)

(define-primitive unsigned-byte-ref
  ((address? type/address))
  type/integer
  byte-ref)

(define-primitive unsigned-byte-set!
  ((address? type/address) (unsigned-byte? type/integer))
  type/unit
  byte-set!)

(define-primitive word-ref ((address? type/address)) type/integer)
(define-primitive word-set!
  ((address? type/address) (positive-integer? type/integer))
  type/unit)

(define-primitive flonum-ref ((address? type/address)) type/float)
(define-primitive flonum-set!
  ((address? type/address) (floatnum? type/float))
  type/unit)

(define-primitive char-pointer->string
  ((address? type/address)
   (positive-integer? type/integer))
  type/string)

(define-primitive char-pointer->nul-terminated-string
  ((address? type/address))
  type/string)

(let ((read-block-return-type
       (make-tuple-type (list type/integer type/boolean type/status))))
  (define-primitive read-block
    ((input-port? type/input-port)
     (address? type/address)
     (positive-integer? type/integer))
    read-block-return-type))
  
(define-primitive write-block
  ((output-port? type/output-port)
   (address? type/address)
   (positive-integer? type/integer))
  type/status)