relicense to 0BSD
[pforth] / csrc / pf_io.c
CommitLineData
8e9db35f
PB
1/* @(#) pf_io.c 96/12/23 1.12 */
2/***************************************************************
3** I/O subsystem for PForth based on 'C'
4**
5** Author: Phil Burk
6** Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom
7**
1f99f95d
S
8** Permission to use, copy, modify, and/or distribute this
9** software for any purpose with or without fee is hereby granted.
10**
11** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
12** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
14** THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
15** CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
16** FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
17** CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18** OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
8e9db35f
PB
19**
20****************************************************************
21** 941004 PLB Extracted IO calls from pforth_main.c
22***************************************************************/
23
24#include "pf_all.h"
25
26
27/***************************************************************
28** Initialize I/O system.
29*/
30void ioInit( void )
31{
32 /* System dependant terminal initialization. */
33 sdTerminalInit();
34}
35void ioTerm( void )
36{
37 sdTerminalTerm();
38}
39
40/***************************************************************
41** Send single character to output stream.
42*/
43void ioEmit( char c )
44{
45 cell_t Result;
46
47 Result = sdTerminalOut(c);
48 if( Result < 0 ) EXIT(1);
49
50 if( gCurrentTask )
51 {
52 if(c == '\n')
53 {
54 gCurrentTask->td_OUT = 0;
55 sdTerminalFlush();
56 }
57 else
58 {
59 gCurrentTask->td_OUT++;
60 }
61 }
62}
63
64/***************************************************************
65** Send an entire string..
66*/
67void ioType( const char *s, cell_t n )
68{
69 cell_t i;
70
71 for( i=0; i<n; i++)
72 {
73 ioEmit ( *s++ );
74 }
75}
76
77/***************************************************************
78** Return single character from input device, always keyboard.
79*/
80cell_t ioKey( void )
81{
82 cell_t c;
83 sdEnableInput();
84 c = sdTerminalIn();
85 sdDisableInput();
86 return c;
87}
88
89/**************************************************************
90** Receive line from keyboard.
91** Return number of characters enterred.
92*/
93#define SPACE (0x20)
94#define BACKSPACE (0x08)
95#define DELETE (0x7F)
96cell_t ioAccept( char *buffer, cell_t maxChars )
97{
98 int c;
99 int len;
100 char *p;
101
102DBUGX(("ioAccept(0x%x, 0x%x)\n", buffer, len ));
103
104 sdEnableInput();
105
106 p = buffer;
107 len = 0;
108 while(len < maxChars)
109 {
110 c = sdTerminalIn();
111 switch(c)
112 {
113 case '\r':
114 case '\n':
115 DBUGX(("EOL\n"));
116 goto gotline;
117 break;
118
119 case BACKSPACE:
120 case DELETE:
121 if( len > 0 ) /* Don't go beyond beginning of line. */
122 {
123 EMIT(BACKSPACE);
124 EMIT(' ');
125 EMIT(BACKSPACE);
126 p--;
127 len--;
128 }
129 break;
130
131 default:
132 sdTerminalEcho( (char) c );
133 *p++ = (char) c;
134 len++;
135 break;
136 }
137
138 }
139
140gotline:
141 sdDisableInput();
142 sdTerminalEcho( SPACE );
143
144/* NUL terminate line to simplify printing when debugging. */
145 if( len < maxChars ) p[len] = '\0';
146
147 return len;
148}
149
150#define UNIMPLEMENTED(name) { MSG(name); MSG("is unimplemented!\n"); }
151
152
153/***********************************************************************************/
154/*********** File I/O **************************************************************/
155/***********************************************************************************/
156#ifdef PF_NO_FILEIO
157
158/* Provide stubs for standard file I/O */
159
160FileStream *PF_STDIN;
161FileStream *PF_STDOUT;
162
163cell_t sdInputChar( FileStream *stream )
164{
165 UNIMPLEMENTED("sdInputChar");
166 TOUCH(stream);
167 return -1;
168}
169
170FileStream *sdOpenFile( const char *FileName, const char *Mode )
171{
172 UNIMPLEMENTED("sdOpenFile");
173 TOUCH(FileName);
174 TOUCH(Mode);
175 return NULL;
176}
177cell_t sdFlushFile( FileStream * Stream )
178{
179 TOUCH(Stream);
180 return 0;
181}
182cell_t sdReadFile( void *ptr, cell_t Size, int32_t nItems, FileStream * Stream )
183{
184 UNIMPLEMENTED("sdReadFile");
185 TOUCH(ptr);
186 TOUCH(Size);
187 TOUCH(nItems);
188 TOUCH(Stream);
189 return 0;
190}
191cell_t sdWriteFile( void *ptr, cell_t Size, int32_t nItems, FileStream * Stream )
192{
193 UNIMPLEMENTED("sdWriteFile");
194 TOUCH(ptr);
195 TOUCH(Size);
196 TOUCH(nItems);
197 TOUCH(Stream);
198 return 0;
199}
ccd2b2a1 200cell_t sdSeekFile( FileStream * Stream, file_offset_t Position, int32_t Mode )
8e9db35f
PB
201{
202 UNIMPLEMENTED("sdSeekFile");
203 TOUCH(Stream);
204 TOUCH(Position);
205 TOUCH(Mode);
206 return 0;
207}
e0489cd1 208file_offset_t sdTellFile( FileStream * Stream )
8e9db35f
PB
209{
210 UNIMPLEMENTED("sdTellFile");
211 TOUCH(Stream);
212 return 0;
213}
214cell_t sdCloseFile( FileStream * Stream )
215{
216 UNIMPLEMENTED("sdCloseFile");
217 TOUCH(Stream);
218 return 0;
219}
220
e0701bfb 221cell_t sdDeleteFile( const char *FileName )
8e9db35f
PB
222{
223 UNIMPLEMENTED("sdDeleteFile");
224 TOUCH(FileName);
e0701bfb 225 return -1;
8e9db35f 226}
6f3de396 227
662a735a 228cell_t sdRenameFile( const char *OldName, const char *NewName )
6f3de396
HE
229{
230 UNIMPLEMENTED("sdRenameFile");
231 TOUCH(OldName);
232 TOUCH(NewName);
233 return -1;
234}
e0701bfb 235
0b1e2489 236ThrowCode sdResizeFile( FileStream * File, uint64_t NewSize )
e0701bfb
HE
237{
238 UNIMPLEMENTED("sdResizeFile");
0b1e2489 239 TOUCH(NewSize);
e0701bfb
HE
240 return THROW_RESIZE_FILE;
241}
242
8e9db35f
PB
243#endif
244