english
version "1.0"
identify "xyz"
#: Copyright (c) 1995-2005 by Wayne C. Gramlich.
#, All rights reserved.
module file_name
#: The {file_name
} type represents hierarchical file names. A file
#, name basically looks like:
#,
#, root/name1/name2/.../nameN
#,
#, where `/' is the file separator (for UNIX) and `root' is some sort
#, file root. For UNIX, the available roots are:
#,
#, Absolute (e.g. `/' and `/usr/bin/cp')
#, Relative (e.g. `.' and `dir1/dir2/file')
#, Login (e.g. `~' and `~/bin/myprog')
#, User (e.g. `~gramlich' and `~gramlich/bin/myprog')
#,
#, Of course, Windows 95 does not have the concept of a user,
#, so the last two file types are not supported for Windows 95.
#,
#, Each {file_name
} object is immutable.
#: {file_name
}'s are represented as chains of {file_name
} objects
#, that contain pointers to the next directory higher in the chain.
define file_name_type #: File name type
enumeration
cwd #: File name is current working dir.
login #: File name is "~"
next #: File name is {name
}
root #: File name is "/"
user #: File name is "~{name
}"
generate equal, print, unsigned_convert
define file_name #: A file name object
record
depth unsigned #: Depth of file name
file_system file_system #: File system file name is part of
name string #: Name portion of file name
parent file_name #: Parent of file name (or self)
status status #: If !== ??, latest status for file
type file_name_type #: Type of this file name node
generate allocate, erase, identical
#: {file_name
} procedures:
procedure access_mode_change@file_name
takes
file_name file_name
access_mode unsigned
errors errors
returns logical
#: This procedure will change the acces mode of {file_name
} to
#, {access_mode
} where mode has the usual Unix style mode bits.
#, If any errors occur and {errors
} is not equal to ??, an error
#, message is output to {errors
}. {true
} is returned if the mode
#, change failed and {false
} otherwise.
procedure canonicalize@file_name
takes
file_name file_name
returns file_name
#: This procedure will return a canonicalized version of {file_name
}
#, that starts from root (e.g. "~gramlich/bin/myprog" =>
#, "/home/gramlich/bin/myprog".)
procedure compare@file_name
takes
file_name1 file_name
file_name2 file_name
returns integer
#: This procedure will return -1, 0, or 1 depending upon whether
#, {file_name1
} is less than, equal to, or greater than {file_name2
}.
procedure compare_helper@file_name
takes
file_name1 file_name
file_name1_depth unsigned
file_name2 file_name
file_name2_depth unsigned
returns integer
#: This procedure will return -1, 0, or 1 depending upon whether
#, {file_name1
} is less than, equal to, or greather than {file_name2
}.
#, {file_name1_depth
} must be the depth of {file_name1
} and
#, {file_name2_depth
} must be the depth of {file_name2
}.
procedure contents_read@file_name
takes
file_name file_name
buffer string
errors errors
returns logical
#: This procedure will read the entire contents of {file_name
}
#, in and store the contents into {buffer
}. If any errors occur,
#, a message is output to {errors
} and {true
} is returned.
procedure create@file_name
takes
file_system file_system
name string
parent file_name
type file_name_type
returns file_name
#: This procedure will create a new {file_name
} type containing
#, {file_system
}, {name
}, {parent
}, and {type
}. If {parent
} equals
#, ??@{file_name
}, the {parent
} field is initialized to point to
#, the returned {file_name
} (i.e. it refers to itself.) This
#, procedure is used for internal purposes only and no additional
#, checking is performed.
procedure directory_create@file_name
takes
directory_file_name file_name
errors errors
returns logical
#: This procedure will create a directory named {directory_file_name
}.
#, {true
} is returned if {directory_name
} is not successfully
#, created and {false
} otherwise otherwise.
procedure directory_create_recursive@file_name
takes
directory_file_name file_name
errors errors
returns logical
#: This procedure will create a all of the directories up to and
#, including the directory nameed {directory_file_name
}. If any
#, errors occur and {errors
} is not equal to ??, an error message
#, is output to {errors
}. If any errors occur, {true
} is returned
#, and {false
} otherwise.
procedure directory_open@file_name
takes
directory_file_name file_name
returns directory
#: This procedure will open the directory named {directory_file_name
}
#, and return a {directory
} object for scanning the files from the
#, directory out. ??@{directory
} is returned if {directory_file_name
}
#, can not be opened as a directory.
procedure directory_replace@file_name
takes
full_file_name file_name
old_directory file_name
new_directory file_name
returns file_name
#: This procedure will return the {file_name
} object that results
#, replacing {old_directory
} in {full_file_name
} with {new_directory
}.
#, ??@{file_name
} is returned if {old_directory
} is not a proper
#, prefix to {full_file_name
}.
procedure directory_replace_helper@file_name
takes
full_file_name file_name
full_file_name_depth unsigned
old_directory file_name
old_directory_depth unsigned
new_directory file_name
returns file_name
#: This procedure will return the {file_name
} object that results
#, replacing {old_directory
} in {full_file_name
} with {new_directory
}.
#, ??@{file_name
} is returned if {old_directory
} is not a proper
#, prefix to {full_file_name
}.
procedure equal@file_name
takes
file_name1 file_name
file_name2 file_name
returns logical
#: This procedure will return {true
} if {file_name1
} is equal
#, to {file_name2
} and {false
} otherwise.
procedure fetch1@file_name
takes
file_name file_name
depth unsigned
returns file_name
#: This procedure will return the component of {file_name
} that is
#, at {depth
}.
procedure file_delete@file_name
takes
file_name file_name
returns logical
#: This procedure will delete the file named {file_name
}. {true
} is
#, if either the file could not be deleted or if the file does not
#, exist; otherwise, {false
} is returned if the file is successfully
#, deleted.
procedure file_exists@file_name
takes
file_name file_name
returns logical
#: This procedure will return {true
}@{logical
} if {file_name
}
#, is a file, directory, symbolic link, etc.; otherwise,
#, {false
}@{logica
} is returned.
procedure format@file_name
takes
file_name file_name
out_stream out_stream
format string
offset unsigned
returns_nothing
#: This procedure will output {file_name
} to {out_stream
} using
#, the formatting characters in {format
} starting at {offset
}
#, until a terminating '%' is encountered. See the {format
} module
#, to find out more about formatted output.
procedure greater_than@file_name
takes
file_name1 file_name
file_name2 file_name
returns logical
#: This procedure will return {true
} if {file_name1
} is greater than
#, {file_name2
} and {false
} otherwise.
procedure has_parent@file_name
takes
file_name file_name
returns logical
#: This procedure will return {true
} if {file_name
} has a parent
#, {file_name
}. Only `root-like' {file_name
} objects (e.g.
#, `/', `.', `~', and `~user') are `root-like'.
procedure hash@file_name
takes
file_name file_name
returns unsigned
#: This procedure will return a hash value for {file_name
}.
procedure is_absolute@file_name
takes
file_name file_name
returns logical
#: This procedure will return {true
} if {file_name
} is a file name
#, with an absolute path and {false
} otherwise. Examples of files
#, that have an absolute path are (`/dev', `/', `~', `~gramlich',
#, `~/public_html', etc.) A file with a relative path is not
#, absolute (e.g. `foo', `./bar', etc.)
procedure is_directory@file_name
takes
directory_file_name file_name
returns logical
#: This procedure will return {true
}@{logical
} if {directory_file_name
}
procedure is_file@file_name
takes
file_name file_name
returns logical
#: This procedure will return {true
}@{logical
} if {file_name
} is
#, a regular file and {false
}@{logical
} otherwise.
procedure is_symbolic_link@file_name
takes
symbolic_link file_name
returns logical
#: This procedure will return {true@logical
} if {symbolic_link
} is
#, a symbolic link and {false@logical
} otherwise.
procedure is_relative@file_name
takes
file_name file_name
returns logical
#: This procedure will return {true
} if {file_name
} is a file name
#, with a relative path and {false
} otherwise. This is defined to
#, be the exact opposite of {is_absolute
}@{file_name
}().
procedure is_root@file_name
takes
file_name file_name
returns logical
#: This procedure will return {true
} if {file_name
} is the root of
#, a file name and {false
} otherwise.
procedure join@file_name
takes
front_file_name file_name
back_file_name file_name
returns file_name
#: This procedure will create and return a new file_name that is
#, the result of joining {back_file_name
} onto the end of
#, {front_file_name
}. Both {front_file_name
} and {back_file_name
}
#, have to be members of the same {file_system
} object.
procedure less_than@file_name
takes
file_name1 file_name
file_name2 file_name
returns logical
#: This procedure will return {true
} if {file_name1
} is less than
#, {file_name2
} and {false
} otherwise.
procedure name_append@file_name
takes
parent_file_name file_name
name string
returns file_name
#: This procedure will return a new {file_name
} object that
#, consists of appending {name
} to {parent_file_name
}.
procedure name_extract@file_name
takes
file_name file_name
offset unsigned
length unsigned
returns file_name
#: This procedure will return a new {file_name
} object that
#, corresponds to the {length
} characters starting at {offset
}
#, in {file_name
}'s name. It is a fatal error to call this
#, procedure if {file_name
} does not have a parent.
procedure name_replace@file_name
takes
file_name file_name
name string
returns file_name
#: This procedure will return a new {file_name
} object that
#, corresponds to replacing {file_name
}'s name with {name
}.
#, It is a fatal error to call this procedure if {file_name
} does
#, not have a parent.
procedure normalize@file_name
takes
file_name file_name
returns file_name
#: This procedure will remove all occurances of "/foo/.." and "/."
#, from {file_name
} and return it. On an operating system that
#, supports symbolic links, removing "/foo./.." where foo is a
#, symbolic link, this operation does not preserve operating system
#, semantics. None-the-less, this operation can be useful.
procedure open_append@file_name
takes
file_name file_name
returns out_stream
#: This procedure will open {file_name
} for writing in append mode.
#, If it is not possible to open }file_name} for writing,
#, ??@{out_stream
} is returned.
procedure open_create@file_name
takes
file_name file_name
returns out_stream
#: This procedure will open {file_name
} for writing. If {file_name
}
#, already exists, it will be truncated to zero length. If it is
#, not possible to open }file_name} for writing, ??@{out_stream
}
#, is returned.
procedure open_read@file_name
takes
file_name file_name
returns in_stream
#: This procedure will open {file_name
} for reading. If it is
#, not possible to open }file_name} for reading, ??@{in_stream
}
#, is returned.
procedure open_read_path@file_name
takes
file_name file_name
path vector[file_name]
returns in_stream
#: This procedure will open {file_name
} for reading by searching
#, each directory in {path
}. If no file can be found, ??@{in_stream
}
#, is returned.
procedure parse@file_name
takes
file_name_string string
file_system file_system
returns file_name
#: This procedure will return a {file_name
} object that contains
#, {file_name_string
}. ??@{file_name
} is returned if any errors
#, occur (should be an exception.)
procedure parse_helper@file_name
takes
file_name_string string
file_system file_system
size unsigned
returns file_name
#: This procedure will return a {file_name
} that corresponds to the
#, file name in {file_name_string
} that is {size
} characters long.
#, ??@{file_name
} is returned if any errors occur; actually, errors
#, should throw an exception. This routine is for internal use only.
#: Prefix procedures:
procedure prefix_prepend@file_name
takes
base_file_name file_name
prefix string
returns file_name
#: This procedure will return the file name that results from prepending
#, {prefix
} to {base_file_name
}. Be sure that prefix has any appropriate
#, period (`.') at the end (e.g. "x.".)
procedure prefix_get@file_name
takes
file_name file_name
returns string
#: This procedure will return the prefix from the end of {file_name
}.
#, If there is no prefix, "" is returned.
procedure prefix_match@file_name
takes
file_name file_name
prefix string
returns logical
#: This procedure will return {true
} if {file_name
} has a prefix
#, that exactly matches {prefix
} and {false
} otherwise.
procedure prefix_replace@file_name
takes
file_name file_name
old_prefix string
new_prefix string
returns file_name
#: This procedure will replace {old_prefix
} at the front of {file_name
}
#, with {new_prefix
} and return the resulting {file_name
} object.
#, It is a fatal error to call this procedure if {file_name
} is
#, not started by {old_prefix
}.
procedure prefix_remove@file_name
takes
file_name file_name
prefix string
returns file_name
#: This procedure will return the file name that results from removing
#, {prefix
} from {file_name
}. It is a fatal error to call this
#, procedure if {file_name
} does not end in {prefix
}.
procedure print@file_name
takes
file_name file_name
out_stream out_stream
returns_nothing
#: This procedure will print {file_name
} to {out_stream
}.
#, in {size_get
}@{file_name
}.
procedure print_helper@file_name
takes
file_name file_name
out_stream out_stream
returns logical
#: This procedure will print {file_name
} to {out_stream
}.
#, in {size_get
}@{file_name
}.
procedure read_open@file_name
takes
file_name file_name
errors errors
returns in_stream
#: This procedure will open {file_name
} for reading and return the
#, associated open {in_stream
} object. If {file_name
} can not be
#, opened, an error message is output to {errors
} and ??@{in_stream
}
#, is returned.
procedure rename@file_name
takes
old_file_name file_name
new_file_name file_name
errors errors
returns logical
#: This procedure will rename {old_file_name
} to {new_file_name
}.
#, If any error occurs, {true
} is returned and {false
} otherwise.
#, If {error_stream
} is not identical to ??@{out_stream
}, an
#, error message is output to {errors
} when an error occurs.
procedure status_update@file_name
takes
file_name file_name
returns logical
#: This procedure will update the {status
} object associated
#, with {file_name
}. If there is no {status_mode
} object, one
#, will be created. {true
} is returned if no corresponding file
#, exists; otherwise, {false
} is returned.
procedure string_append@file_name
takes
file_name file_name
buffer string
returns_nothing
#: This procedure will append {file_name
} to {buffer
} (which must
#, be writable.)
procedure string_append_helper@file_name
takes
file_name file_name
buffer string
returns logical
#: This procedure will append {file_name
} to {buffer
}.
procedure string_convert@file_name
takes
file_name file_name
returns string
#: This procedure will convert {file_name
} to a {string
} and return it.
#: Suffix procedures:
procedure suffix_append@file_name
takes
base_file_name file_name
suffix string
returns file_name
#: This procedure will return the file name that results from appending
#, {suffix
} to {base_file_name
}. Be sure that suffix has any appropriate
#, period (`.') at the beginning (e.g. ".txt").
procedure suffix_get@file_name
takes
file_name file_name
returns string
#: This procedure will return the suffix from the end of {file_name
}.
#, If there is no suffix, "" is returned.
procedure suffix_match@file_name
takes
file_name file_name
suffix string
returns logical
#: This procedure will return {true
} if {file_name
} has a suffix
#, that exactly matches {suffix
} and {false
} otherwise.
procedure suffix_replace@file_name
takes
file_name file_name
old_suffix string
new_suffix string
returns file_name
#: This procedure will replace {old_suffix
} at the end of {file_name
}
#, with {new_suffix
} and return the resulting {file_name
} object.
#, It is a fatal error to call this procedure if {file_name
} is
#, not terminated by {old_suffix
}.
procedure suffix_remove@file_name
takes
file_name file_name
suffix string
returns file_name
#: This procedure will return the file name that results from removing
#, {suffix
} from {file_name
}. It is a fatal error to call this
#, procedure if {file_name
} does not end in {suffix
}.
procedure tail@file_name
takes
full_file_name file_name
prefix_file_name file_name
returns file_name
#: This procedure will match the first part of {prefix_file_name
}
#, to {full_file_name
} and return the remaining portion of the
#, file name.
procedure user_create@file_name
takes
file_system file_system
user_name string
returns file_name
#: This procedure will create and return file_name from {file_system
}
#, that points to {user_name
}'s home directory (i.e. "~{user_name
}".)
procedure write_open@file_name
takes
file_name file_name
errors errors
returns out_stream
#: This procedure will open {file_name
} for writing and return the
#, associated open {in_stream
} object. If {file_name
} can not be
#, opened, an error message is output to {errors
} and ??@{in_stream
}
#, is returned.
#: {string
} procedures:
procedure file_name_convert@string
takes
file_name_string string
returns file_name
#: This procedure will convert {file_name_string
} into a {file_name
}
#, object and return it.