Improvements from review
[pforth] / csrc / pf_io.c
index 5638874..819dc9f 100644 (file)
-/* @(#) pf_io.c 96/12/23 1.12 */\r
-/***************************************************************\r
-** I/O subsystem for PForth based on 'C'\r
-**\r
-** Author: Phil Burk\r
-** Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom\r
-**\r
-** The pForth software code is dedicated to the public domain,\r
-** and any third party may reproduce, distribute and modify\r
-** the pForth software code or any derivative works thereof\r
-** without any compensation or license.  The pForth software\r
-** code is provided on an "as is" basis without any warranty\r
-** of any kind, including, without limitation, the implied\r
-** warranties of merchantability and fitness for a particular\r
-** purpose and their equivalents under the laws of any jurisdiction.\r
-**\r
-****************************************************************\r
-** 941004 PLB Extracted IO calls from pforth_main.c\r
-***************************************************************/\r
-\r
-#include "pf_all.h"\r
-\r
-\r
-/***************************************************************\r
-** Initialize I/O system.\r
-*/\r
-void ioInit( void )\r
-{\r
-       /* System dependant terminal initialization. */\r
-       sdTerminalInit();\r
-}\r
-void ioTerm( void )\r
-{\r
-       sdTerminalTerm();\r
-}\r
-\r
-/***************************************************************\r
-** Send single character to output stream.\r
-*/\r
-void ioEmit( char c )\r
-{\r
-       cell_t Result;\r
-       \r
-       Result = sdTerminalOut(c);\r
-       if( Result < 0 ) EXIT(1);\r
-       \r
-       if( gCurrentTask )\r
-       {\r
-               if(c == '\n')\r
-               {\r
-                       gCurrentTask->td_OUT = 0;\r
-                       sdTerminalFlush();\r
-               }\r
-               else\r
-               {\r
-                       gCurrentTask->td_OUT++;\r
-               }\r
-       }\r
-}\r
-\r
-/***************************************************************\r
-** Send an entire string..\r
-*/\r
-void ioType( const char *s, cell_t n )\r
-{\r
-       cell_t i;\r
-\r
-       for( i=0; i<n; i++)\r
-       {\r
-               ioEmit ( *s++ );\r
-       }\r
-}\r
-\r
-/***************************************************************\r
-** Return single character from input device, always keyboard.\r
-*/\r
-cell_t ioKey( void )\r
-{\r
-       cell_t c;\r
-       sdEnableInput();\r
-       c = sdTerminalIn();\r
-       sdDisableInput();\r
-       return c;\r
-}\r
-\r
-/**************************************************************\r
-** Receive line from keyboard.\r
-** Return number of characters enterred.\r
-*/\r
-#define SPACE      (0x20)\r
-#define BACKSPACE  (0x08)\r
-#define DELETE     (0x7F)\r
-cell_t ioAccept( char *buffer, cell_t maxChars )\r
-{\r
-       int c;\r
-       int len;\r
-       char *p;\r
-\r
-DBUGX(("ioAccept(0x%x, 0x%x)\n", buffer, len ));\r
-       \r
-       sdEnableInput();\r
-\r
-       p = buffer;\r
-       len = 0;\r
-       while(len < maxChars)\r
-       {\r
-               c = sdTerminalIn();\r
-               switch(c)\r
-               {\r
-                       case '\r':\r
-                       case '\n':\r
-                               DBUGX(("EOL\n"));\r
-                               goto gotline;\r
-                               break;\r
-                               \r
-                       case BACKSPACE:\r
-                       case DELETE:\r
-                               if( len > 0 )  /* Don't go beyond beginning of line. */\r
-                               {\r
-                                       EMIT(BACKSPACE);\r
-                                       EMIT(' ');\r
-                                       EMIT(BACKSPACE);\r
-                                       p--;\r
-                                       len--;\r
-                               }\r
-                               break;\r
-                               \r
-                       default:\r
-                               sdTerminalEcho( (char) c );\r
-                               *p++ = (char) c;\r
-                               len++;\r
-                               break;\r
-               }\r
-               \r
-       }\r
-\r
-gotline:\r
-       sdDisableInput();\r
-       sdTerminalEcho( SPACE );\r
-\r
-/* NUL terminate line to simplify printing when debugging. */\r
-       if( len < maxChars ) p[len] = '\0';\r
-               \r
-       return len;\r
-}\r
-\r
-#define UNIMPLEMENTED(name) { MSG(name); MSG("is unimplemented!\n"); }\r
-\r
-\r
-/***********************************************************************************/\r
-/*********** File I/O **************************************************************/\r
-/***********************************************************************************/\r
-#ifdef PF_NO_FILEIO\r
-\r
-/* Provide stubs for standard file I/O */\r
-\r
-FileStream *PF_STDIN;\r
-FileStream *PF_STDOUT;\r
-\r
-cell_t  sdInputChar( FileStream *stream )\r
-{\r
-       UNIMPLEMENTED("sdInputChar");\r
-       TOUCH(stream);\r
-       return -1;\r
-}\r
-\r
-FileStream *sdOpenFile( const char *FileName, const char *Mode )\r
-{\r
-       UNIMPLEMENTED("sdOpenFile");\r
-       TOUCH(FileName);\r
-       TOUCH(Mode);\r
-       return NULL;\r
-}\r
-cell_t sdFlushFile( FileStream * Stream  )\r
-{\r
-       TOUCH(Stream);\r
-       return 0;\r
-}\r
-cell_t sdReadFile( void *ptr, cell_t Size, int32_t nItems, FileStream * Stream  ) \r
-{ \r
-       UNIMPLEMENTED("sdReadFile");\r
-       TOUCH(ptr);\r
-       TOUCH(Size);\r
-       TOUCH(nItems);\r
-       TOUCH(Stream);\r
-       return 0; \r
-}\r
-cell_t sdWriteFile( void *ptr, cell_t Size, int32_t nItems, FileStream * Stream  )\r
-{ \r
-       UNIMPLEMENTED("sdWriteFile");\r
-       TOUCH(ptr);\r
-       TOUCH(Size);\r
-       TOUCH(nItems);\r
-       TOUCH(Stream);\r
-       return 0; \r
-}\r
-cell_t sdSeekFile( FileStream * Stream, cell_t Position, int32_t Mode ) \r
-{ \r
-       UNIMPLEMENTED("sdSeekFile");\r
-       TOUCH(Stream);\r
-       TOUCH(Position);\r
-       TOUCH(Mode);\r
-       return 0; \r
-}\r
-cell_t sdTellFile( FileStream * Stream ) \r
-{ \r
-       UNIMPLEMENTED("sdTellFile");\r
-       TOUCH(Stream);\r
-       return 0; \r
-}\r
-cell_t sdCloseFile( FileStream * Stream ) \r
-{ \r
-       UNIMPLEMENTED("sdCloseFile");\r
-       TOUCH(Stream);\r
-       return 0; \r
-}\r
-#endif\r
-\r
+/* @(#) pf_io.c 96/12/23 1.12 */
+/***************************************************************
+** I/O subsystem for PForth based on 'C'
+**
+** Author: Phil Burk
+** Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom
+**
+** The pForth software code is dedicated to the public domain,
+** and any third party may reproduce, distribute and modify
+** the pForth software code or any derivative works thereof
+** without any compensation or license.  The pForth software
+** code is provided on an "as is" basis without any warranty
+** of any kind, including, without limitation, the implied
+** warranties of merchantability and fitness for a particular
+** purpose and their equivalents under the laws of any jurisdiction.
+**
+****************************************************************
+** 941004 PLB Extracted IO calls from pforth_main.c
+***************************************************************/
+
+#include "pf_all.h"
+
+
+/***************************************************************
+** Initialize I/O system.
+*/
+void ioInit( void )
+{
+    /* System dependant terminal initialization. */
+    sdTerminalInit();
+}
+void ioTerm( void )
+{
+    sdTerminalTerm();
+}
+
+/***************************************************************
+** Send single character to output stream.
+*/
+void ioEmit( char c )
+{
+    cell_t Result;
+
+    Result = sdTerminalOut(c);
+    if( Result < 0 ) EXIT(1);
+
+    if( gCurrentTask )
+    {
+        if(c == '\n')
+        {
+            gCurrentTask->td_OUT = 0;
+            sdTerminalFlush();
+        }
+        else
+        {
+            gCurrentTask->td_OUT++;
+        }
+    }
+}
+
+/***************************************************************
+** Send an entire string..
+*/
+void ioType( const char *s, cell_t n )
+{
+    cell_t i;
+
+    for( i=0; i<n; i++)
+    {
+        ioEmit ( *s++ );
+    }
+}
+
+/***************************************************************
+** Return single character from input device, always keyboard.
+*/
+cell_t ioKey( void )
+{
+    cell_t c;
+    sdEnableInput();
+    c = sdTerminalIn();
+    sdDisableInput();
+    return c;
+}
+
+/**************************************************************
+** Receive line from keyboard.
+** Return number of characters enterred.
+*/
+#define SPACE      (0x20)
+#define BACKSPACE  (0x08)
+#define DELETE     (0x7F)
+cell_t ioAccept( char *buffer, cell_t maxChars )
+{
+    int c;
+    int len;
+    char *p;
+
+DBUGX(("ioAccept(0x%x, 0x%x)\n", buffer, len ));
+
+    sdEnableInput();
+
+    p = buffer;
+    len = 0;
+    while(len < maxChars)
+    {
+        c = sdTerminalIn();
+        switch(c)
+        {
+            case '\r':
+            case '\n':
+                DBUGX(("EOL\n"));
+                goto gotline;
+                break;
+
+            case BACKSPACE:
+            case DELETE:
+                if( len > 0 )  /* Don't go beyond beginning of line. */
+                {
+                    EMIT(BACKSPACE);
+                    EMIT(' ');
+                    EMIT(BACKSPACE);
+                    p--;
+                    len--;
+                }
+                break;
+
+            default:
+                sdTerminalEcho( (char) c );
+                *p++ = (char) c;
+                len++;
+                break;
+        }
+
+    }
+
+gotline:
+    sdDisableInput();
+    sdTerminalEcho( SPACE );
+
+/* NUL terminate line to simplify printing when debugging. */
+    if( len < maxChars ) p[len] = '\0';
+
+    return len;
+}
+
+#define UNIMPLEMENTED(name) { MSG(name); MSG("is unimplemented!\n"); }
+
+
+/***********************************************************************************/
+/*********** File I/O **************************************************************/
+/***********************************************************************************/
+#ifdef PF_NO_FILEIO
+
+/* Provide stubs for standard file I/O */
+
+FileStream *PF_STDIN;
+FileStream *PF_STDOUT;
+
+cell_t  sdInputChar( FileStream *stream )
+{
+    UNIMPLEMENTED("sdInputChar");
+    TOUCH(stream);
+    return -1;
+}
+
+FileStream *sdOpenFile( const char *FileName, const char *Mode )
+{
+    UNIMPLEMENTED("sdOpenFile");
+    TOUCH(FileName);
+    TOUCH(Mode);
+    return NULL;
+}
+cell_t sdFlushFile( FileStream * Stream  )
+{
+    TOUCH(Stream);
+    return 0;
+}
+cell_t sdReadFile( void *ptr, cell_t Size, int32_t nItems, FileStream * Stream  )
+{
+    UNIMPLEMENTED("sdReadFile");
+    TOUCH(ptr);
+    TOUCH(Size);
+    TOUCH(nItems);
+    TOUCH(Stream);
+    return 0;
+}
+cell_t sdWriteFile( void *ptr, cell_t Size, int32_t nItems, FileStream * Stream  )
+{
+    UNIMPLEMENTED("sdWriteFile");
+    TOUCH(ptr);
+    TOUCH(Size);
+    TOUCH(nItems);
+    TOUCH(Stream);
+    return 0;
+}
+cell_t sdSeekFile( FileStream * Stream, cell_t Position, int32_t Mode )
+{
+    UNIMPLEMENTED("sdSeekFile");
+    TOUCH(Stream);
+    TOUCH(Position);
+    TOUCH(Mode);
+    return 0;
+}
+cell_t sdTellFile( FileStream * Stream )
+{
+    UNIMPLEMENTED("sdTellFile");
+    TOUCH(Stream);
+    return 0;
+}
+cell_t sdCloseFile( FileStream * Stream )
+{
+    UNIMPLEMENTED("sdCloseFile");
+    TOUCH(Stream);
+    return 0;
+}
+
+FileStream *sdDeleteFile( const char *FileName )
+{
+    UNIMPLEMENTED("sdDeleteFile");
+    TOUCH(FileName);
+    return NULL;
+}
+
+cell_t sdRenameFile( const char *OldName, const char *NewName )
+{
+    UNIMPLEMENTED("sdRenameFile");
+    TOUCH(OldName);
+    TOUCH(NewName);
+    return -1;
+}
+#endif
+