94 lines
1.9 KiB
Text
94 lines
1.9 KiB
Text
|
|
|||
|
‹ShellTerm› :=
|
|||
|
| Lit : "«String»" | "«Path»~«Sep Char '/'»~«Seq Char»~«TerminatedArray AsciiChar~Byte 0»"
|
|||
|
| Var : $«ProcessArgument~ℕ~«PositionalInt 10 BigEndian»»
|
|||
|
| Sub : $(«Process»)
|
|||
|
|
|||
|
$PATH:›Sequence Path‹
|
|||
|
:›SeparatedSequence Char '/' ‹
|
|||
|
:›Sequence ›Sequence Char‹‹
|
|||
|
:›‹
|
|||
|
:‹SeparatedSequence Char ':'‹
|
|||
|
:‹Sequence Char›
|
|||
|
&‹OsString~›
|
|||
|
~‹List Char~Vec Byte›
|
|||
|
|
|||
|
Seq
|
|||
|
Vec
|
|||
|
Sep
|
|||
|
read :: Sep -> Seq
|
|||
|
read (Sep xs) d ->
|
|||
|
deco :: Style -> Seq ->
|
|||
|
|
|||
|
ShellTerm::eval t:‹ShellTerm› -> ‹String› {
|
|||
|
match t {
|
|||
|
ShellTerm::Lit "s:«String»" -> {
|
|||
|
|
|||
|
}
|
|||
|
ShellTerm::Var var:$
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
$PATH : ‹Sequence Path› ~ ‹SeparatedSequence Char ':'›
|
|||
|
|
|||
|
ShellTerm::eval := «» -> «»
|
|||
|
«Path» :> «»
|
|||
|
|
|||
|
‹Path› := [ PathSegment ] ~ ‹List ›
|
|||
|
|
|||
|
[Char]
|
|||
|
:separator '/'
|
|||
|
:
|
|||
|
|
|||
|
‹ a: Int x b: Int ›
|
|||
|
( a b )
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// Process is a Structure Type
|
|||
|
‹Process› := {
|
|||
|
env : ‹ Symbol -> ShellTerm ›
|
|||
|
exe : ‹ Path ›
|
|||
|
args : ‹ [ShellTerm] ›
|
|||
|
stdin : ‹ Pipe ›
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// OsString is an Abstraction Type
|
|||
|
[OsString] := [Sequence AsciiChar] ~ [Sequence Byte] ~ [TerminatedSequence Byte 0] ~ [Pointer Byte] ~ [MachineWord]
|
|||
|
|
|||
|
execve := {
|
|||
|
‹ Process
|
|||
|
~ { env : Symbol, exe: Path~, } ›
|
|||
|
->
|
|||
|
}
|
|||
|
|
|||
|
precedence of operators: '~' < ':' < '[ ]' < '{ }'
|
|||
|
|
|||
|
<Ls> := [ < ]
|
|||
|
|
|||
|
|
|||
|
|
|||
|
‹Process exe=/bin/ls› : ‹Process› := {
|
|||
|
args : ‹ [ProcessArgument] ~ []
|
|||
|
}
|
|||
|
|
|||
|
:> «PosixShellScript ~ String» { ... }
|
|||
|
:> «TerminalView» { ... }
|
|||
|
|
|||
|
|
|||
|
»ProcessId«~»MachineInt«~»MachineWord«~»Register«
|
|||
|
«ProcessId»~«MachineInt»~«MachineWord»~«Register»
|
|||
|
|
|||
|
Pipe::read = {
|
|||
|
fd: const ( FileDescriptor ~ MachineInt ~ Register ~ EAX )
|
|||
|
buf: ( Array Byte ~ )
|
|||
|
} ->
|
|||
|
|
|||
|
stdout := «ProcessId» -> «FileDescriptor»~«MachineInt»~«Register»~«EAX»
|
|||
|
|
|||
|
|
|||
|
poorly-written shell scripts often do not handle filenames with spaces.
|
|||
|
|