1 /*  Part of XPCE --- The SWI-Prolog GUI toolkit
2 
3     Author:        Jan Wielemaker and Anjo Anjewierden
4     E-mail:        jan@swi.psy.uva.nl
5     WWW:           http://www.swi.psy.uva.nl/projects/xpce/
6     Copyright (c)  1985-2002, University of Amsterdam
7     All rights reserved.
8 
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions
11     are met:
12 
13     1. Redistributions of source code must retain the above copyright
14        notice, this list of conditions and the following disclaimer.
15 
16     2. Redistributions in binary form must reproduce the above copyright
17        notice, this list of conditions and the following disclaimer in
18        the documentation and/or other materials provided with the
19        distribution.
20 
21     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25     COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32     POSSIBILITY OF SUCH DAMAGE.
33 */
34 
35 #include <h/interface.h>
36 
37 		 /*******************************
38 		 *	    BASIC TYPES		*
39 		 *******************************/
40 
41 typedef void * 		XPCE_Object;		/* anonymous objects */
42 typedef XPCE_Object	XPCE_Variable;		/* just an alias */
43 typedef int    		XPCE_status;		/* send() return */
44 typedef XPCE_status	(*XPCE_Procedure)();	/* procedure */
45 typedef XPCE_Object	(*XPCE_Function)();	/* function */
46 typedef int		XPCE_Access;		/* enum ... */
47 
48 #define XPCE_ACCESS_none	0
49 #define XPCE_ACCESS_get		1
50 #define XPCE_ACCESS_send	2
51 #define XPCE_ACCESS_both	3
52 
53 #define XPCE_END		((XPCE_Object)0)
54 
55 
56 		 /*******************************
57 		 *	  DATA CONVERSION	*
58 		 *******************************/
59 
60 					/* C ---> XPCE */
61 
62 __pce_export XPCE_Object	XPCE_to_string(char *text);
63 __pce_export XPCE_Object	XPCE_to_name(char *text);
64 __pce_export XPCE_Object	XPCE_to_integer(long value);
65 __pce_export XPCE_Object	XPCE_to_real(float value);
66 __pce_export XPCE_Object	XPCE_to_pointer(void *value);
67 __pce_export XPCE_Object	XPCE_to_object(XPCE_Object name);
68 __pce_export XPCE_Object	XPCE_to_class(XPCE_Object name);
69 __pce_export XPCE_Object	XPCE_to_type(char *description);
70 
71 
72 					/* XPCE ---> C */
73 
74 __pce_export char *		XPCE_charp_of(XPCE_Object string);
75 __pce_export long		XPCE_int_of(XPCE_Object integer);
76 __pce_export float		XPCE_float_of(XPCE_Object real);
77 __pce_export void *		XPCE_pointer_of(XPCE_Object c_pointer);
78 
79 
80 		 /*******************************
81 		 *	   ACCESS MACROS	*
82 		 *******************************/
83 
84 #define Object		XPCE_Object
85 #define status		XPCE_status
86 #define Proc		XPCE_Procedure
87 #define Func		XPCE_Function
88 
89 #define to_string(s)	XPCE_to_string(s)
90 #define to_name(s)	XPCE_to_name(s)
91 #define to_int(i)	XPCE_to_integer(i)
92 #define to_real(f)	XPCE_to_real(f)
93 #define to_object(s)	XPCE_to_object(XPCE_to_name(s))
94 #define to_class(s)	XPCE_to_class(XPCE_to_name(s))
95 
96 #define charp_of(o)	XPCE_charp_of(o)
97 #define int_of(o)	XPCE_int_of(o)
98 #define float_of(o)	XPCE_float_of(o)
99 
100 
101 		 /*******************************
102 		 *	        VMI		*
103 		 *******************************/
104 
105 __pce_export status	 XPCE_sendv(XPCE_Object receiver, XPCE_Object selector,
106 				    int argc, const XPCE_Object argv[]);
107 __pce_export XPCE_Object XPCE_getv(XPCE_Object receiver, XPCE_Object selector,
108 				   int argc, const XPCE_Object argv[]);
109 __pce_export XPCE_Object XPCE_newv(XPCE_Object class, const XPCE_Object name,
110 				   int argc, const XPCE_Object argv[]);
111 
112 __pce_export status	 XPCE_send(XPCE_Object receiver, XPCE_Object selector,
113 				   ...);
114 __pce_export XPCE_Object XPCE_get(XPCE_Object receiver, XPCE_Object selector,
115 				  ...);
116 __pce_export XPCE_Object XPCE_new(XPCE_Object class, const XPCE_Object, ...);
117 
118 __pce_export status	 XPCE_free(XPCE_Object);
119 
120 
121 		 /*******************************
122 		 *	      FUNCALL		*
123 		 *******************************/
124 
125 __pce_export XPCE_Object XPCE_callv(XPCE_Procedure function,
126 				    int argc, const XPCE_Object arg[]);
127 __pce_export XPCE_Object XPCE_funcallv(XPCE_Function function,
128 				       int argc, const XPCE_Object arg[]);
129 
130 __pce_export XPCE_Object XPCE_call(XPCE_Procedure function, ...);
131 __pce_export XPCE_Object XPCE_funcall(XPCE_Function function, ...);
132 
133 #if O_CPLUSPLUS
134 __pce_export XPCE_Object
135 	XPCE_funcallCPlusPlusMethodv(XPCE_Function function,
136 				     void *obj,
137 				     int argc,
138 				     const XPCE_Object argv[]);
139 __pce_export XPCE_Object
140 	XPCE_callCPlusPlusMethodv(XPCE_Procedure function, void *obj,
141 				  int argc, const XPCE_Object argv[]);
142 __pce_export XPCE_Object
143 	XPCE_callCPlusPlusv(XPCE_Procedure f,
144 			    int argc, const XPCE_Object argv[]);
145 __pce_export XPCE_Object
146 	XPCE_funcallCPlusPlusv(XPCE_Function f,
147 			       int argc, const XPCE_Object argv[]);
148 #endif /*O_CPLUSPLUS*/
149 
150 		 /*******************************
151 		 *	     CLASSES		*
152 		 *******************************/
153 
154 __pce_export XPCE_Object XPCE_defclass(XPCE_Object name, XPCE_Object super,
155 				       XPCE_Object summary,
156 				       XPCE_Procedure function);
157 
158 __pce_export XPCE_Object XPCE_defcxxclass(XPCE_Object name, XPCE_Object super,
159 				       XPCE_Object summary,
160 				       XPCE_Procedure function);
161 
162 __pce_export XPCE_Object XPCE_makeclass(XPCE_Object name, XPCE_Object super,
163 					XPCE_Object summary);
164 
165 
166 __pce_export XPCE_Variable XPCE_defvar(XPCE_Object class,
167 				       XPCE_Object name, XPCE_Object group,
168 				       XPCE_Object summary,
169 				       XPCE_Object access,
170 				       XPCE_Object initial,
171 				       XPCE_Object type);
172 
173 
174 __pce_export XPCE_status XPCE_defsendmethodv(XPCE_Object class,
175 					     XPCE_Object name,
176 					     XPCE_Object group,
177 					     XPCE_Object summary,
178 					     XPCE_Procedure implementation,
179 					     int argc,
180 					     const XPCE_Object types[]);
181 
182 
183 __pce_export XPCE_status XPCE_defgetmethodv(XPCE_Object class,
184 					    XPCE_Object name,
185 					    XPCE_Object group,
186 					    XPCE_Object summary,
187 					    XPCE_Object ret_type,
188 					    XPCE_Function implementation,
189 					    int argc,
190 					    const XPCE_Object types[]);
191 
192 __pce_export XPCE_status XPCE_store(XPCE_Object in,
193 				    XPCE_Variable var,
194 				    XPCE_Object value);
195 
196 
197 __pce_export XPCE_Object XPCE_fetch(XPCE_Object in,
198 				    XPCE_Variable var);
199 
200 #if O_CPLUSPLUS
201 #define CPLUSPLUS_MASK 01L	 /* mask for function-pointers */
202 #define isCppFunctionPointer(p)	 (((unsigned long)(p)) & CPLUSPLUS_MASK)
203 #define valCppFunctionPointer(p) ((void*)((unsigned long)(p) & ~CPLUSPLUS_MASK))
204 #endif
205 
206 		 /*******************************
207 		 *	       CHAIN		*
208 		 *******************************/
209 
210 __pce_export XPCE_Object XPCE_chain_head(XPCE_Object chain);
211 __pce_export XPCE_Object XPCE_next_cell(XPCE_Object cell);
212 __pce_export XPCE_Object XPCE_cell_value(XPCE_Object cell);
213 
214 
215 		 /*******************************
216 		 *	       GLOBALS		*
217 		 *******************************/
218 
219 __pce_export Any XPCE_on;
220 __pce_export Any XPCE_off;
221 __pce_export Any XPCE_nil;
222 __pce_export Any XPCE_default;
223 __pce_export Any XPCE_arg1;
224 __pce_export Any XPCE_arg2;
225 __pce_export Any XPCE_arg3;
226 __pce_export Any XPCE_arg4;
227 __pce_export Any XPCE_arg5;
228 __pce_export Any XPCE_arg6;
229 __pce_export Any XPCE_arg7;
230 __pce_export Any XPCE_arg8;
231 __pce_export Any XPCE_arg9;
232 __pce_export Any XPCE_arg10;
233 __pce_export Any XPCE_event;
234 __pce_export Any XPCE_receiver;
235 __pce_export Any XPCE_pce;
236 __pce_export Any XPCE_display;
237