#line 750 "/home/ubuntu/felix/src/packages/program.fdoc"
class Shell_class[OS, process_status_t]
{
virtual fun quote_arg:string->string;
fun quote_args (s:list[string]) : string => catmap[string] ' ' quote_arg s;
virtual fun quote_line_for_system: string->string;
virtual fun parse: string -> list[string];
gen raw_system: string -> int = "::std::system($1.c_str())"
requires Cxx_headers::cstdlib
;
gen basic_system (cmd: string) :int =>
cmd.quote_line_for_system.raw_system
;
gen system (cmd:string) = {
if Env::getenv "FLX_SHELL_ECHO" != "" do
eprintln$ "[system] " + cmd;
done
return basic_system cmd;
}
gen system (args:list[string]) : int =>
args.quote_args.system
;
gen system[T with Iterable[T,string]] (args:T) : int =
{
var lst = Empty[string];
for arg in args do
lst = lst + arg;
done
return system lst;
}
virtual fun quote_line_for_popen: string -> string;
virtual gen raw_get_stdout : string -> int * string;
gen basic_get_stdout (cmd: string) : int * string =>
cmd.quote_line_for_popen.raw_get_stdout
;
gen get_stdout (cmd:string) : int * string = {
if Env::getenv "FLX_SHELL_ECHO" != "" do
eprintln$ "[get_stdout] " + cmd;
done
return basic_get_stdout cmd;
}
gen get_stdout (args:list[string]) : int * string =>
args.quote_args.get_stdout
;
gen get_stdout[T with Iterable[T,string]] (args:T) : int * string =
{
var lst = Empty[string];
for arg in args do
lst = lst + arg;
done
return get_stdout lst;
}
}
class Shell {
if PLAT_WIN32 do
inherit CmdExe;
else
inherit Bash;
done
}