1 /* @(#) pf_cglue.c 98/02/11 1.4 */
2 /***************************************************************
3 ** 'C' Glue support for Forth based on 'C'
6 ** Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom
8 ** Permission to use, copy, modify, and/or distribute this
9 ** software for any purpose with or without fee is hereby granted.
11 ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
12 ** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13 ** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
14 ** THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
15 ** CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
16 ** FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
17 ** CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 ** OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 ***************************************************************/
24 extern CFunc0 CustomFunctionTable[];
26 /***************************************************************/
27 cell_t CallUserFunction( cell_t Index, int32_t ReturnMode, int32_t NumParams )
29 cell_t P1, P2, P3, P4, P5;
33 DBUG(("CallUserFunction: Index = %d, ReturnMode = %d, NumParams = %d\n",
34 Index, ReturnMode, NumParams ));
36 CF = CustomFunctionTable[Index];
41 Result = ((CFunc0) CF) ( );
45 Result = ((CFunc1) CF) ( P1 );
50 Result = ((CFunc2) CF) ( P1, P2 );
56 Result = ((CFunc3) CF) ( P1, P2, P3 );
63 Result = ((CFunc4) CF) ( P1, P2, P3, P4 );
71 Result = ((CFunc5) CF) ( P1, P2, P3, P4, P5 );
74 pfReportError("CallUserFunction", PF_ERR_NUM_PARAMS);
78 /* Push result on Forth stack if requested. */
79 if(ReturnMode == C_RETURNS_VALUE) PUSH_DATA_STACK( Result );
84 #if (!defined(PF_NO_INIT)) && (!defined(PF_NO_SHELL))
85 /***************************************************************/
86 Err CreateGlueToC( const char *CName, ucell_t Index, cell_t ReturnMode, int32_t NumParams )
91 CStringToForth( FName, CName, sizeof(FName) );
92 Packed = (Index & 0xFFFF) | 0 | (NumParams << 24) |
94 DBUG(("Packed = 0x%8x\n", Packed));
96 ffCreateSecondaryHeader( FName );
97 CODE_COMMA( ID_CALL_C );