summaryrefslogtreecommitdiff
path: root/ghc/lib/glaExts/Stdio.lhs
blob: 518e504da0c2a25a397357704943bda28e70d8e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
%
% (c) The AQUA Project, Glasgow University, 1993-1994
%
\section[Stdio]{Wrappers for C standard-IO library}

\begin{code}
module Stdio where

import Cls
import Core
import IInt
import IList
import List		( (++), foldr )
import PS		-- ( _PackedString )
import TyArray
import PreludeGlaST
import Text

data _FILE = _FILE Addr#
instance _CCallable   _FILE
instance _CReturnable _FILE

instance Eq _FILE where
    (_FILE a) == (_FILE b) = a `eqAddr#` b
    (_FILE a) /= (_FILE b) = if a `eqAddr#` b then False else True

type FILE_DESCRIPTOR = Int

fopen	:: String		-- as w/ C fopen, name
	-> String		-- type of open (as w/ C)
	-> PrimIO _FILE		-- FILE* returned; will be ``NULL''
				-- if things go wrong...

-- similarly...
freopen	:: String -> String -> _FILE -> PrimIO _FILE
fdopen	:: FILE_DESCRIPTOR -> String -> PrimIO _FILE

fopen name descr
  = _casm_ ``%r = (A_) fopen((char *) %0, (char *) %1);'' name descr

freopen name descr file
  = _casm_ ``%r = (A_) freopen((char *) %0, (char *) %1, (FILE *) %2);'' 
	name descr file

fdopen fd descr
  = _casm_ ``%r = (A_) fdopen((int) %0, (char *) %1);'' fd descr

---------------------------------------------------------------
fclose, fflush :: _FILE -> PrimIO Int

fclose file
  = _casm_ ``%r = fclose((FILE *) %0);'' file

fflush file
  = _casm_ ``%r = fflush((FILE *) %0);'' file

fread :: Int -> Int -> _FILE -> PrimIO (Int, _ByteArray Int)

fread size nitems file
  = let
	barr_end = size * nitems - 1
    in
    newCharArray (0::Int, barr_end){-malloc!?-} `thenStrictlyST` \ barr ->

    _ccall_ fread barr size nitems file `thenPrimIO` \ num_read ->

    unsafeFreezeByteArray barr	`thenStrictlyST` \ frozen ->

    returnPrimIO (num_read, frozen)

fwrite :: _ByteArray Int -> Int -> Int -> _FILE -> PrimIO Int

fwrite barr size nitems file
  = _ccall_ fwrite barr size nitems file `thenPrimIO` \ num_written ->
    returnPrimIO num_written

--fgetc	:: _FILE -> B Char
--fputc	:: Char -> _FILE -> B Char

-- ===============================================================
{- LATER

-- in Haskell, these are just synonyms for getc and putc

gets	:: B [Char]
fgets	:: C_FILE -> Int -> B [Char]
puts	:: [Char] -> B Bool	-- ??? ToDo: better error indicator
fputs	:: [Char] -> C_FILE -> B Bool

-- getw, putw omitted

feof	:: C_FILE -> B Int -- ToDo: Bool?
ferror	:: C_FILE -> B Int -- ToDo: something else?
fileno	:: C_FILE -> B Int
clearerr :: C_FILE -> B ()

popen	:: [Char] -> [Char] -> B C_FILE
pclose	:: C_FILE -> B Int -- exit status

tmpfile :: B C_FILE	-- B (Maybe C_FILE) ???
tmpnam	:: [Char] -> B [Char]
tempnam	:: [Char] -> [Char] -> B [Char]

lseek	:: C_FileDes -> C_off_t -> Int -> B C_off_t

ctermid	:: B [Char]
cuserid	:: B [Char]

-- nothing yet:
--  printf
--  fprintf
--  sprintf
--  scanf
--  fscanf
-}
\end{code}