relicense to 0BSD
[pforth] / csrc / pf_cglue.c
index 2e6f52d..f06aea4 100644 (file)
-/* @(#) pf_cglue.c 98/02/11 1.4 */\r
-/***************************************************************\r
-** 'C' Glue support for Forth 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
-\r
-#include "pf_all.h"\r
-\r
-extern CFunc0 CustomFunctionTable[];\r
-\r
-/***************************************************************/\r
-cell_t CallUserFunction( cell_t Index, int32_t ReturnMode, int32_t NumParams )\r
-{\r
-       cell_t P1, P2, P3, P4, P5;\r
-       cell_t Result = 0;\r
-       CFunc0 CF;\r
-\r
-DBUG(("CallUserFunction: Index = %d, ReturnMode = %d, NumParams = %d\n",\r
-       Index, ReturnMode, NumParams ));\r
-\r
-       CF = CustomFunctionTable[Index];\r
-       \r
-       switch( NumParams )\r
-       {\r
-       case 0:\r
-               Result = ((CFunc0) CF) ( );\r
-               break;\r
-       case 1:\r
-               P1 = POP_DATA_STACK;\r
-               Result = ((CFunc1) CF) ( P1 );\r
-               break;\r
-       case 2:\r
-               P2 = POP_DATA_STACK;\r
-               P1 = POP_DATA_STACK;\r
-               Result = ((CFunc2) CF) ( P1, P2 );\r
-               break;\r
-       case 3:\r
-               P3 = POP_DATA_STACK;\r
-               P2 = POP_DATA_STACK;\r
-               P1 = POP_DATA_STACK;\r
-               Result = ((CFunc3) CF) ( P1, P2, P3 );\r
-               break;\r
-       case 4:\r
-               P4 = POP_DATA_STACK;\r
-               P3 = POP_DATA_STACK;\r
-               P2 = POP_DATA_STACK;\r
-               P1 = POP_DATA_STACK;\r
-               Result = ((CFunc4) CF) ( P1, P2, P3, P4 );\r
-               break;\r
-       case 5:\r
-               P5 = POP_DATA_STACK;\r
-               P4 = POP_DATA_STACK;\r
-               P3 = POP_DATA_STACK;\r
-               P2 = POP_DATA_STACK;\r
-               P1 = POP_DATA_STACK;\r
-               Result = ((CFunc5) CF) ( P1, P2, P3, P4, P5 );\r
-               break;\r
-       default:\r
-               pfReportError("CallUserFunction", PF_ERR_NUM_PARAMS);\r
-               EXIT(1);\r
-       }\r
-\r
-/* Push result on Forth stack if requested. */\r
-       if(ReturnMode == C_RETURNS_VALUE) PUSH_DATA_STACK( Result );\r
-\r
-       return Result;\r
-}\r
-\r
-#if (!defined(PF_NO_INIT)) && (!defined(PF_NO_SHELL))\r
-/***************************************************************/\r
-Err CreateGlueToC( const char *CName, ucell_t Index, cell_t ReturnMode, int32_t NumParams )\r
-{\r
-       ucell_t Packed;\r
-       char FName[40];\r
-       \r
-       CStringToForth( FName, CName );\r
-       Packed = (Index & 0xFFFF) | 0 | (NumParams << 24) |\r
-               (ReturnMode << 31);\r
-       DBUG(("Packed = 0x%8x\n", Packed));\r
-\r
-       ffCreateSecondaryHeader( FName );\r
-       CODE_COMMA( ID_CALL_C );\r
-       CODE_COMMA(Packed);\r
-       ffFinishSecondary();\r
-\r
-       return 0;\r
-}\r
-#endif\r
+/* @(#) pf_cglue.c 98/02/11 1.4 */
+/***************************************************************
+** 'C' Glue support for Forth based on 'C'
+**
+** Author: Phil Burk
+** Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom
+**
+** Permission to use, copy, modify, and/or distribute this
+** software for any purpose with or without fee is hereby granted.
+**
+** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+** THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
+** CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+** FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+** CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+** OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+**
+***************************************************************/
+
+#include "pf_all.h"
+
+extern CFunc0 CustomFunctionTable[];
+
+/***************************************************************/
+cell_t CallUserFunction( cell_t Index, int32_t ReturnMode, int32_t NumParams )
+{
+    cell_t P1, P2, P3, P4, P5;
+    cell_t Result = 0;
+    CFunc0 CF;
+
+DBUG(("CallUserFunction: Index = %d, ReturnMode = %d, NumParams = %d\n",
+    Index, ReturnMode, NumParams ));
+
+    CF = CustomFunctionTable[Index];
+
+    switch( NumParams )
+    {
+    case 0:
+        Result = ((CFunc0) CF) ( );
+        break;
+    case 1:
+        P1 = POP_DATA_STACK;
+        Result = ((CFunc1) CF) ( P1 );
+        break;
+    case 2:
+        P2 = POP_DATA_STACK;
+        P1 = POP_DATA_STACK;
+        Result = ((CFunc2) CF) ( P1, P2 );
+        break;
+    case 3:
+        P3 = POP_DATA_STACK;
+        P2 = POP_DATA_STACK;
+        P1 = POP_DATA_STACK;
+        Result = ((CFunc3) CF) ( P1, P2, P3 );
+        break;
+    case 4:
+        P4 = POP_DATA_STACK;
+        P3 = POP_DATA_STACK;
+        P2 = POP_DATA_STACK;
+        P1 = POP_DATA_STACK;
+        Result = ((CFunc4) CF) ( P1, P2, P3, P4 );
+        break;
+    case 5:
+        P5 = POP_DATA_STACK;
+        P4 = POP_DATA_STACK;
+        P3 = POP_DATA_STACK;
+        P2 = POP_DATA_STACK;
+        P1 = POP_DATA_STACK;
+        Result = ((CFunc5) CF) ( P1, P2, P3, P4, P5 );
+        break;
+    default:
+        pfReportError("CallUserFunction", PF_ERR_NUM_PARAMS);
+        EXIT(1);
+    }
+
+/* Push result on Forth stack if requested. */
+    if(ReturnMode == C_RETURNS_VALUE) PUSH_DATA_STACK( Result );
+
+    return Result;
+}
+
+#if (!defined(PF_NO_INIT)) && (!defined(PF_NO_SHELL))
+/***************************************************************/
+Err CreateGlueToC( const char *CName, ucell_t Index, cell_t ReturnMode, int32_t NumParams )
+{
+    ucell_t Packed;
+    char FName[40];
+
+    CStringToForth( FName, CName, sizeof(FName) );
+    Packed = (Index & 0xFFFF) | 0 | (NumParams << 24) |
+        (ReturnMode << 31);
+    DBUG(("Packed = 0x%8x\n", Packed));
+
+    ffCreateSecondaryHeader( FName );
+    CODE_COMMA( ID_CALL_C );
+    CODE_COMMA(Packed);
+    ffFinishSecondary();
+
+    return 0;
+}
+#endif