2 % (c) The AQUA Project, Glasgow University, 1993-1994
4 \section[Stdio]{Wrappers for C standard-IO library}
13 import List ( (++), foldr )
14 import PS -- ( _PackedString )
20 data _FILE = _FILE Addr#
21 instance _CCallable _FILE
22 instance _CReturnable _FILE
24 instance Eq _FILE where
25 (_FILE a) == (_FILE b) = a `eqAddr#` b
26 (_FILE a) /= (_FILE b) = if a `eqAddr#` b then False else True
28 type FILE_DESCRIPTOR = Int
30 fopen :: String -- as w/ C fopen, name
31 -> String -- type of open (as w/ C)
32 -> PrimIO _FILE -- FILE* returned; will be ``NULL''
33 -- if things go wrong...
36 freopen :: String -> String -> _FILE -> PrimIO _FILE
37 fdopen :: FILE_DESCRIPTOR -> String -> PrimIO _FILE
40 = _casm_ ``%r = (A_) fopen((char *) %0, (char *) %1);'' name descr
42 freopen name descr file
43 = _casm_ ``%r = (A_) freopen((char *) %0, (char *) %1, (FILE *) %2);''
47 = _casm_ ``%r = (A_) fdopen((int) %0, (char *) %1);'' fd descr
49 ---------------------------------------------------------------
50 fclose, fflush :: _FILE -> PrimIO Int
53 = _casm_ ``%r = fclose((FILE *) %0);'' file
56 = _casm_ ``%r = fflush((FILE *) %0);'' file
58 fread :: Int -> Int -> _FILE -> PrimIO (Int, _ByteArray Int)
60 fread size nitems file
62 barr_end = size * nitems - 1
64 newCharArray (0::Int, barr_end){-malloc!?-} `thenStrictlyST` \ barr ->
66 _ccall_ fread barr size nitems file `thenPrimIO` \ num_read ->
68 unsafeFreezeByteArray barr `thenStrictlyST` \ frozen ->
70 returnPrimIO (num_read, frozen)
72 fwrite :: _ByteArray Int -> Int -> Int -> _FILE -> PrimIO Int
74 fwrite barr size nitems file
75 = _ccall_ fwrite barr size nitems file `thenPrimIO` \ num_written ->
76 returnPrimIO num_written
78 --fgetc :: _FILE -> B Char
79 --fputc :: Char -> _FILE -> B Char
81 -- ===============================================================
84 -- in Haskell, these are just synonyms for getc and putc
87 fgets :: C_FILE -> Int -> B [Char]
88 puts :: [Char] -> B Bool -- ??? ToDo: better error indicator
89 fputs :: [Char] -> C_FILE -> B Bool
93 feof :: C_FILE -> B Int -- ToDo: Bool?
94 ferror :: C_FILE -> B Int -- ToDo: something else?
95 fileno :: C_FILE -> B Int
96 clearerr :: C_FILE -> B ()
98 popen :: [Char] -> [Char] -> B C_FILE
99 pclose :: C_FILE -> B Int -- exit status
101 tmpfile :: B C_FILE -- B (Maybe C_FILE) ???
102 tmpnam :: [Char] -> B [Char]
103 tempnam :: [Char] -> [Char] -> B [Char]
105 lseek :: C_FileDes -> C_off_t -> Int -> B C_off_t