Updated README with better build info
[debian/pforth] / csrc / pf_io.c
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 **
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.
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 */
30 void ioInit( void )
31 {
32     /* System dependant terminal initialization. */
33     sdTerminalInit();
34 }
35 void ioTerm( void )
36 {
37     sdTerminalTerm();
38 }
39
40 /***************************************************************
41 ** Send single character to output stream.
42 */
43 void 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 */
67 void 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 */
80 cell_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)
96 cell_t ioAccept( char *buffer, cell_t maxChars )
97 {
98     int c;
99     int len;
100     char *p;
101
102 DBUGX(("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
140 gotline:
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
160 FileStream *PF_STDIN;
161 FileStream *PF_STDOUT;
162
163 cell_t  sdInputChar( FileStream *stream )
164 {
165     UNIMPLEMENTED("sdInputChar");
166     TOUCH(stream);
167     return -1;
168 }
169
170 FileStream *sdOpenFile( const char *FileName, const char *Mode )
171 {
172     UNIMPLEMENTED("sdOpenFile");
173     TOUCH(FileName);
174     TOUCH(Mode);
175     return NULL;
176 }
177 cell_t sdFlushFile( FileStream * Stream  )
178 {
179     TOUCH(Stream);
180     return 0;
181 }
182 cell_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 }
191 cell_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 }
200 cell_t sdSeekFile( FileStream * Stream, file_offset_t Position, int32_t Mode )
201 {
202     UNIMPLEMENTED("sdSeekFile");
203     TOUCH(Stream);
204     TOUCH(Position);
205     TOUCH(Mode);
206     return 0;
207 }
208 file_offset_t sdTellFile( FileStream * Stream )
209 {
210     UNIMPLEMENTED("sdTellFile");
211     TOUCH(Stream);
212     return 0;
213 }
214 cell_t sdCloseFile( FileStream * Stream )
215 {
216     UNIMPLEMENTED("sdCloseFile");
217     TOUCH(Stream);
218     return 0;
219 }
220
221 cell_t sdDeleteFile( const char *FileName )
222 {
223     UNIMPLEMENTED("sdDeleteFile");
224     TOUCH(FileName);
225     return -1;
226 }
227
228 cell_t sdRenameFile( const char *OldName, const char *NewName )
229 {
230     UNIMPLEMENTED("sdRenameFile");
231     TOUCH(OldName);
232     TOUCH(NewName);
233     return -1;
234 }
235
236 ThrowCode sdResizeFile( FileStream * File, uint64_t NewSize )
237 {
238     UNIMPLEMENTED("sdResizeFile");
239     TOUCH(NewSize);
240     return THROW_RESIZE_FILE;
241 }
242
243 #endif
244