english
version "1.0"
identify "xyz"
#: Copyright (c) 1997, 2000, 2002 by Wayne C. Gramlich.
#, All rights reserved.
#,
#, Permission to use, copy, modify, distribute, and sell this software
#, for any purpose is hereby granted without fee provided that the above
#, copyright notice and this permission are retained. The author makes
#, no representations about the suitability of this software for any purpose.
#, It is provided "as is" without express or implied warranty.
module memory
#: This module implements a bounds protected memory module.
define memory
external
procedure address_get@memory
takes
memory memory
returns address
external memory__address_get
#: This procedure will return the address associated with {memory}.
#, Please note, this is the address associated with the {memory}
#, object, not the memory buffer pointed to by {memory}.
procedure buffer_address_get@memory
takes
memory memory
returns address
external memory__buffer_address_get
#: This procedure will return the buffer address associated with
#, {memory}. The buffer address can change as a result of the
#, {resize}@{memory}() operation.
procedure byte_add@memory
takes
to_memory memory
to_offset unsigned
from_memory memory
from_offset unsigned
byte unsigned
length unsigned
returns_nothing
#: This procedure will perform a add {byte} to the {length} bytes
#, in {from_memory} starting at {from_offset} and store the result
#, in {to_memory} starting at {to_offset}. {to_memory} and
#, {from_memory} can point to the same {memory} object, but the
#, regions must either exactly overlap or be totally non-overlapping.
#, The semantics of partial overlappiny memory regions are undefined.
procedure byte_and@memory
takes
to_memory memory
to_offset unsigned
from_memory memory
from_offset unsigned
byte unsigned
length unsigned
returns_nothing
#: This procedure will perform a bitwise AND of {byte} with the {length}
#, bytes in {from_memory} starting at {from_offset} and store the
#, result in {to_memory} starting at {to_offset}. {to_memory} and
#, {from_memory} can point at the same {memory} object, but the
#, regions must either exactly overlap or be totally non-overlapping.
#, The semantics of partial overlapping memory regions are undefined.
procedure byte_equal@memory
takes
memory memory
offset unsigned
byte unsigned
length unsigned
returns logical
#: This procedure will return {true}@{logical} if the {length} bytes
#, in {memory} starting at {offset} are equal to {byte} and {false}
#, otherwise.
procedure byte_multiply@memory
takes
from_memory memory
from_offset unsigned
to_memory memory
to_offset unsigned
byte unsigned
length unsigned
returns_nothing
#: This procedure will multiply {byte} times each byte in the {length}
#, bytes in {from_memory} starting at {from_offset} and store the result
#, in {to_memory} starting at {to_offset}. {to_memory} and {from_memory}
#, can point the same {memory} object, but the regions must either
#, exactly overlap or be totally non-overlapping. The semantics of
#, partial overlapping memory regions are undefined.
procedure byte_or@memory
takes
to_memory memory
to_offset unsigned
from_memory memory
from_offset unsigned
byte unsigned
length unsigned
returns_nothing
#: This procedure will perform a bitwise OR of {byte} with the {length}
#, bytes in {from_memory} starting at {from_offset} and store the result
#, in {to_memory} starting at {to_offset}. {to_memory} and {from_memory}
#, can point to the same {memory} object, but the regions must either
#, exactly overlap or be totally non-overlapping. The semantics of
#, partial overlapping memory regions are undefined.
procedure byte_search@memory
takes
memory memory
offset unsigned
byte unsigned
length unsigned
returns unsigned
#: This procedure will search the {length} bytes of {memory} starting at
#, {offset} for a byte that equals {byte}. If a matching byte is found,
#, the index of the matching byte is returned; otherwise, {memory}.{size}
#, is returned.
procedure byte_subtract@memory
takes
to_memory memory
to_offset unsigned
from_memory memory
from_offset unsigned
byte unsigned
length unsigned
returns_nothing
#: This procedure will subtract {byte} from the {length} bytes in
#, {from_memory} starting at {from_offset} and store the result in
#, {to_memory} starting at {to_offset}. {to_memory} and {from_memory}
#, can point to the same {memory} object, but the regions must either
#, exactly overlap, or be totally non-overlapping. The semantics of
#, partial overlapping memory regions are undefined.
procedure byte_xor@memory
takes
to_memory memory
to_offset unsigned
from_memory memory
from_offset unsigned
byte unsigned
length unsigned
returns_nothing
#: This procedure will perform a bitwis XOR of {byte} with the {length}
#, bytes in {from_memory} starting at {from_offset} and store the result
#, in {to_memory} starting at {to_offset}. {to_memory} and {from_memory}
#, can point to the same {memory} object, but the regions must either
#, exactly overlap, or be totally non-overlapping. The semantics of
#, partial overlapping memory regions are undefined.
procedure clear@memory
takes
memory memory
returns_nothing
#: This procuedure will set every byte in {memory} to zero.
procedure copy@memory
takes
memory memory
returns memory
#: This procedure will return a byte wise copy of {memory}.
procedure create@memory
takes
size unsigned
returns memory
external memory__create
#: This procedure will return a chunk of memory that contains
#, {size} bytes of memory. The mode of the returned memory is
#, {read_write}.
procedure equal@memory
takes
memory1 memory
memory2 memory
returns logical
#: This procedure will return {true} if the entire contents of
#, {memory1} is equal to the contents of {memory2} and {false}
#, otherwise.
procedure fetch1@memory
takes
memory memory
index unsigned
returns unsigned
external memory__fetch1
#: This procedure will fetch and return the byte value at the
#, {index}'th location in {memory}.
procedure identical@memory
takes
memory1 memory
memory2 memory
returns logical
#: This procedure will return {true} if {memory1} is identical to
#, {memory2} and {false} otherwise.
procedure integer_word_fetch@memory
takes
memory memory
word_index unsigned
returns integer
external memory__integer_word_fetch
#: This procedure will return the 4-byte signed integer from {memory}
#, starting at {word_index}. The word is fetched from the memory
#, location in the "natural" byte order for the machine.
procedure integer_word_store@memory
takes
memory memory
word_index unsigned
value unsigned
returns_nothing
external memory__integer_word_store
#: This procedure will store {value} into {memory} at {word_index}
#, as a 4-byte signed integer. The word is fetched from the memory
#, location in the "natural" byte order for the machine.
procedure limit_get@memory
takes
memory memory
returns unsigned
external memory__limit_get
#: This procedure will fetch and return the maximum size that
#, {memory} can get in bytes before it must be reallocated.
procedure print@memory
takes
memory memory
out_stream out_stream
returns_nothing
#: This procedure will print out the contents of {memory} to {out_stream}.
procedure region_and@memory
takes
memory1 memory
offset1 unsigned
memory2 memory
offset2 unsigned
memory3 memory
offset3 unsigned
length unsigned
returns_nothing
#: This procedure will AND the {length} btyes from {memory1} starting
#, at {offset1} with the bits from {memory2} starting at {offset2}
#, and store the result into {memory3} starting at {offset3}.
#, This operation does allow {memory1}, {memory2} and {memory3} to
#, point to the exact same {memory} object, but only if the corresponding
#, offsets are either equal or totally non-overlapping.
procedure region_equal@memory
takes
memory1 memory
offset1 unsigned
memory2 memory
offset2 unsigned
length unsigned
returns logical
#: This procedure will return {true} if the {length} bytes from
#, {memory1} starting at {offset1} are equal to the {length} bytes
#, of {memory2} starting at {offset2}.
procedure region_not@memory
takes
memory1 memory
offset1 unsigned
memory2 memory
offset2 unsigned
length unsigned
returns_nothing
#: This procedure will complement the {length} btyes from {memory1}
#, starting at {offset1} and store the result into {memory2} starting
#, at {offset3}. This operation does allow {memory1} and {memory2}
#, to point to the exact same {memory} object, but only if the
#, corresponding offsets are either equal or totally non-overlapping.
procedure region_or@memory
takes
memory1 memory
offset1 unsigned
memory2 memory
offset2 unsigned
memory3 memory
offset3 unsigned
length unsigned
returns_nothing
#: This procedure will OR the {length} btyes from {memory1} starting
#, at {offset1} with the bits from {memory2} starting at {offset2}
#, and store the result into {memory3} starting at {offset3}.
#, This operation does allow {memory1}, {memory2} and {memory3} to
#, point to the exact same {memory} object, but only if the corresponding
#, offsets are either equal or totally non-overlapping.
procedure region_search@memory
takes
search_memory memory
search_offset unsigned
search_length unsigned
pattern_memory memory
pattern_offset unsigned
pattern_length unsigned
returns unsigned
#: This procedure will search forward through {search_memory} starting
#, at {search_offset} for {search_length} bytes for an exact match
#, with the {pattern_length} bytes in {pattern_memory} starting at
#, {pattern_offset}. If a match is found, the index of the first
#, matching region is returned; otherwise, if no match is found,
#, {search_memory}.{size} is returned.
procedure region_set@memory
takes
memory memory
offset unsigned
length unsigned
value unsigned
returns_nothing
#: This procedure will set the {length} bytes of {memory} starting at
#, {offset} to {value}.
procedure region_xor@memory
takes
memory1 memory
offset1 unsigned
memory2 memory
offset2 unsigned
memory3 memory
offset3 unsigned
length unsigned
returns_nothing
#: This procedure will XOR the {length} btyes from {memory1} starting
#, at {offset1} with the bits from {memory2} starting at {offset2}
#, and store the result into {memory3} starting at {offset3}.
#, This operation does allow {memory1}, {memory2} and {memory3} to
#, point to the exact same {memory} object, but only if the corresponding
#, offsets are either equal or totally non-overlapping.
procedure resize@memory
takes
memory memory
new_size unsigned
returns_nothing
external memory__resize
#: This procedure ensure that there are {new_size} bytes of
#, memory in {memory}.
procedure size_get@memory
takes
memory memory
returns unsigned
external memory__size_get
#: This procudure will the number of bytes associated with {memory}.
procedure store1@memory
takes
memory memory
index unsigned
value unsigned
returns_nothing
external memory__store1
#: This procedure will store {value} into the {index}'th location
#, in {memory}.
procedure string_copy_from@memory
takes
to_memory memory
to_offset unsigned
from_string string
from_offset unsigned
amount unsigned
returns_nothing
#: This procedure will transfer {amount} characters from {from_string}
#, starting at {from_offset} into {to_memory} starting at {to_offset}.
#, Each characters in {from_string} must be representable as an 8-bit
#, byte. This operation will fail if any attempt is made to access
#, beyond the upper limit of either {from_string} or {to_memory}.
procedure transfer@memory
takes
from_memory memory
from_offset unsigned
to_memory memory
to_offset unsigned
length unsigned
returns_nothing
#: This procedure will transfer {length} bytes of memory from
#, {from_memory} at {from_offset} to {to_memory} at {to_offset}.
#, {from_memory} and {to_memory} are permitted to reference the
#, same {memory} object.
procedure unsigned_word_fetch@memory
takes
memory memory
word_index unsigned
returns unsigned
external memory__unsigned_word_fetch
#: This procedure will return the 4-byte unsigned word from {memory}
#, starting {word_index}. The word is fetched from the memory
#, location in the "natural" byte order for the machine.
procedure unsigned_word_store@memory
takes
memory memory
word_index unsigned
value unsigned
returns_nothing
external memory__unsigned_word_store
#: This procedure will store {value} into {memory} at {word_index}
#, as a the 4-byte unsigned word. The word is fetched from the memory
#, location in the "natural" byte order for the machine.