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 )
19 data _FILE = _FILE Addr#
20 instance _CCallable _FILE
21 instance _CReturnable _FILE
23 instance Eq _FILE where
24 (_FILE a) == (_FILE b) = a `eqAddr#` b
25 (_FILE a) /= (_FILE b) = if a `eqAddr#` b then False else True
27 type FILE_DESCRIPTOR = Int
29 fopen :: String -- as w/ C fopen, name
30 -> String -- type of open (as w/ C)
31 -> PrimIO _FILE -- FILE* returned; will be ``NULL''
32 -- if things go wrong...
35 freopen :: String -> String -> _FILE -> PrimIO _FILE
36 fdopen :: FILE_DESCRIPTOR -> String -> PrimIO _FILE
39 = _casm_ ``%r = (A_) fopen((char *) %0, (char *) %1);'' name descr
41 freopen name descr file
42 = _casm_ ``%r = (A_) freopen((char *) %0, (char *) %1, (FILE *) %2);''
46 = _casm_ ``%r = (A_) fdopen((int) %0, (char *) %1);'' fd descr
48 ---------------------------------------------------------------
49 fclose, fflush :: _FILE -> PrimIO Int
52 = _casm_ ``%r = fclose((FILE *) %0);'' file
55 = _casm_ ``%r = fflush((FILE *) %0);'' file
57 fread :: Int -> Int -> _FILE -> PrimIO (Int, _ByteArray Int)
59 fread size nitems file
61 barr_end = size * nitems - 1
63 newCharArray (0::Int, barr_end){-malloc!?-} `thenStrictlyST` \ barr ->
65 _ccall_ fread barr size nitems file `thenPrimIO` \ num_read ->
67 unsafeFreezeByteArray barr `thenStrictlyST` \ frozen ->
69 returnPrimIO (num_read, frozen)
71 fwrite :: _ByteArray Int -> Int -> Int -> _FILE -> PrimIO Int
73 fwrite barr size nitems file
74 = _ccall_ fwrite barr size nitems file `thenPrimIO` \ num_written ->
75 returnPrimIO num_written
77 --fgetc :: _FILE -> B Char
78 --fputc :: Char -> _FILE -> B Char
80 -- ===============================================================
83 -- in Haskell, these are just synonyms for getc and putc
86 fgets :: C_FILE -> Int -> B [Char]
87 puts :: [Char] -> B Bool -- ??? ToDo: better error indicator
88 fputs :: [Char] -> C_FILE -> B Bool
92 feof :: C_FILE -> B Int -- ToDo: Bool?
93 ferror :: C_FILE -> B Int -- ToDo: something else?
94 fileno :: C_FILE -> B Int
95 clearerr :: C_FILE -> B ()
97 popen :: [Char] -> [Char] -> B C_FILE
98 pclose :: C_FILE -> B Int -- exit status
100 tmpfile :: B C_FILE -- B (Maybe C_FILE) ???
101 tmpnam :: [Char] -> B [Char]
102 tempnam :: [Char] -> [Char] -> B [Char]
104 lseek :: C_FileDes -> C_off_t -> Int -> B C_off_t