on master help sign in
Merge pull request #2896 from sheganinans/master

Greatly expanded file modes

commit2a6b577353721bca7bd07085ea9f599986cb4c96 authorNiklas Larsson <metaniklas@gmail.com> dateSun 7 Feb 2016, 23:19 (11 years ago) parent80e707e009a5d7
2 files changed+23−11
libs/prelude/Prelude/File.idr+22−10 test/io001/test004.idr+1−1
libs/prelude/Prelude/File.idr+22−10
@@ -96,17 +96,33 @@ validFile (FHandle h) = do x <- nullPtr h
9696 return (not x)
9797
9898||| Modes for opening files
99−data Mode = Read | Write | ReadWrite
99+data Mode = Read | WriteTruncate | Append | ReadWrite | ReadWriteTruncate | ReadAppend
100+
101+Write : Mode
102+Write = WriteTruncate
103+%deprecate Write "Please use WriteTruncate instead."
104+
105+modeStr : Mode -> String
106+modeStr Read = "r"
107+modeStr WriteTruncate = "w"
108+modeStr Append = "a"
109+modeStr ReadWrite = "r+"
110+modeStr ReadWriteTruncate = "w+"
111+modeStr ReadAppend = "a+"
100112
101113||| Open a file
102114||| @ f the filename
103−||| @ m the mode; either Read, Write, or ReadWrite
115+||| @ m the mode; either Read, WriteTruncate, Append, ReadWrite, ReadWriteTruncate, or ReadAppend
104116export
105117openFile : (f : String) -> (m : Mode) -> IO (Either FileError File)
106−openFile f m = fopen f (modeStr m) where
107− modeStr Read = "r"
108− modeStr Write = "w"
109− modeStr ReadWrite = "r+"
118+openFile f m = fopen f (modeStr m)
119+
120+||| Open a file using C11 extended modes.
121+||| @ f the filename
122+||| @ m the mode; either Read, WriteTruncate, Append, ReadWrite, ReadWriteTruncate, or ReadAppend
123+export
124+openFileX : (f : String) -> (m : Mode) -> IO (Either FileError File)
125+openFileX f m = fopen f $ modeStr m ++ "x"
110126
111127private
112128do_fclose : Ptr -> IO ()
@@ -142,10 +158,6 @@ popen f m = do ptr <- do_popen f (modeStr m)
142158 then do err <- getFileError
143159 return (Left err)
144160 else return (Right (FHandle ptr))
145− where
146− modeStr Read = "r"
147− modeStr Write = "w"
148− modeStr ReadWrite = "r+"
149161
150162export
151163pclose : File -> IO ()
test/io001/test004.idr+1−1
@@ -17,7 +17,7 @@ dumpFile fn = do { Right h <- openFile fn Read
1717 closeFile h }
1818
1919main : IO ()
20−main = do { Right h <- openFile "testfile" Write
20+main = do { Right h <- openFile "testfile" WriteTruncate
2121 fPutStr h "Hello!\nWorld!\n...\n3\n4\nLast line\n"
2222 closeFile h
2323 putStrLn "Reading testfile"