1 /* @(#) pf_cglue.c 98/02/11 1.4 */
\r
2 /***************************************************************
\r
3 ** 'C' Glue support for Forth based on 'C'
\r
6 ** Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom
\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
17 ***************************************************************/
\r
21 extern CFunc0 CustomFunctionTable[];
\r
23 /***************************************************************/
\r
24 cell_t CallUserFunction( cell_t Index, int32_t ReturnMode, int32_t NumParams )
\r
26 cell_t P1, P2, P3, P4, P5;
\r
30 DBUG(("CallUserFunction: Index = %d, ReturnMode = %d, NumParams = %d\n",
\r
31 Index, ReturnMode, NumParams ));
\r
33 CF = CustomFunctionTable[Index];
\r
38 Result = ((CFunc0) CF) ( );
\r
41 P1 = POP_DATA_STACK;
\r
42 Result = ((CFunc1) CF) ( P1 );
\r
45 P2 = POP_DATA_STACK;
\r
46 P1 = POP_DATA_STACK;
\r
47 Result = ((CFunc2) CF) ( P1, P2 );
\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
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
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
71 pfReportError("CallUserFunction", PF_ERR_NUM_PARAMS);
\r
75 /* Push result on Forth stack if requested. */
\r
76 if(ReturnMode == C_RETURNS_VALUE) PUSH_DATA_STACK( Result );
\r
81 #if (!defined(PF_NO_INIT)) && (!defined(PF_NO_SHELL))
\r
82 /***************************************************************/
\r
83 Err CreateGlueToC( const char *CName, ucell_t Index, cell_t ReturnMode, int32_t NumParams )
\r
88 CStringToForth( FName, CName, sizeof(FName) );
\r
89 Packed = (Index & 0xFFFF) | 0 | (NumParams << 24) |
\r
91 DBUG(("Packed = 0x%8x\n", Packed));
\r
93 ffCreateSecondaryHeader( FName );
\r
94 CODE_COMMA( ID_CALL_C );
\r
96 ffFinishSecondary();
\r