relicense to 0BSD
[pforth] / csrc / pf_cglue.c
CommitLineData
8e9db35f
PB
1/* @(#) pf_cglue.c 98/02/11 1.4 */
2/***************************************************************
3** 'C' Glue support for Forth based on 'C'
4**
5** Author: Phil Burk
6** Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom
7**
1f99f95d
S
8** Permission to use, copy, modify, and/or distribute this
9** software for any purpose with or without fee is hereby granted.
10**
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.
8e9db35f
PB
19**
20***************************************************************/
21
22#include "pf_all.h"
23
24extern CFunc0 CustomFunctionTable[];
25
26/***************************************************************/
27cell_t CallUserFunction( cell_t Index, int32_t ReturnMode, int32_t NumParams )
28{
29 cell_t P1, P2, P3, P4, P5;
30 cell_t Result = 0;
31 CFunc0 CF;
32
33DBUG(("CallUserFunction: Index = %d, ReturnMode = %d, NumParams = %d\n",
34 Index, ReturnMode, NumParams ));
35
36 CF = CustomFunctionTable[Index];
37
38 switch( NumParams )
39 {
40 case 0:
41 Result = ((CFunc0) CF) ( );
42 break;
43 case 1:
44 P1 = POP_DATA_STACK;
45 Result = ((CFunc1) CF) ( P1 );
46 break;
47 case 2:
48 P2 = POP_DATA_STACK;
49 P1 = POP_DATA_STACK;
50 Result = ((CFunc2) CF) ( P1, P2 );
51 break;
52 case 3:
53 P3 = POP_DATA_STACK;
54 P2 = POP_DATA_STACK;
55 P1 = POP_DATA_STACK;
56 Result = ((CFunc3) CF) ( P1, P2, P3 );
57 break;
58 case 4:
59 P4 = POP_DATA_STACK;
60 P3 = POP_DATA_STACK;
61 P2 = POP_DATA_STACK;
62 P1 = POP_DATA_STACK;
63 Result = ((CFunc4) CF) ( P1, P2, P3, P4 );
64 break;
65 case 5:
66 P5 = POP_DATA_STACK;
67 P4 = POP_DATA_STACK;
68 P3 = POP_DATA_STACK;
69 P2 = POP_DATA_STACK;
70 P1 = POP_DATA_STACK;
71 Result = ((CFunc5) CF) ( P1, P2, P3, P4, P5 );
72 break;
73 default:
74 pfReportError("CallUserFunction", PF_ERR_NUM_PARAMS);
75 EXIT(1);
76 }
77
78/* Push result on Forth stack if requested. */
79 if(ReturnMode == C_RETURNS_VALUE) PUSH_DATA_STACK( Result );
80
81 return Result;
82}
83
84#if (!defined(PF_NO_INIT)) && (!defined(PF_NO_SHELL))
85/***************************************************************/
86Err CreateGlueToC( const char *CName, ucell_t Index, cell_t ReturnMode, int32_t NumParams )
87{
88 ucell_t Packed;
89 char FName[40];
90
91 CStringToForth( FName, CName, sizeof(FName) );
92 Packed = (Index & 0xFFFF) | 0 | (NumParams << 24) |
93 (ReturnMode << 31);
94 DBUG(("Packed = 0x%8x\n", Packed));
95
96 ffCreateSecondaryHeader( FName );
97 CODE_COMMA( ID_CALL_C );
98 CODE_COMMA(Packed);
99 ffFinishSecondary();
100
101 return 0;
102}
103#endif