1#![doc = include_str!("../README.md")]
2#![no_std]
3#![allow(non_upper_case_globals)]
4#![allow(non_camel_case_types)]
5#![allow(non_snake_case)]
6#![allow(clippy::all)]
7
8use core::{
9 ffi::{CStr, FromBytesUntilNulError},
10 fmt::Debug,
11 str,
12};
13
14include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
15
16pub const QHULL_LICENSE_TEXT: &str = include_str!("../qhull/COPYING.txt");
17
18fn str_from_c_char_array<'a>(data: &'a [core::ffi::c_char]) -> Result<&'a CStr, FromBytesUntilNulError> {
19 unsafe {
20 CStr::from_bytes_until_nul(core::slice::from_raw_parts(
21 data.as_ptr() as *const u8,
22 data.len(),
23 ))
24 }
25}
26
27impl Debug for qhT {
28 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
29 f.debug_struct("qhT")
30 .field("ALLpoints", &self.ALLpoints)
31 .field("ALLOWshort", &self.ALLOWshort)
32 .field("ALLOWwarning", &self.ALLOWwarning)
33 .field("ALLOWwide", &self.ALLOWwide)
34 .field("ANGLEmerge", &self.ANGLEmerge)
35 .field("APPROXhull", &self.APPROXhull)
36 .field("MINoutside", &self.MINoutside)
37 .field("ANNOTATEoutput", &self.ANNOTATEoutput)
38 .field("ATinfinity", &self.ATinfinity)
39 .field("AVOIDold", &self.AVOIDold)
40 .field("BESToutside", &self.BESToutside)
41 .field("CDDinput", &self.CDDinput)
42 .field("CDDoutput", &self.CDDoutput)
43 .field("CHECKduplicates", &self.CHECKduplicates)
44 .field("CHECKfrequently", &self.CHECKfrequently)
45 .field("premerge_cos", &self.premerge_cos)
46 .field("postmerge_cos", &self.postmerge_cos)
47 .field("DELAUNAY", &self.DELAUNAY)
48 .field("DOintersections", &self.DOintersections)
49 .field("DROPdim", &self.DROPdim)
50 .field("FLUSHprint", &self.FLUSHprint)
51 .field("FORCEoutput", &self.FORCEoutput)
52 .field("GOODpoint", &self.GOODpoint)
53 .field("GOODpointp", &self.GOODpointp)
54 .field("GOODthreshold", &self.GOODthreshold)
55 .field("GOODvertex", &self.GOODvertex)
56 .field("GOODvertexp", &self.GOODvertexp)
57 .field("HALFspace", &self.HALFspace)
58 .field("ISqhullQh", &self.ISqhullQh)
59 .field("IStracing", &self.IStracing)
60 .field("KEEParea", &self.KEEParea)
61 .field("KEEPcoplanar", &self.KEEPcoplanar)
62 .field("KEEPinside", &self.KEEPinside)
63 .field("KEEPmerge", &self.KEEPmerge)
64 .field("KEEPminArea", &self.KEEPminArea)
65 .field("MAXcoplanar", &self.MAXcoplanar)
66 .field("MAXwide", &self.MAXwide)
67 .field("MERGEexact", &self.MERGEexact)
68 .field("MERGEindependent", &self.MERGEindependent)
69 .field("MERGING", &self.MERGING)
70 .field("premerge_centrum", &self.premerge_centrum)
71 .field("postmerge_centrum", &self.postmerge_centrum)
72 .field("MERGEpinched", &self.MERGEpinched)
73 .field("MERGEvertices", &self.MERGEvertices)
74 .field("MINvisible", &self.MINvisible)
75 .field("NOnarrow", &self.NOnarrow)
76 .field("NOnearinside", &self.NOnearinside)
77 .field("NOpremerge", &self.NOpremerge)
78 .field("ONLYgood", &self.ONLYgood)
79 .field("ONLYmax", &self.ONLYmax)
80 .field("PICKfurthest", &self.PICKfurthest)
81 .field("POSTmerge", &self.POSTmerge)
82 .field("PREmerge", &self.PREmerge)
83 .field("PRINTcentrums", &self.PRINTcentrums)
84 .field("PRINTcoplanar", &self.PRINTcoplanar)
85 .field("PRINTdim", &self.PRINTdim)
86 .field("PRINTdots", &self.PRINTdots)
87 .field("PRINTgood", &self.PRINTgood)
88 .field("PRINTinner", &self.PRINTinner)
89 .field("PRINTneighbors", &self.PRINTneighbors)
90 .field("PRINTnoplanes", &self.PRINTnoplanes)
91 .field("PRINToptions1st", &self.PRINToptions1st)
92 .field("PRINTouter", &self.PRINTouter)
93 .field("PRINTprecision", &self.PRINTprecision)
94 .field("PRINTout", &self.PRINTout)
95 .field("PRINTridges", &self.PRINTridges)
96 .field("PRINTspheres", &self.PRINTspheres)
97 .field("PRINTstatistics", &self.PRINTstatistics)
98 .field("PRINTsummary", &self.PRINTsummary)
99 .field("PRINTtransparent", &self.PRINTtransparent)
100 .field("PROJECTdelaunay", &self.PROJECTdelaunay)
101 .field("PROJECTinput", &self.PROJECTinput)
102 .field("RANDOMdist", &self.RANDOMdist)
103 .field("RANDOMfactor", &self.RANDOMfactor)
104 .field("RANDOMa", &self.RANDOMa)
105 .field("RANDOMb", &self.RANDOMb)
106 .field("RANDOMoutside", &self.RANDOMoutside)
107 .field("REPORTfreq", &self.REPORTfreq)
108 .field("REPORTfreq2", &self.REPORTfreq2)
109 .field("RERUN", &self.RERUN)
110 .field("ROTATErandom", &self.ROTATErandom)
111 .field("SCALEinput", &self.SCALEinput)
112 .field("SCALElast", &self.SCALElast)
113 .field("SETroundoff", &self.SETroundoff)
114 .field("SKIPcheckmax", &self.SKIPcheckmax)
115 .field("SKIPconvex", &self.SKIPconvex)
116 .field("SPLITthresholds", &self.SPLITthresholds)
117 .field("STOPadd", &self.STOPadd)
118 .field("STOPcone", &self.STOPcone)
119 .field("STOPpoint", &self.STOPpoint)
120 .field("TESTpoints", &self.TESTpoints)
121 .field("TESTvneighbors", &self.TESTvneighbors)
122 .field("TRACElevel", &self.TRACElevel)
123 .field("TRACElastrun", &self.TRACElastrun)
124 .field("TRACEpoint", &self.TRACEpoint)
125 .field("TRACEdist", &self.TRACEdist)
126 .field("TRACEmerge", &self.TRACEmerge)
127 .field("TRIangulate", &self.TRIangulate)
128 .field("TRInormals", &self.TRInormals)
129 .field("UPPERdelaunay", &self.UPPERdelaunay)
130 .field("USEstdout", &self.USEstdout)
131 .field("VERIFYoutput", &self.VERIFYoutput)
132 .field("VIRTUALmemory", &self.VIRTUALmemory)
133 .field("VORONOI", &self.VORONOI)
134 .field("AREAfactor", &self.AREAfactor)
135 .field("DOcheckmax", &self.DOcheckmax)
136 .field("feasible_string", &self.feasible_string)
137 .field("feasible_point", &self.feasible_point)
138 .field("GETarea", &self.GETarea)
139 .field("KEEPnearinside", &self.KEEPnearinside)
140 .field("hull_dim", &self.hull_dim)
141 .field("input_dim", &self.input_dim)
142 .field("num_points", &self.num_points)
143 .field("first_point", &self.first_point)
144 .field("POINTSmalloc", &self.POINTSmalloc)
145 .field("input_points", &self.input_points)
146 .field("input_malloc", &self.input_malloc)
147 .field("qhull_command", &str_from_c_char_array(&self.qhull_command))
148 .field("qhull_commandsiz2", &self.qhull_commandsiz2)
149 .field("rbox_command", &str_from_c_char_array(&self.rbox_command))
150 .field("qhull_options", &str_from_c_char_array(&self.qhull_options))
151 .field("qhull_optionlen", &self.qhull_optionlen)
152 .field("qhull_optionsiz", &self.qhull_optionsiz)
153 .field("qhull_optionsiz2", &self.qhull_optionsiz2)
154 .field("run_id", &self.run_id)
155 .field("VERTEXneighbors", &self.VERTEXneighbors)
156 .field("ZEROcentrum", &self.ZEROcentrum)
157 .field("upper_threshold", &self.upper_threshold)
158 .field("lower_threshold", &self.lower_threshold)
159 .field("upper_bound", &self.upper_bound)
160 .field("lower_bound", &self.lower_bound)
161 .field("ANGLEround", &self.ANGLEround)
162 .field("centrum_radius", &self.centrum_radius)
163 .field("cos_max", &self.cos_max)
164 .field("DISTround", &self.DISTround)
165 .field("MAXabs_coord", &self.MAXabs_coord)
166 .field("MAXlastcoord", &self.MAXlastcoord)
167 .field("MAXoutside", &self.MAXoutside)
168 .field("MAXsumcoord", &self.MAXsumcoord)
169 .field("MAXwidth", &self.MAXwidth)
170 .field("MINdenom_1", &self.MINdenom_1)
171 .field("MINdenom", &self.MINdenom)
172 .field("MINdenom_1_2", &self.MINdenom_1_2)
173 .field("MINdenom_2", &self.MINdenom_2)
174 .field("MINlastcoord", &self.MINlastcoord)
175 .field("NEARzero", &self.NEARzero)
176 .field("NEARinside", &self.NEARinside)
177 .field("ONEmerge", &self.ONEmerge)
178 .field("outside_err", &self.outside_err)
179 .field("WIDEfacet", &self.WIDEfacet)
180 .field("NARROWhull", &self.NARROWhull)
181 .field("qhull", &self.qhull)
182 .field("errexit", &"...")
183 .field("jmpXtra", &"...")
184 .field("restartexit", &"...")
185 .field("jmpXtra2", &"...")
186 .field("fin", &self.fin)
187 .field("fout", &self.fout)
188 .field("ferr", &self.ferr)
189 .field("interior_point", &self.interior_point)
190 .field("normal_size", &self.normal_size)
191 .field("center_size", &self.center_size)
192 .field("TEMPsize", &self.TEMPsize)
193 .field("facet_list", &self.facet_list)
194 .field("facet_tail", &self.facet_tail)
195 .field("facet_next", &self.facet_next)
196 .field("newfacet_list", &self.newfacet_list)
197 .field("visible_list", &self.visible_list)
198 .field("num_visible", &self.num_visible)
199 .field("tracefacet_id", &self.tracefacet_id)
200 .field("tracefacet", &self.tracefacet)
201 .field("traceridge_id", &self.traceridge_id)
202 .field("traceridge", &self.traceridge)
203 .field("tracevertex_id", &self.tracevertex_id)
204 .field("tracevertex", &self.tracevertex)
205 .field("vertex_list", &self.vertex_list)
206 .field("vertex_tail", &self.vertex_tail)
207 .field("newvertex_list", &self.newvertex_list)
208 .field("num_facets", &self.num_facets)
209 .field("num_vertices", &self.num_vertices)
210 .field("num_outside", &self.num_outside)
211 .field("num_good", &self.num_good)
212 .field("facet_id", &self.facet_id)
213 .field("ridge_id", &self.ridge_id)
214 .field("vertex_id", &self.vertex_id)
215 .field("first_newfacet", &self.first_newfacet)
216 .field("hulltime", &self.hulltime)
217 .field("ALLOWrestart", &self.ALLOWrestart)
218 .field("build_cnt", &self.build_cnt)
219 .field("CENTERtype", &self.CENTERtype)
220 .field("furthest_id", &self.furthest_id)
221 .field("last_errcode", &self.last_errcode)
222 .field("GOODclosest", &self.GOODclosest)
223 .field("coplanar_apex", &self.coplanar_apex)
224 .field("hasAreaVolume", &self.hasAreaVolume)
225 .field("hasTriangulation", &self.hasTriangulation)
226 .field("isRenameVertex", &self.isRenameVertex)
227 .field("JOGGLEmax", &self.JOGGLEmax)
228 .field("maxoutdone", &self.maxoutdone)
229 .field("max_outside", &self.max_outside)
230 .field("max_vertex", &self.max_vertex)
231 .field("min_vertex", &self.min_vertex)
232 .field("NEWfacets", &self.NEWfacets)
233 .field("NEWtentative", &self.NEWtentative)
234 .field("findbestnew", &self.findbestnew)
235 .field("findbest_notsharp", &self.findbest_notsharp)
236 .field("NOerrexit", &self.NOerrexit)
237 .field("PRINTcradius", &self.PRINTcradius)
238 .field("PRINTradius", &self.PRINTradius)
239 .field("POSTmerging", &self.POSTmerging)
240 .field("printoutvar", &self.printoutvar)
241 .field("printoutnum", &self.printoutnum)
242 .field("repart_facetid", &self.repart_facetid)
243 .field("retry_addpoint", &self.retry_addpoint)
244 .field("QHULLfinished", &self.QHULLfinished)
245 .field("totarea", &self.totarea)
246 .field("totvol", &self.totvol)
247 .field("visit_id", &self.visit_id)
248 .field("vertex_visit", &self.vertex_visit)
249 .field("WAScoplanar", &self.WAScoplanar)
250 .field("ZEROall_ok", &self.ZEROall_ok)
251 .field("facet_mergeset", &self.facet_mergeset)
252 .field("degen_mergeset", &self.degen_mergeset)
253 .field("vertex_mergeset", &self.vertex_mergeset)
254 .field("hash_table", &self.hash_table)
255 .field("other_points", &self.other_points)
256 .field("del_vertices", &self.del_vertices)
257 .field("gm_matrix", &self.gm_matrix)
258 .field("gm_row", &self.gm_row)
259 .field("line", &self.line)
260 .field("maxline", &self.maxline)
261 .field("half_space", &self.half_space)
262 .field("temp_malloc", &self.temp_malloc)
263 .field("ERREXITcalled", &self.ERREXITcalled)
264 .field("firstcentrum", &self.firstcentrum)
265 .field("old_randomdist", &self.old_randomdist)
266 .field("coplanarfacetset", &self.coplanarfacetset)
267 .field("last_low", &self.last_low)
268 .field("last_high", &self.last_high)
269 .field("last_newhigh", &self.last_newhigh)
270 .field("lastcpu", &self.lastcpu)
271 .field("lastfacets", &self.lastfacets)
272 .field("lastmerges", &self.lastmerges)
273 .field("lastplanes", &self.lastplanes)
274 .field("lastdist", &self.lastdist)
275 .field("lastreport", &self.lastreport)
276 .field("mergereport", &self.mergereport)
277 .field("old_tempstack", &self.old_tempstack)
278 .field("ridgeoutnum", &self.ridgeoutnum)
279 .field("last_random", &self.last_random)
280 .field("rbox_errexit", &"...")
281 .field("jmpXtra3", &"...")
282 .field("rbox_isinteger", &self.rbox_isinteger)
283 .field("rbox_out_offset", &self.rbox_out_offset)
284 .field("cpp_object", &self.cpp_object)
285 .field("cpp_other", &self.cpp_other)
286 .field("cpp_user", &self.cpp_user)
287 .field("qhmem", &self.qhmem)
288 .field("qhstat", &"...")
289 .finish()
290 }
291}