on master help sign in
Add functions for checking file timestamps
commit7c9d72a0c793fd0fd8fa146cafa20b0b79248bd1 authorEdwin Brady <ecb10@st-andrews.ac.uk> dateWed 21 Mar 2018, 18:20 (9 years ago) parent8c66955
3 files changed+93−5
libs/prelude/Prelude/File.idr+52−5 rts/idris_stdfgn.c+36 rts/idris_stdfgn.h+5
libs/prelude/Prelude/File.idr+52−5
@@ -141,17 +141,64 @@ private
141141do_getFileSize : Ptr -> IO Int
142142do_getFileSize h = foreign FFI_C "fileSize" (Ptr -> IO Int) h
143143
144+private
145+do_getFileAccessTime : Ptr -> IO Integer
146+do_getFileAccessTime h =
147+ do MkRaw i <- foreign FFI_C "fileAccessTime" (Ptr -> IO (Raw Integer)) h
148+ pure i
149+
150+private
151+do_getFileModifiedTime : Ptr -> IO Integer
152+do_getFileModifiedTime h =
153+ do MkRaw i <- foreign FFI_C "fileModifiedTime" (Ptr -> IO (Raw Integer)) h
154+ pure i
155+
156+private
157+do_getFileStatusTime : Ptr -> IO Integer
158+do_getFileStatusTime h =
159+ do MkRaw i <- foreign FFI_C "fileStatusTime" (Ptr -> IO (Raw Integer)) h
160+ pure i
161+
144162||| Return the size of a File
145163||| Returns an error if the File is not an ordinary file (e.g. a directory)
146164||| Also note that this currently returns an Int, which may overflow if the
147165||| file is very big
148166export
149167fileSize : File -> IO (Either FileError Int)
150−fileSize (FHandle h) = do s <- do_getFileSize h
151− if (s < 0)
152− then do err <- getFileError
153− pure (Left err)
154− else pure (Right s)
168+fileSize (FHandle h)
169+ = do s <- do_getFileSize h
170+ if (s < 0)
171+ then do err <- getFileError
172+ pure (Left err)
173+ else pure (Right s)
174+
175+export
176+fileModifiedTime : File -> IO (Either FileError Integer)
177+fileModifiedTime (FHandle h)
178+ = do s <- do_getFileModifiedTime h
179+ if (s < 0)
180+ then do err <- getFileError
181+ pure (Left err)
182+ else pure (Right s)
183+
184+export
185+fileAccessTime : File -> IO (Either FileError Integer)
186+fileAccessTime (FHandle h)
187+ = do s <- do_getFileAccessTime h
188+ if (s < 0)
189+ then do err <- getFileError
190+ pure (Left err)
191+ else pure (Right s)
192+
193+export
194+fileStatusTime : File -> IO (Either FileError Integer)
195+fileStatusTime (FHandle h)
196+ = do s <- do_getFileStatusTime h
197+ if (s < 0)
198+ then do err <- getFileError
199+ pure (Left err)
200+ else pure (Right s)
201+
155202
156203private
157204do_fread : Ptr -> IO' l String
rts/idris_stdfgn.c+36
@@ -61,6 +61,42 @@ int fileSize(void* h) {
6161 }
6262}
6363
64+VAL fileAccessTime(void* h) {
65+ FILE* f = (FILE*)h;
66+ int fd = fileno(f);
67+
68+ struct stat buf;
69+ if (fstat(fd, &buf) == 0) {
70+ return MKBIGI(buf.st_atime);
71+ } else {
72+ return MKBIGI(-1);
73+ }
74+}
75+
76+VAL fileModifiedTime(void* h) {
77+ FILE* f = (FILE*)h;
78+ int fd = fileno(f);
79+
80+ struct stat buf;
81+ if (fstat(fd, &buf) == 0) {
82+ return MKBIGI(buf.st_mtime);
83+ } else {
84+ return MKBIGI(-1);
85+ }
86+}
87+
88+VAL fileStatusTime(void* h) {
89+ FILE* f = (FILE*)h;
90+ int fd = fileno(f);
91+
92+ struct stat buf;
93+ if (fstat(fd, &buf) == 0) {
94+ return MKBIGI(buf.st_ctime);
95+ } else {
96+ return MKBIGI(-1);
97+ }
98+}
99+
64100typedef struct {
65101 DIR* dirptr;
66102 int error;
rts/idris_stdfgn.h+5
@@ -15,6 +15,11 @@ int fileError(void* h);
1515// Returns a negative number if not a file (e.g. directory or device)
1616int fileSize(void* h);
1717
18+// Return a negative number if not a file (e.g. directory or device)
19+VAL fileAccessTime(void* h);
20+VAL fileModifiedTime(void* h);
21+VAL fileStatusTime(void* h);
22+
1823void* idris_dirOpen(char* dname);
1924void idris_dirClose(void* h);
2025char* idris_nextDirEntry(void* h);