Initial import.
[debian/pforth] / csrc / pf_cglue.c
1 /* @(#) pf_cglue.c 98/02/11 1.4 */\r
2 /***************************************************************\r
3 ** 'C' Glue support for Forth based on 'C'\r
4 **\r
5 ** Author: Phil Burk\r
6 ** Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom\r
7 **\r
8 ** The pForth software code is dedicated to the public domain,\r
9 ** and any third party may reproduce, distribute and modify\r
10 ** the pForth software code or any derivative works thereof\r
11 ** without any compensation or license.  The pForth software\r
12 ** code is provided on an "as is" basis without any warranty\r
13 ** of any kind, including, without limitation, the implied\r
14 ** warranties of merchantability and fitness for a particular\r
15 ** purpose and their equivalents under the laws of any jurisdiction.\r
16 **\r
17 ***************************************************************/\r
18 \r
19 #include "pf_all.h"\r
20 \r
21 extern CFunc0 CustomFunctionTable[];\r
22 \r
23 /***************************************************************/\r
24 int32 CallUserFunction( int32 Index, int32 ReturnMode, int32 NumParams )\r
25 {\r
26         cell P1, P2, P3, P4, P5;\r
27         cell Result = 0;\r
28         CFunc0 CF;\r
29 \r
30 DBUG(("CallUserFunction: Index = %d, ReturnMode = %d, NumParams = %d\n",\r
31         Index, ReturnMode, NumParams ));\r
32 \r
33         CF = CustomFunctionTable[Index];\r
34         \r
35         switch( NumParams )\r
36         {\r
37         case 0:\r
38                 Result = ((CFunc0) CF) ( );\r
39                 break;\r
40         case 1:\r
41                 P1 = POP_DATA_STACK;\r
42                 Result = ((CFunc1) CF) ( P1 );\r
43                 break;\r
44         case 2:\r
45                 P2 = POP_DATA_STACK;\r
46                 P1 = POP_DATA_STACK;\r
47                 Result = ((CFunc2) CF) ( P1, P2 );\r
48                 break;\r
49         case 3:\r
50                 P3 = POP_DATA_STACK;\r
51                 P2 = POP_DATA_STACK;\r
52                 P1 = POP_DATA_STACK;\r
53                 Result = ((CFunc3) CF) ( P1, P2, P3 );\r
54                 break;\r
55         case 4:\r
56                 P4 = POP_DATA_STACK;\r
57                 P3 = POP_DATA_STACK;\r
58                 P2 = POP_DATA_STACK;\r
59                 P1 = POP_DATA_STACK;\r
60                 Result = ((CFunc4) CF) ( P1, P2, P3, P4 );\r
61                 break;\r
62         case 5:\r
63                 P5 = POP_DATA_STACK;\r
64                 P4 = POP_DATA_STACK;\r
65                 P3 = POP_DATA_STACK;\r
66                 P2 = POP_DATA_STACK;\r
67                 P1 = POP_DATA_STACK;\r
68                 Result = ((CFunc5) CF) ( P1, P2, P3, P4, P5 );\r
69                 break;\r
70         default:\r
71                 pfReportError("CallUserFunction", PF_ERR_NUM_PARAMS);\r
72                 EXIT(1);\r
73         }\r
74 \r
75 /* Push result on Forth stack if requested. */\r
76         if(ReturnMode == C_RETURNS_VALUE) PUSH_DATA_STACK( Result );\r
77 \r
78         return Result;\r
79 }\r
80 \r
81 #if (!defined(PF_NO_INIT)) && (!defined(PF_NO_SHELL))\r
82 /***************************************************************/\r
83 Err CreateGlueToC( const char *CName, uint32 Index, int32 ReturnMode, int32 NumParams )\r
84 {\r
85         uint32 Packed;\r
86         char FName[40];\r
87         \r
88         CStringToForth( FName, CName );\r
89         Packed = (Index & 0xFFFF) | 0 | (NumParams << 24) |\r
90                 (ReturnMode << 31);\r
91         DBUG(("Packed = 0x%8x\n", Packed));\r
92 \r
93         ffCreateSecondaryHeader( FName );\r
94         CODE_COMMA( ID_CALL_C );\r
95         CODE_COMMA(Packed);\r
96         ffFinishSecondary();\r
97 \r
98         return 0;\r
99 }\r
100 #endif\r