Informal Introduction
From the logical point of view directories differ from regular files, however Unix
treates them in the same way. Generic file is used to specify the 'general' file
which may be either directory or regular file.
(0) CHARACTERISTICS
-type specified: genericfile
-features: deterministic, non-parameterized
-foreign types: directory, sequence, byte, global, mystring
(1) SYNTAX
ACCESS-PROGRAMS
Arg#1 | Arg#2 | Arg#3 | Result Type | CREATESEQ | genericfile:VO | sequence:V | | | CREATEDIR | genericfile:VO | directory:V | | | RELEASE | genericfile:VO | | | | TYPE | genericfile:V | | | int | PUT | genericfile:VO | int:V | byte:V | | GET | genericfile:V | int:V | byte:VO | | TRUNC | genericfile:VO | int:V | | | SIZE | genericfile:V | | | int | CREATE | genericfile:VO | mystring:V | int:V | | REMOVE | genericfile:VO | mystring:V | | | GETINODETABLEINDEX | genericfile:V | mystring:V | | int | EXISTS | genericfile:V | mystring:V | | bool | ISFULL | genericfile:V | | | bool | |
---|
(2) CANONICAL TRACES
canonical(T) T = _ ( s:<sequence> [T = CREATESEQ(*, s) ] d:<directory> [T = CREATEDIR(*, d) ])AUXILIARY FUNCTIONS
interrorval: <int>
interrorval() = -1
errorval: <byte>
errorval() = -1
t_empty: <int>
t_empty() = -1
t_seq: <int>
t_seq() = 0
t_dir: <int>
t_dir() = 1
type: <genericfile> <int>
type(gf) =
Condition | Value |
---|---|
gf = _ | t_empty() |
s:<sequence> [gf = CREATESEQ(*, s) ] | t_seq() |
d:<directory> [gf = CREATEDIR(*, d) ] | t_dir() |
getseq: <genericfile> <sequence>
getseq(gf) =
Condition | Value |
---|---|
type(gf) t_seq() | sequence::_ |
type(gf) = t_seq() | s where s:<sequence> [gf = CREATESEQ(*, s) ] |
getdir: <genericfile> <directory>
getdir(gf) =
Condition | Value |
---|---|
type(gf) t_dir() | directory::_ |
type(gf) = t_dir() | d where d:<directory> [gf = CREATEDIR(*, d) ] |
get: <genericfile> × <int> <byte>
get(gf, pos) =
Condition | Value |
---|---|
type(gf) t_seq() (pos < 0 pos global::G_sequence_size()) | errorval() |
type(gf) = t_seq() (pos 0 pos < global::G_sequence_size()) | sequence::get(getseq(gf), pos) |
size: <genericfile> <int>
size(gf) =
Condition | Value |
---|---|
type(gf) t_seq() | interrorval() |
type(gf) = t_seq() | sequence::size(getseq(gf)) |
exists: <genericfile> × <mystring> <bool>
exists(gf, name) =
Condition | Value |
---|---|
type(gf) t_dir() | false |
type(gf) = t_dir() | directory::exists(getdir(gf), name) |
getinodetableindex: <genericfile> × <mystring> <int>
getinodetableindex(gf, name) =
Condition | Value |
---|---|
type(gf) t_dir() | interrorval() |
type(gf) = t_dir() | directory::getinodetableindex(getdir(gf), name) |
isfull: <genericfile> <bool>
isfull(gf) =
Condition | Value |
---|---|
type(gf) t_dir() | false |
type(gf) = t_dir() | directory::isfull(getdir(gf)) |
(3) SEMANTICS
ACCESS-PROGRAMSLegality(CREATESEQ((n, T), s)) =
Condition | Value |
---|---|
type(T) t_seq() type(T) t_empty() | %illegal operation% |
type(T) = t_seq() type(T) = t_empty() | %legal% |
CREATESEQ((n, T) , s) = CREATESEQ(*, s)
Legality(CREATEDIR((n, T), d)) =
Condition | Value |
---|---|
type(T) t_seq() type(T) t_empty() | %illegal operation% |
type(T) = t_seq() type(T) = t_empty() | %legal% |
CREATEDIR((n, T) , d) = CREATEDIR(*, d)
Legality(RELEASE((n, T))) = %legal%
RELEASE((n, T) ) = _
Legality(TYPE(T)) = %legal%
TYPE(T) = type(T)
Legality(PUT((n, T), pos, b)) =
Condition | Value |
---|---|
type(T) t_seq() (pos < 0 pos global::G_sequence_size()) | %type mismatch or invalid position% |
type(T) = t_seq() (pos 0 pos < global::G_sequence_size()) | %legal% |
PUT((n, T) , pos, b) = CREATESEQ(*, sequence::PUT((*1,getseq(T)) , pos, b))
Legality(GET(T, pos, (n, b))) =
Condition | Value |
---|---|
type(T) t_seq() (pos < 0 pos global::G_sequence_size()) | %type mismatch or invalid position% |
type(T) = t_seq() (pos 0 pos < global::G_sequence_size()) | %legal% |
GET(T, pos, (n, b) ) = get(T, pos)
Legality(TRUNC((n, T), pos)) =
Condition | Value |
---|---|
type(T) t_seq() (pos < 0 pos global::G_sequence_size()) | %type mismatch or invalid position% |
type(T) = t_seq() (pos 0 pos < global::G_sequence_size()) | %legal% |
TRUNC((n, T) , pos) = CREATESEQ(*, sequence::TRUNC((*1,getseq(T)) , pos))
Legality(SIZE(T)) = %legal%
SIZE(T) = size(T)
Legality(CREATE((n, T), name, v)) =
Condition | Value |
---|---|
type(T) t_dir() (exists(T, name) (¬mystring::iscorrectfilename(name) (v < 0 length(T) = global::G_directory_size() ))) | %type mismatch, invalid file name or i-node number% |
type(T) = t_dir() ¬(exists(T, name) (mystring::iscorrectfilename(name) (v 0 length(T) < global::G_directory_size()))) | %legal% |
CREATE((n, T) , name, v) = CREATEDIR(*, directory::CREATE((*1,getdir(T)) , name, v))
Legality(REMOVE((n, T), name)) =
Condition | Value |
---|---|
type(T) t_dir() ¬exists(T, name) | %type mismatch or file doesn't exist% |
type(T) = t_dir() exists(T, name) | %legal% |
REMOVE((n, T) , name) = CREATEDIR(*, directory::REMOVE((*1,getdir(T)) , name))
Legality(GETINODETABLEINDEX(T, name)) = %legal%
GETINODETABLEINDEX(T, name) = getinodetableindex(T, name)
Legality(EXISTS(T, name)) =
Condition | Value |
---|---|
type(T) t_dir() | %type mismatch% |
type(T) = t_dir() | %legal% |
EXISTS(T, name) = exists(T, name)
Legality(ISFULL(T)) =
Condition | Value |
---|---|
type(T) t_dir() | %type mismatch% |
type(T) = t_dir() | %legal% |
ISFULL(T) = isfull(T)