english
version "1.0"
identify "wxyz"
#: Copyright (c) 1995, 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 chunk
#: This module implements the {chunk} and {chunks} types for SVMS history
#, files.
define chunk_type #: {chunk} representation
enumeration
binary #: Raw binary bytes
error #: Unknown type (error)
line #: Characters followed by new-line
range #: A bunch of {chunk} ranges
generate equal, hash, print, unsigned_convert
#: An allocated {chunk} is always a member of exactly one {version}.{chunks}
#, list. A {chunk} chunk can be moved from one {version}.{chunks} list
#, to another one, but care must be taken to ensure that the previous
#, one is deleted.
define chunk #: Bytes of data in file
record
data string #: String of data
data_hash unsigned #: Hash for chunk
offset unsigned #: Offset into {version}.{chunks}
resources resources #: Parent {resources} object
sort_key unsigned #: Key used for sorting {chunk}'s
type chunk_type #: {line} or {binary} or {range}
version version #: Version that {chunk} is part of
generate address_get, allocate, erase, identical, print
define chunk_range #: List of chunk names
record
count unsigned #: Number of chunks in sequence
indirect logical #: {true}=>keep expanding
offset unsigned #: First chunk in range
resources resources #: Parent {resources} object
version version #: {version} that range is part of
generate address_get, allocate, erase, identical, print
define chunk_ranges #: List of chunk ranges
record
list vector[chunk_range] #: List of {chunk_range}
resources resources #: Parent {resources} object
generate address_get, allocate, erase, identical, print
define chunks #: List of chunks
record
list vector[chunk] #: List of {chunk}
resources resources #: Parent {resources} object
generate address_get, allocate, erase, identical, print
#: {chunk} procedures:
procedure xallocate@chunk
takes
version version
returns chunk
#: This procedure will allocate and return a new {chunk} object
#, that refers to {version}.
procedure compare@chunk
takes
chunk1 chunk
chunk2 chunk
returns integer
#: This procedure returns -1, 0, or 1 depending upon whether the
#, {sort_key} field in {chunk1} is less than, equal to, or greater
#, than the {sort_key} field in {chunk2}. Please note that this
#, procedure only examines the {sort_key} field and nothing else;
#, in particular, when this procedure returns a 0, it may not mean
#, that the two chunks are equal in terms of their contents (i.e.
#, {equal}@{chunk}() might not return {true}.)
procedure deallocate@chunk
takes
chunk chunk
returns_nothing
#: This procedure will deallocate {chunk} and make it available for
#, subsequent reallocation.
procedure equal@chunk
takes
chunk1 chunk
chunk2 chunk
returns logical
#: This procedure will return {true} if {chunk1} is equal to {chunk2}
#, and {false} otherwise.
procedure hash@chunk
takes
chunk chunk
returns unsigned
#: This procedure will return a hash value for {chunk}.
procedure move@chunk
takes
chunk chunk
new_version version
returns_nothing
#: This procedure will move {chunk} from {chunk}.{version}.{chunks}
#, to {new_version}.{chunks}.
procedure read@chunk
takes
data_in_stream data_in_stream
version version
returns chunk
#: This procedure will read in a {chunk} object from {data_in_stream}
#, and return it.
procedure remove@chunk
takes
chunk chunk
returns_nothing
#: This procedure will remove {chunk} from {chunk}.{version}.{chunks}.
procedure share@chunk
takes
chunk chunk
share_table set[chunk]
returns chunk
#: This procedure will return a {chunk} object whose contents are
#, equal to {chunk}. {chunk} must be part of either the comments
#, or data of {version}.
procedure show_prefixed@chunk
takes
chunk chunk
prefix string
out_stream out_stream
returns_nothing
#: This procedure will output {chunk} to {out_stream} where each
#, line is prefixed by {prefix}.
procedure write@chunk
takes
chunk chunk
data_out_stream data_out_stream
version version
returns_nothing
#: This procedure will write {chunk} to {data_out_stream}.
#: {chunk_range} procedures:
procedure xallocate@chunk_range
takes
version version
returns chunk_range
#: This procedure will allocate a new {chunk_range} for {version}.
procedure chunks_append@chunk_range
takes
chunk_range chunk_range
chunks chunks
returns_nothing
#: This procedure will append a {chunk} object to {chunks} for
#, each appropriate {chunk} in {chunk_range}.
procedure compare@chunk_range
takes
chunk_range1 chunk_range
chunk_range2 chunk_range
returns integer
#: This procedure will return -1, 0, or 1 depending upon whether
#, {chunk_range1} is less than, equal to, or greater than
#, {chunk_range2}.
procedure deallocate@chunk_range
takes
chunk_range chunk_range
returns_nothing
#: This procedure will deallocate {chunk_range} for subsequent
#, reallocation.
procedure equal@chunk_range
takes
chunk_range1 chunk_range
chunk_range2 chunk_range
returns logical
#: This procedure will return {true} if {chunk_range1} is equal to
#, {chunk_range2}.
procedure greater_than@chunk_range
takes
chunk_range1 chunk_range
chunk_range2 chunk_range
returns logical
#: This procedure will return {true} if {chunk_range1} is greater than
#, {chunk_range2}.
procedure less_than@chunk_range
takes
chunk_range1 chunk_range
chunk_range2 chunk_range
returns logical
#: This procedure will return {true} if {chunk_range1} is less than
#, {chunk_range2}.
procedure read@chunk_range
takes
data_in_stream data_in_stream
history history
returns chunk_range
#: This procedure will read in and return a {chunk_range} object from
#, {data_in_stream} that was written by {write}@{chank_range}().
#, {history} is used to access the version list.
procedure write@chunk_range
takes
chunk_range chunk_range
data_out_stream data_out_stream
returns_nothing
#: This procedure will write {chunk_range} out to {data_out_stream}.
#: {chunk_ranges} procedures:
procedure xallocate@chunk_ranges
takes
resources resources
returns chunk_ranges
#: This procedure will allocate a new {chunk_ranges} object from
#, {resources}.
procedure append@chunk_ranges
takes
chunk_ranges chunk_ranges
chunk chunk
indirect logical
returns_nothing
#: This procedure will append into {chunk_ranges} creating
#, a new {chunk_range} object to contain it if needed.
#format@format4[address, address, logical, unsigned](debug_stream,
# 'append@chunk_ranges(%X%, %X%, %l%) size=%d% returns\n\',
# chunk_ranges.address, chunk.address, indirect, list.size)
procedure chunks_convert@chunk_ranges
takes
chunk_ranges chunk_ranges
chunks chunks
returns_nothing
#: This procedure will take a {chunks_ranges} object and expand
#, it so that referenced chunk is appended to {chunks} in the
#, proper order.
procedure compress@chunk_ranges
takes
chunk_ranges chunk_ranges
version version
share_table set[chunk]
returns_nothing
#: This procedure will compress {chunk_ranges} down to a single
#, {chunk_range} object and return it. Any new indirect strings
#, are added to {version}.
#, common sequences of lines. Unfortunately, the algorithm is
#, a bit opaque.
#format@format3[address, address, unsigned](debug_stream,
# 'compress@chunk_ranges(%X%, %X%) size=%d% returns\n\',
# chunk_ranges.address, version.address, list.size)
procedure deallocate@chunk_ranges
takes
chunk_ranges chunk_ranges
returns_nothing
#: This procedure will deallocate {chunk_ranges} for subsequent
#, reallocation.
procedure read@chunk_ranges
takes
data_in_stream data_in_stream
history history
returns chunk_ranges
#: This procedure will read in a {chunk_ranges} object that was
#, originally writen by {write}@{chunk_ranges}(). {history} is
#, used to access the {version} table.
procedure write@chunk_ranges
takes
chunk_ranges chunk_ranges
data_out_stream data_out_stream
returns_nothing
#: This procedure will write {chunk_ranges} to {data_out_stream}.
#: {chunks} procedures:
procedure xallocate@chunks
takes
resources resources
returns chunks
#: This procedure will allocate a new {chunks} object from {resources}.
procedure append@chunks
takes
chunks chunks
chunk chunk
returns_nothing
#: This procedure will append {chunk} to {chunks}.
procedure binary_extract@chunks
takes
contents string
version version
returns chunks
#: This procedure will treat {contents} as a sequence of raw bianry
#, bytes and return a {chunks} object that contains the data.
procedure chunk_ranges_convert@chunks
takes
chunks chunks
version version
share_table set[chunk]
returns chunk_ranges
#: This procedure will convert {chunks} into a corresponding
#, {chunk_ranges} object. Any needed indirect {chunk}'s will
#, be added to {version}.
procedure deallocate@chunks
takes
chunks chunks
returns_nothing
#: This procedure will deallocate {chunks} and make it available for
#, subsequent reallocation. If {chunks}.{size} is non-zero, {chunks}
#, must be a {version}.{chunks} object.
#format@format1[address](debug_stream,
# 'deallocate@chunks(%X%) returns\n\', chunks.address)
procedure lines_extract@chunks
takes
chunks chunks
version version
contents string
returns_nothing
#: This procedure will treat {contents} as a sequence of lines and
#, generate a sequence of shared {chunk} objects and append them to
#, the end of {chunks}. Any new shared {chunk} objects will be part
#, of {version}. {global} provides a few useful global values.
procedure fetch1@chunks
takes
chunks chunks
index unsigned
returns chunk
#: This procedure will return the {index}'th {chunk} object in {chunks}.
procedure is_sorted@chunks
takes
chunks chunks
version version
returns logical
#: This procedure will validate that each {chunk} that is in {version}
#, in {chunks} is properly ordered by the {sort_key} field. {true}
#, is returned if everything is properly sorted and {false} otherwise.
procedure ranges_remove@chunks
takes
chunks chunks
version version
returns logical
#: This procedure will remove any range {chunk}'s from {chunks}
#, that are part of {version}. {true} is removed if at least
#, one {chunk} is removed.
procedure read@chunks
takes
chunks chunks
data_in_stream data_in_stream
version version
returns_nothing
#: This procedure will read in a sequence of chunks from {in_stream}
procedure show@chunks
takes
chunks chunks
out_stream out_stream
returns_nothing
#: This procedure will output {chunks} ot {out_stream}. Each {chunk} in
#, {chunks} must be of type {line}.
procedure show_prefixed@chunks
takes
chunks chunks
prefix string
out_stream out_stream
returns_nothing
#: This procedure will output {chunks} to {out_stream} where each
#, line is prefixed by {prefix}.
procedure share@chunks
takes
chunks chunks
share_table set[chunk]
returns_nothing
#: This procedure will force each {chunk} in {chunks} to be sharable
#, via {share_table}.
procedure size_get@chunks
takes
chunks chunks
returns unsigned
#: This procedure will return the size of {chunks}.
procedure sort@chunks
takes
chunks chunks
version version
returns_nothing
#: This procedure will sort {chunks} based on the {sort_key} field
#, in each {chunk}. Each {chunk} in {chunks} must be a member of
#, {version}.
procedure sort_key_bind@chunks
takes
chunks chunks
start_offset unsigned
version version
returns unsigned
#: This procedure will take each {chunk} in {chunks} that is a member
#, {version} and assign its {sort_key} field a value starting at
#, at {start_offset} and incrementing by one. The last assigned
#, value (plus one) is returned. This procedure requires that
#, {sort_key_reset}@{chunks}() be called on {chunks} beforehand.
procedure sort_key_reset@chunks
takes
chunks chunks
version version
returns_nothing
#: This procedure will reset the {sort_key} field for each {chunk} in
#, {chunks} that is a member of {version} to zero.
procedure store1@chunks
takes
chunks chunks
index unsigned
chunk chunk
returns_nothing
#: This procedure will store {chunk} into the {index}'th slot in {chunks}.
procedure string_append@chunks
takes
chunks chunks
text string
returns_nothing
#: This procedure will take the contents of {chunks} and append them
#, to the end of {text}.
procedure trim@chunks
takes
chunks chunks
size unsigned
returns_nothing
#: This procedure will trim {chunks} to have a size of {size}
procedure unshare@chunks
takes
chunks chunks
share_table set[chunk]
returns_nothing
#: This procedure will ensure that each {chunk} in {chunks} is no
#, longer in {share_table}.
procedure verify@chunks
takes
chunks chunks
version version
returns_nothing
#: This procedure will verify that each {chunk} in {chunks} matches
#, {version} (if {version} is no equal to ??@{version}) and has the
#, correct offset. A fatal assertion error occurs if any problem is
#, encountered. This procedure is used for debugging.
procedure write@chunks
takes
chunks chunks
data_out_stream data_out_stream
version version
returns_nothing
#: This procedure will write {chunks} to {data_out_stream}.