1 /* Copyright (C) 1992-1998 The Geometry Center
2  * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips
3  *
4  * This file is part of Geomview.
5  *
6  * Geomview is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published
8  * by the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * Geomview is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with Geomview; see the file COPYING.  If not, write
18  * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
19  * USA, or visit http://www.gnu.org.
20  */
21 #define PICKFUNC(name, body, NDbody)					\
22   static inline LObject *pickbody(char *coordsys, char *id,		\
23 				  HPoint3 point, int pn,		\
24 				  HPoint3 vertex, int vn,		\
25 				  HPoint3 edge[2], int en,		\
26 				  HPoint3 face[], int fn,		\
27 				  int ppath[], int ppn,			\
28 				  int vi, int ei[2], int ein, int fi)	\
29   {									\
30     do {								\
31       body;								\
32     } while (false);							\
33     return Lt;								\
34   }									\
35   static inline LObject *pickNDbody(char *coordsys, char *id,		\
36 				    float *point, int pn,		\
37 				    float *vertex, int vn,		\
38 				    float *edge, int en,		\
39 				    float *face, int fn,		\
40 				    int ppath[], int ppn,		\
41 				    int vi, int ei[2], int ein, int fi)	\
42   {									\
43     do {								\
44       NDbody;								\
45     } while (false);							\
46     return Lt;								\
47   }									\
48   LObject *name(Lake *lake, LList *args)				\
49   {									\
50     char *coordsys = NULL, *id = NULL;					\
51     float *varpoint = NULL;  int pn;					\
52     float *varvertex = NULL; int vn;					\
53     float *varedge = NULL; int en;					\
54     float *varface = NULL; int fn;					\
55     int *varppath = NULL; int ppn;					\
56     int vi;								\
57     int ei[2]; int ein = 2;						\
58     int fi;								\
59     LObject *res;							\
60 									\
61     LDECLARE(("pick", LBEGIN,						\
62 	      LSTRING,			&coordsys,			\
63 	      LSTRING,			&id,				\
64 	      LHOLD, LVARARRAY, LFLOAT,	&varpoint, &pn,			\
65 	      LHOLD, LVARARRAY, LFLOAT,	&varvertex, &vn,		\
66 	      LHOLD, LVARARRAY, LFLOAT,	&varedge, &en,			\
67 	      LHOLD, LVARARRAY, LFLOAT,	&varface, &fn,			\
68 	      LHOLD, LVARARRAY, LINT,	&varppath, &ppn,		\
69 	      LINT,			&vi,				\
70 	      LHOLD, LARRAY, LINT,	ei, &ein,			\
71 	      LINT,			&fi,				\
72 	      LEND));							\
73 									\
74     if (varpoint == NULL) {						\
75       return Lnil;							\
76     }									\
77 									\
78     if (pn <= 4) {							\
79       HPoint3 point;							\
80       HPoint3 vertex;							\
81 									\
82       if (varpoint) {							\
83 	point = *(HPoint3 *)varpoint;					\
84       }									\
85       if (varvertex) {							\
86 	vertex = *(HPoint3 *)varvertex;					\
87       }									\
88       res = pickbody(coordsys, id,					\
89 		     point, pn,						\
90 		     vertex, vn,					\
91 		     (HPoint3 *)varedge, en,				\
92 		     (HPoint3 *)varface, fn,				\
93 		     varppath, ppn, vi, ei, ein, fi);			\
94     } else {								\
95       res = pickNDbody(coordsys, id,					\
96 		       varpoint, pn,					\
97 		       varvertex, vn, varedge, en, varface, fn,		\
98 		       varppath, ppn, vi, ei, ein, fi);			\
99     }									\
100 									\
101     if (varpoint) OOGLFree(varpoint);					\
102     if (varvertex) OOGLFree(varvertex);					\
103     if (varedge) OOGLFree(varedge);					\
104     if (varface) OOGLFree(varface);					\
105     if (varppath) OOGLFree(varppath);					\
106 									\
107     return res;								\
108   }
109 
110 /*
111   Note: the "if (1)" business above is to prevent a warning
112   about the following statement ("return Lt") not being reached
113   if the body itself returns.
114 */
115 
116 /* Note: Don't use DEFPICKFUNC any more.  Use the newer PICKFUNC
117  * instead.  DEFPICKFUNC is provided for backward compatibility.
118  *
119  * cH: the above comment seemingly is ignored by everybody ...
120  */
121 #define DEFPICKFUNC(helpstr,						\
122 		    coordsys,						\
123 		    id,							\
124 		    point, pn,						\
125 		    vertex, vn,						\
126 		    edge, en,						\
127 		    face, fn,						\
128 		    ppath, ppn,						\
129 		    vi,							\
130 		    ei, ein,						\
131 		    fi,							\
132 		    body,						\
133 		    NDbody)						\
134   static inline LObject *pickbody(char *coordsys, char *id,		\
135 				  HPoint3 point, int pn,		\
136 				  HPoint3 vertex, int vn,		\
137 				  HPoint3 edge[2], int en,		\
138 				  HPoint3 face[], int fn,		\
139 				  int ppath[], int ppn,			\
140 				  int vi, int ei[2], int ein, int fi)	\
141   {									\
142     do {								\
143       body;								\
144     } while (false);							\
145     return Lt;								\
146   }									\
147   static inline LObject *pickNDbody(char *coordsys, char *id,		\
148 				    float *point, int pn,		\
149 				    float *vertex, int vn,		\
150 				    float *edge, int en,		\
151 				    float *face, int fn,		\
152 				    int ppath[], int ppn,		\
153 				    int vi, int ei[2], int ein, int fi)	\
154   {									\
155     do {								\
156       NDbody;								\
157     } while (false);							\
158     return Lt;								\
159   }									\
160   LDEFINE(pick, LVOID, helpstr)						\
161   {									\
162     char *coordsys = NULL, *id = NULL;					\
163     float *var##point = NULL;  int pn;					\
164     float *var##vertex = NULL; int vn;					\
165     float *var##edge = NULL; int en;					\
166     float *var##face = NULL; int fn;					\
167     int *var##ppath = NULL; int ppn;					\
168     int vi;								\
169     int ei[2]; int ein = 2;						\
170     int fi;								\
171     LObject *res;							\
172 									\
173     LDECLARE(("pick", LBEGIN,						\
174 	      LSTRING,			&coordsys,			\
175 	      LSTRING,			&id,				\
176 	      LHOLD, LVARARRAY, LFLOAT,	&var##point, &pn,		\
177 	      LHOLD, LVARARRAY, LFLOAT,	&var##vertex, &vn,		\
178 	      LHOLD, LVARARRAY, LFLOAT,	&var##edge, &en,		\
179 	      LHOLD, LVARARRAY, LFLOAT,	&var##face, &fn,		\
180 	      LHOLD, LVARARRAY, LINT,	&var##ppath, &ppn,		\
181 	      LINT,			&vi,				\
182 	      LHOLD, LARRAY, LINT,	ei, &ein,			\
183 	      LINT,			&fi,				\
184 	      LEND));							\
185 									\
186     if (var##point == NULL) {						\
187       return Lnil;							\
188     }									\
189 									\
190     if (pn <= 4) {							\
191       HPoint3 point;							\
192       HPoint3 vertex = { 0.0, 0.0, 0.0 };				\
193 									\
194       if (var##point) {							\
195 	point = *(HPoint3 *)var##point;					\
196       }									\
197       if (var##vertex) {						\
198 	vertex = *(HPoint3 *)var##vertex;				\
199       }									\
200       res = pickbody(coordsys, id,					\
201 		     point, pn,						\
202 		     vertex, vn,					\
203 		     (HPoint3 *)var##edge, en,				\
204 		     (HPoint3 *)var##face, fn,				\
205 		     var##ppath, ppn, vi, ei, ein, fi);			\
206     } else {								\
207       res = pickNDbody(coordsys, id,					\
208 		       var##point, pn,					\
209 		       var##vertex, vn, var##edge, en, var##face, fn,	\
210 		       var##ppath, ppn, vi, ei, ein, fi);		\
211     }									\
212 									\
213     if (var##point) OOGLFree(var##point);				\
214     if (var##vertex) OOGLFree(var##vertex);				\
215     if (var##edge) OOGLFree(var##edge);					\
216     if (var##face) OOGLFree(var##face);					\
217     if (var##ppath) OOGLFree(var##ppath);				\
218 									\
219     return res;								\
220   }
221 
222 /*
223  * Local Variables: ***
224  * mode: c ***
225  * c-basic-offset: 2 ***
226  * End: ***
227  */
228 
229 
230