#line 191 "/home/ubuntu/felix/src/packages/filesystem.fdoc"
class FileStat_class[OS,stat_t, mode_t]
{
virtual proc stat: string * &stat_t * ∫
virtual proc utime: string * double * double * ∫
virtual gen chmod: string * mode_t -> int;
virtual gen umask: mode_t -> mode_t;
variant file_type_t =
| PIPE
| STREAM
| DIRECTORY
| BLOCK
| REGULAR
| SYMLINK
| SOCKET
| INDETERMINATE
| NONEXISTANT
| NOPERMISSION
;
virtual fun file_type: &stat_t -> file_type_t;
gen stat(file: string, statbuf:&stat_t) = {
var res: int;
stat(file, statbuf, &res);
return res == 0;
}
fun mtime: &stat_t -> double = "(double)($1->st_mtime)";
fun ctime: &stat_t -> double = "(double)($1->st_ctime)";
fun filetime(f:string):double =
{
var b: stat_t;
var err:int;
stat(f,&b,&err);
return if err == 0 then mtime (&b) else 0.0 endif;
}
gen utime(f:string, a:double, m:double): bool = {
var r:int;
utime(f,a,m,&r);
return r == 0;
}
gen utime(f:string, t:double) => utime(f,t,t);
fun fileexists(f:string):bool=> filetime f != 0.0;
fun filetype(f:string):file_type_t =
{
var b:stat_t;
var err:int;
stat(f,&b,&err);
return
if err == 0 then file_type (&b)
elif errno == EACCES then NOPERMISSION
elif errno == ENOENT then NONEXISTANT
else INDETERMINATE
endif
;
}
fun past_time () => -1.0;
fun future_time () => double(ulong(-1));
fun strfiletime0 (x:double) = {
return
if x == #past_time then "BIG BANG"
elif x == #future_time then "BIG CRUNCH"
else fmt (x, fixed (0,3))
endif
;
}
fun strfiletime (x:double) = {
assert x != 0.0;
return strfiletime0 x;
}
fun dfiletime(var f:string, dflt:double)=
{
var x = FileStat::filetime (f);
x = if x == 0.0 then dflt else x endif;
return x;
}
}
class FileStat {
if PLAT_WIN32 do
inherit Win32FileStat;
else
inherit PosixFileStat;
done
}