english
version "1.0"
identify "%Z%%M% %I% %E%"
#: Copyright (c) 1993-2005 Wayne C. Gramlich.
#, All rights reserved.
module save
#: The save module provides the ability to save an object and all
#, of its children into a sharable object file.
define save_element # One word of saved data
variant type save_type
characters unsigned # Characters from a string
object string # An object
read_only_address unsigned # A read-only address
read_write_address unsigned # A read/write address
routine string # A routine
undefined null # Error
unsigned unsigned # An unsigned word
generate allocate, erase, print
define save
record
full_name string # Temporary string buffer
objects vector[string] # List of save objects
object_table set[string] # Set of save objects
routines vector[string] # List of save routines
routine_table set[string] # Set of save proecures
read_only_elements vector[save_element] # Vector of read-only elements
read_only_table table[address, unsigned] # Read-only address table
read_write_elements vector[save_element] # Vector of read/write elements
read_write_table table[address, unsigned] # Read/write address table
undefined save_element # Unused save element
zero address # An address of 0
generate address_get, allocate, erase, print
define save1[object_type] # Helper type
record
zilch null # This type is not used.
generate allocate, erase, print
procedure characters@save
takes
save save
characters unsigned
returns save_element
#: This procedure will return a save element containing {characters
}
#, allocated from {save
}.
procedure object@save
takes
save save
object_name string
object_type string
offset unsigned
returns_nothing
#: This procedure will install a reference to {object_name
}@{object_type
}
#, at {offset
} in {save
}.
procedure read_only@save
takes
save save
offset unsigned
returns save_element
#: This procedure will return a read/write {save_element
} for the
#, read-only elements in {save
}.
procedure read_only_lookup@save
takes
save save
address address
returns unsigned
#: This procedure will return the read-only offset associated
#, {address
} in {save
}. If there is no offset, 0 is returned.
procedure read_only_allocate@save
takes
save save
address address
amount unsigned
returns unsigned
#: This procedure will allocate {amount
} entries for {address
}
#, in the read/only elements in {save
}. The offset of the
#, first allocated element is returned.
procedure read_only_store@save
takes
save save
index unsigned
save_element save_element
returns_nothing
#: This procedure will store {save_element
} into
#, {save
}.{read_only_elements
} at {index
}.
procedure read_write@save
takes
save save
offset unsigned
returns save_element
#: This procedure will return a read/write {save_element
} for the
#, read/write elements in {save
}.
procedure read_write_lookup@save
takes
save save
address address
returns unsigned
#: This procedure will return the read/write offset associated
#, {address
} in {save
}. If there is no offset, 0 is returned.
procedure read_write_allocate@save
takes
save save
address address
amount unsigned
returns unsigned
#: This procedure will allocate {amount
} words of from the
#, read/write elements ins {save
}. If {address
} is non-zero,
#, {address
} is entered into read/write table in {save
}.
procedure routine@save
takes
save save
routine_name string
routine_type string
offset unsigned
returns_nothing
#: This procedure will install a reference to {routine_name
}@{routine_type
}
#, at {offset
} in {save
}.
procedure store1@save
takes
save save
index unsigned
save_element save_element
returns_nothing
#: This procedure will store {save_element
} into
#, {save
}.{read_write_elements
} at {index
}.
procedure read@save1[object_type]
takes
directory_name string
base_name string
suffix string
system system
returns object_type
#: This procedure will read in an object of type {object_type
} from
#, the file named {base_name
} with a suffix of {suffix
} from the
#, directory named {directory_name
}. {system
} is used to do file I/O.
#, ??@{object_type
} is returned if the file name can not be opened.
procedure read_helper@save1[object_type]
takes
file_name string
symbol_name string
returns object_type
external save1__read_helper
#: This is an unsafe routine that uses dlopen to slurp in the
#, shared object file named {file_name
} and returns the address
#, of the symbol named {symbol_name
}. The user has to make sure
#, that the types written out by {write@save1
} match the type
#, read by {read_helper@save1
}.
procedure write@save1[object_type]
takes
directory_name string
base_name string
suffix string
object object_type
system system
returns_nothing
needs
procedure save@object_type
takes object_type, save, unsigned
returns_nothing
#: This routine will write {object
} out to {file_name
} as a sharable
#, object.
procedure write_helper@save
takes
out_stream out_stream
save_elements vector[save_element]
storage_class string
name string
returns_nothing
#: This procedure will write out {save_elements
} to {out_stream
}
#, labeled with {storage_class
} and {name
}.
procedure unsigned@save
takes
save save
unsigned unsigned
returns save_element
#: This procedure will return a save element containing {unsigned
}
#, allocated from {save
}.