V25 with 64-bit support
[pforth] / csrc / pf_cglue.c
CommitLineData
bb6b2dcd 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
21extern CFunc0 CustomFunctionTable[];\r
22\r
23/***************************************************************/\r
1cb310e6 24cell_t CallUserFunction( cell_t Index, int32_t ReturnMode, int32_t NumParams )\r
bb6b2dcd 25{\r
1cb310e6 26 cell_t P1, P2, P3, P4, P5;\r
27 cell_t Result = 0;\r
bb6b2dcd 28 CFunc0 CF;\r
29\r
30DBUG(("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
1cb310e6 83Err CreateGlueToC( const char *CName, ucell_t Index, cell_t ReturnMode, int32_t NumParams )\r
bb6b2dcd 84{\r
1cb310e6 85 ucell_t Packed;\r
bb6b2dcd 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