1 /*****************************************************************************/
2 /*  LibreDWG - free implementation of the DWG file format                    */
3 /*                                                                           */
4 /*  Copyright (C) 2020 Free Software Foundation, Inc.                        */
5 /*                                                                           */
6 /*  This library is free software, licensed under the terms of the GNU       */
7 /*  General Public License as published by the Free Software Foundation,     */
8 /*  either version 3 of the License, or (at your option) any later version.  */
9 /*  You should have received a copy of the GNU General Public License        */
10 /*  along with this program.  If not, see <http://www.gnu.org/licenses/>.    */
11 /*****************************************************************************/
12 
13 /*
14  * classes.c: map type to name. classify into unstable, debugging and unhandled.
15  * written by Reini Urban
16  */
17 
18 #include "config.h"
19 #include <string.h>
20 #include <stdlib.h>
21 #include <assert.h>
22 #include "common.h"
23 #include "classes.h"
24 #include "dynapi.h"
25 
26 // Now with direct O[1] access by type.
27 static const char *const _dwg_type_names_fixed[] =
28   {
29     "UNUSED",   	/* DWG_TYPE_UNUSED 0x00 */
30     "TEXT",		/* DWG_TYPE_TEXT 0x01 */
31     "ATTRIB",		/* DWG_TYPE_ATTRIB 0x02 */
32     "ATTDEF",		/* DWG_TYPE_ATTDEF 0x03 */
33     "BLOCK",		/* DWG_TYPE_BLOCK 0x04 */
34     "ENDBLK",		/* DWG_TYPE_ENDBLK 0x05 */
35     "SEQEND",		/* DWG_TYPE_SEQEND 0x06 */
36     "INSERT",		/* DWG_TYPE_INSERT 0x07 */
37     "MINSERT",		/* DWG_TYPE_MINSERT 0x08 */
38     NULL, 		/* DWG_TYPE_<UNKNOWN> = 0x09, */
39     "VERTEX_2D",	/* DWG_TYPE_VERTEX_2D 0x0a */
40     "VERTEX_3D",	/* DWG_TYPE_VERTEX_3D 0x0b */
41     "VERTEX_MESH",	/* DWG_TYPE_VERTEX_MESH 0x0c */
42     "VERTEX_PFACE",	/* DWG_TYPE_VERTEX_PFACE 0x0d */
43     "VERTEX_PFACE_FACE",/* DWG_TYPE_VERTEX_PFACE_FACE 0x0e */
44     "POLYLINE_2D",	/* DWG_TYPE_POLYLINE_2D 0x0f */
45     "POLYLINE_3D",	/* DWG_TYPE_POLYLINE_3D 0x10 */
46     "ARC",		/* DWG_TYPE_ARC 0x11 */
47     "CIRCLE",		/* DWG_TYPE_CIRCLE 0x12 */
48     "LINE",		/* DWG_TYPE_LINE 0x13 */
49     "DIMENSION_ORDINATE",/* DWG_TYPE_DIMENSION_ORDINATE 0x14 */
50     "DIMENSION_LINEAR",	/* DWG_TYPE_DIMENSION_LINEAR 0x15 */
51     "DIMENSION_ALIGNED",/* DWG_TYPE_DIMENSION_ALIGNED 0x16 */
52     "DIMENSION_ANG3PT",	/* DWG_TYPE_DIMENSION_ANG3PT 0x17 */
53     "DIMENSION_ANG2LN",	/* DWG_TYPE_DIMENSION_ANG2LN 0x18 */
54     "DIMENSION_RADIUS",	/* DWG_TYPE_DIMENSION_RADIUS 0x19 */
55     "DIMENSION_DIAMETER",/* DWG_TYPE_DIMENSION_DIAMETER 0x1A */
56     "POINT",		/* DWG_TYPE_POINT 0x1b */
57     "3DFACE",		/* DWG_TYPE__3DFACE 0x1c */
58     "POLYLINE_PFACE",	/* DWG_TYPE_POLYLINE_PFACE 0x1d */
59     "POLYLINE_MESH",	/* DWG_TYPE_POLYLINE_MESH 0x1e */
60     "SOLID",		/* DWG_TYPE_SOLID 0x1f */
61     "TRACE",		/* DWG_TYPE_TRACE 0x20 */
62     "SHAPE",		/* DWG_TYPE_SHAPE 0x21 */
63     "VIEWPORT",		/* DWG_TYPE_VIEWPORT 0x22 */
64     "ELLIPSE",		/* DWG_TYPE_ELLIPSE 0x23 */
65     "SPLINE",		/* DWG_TYPE_SPLINE 0x24 */
66     "REGION",		/* DWG_TYPE_REGION 0x25 */
67     "3DSOLID",		/* DWG_TYPE__3DSOLID 0x26 */
68     "BODY",		/* DWG_TYPE_BODY 0x27 */
69     "RAY",		/* DWG_TYPE_RAY 0x28 */
70     "XLINE",		/* DWG_TYPE_XLINE 0x29 */
71     "DICTIONARY",	/* DWG_TYPE_DICTIONARY 0x2a */
72     "OLEFRAME",         /* DWG_TYPE_OLEFRAME = 0x2b */
73     "MTEXT", 		/* DWG_TYPE_MTEXT = 0x2c */
74     "LEADER",		/* DWG_TYPE_LEADER = 0x2d */
75     "TOLERANCE",	/* DWG_TYPE_TOLERANCE = 0x2e */
76     "MLINE",		/* DWG_TYPE_MLINE 0x2f */
77     "BLOCK_CONTROL",	/* DWG_TYPE_BLOCK_CONTROL 0x30 */
78     "BLOCK_HEADER",	/* DWG_TYPE_BLOCK_HEADER 0x31 */
79     "LAYER_CONTROL",	/* DWG_TYPE_LAYER_CONTROL 0x32 */
80     "LAYER",		/* DWG_TYPE_LAYER 0x33 */
81     "STYLE_CONTROL",	/* DWG_TYPE_STYLE_CONTROL 0x34 */
82     "STYLE",		/* DWG_TYPE_STYLE 0x35 */
83     NULL, 		/* DWG_TYPE_<UNKNOWN> = 0x36, */
84     NULL, 		/* DWG_TYPE_<UNKNOWN> = 0x37, */
85     "LTYPE_CONTROL",	/* DWG_TYPE_LTYPE_CONTROL 0x38 */
86     "LTYPE",		/* DWG_TYPE_LTYPE 0x39 */
87     NULL, 		/* DWG_TYPE_<UNKNOWN> = 0x3a, */
88     NULL, 		/* DWG_TYPE_<UNKNOWN> = 0x3b, */
89     "VIEW_CONTROL",	/* DWG_TYPE_VIEW_CONTROL 0x3c */
90     "VIEW",		/* DWG_TYPE_VIEW 0x3d */
91     "UCS_CONTROL",	/* DWG_TYPE_UCS_CONTROL 0x3e */
92     "UCS",		/* DWG_TYPE_UCS 0x3f */
93     "VPORT_CONTROL",	/* DWG_TYPE_VPORT_CONTROL 0x40 */
94     "VPORT",		/* DWG_TYPE_VPORT 0x41 */
95     "APPID_CONTROL",	/* DWG_TYPE_APPID_CONTROL 0x42 */
96     "APPID",		/* DWG_TYPE_APPID 0x43 */
97     "DIMSTYLE_CONTROL",	/* DWG_TYPE_DIMSTYLE_CONTROL 0x44 */
98     "DIMSTYLE",		/* DWG_TYPE_DIMSTYLE 0x45 */
99     "VX_CONTROL",	/* DWG_TYPE_VX_CONTROL 0x46 */
100     "VX_TABLE_RECORD",	/* DWG_TYPE_VX_TABLE_RECORD 0x47 */
101     "GROUP",		/* DWG_TYPE_GROUP 0x48 */
102     "MLINESTYLE",	/* DWG_TYPE_MLINESTYLE 0x49 */
103     "OLE2FRAME",	/* DWG_TYPE_OLE2FRAME 0x4a */
104     "DUMMY",		/* DWG_TYPE_DUMMY 0x4b */
105     "LONG_TRANSACTION",	/* DWG_TYPE_LONG_TRANSACTION 0x4c */
106     "LWPOLYLINE",	/* DWG_TYPE_LWPOLYLINE 0x4d */
107     "HATCH",		/* DWG_TYPE_HATCH 0x4e */
108     "XRECORD",		/* DWG_TYPE_XRECORD 0x4f */
109     "PLACEHOLDER",	/* DWG_TYPE_PLACEHOLDER 0x50 */
110     "VBA_PROJECT",	/* DWG_TYPE_VBA_PROJECT 0x51 */
111     "LAYOUT",		/* DWG_TYPE_LAYOUT 0x52 */
112   };
113 
114 //  "PROXY_ENTITY" 0x1f2 498
115 //  "PROXY_OBJECT" 0x1f3 499
116 
117 // Auto-generated array of names starting at index 500, with direct access by fixedtype.
118 static const char *const _dwg_type_names_variable[] =
119   {
120     /* Start auto-generated variable. Do not modify */
121     "ACDSRECORD",                           	/* 500 */
122     "ACDSSCHEMA",                           	/* 501 */
123     "ACMECOMMANDHISTORY",                   	/* 502 */
124     "ACMESCOPE",                            	/* 503 */
125     "ACMESTATEMGR",                         	/* 504 */
126     "ACSH_BOOLEAN_CLASS",                   	/* 505 */
127     "ACSH_BOX_CLASS",                       	/* 506 */
128     "ACSH_BREP_CLASS",                      	/* 507 */
129     "ACSH_CHAMFER_CLASS",                   	/* 508 */
130     "ACSH_CONE_CLASS",                      	/* 509 */
131     "ACSH_CYLINDER_CLASS",                  	/* 510 */
132     "ACSH_EXTRUSION_CLASS",                 	/* 511 */
133     "ACSH_FILLET_CLASS",                    	/* 512 */
134     "ACSH_HISTORY_CLASS",                   	/* 513 */
135     "ACSH_LOFT_CLASS",                      	/* 514 */
136     "ACSH_PYRAMID_CLASS",                   	/* 515 */
137     "ACSH_REVOLVE_CLASS",                   	/* 516 */
138     "ACSH_SPHERE_CLASS",                    	/* 517 */
139     "ACSH_SWEEP_CLASS",                     	/* 518 */
140     "ACSH_TORUS_CLASS",                     	/* 519 */
141     "ACSH_WEDGE_CLASS",                     	/* 520 */
142     "ALDIMOBJECTCONTEXTDATA",               	/* 521 */
143     "ALIGNMENTPARAMETERENTITY",             	/* 522 */
144     "ANGDIMOBJECTCONTEXTDATA",              	/* 523 */
145     "ANNOTSCALEOBJECTCONTEXTDATA",          	/* 524 */
146     "ARCALIGNEDTEXT",                       	/* 525 */
147     "ARC_DIMENSION",                        	/* 526 */
148     "ASSOC2DCONSTRAINTGROUP",               	/* 527 */
149     "ASSOC3POINTANGULARDIMACTIONBODY",      	/* 528 */
150     "ASSOCACTION",                          	/* 529 */
151     "ASSOCACTIONPARAM",                     	/* 530 */
152     "ASSOCALIGNEDDIMACTIONBODY",            	/* 531 */
153     "ASSOCARRAYACTIONBODY",                 	/* 532 */
154     "ASSOCARRAYMODIFYACTIONBODY",           	/* 533 */
155     "ASSOCARRAYMODIFYPARAMETERS",           	/* 534 */
156     "ASSOCARRAYPATHPARAMETERS",             	/* 535 */
157     "ASSOCARRAYPOLARPARAMETERS",            	/* 536 */
158     "ASSOCARRAYRECTANGULARPARAMETERS",      	/* 537 */
159     "ASSOCASMBODYACTIONPARAM",              	/* 538 */
160     "ASSOCBLENDSURFACEACTIONBODY",          	/* 539 */
161     "ASSOCCOMPOUNDACTIONPARAM",             	/* 540 */
162     "ASSOCDEPENDENCY",                      	/* 541 */
163     "ASSOCDIMDEPENDENCYBODY",               	/* 542 */
164     "ASSOCEDGEACTIONPARAM",                 	/* 543 */
165     "ASSOCEDGECHAMFERACTIONBODY",           	/* 544 */
166     "ASSOCEDGEFILLETACTIONBODY",            	/* 545 */
167     "ASSOCEXTENDSURFACEACTIONBODY",         	/* 546 */
168     "ASSOCEXTRUDEDSURFACEACTIONBODY",       	/* 547 */
169     "ASSOCFACEACTIONPARAM",                 	/* 548 */
170     "ASSOCFILLETSURFACEACTIONBODY",         	/* 549 */
171     "ASSOCGEOMDEPENDENCY",                  	/* 550 */
172     "ASSOCLOFTEDSURFACEACTIONBODY",         	/* 551 */
173     "ASSOCMLEADERACTIONBODY",               	/* 552 */
174     "ASSOCNETWORK",                         	/* 553 */
175     "ASSOCNETWORKSURFACEACTIONBODY",        	/* 554 */
176     "ASSOCOBJECTACTIONPARAM",               	/* 555 */
177     "ASSOCOFFSETSURFACEACTIONBODY",         	/* 556 */
178     "ASSOCORDINATEDIMACTIONBODY",           	/* 557 */
179     "ASSOCOSNAPPOINTREFACTIONPARAM",        	/* 558 */
180     "ASSOCPATCHSURFACEACTIONBODY",          	/* 559 */
181     "ASSOCPATHACTIONPARAM",                 	/* 560 */
182     "ASSOCPERSSUBENTMANAGER",               	/* 561 */
183     "ASSOCPLANESURFACEACTIONBODY",          	/* 562 */
184     "ASSOCPOINTREFACTIONPARAM",             	/* 563 */
185     "ASSOCRESTOREENTITYSTATEACTIONBODY",    	/* 564 */
186     "ASSOCREVOLVEDSURFACEACTIONBODY",       	/* 565 */
187     "ASSOCROTATEDDIMACTIONBODY",            	/* 566 */
188     "ASSOCSWEPTSURFACEACTIONBODY",          	/* 567 */
189     "ASSOCTRIMSURFACEACTIONBODY",           	/* 568 */
190     "ASSOCVALUEDEPENDENCY",                 	/* 569 */
191     "ASSOCVARIABLE",                        	/* 570 */
192     "ASSOCVERTEXACTIONPARAM",               	/* 571 */
193     "BASEPOINTPARAMETERENTITY",             	/* 572 */
194     "BLKREFOBJECTCONTEXTDATA",              	/* 573 */
195     "BLOCKALIGNEDCONSTRAINTPARAMETER",      	/* 574 */
196     "BLOCKALIGNMENTGRIP",                   	/* 575 */
197     "BLOCKALIGNMENTPARAMETER",              	/* 576 */
198     "BLOCKANGULARCONSTRAINTPARAMETER",      	/* 577 */
199     "BLOCKARRAYACTION",                     	/* 578 */
200     "BLOCKBASEPOINTPARAMETER",              	/* 579 */
201     "BLOCKDIAMETRICCONSTRAINTPARAMETER",    	/* 580 */
202     "BLOCKFLIPACTION",                      	/* 581 */
203     "BLOCKFLIPGRIP",                        	/* 582 */
204     "BLOCKFLIPPARAMETER",                   	/* 583 */
205     "BLOCKGRIPLOCATIONCOMPONENT",           	/* 584 */
206     "BLOCKHORIZONTALCONSTRAINTPARAMETER",   	/* 585 */
207     "BLOCKLINEARCONSTRAINTPARAMETER",       	/* 586 */
208     "BLOCKLINEARGRIP",                      	/* 587 */
209     "BLOCKLINEARPARAMETER",                 	/* 588 */
210     "BLOCKLOOKUPACTION",                    	/* 589 */
211     "BLOCKLOOKUPGRIP",                      	/* 590 */
212     "BLOCKLOOKUPPARAMETER",                 	/* 591 */
213     "BLOCKMOVEACTION",                      	/* 592 */
214     "BLOCKPARAMDEPENDENCYBODY",             	/* 593 */
215     "BLOCKPOINTPARAMETER",                  	/* 594 */
216     "BLOCKPOLARGRIP",                       	/* 595 */
217     "BLOCKPOLARPARAMETER",                  	/* 596 */
218     "BLOCKPOLARSTRETCHACTION",              	/* 597 */
219     "BLOCKPROPERTIESTABLE",                 	/* 598 */
220     "BLOCKPROPERTIESTABLEGRIP",             	/* 599 */
221     "BLOCKRADIALCONSTRAINTPARAMETER",       	/* 600 */
222     "BLOCKREPRESENTATION",                  	/* 601 */
223     "BLOCKROTATEACTION",                    	/* 602 */
224     "BLOCKROTATIONGRIP",                    	/* 603 */
225     "BLOCKROTATIONPARAMETER",               	/* 604 */
226     "BLOCKSCALEACTION",                     	/* 605 */
227     "BLOCKSTRETCHACTION",                   	/* 606 */
228     "BLOCKUSERPARAMETER",                   	/* 607 */
229     "BLOCKVERTICALCONSTRAINTPARAMETER",     	/* 608 */
230     "BLOCKVISIBILITYGRIP",                  	/* 609 */
231     "BLOCKVISIBILITYPARAMETER",             	/* 610 */
232     "BLOCKXYGRIP",                          	/* 611 */
233     "BLOCKXYPARAMETER",                     	/* 612 */
234     "CAMERA",                               	/* 613 */
235     "CELLSTYLEMAP",                         	/* 614 */
236     "CONTEXTDATAMANAGER",                   	/* 615 */
237     "CSACDOCUMENTOPTIONS",                  	/* 616 */
238     "CURVEPATH",                            	/* 617 */
239     "DATALINK",                             	/* 618 */
240     "DATATABLE",                            	/* 619 */
241     "DBCOLOR",                              	/* 620 */
242     "DETAILVIEWSTYLE",                      	/* 621 */
243     "DGNDEFINITION",                        	/* 622 */
244     "DGNUNDERLAY",                          	/* 623 */
245     "DICTIONARYVAR",                        	/* 624 */
246     "DICTIONARYWDFLT",                      	/* 625 */
247     "DIMASSOC",                             	/* 626 */
248     "DMDIMOBJECTCONTEXTDATA",               	/* 627 */
249     "DWFDEFINITION",                        	/* 628 */
250     "DWFUNDERLAY",                          	/* 629 */
251     "DYNAMICBLOCKPROXYNODE",                	/* 630 */
252     "DYNAMICBLOCKPURGEPREVENTER",           	/* 631 */
253     "EVALUATION_GRAPH",                     	/* 632 */
254     "EXTRUDEDSURFACE",                      	/* 633 */
255     "FCFOBJECTCONTEXTDATA",                 	/* 634 */
256     "FIELD",                                	/* 635 */
257     "FIELDLIST",                            	/* 636 */
258     "FLIPPARAMETERENTITY",                  	/* 637 */
259     "GEODATA",                              	/* 638 */
260     "GEOMAPIMAGE",                          	/* 639 */
261     "GEOPOSITIONMARKER",                    	/* 640 */
262     "GRADIENT_BACKGROUND",                  	/* 641 */
263     "GROUND_PLANE_BACKGROUND",              	/* 642 */
264     "HELIX",                                	/* 643 */
265     "IBL_BACKGROUND",                       	/* 644 */
266     "IDBUFFER",                             	/* 645 */
267     "IMAGE",                                	/* 646 */
268     "IMAGEDEF",                             	/* 647 */
269     "IMAGEDEF_REACTOR",                     	/* 648 */
270     "IMAGE_BACKGROUND",                     	/* 649 */
271     "INDEX",                                	/* 650 */
272     "LARGE_RADIAL_DIMENSION",               	/* 651 */
273     "LAYERFILTER",                          	/* 652 */
274     "LAYER_INDEX",                          	/* 653 */
275     "LAYOUTPRINTCONFIG",                    	/* 654 */
276     "LEADEROBJECTCONTEXTDATA",              	/* 655 */
277     "LIGHT",                                	/* 656 */
278     "LIGHTLIST",                            	/* 657 */
279     "LINEARPARAMETERENTITY",                	/* 658 */
280     "LOFTEDSURFACE",                        	/* 659 */
281     "MATERIAL",                             	/* 660 */
282     "MENTALRAYRENDERSETTINGS",              	/* 661 */
283     "MESH",                                 	/* 662 */
284     "MLEADEROBJECTCONTEXTDATA",             	/* 663 */
285     "MLEADERSTYLE",                         	/* 664 */
286     "MOTIONPATH",                           	/* 665 */
287     "MPOLYGON",                             	/* 666 */
288     "MTEXTATTRIBUTEOBJECTCONTEXTDATA",      	/* 667 */
289     "MTEXTOBJECTCONTEXTDATA",               	/* 668 */
290     "MULTILEADER",                          	/* 669 */
291     "NAVISWORKSMODEL",                      	/* 670 */
292     "NAVISWORKSMODELDEF",                   	/* 671 */
293     "NPOCOLLECTION",                        	/* 672 */
294     "NURBSURFACE",                          	/* 673 */
295     "OBJECT_PTR",                           	/* 674 */
296     "ORDDIMOBJECTCONTEXTDATA",              	/* 675 */
297     "PARTIAL_VIEWING_INDEX",                	/* 676 */
298     "PDFDEFINITION",                        	/* 677 */
299     "PDFUNDERLAY",                          	/* 678 */
300     "PERSUBENTMGR",                         	/* 679 */
301     "PLANESURFACE",                         	/* 680 */
302     "PLOTSETTINGS",                         	/* 681 */
303     "POINTCLOUD",                           	/* 682 */
304     "POINTCLOUDCOLORMAP",                   	/* 683 */
305     "POINTCLOUDDEF",                        	/* 684 */
306     "POINTCLOUDDEFEX",                      	/* 685 */
307     "POINTCLOUDDEF_REACTOR",                	/* 686 */
308     "POINTCLOUDDEF_REACTOR_EX",             	/* 687 */
309     "POINTCLOUDEX",                         	/* 688 */
310     "POINTPARAMETERENTITY",                 	/* 689 */
311     "POINTPATH",                            	/* 690 */
312     "POLARGRIPENTITY",                      	/* 691 */
313     "RADIMLGOBJECTCONTEXTDATA",             	/* 692 */
314     "RADIMOBJECTCONTEXTDATA",               	/* 693 */
315     "RAPIDRTRENDERSETTINGS",                	/* 694 */
316     "RASTERVARIABLES",                      	/* 695 */
317     "RENDERENTRY",                          	/* 696 */
318     "RENDERENVIRONMENT",                    	/* 697 */
319     "RENDERGLOBAL",                         	/* 698 */
320     "RENDERSETTINGS",                       	/* 699 */
321     "REVOLVEDSURFACE",                      	/* 700 */
322     "ROTATIONPARAMETERENTITY",              	/* 701 */
323     "RTEXT",                                	/* 702 */
324     "SCALE",                                	/* 703 */
325     "SECTIONOBJECT",                        	/* 704 */
326     "SECTIONVIEWSTYLE",                     	/* 705 */
327     "SECTION_MANAGER",                      	/* 706 */
328     "SECTION_SETTINGS",                     	/* 707 */
329     "SKYLIGHT_BACKGROUND",                  	/* 708 */
330     "SOLID_BACKGROUND",                     	/* 709 */
331     "SORTENTSTABLE",                        	/* 710 */
332     "SPATIAL_FILTER",                       	/* 711 */
333     "SPATIAL_INDEX",                        	/* 712 */
334     "SUN",                                  	/* 713 */
335     "SUNSTUDY",                             	/* 714 */
336     "SWEPTSURFACE",                         	/* 715 */
337     "TABLE",                                	/* 716 */
338     "TABLECONTENT",                         	/* 717 */
339     "TABLEGEOMETRY",                        	/* 718 */
340     "TABLESTYLE",                           	/* 719 */
341     "TEXTOBJECTCONTEXTDATA",                	/* 720 */
342     "TVDEVICEPROPERTIES",                   	/* 721 */
343     "VISIBILITYGRIPENTITY",                 	/* 722 */
344     "VISIBILITYPARAMETERENTITY",            	/* 723 */
345     "VISUALSTYLE",                          	/* 724 */
346     "WIPEOUT",                              	/* 725 */
347     "WIPEOUTVARIABLES",                     	/* 726 */
348     "XREFPANELOBJECT",                      	/* 727 */
349     "XYPARAMETERENTITY",                    	/* 728 */
350   /* End auto-generated variable */
351 };
352 
353 // after 1.0 add new types here for binary compat
354 /*
355   { DWG_TYPE_FREED      , "FREED      " }, // 0xfffd
356   { DWG_TYPE_UNKNOWN_ENT, "UNKNOWN_ENT" }, // 0xfffe
357   { DWG_TYPE_UNKNOWN_OBJ, "UNKNOWN_OBJ" }, // 0xffff
358 */
359 
360 /* Fast type -> name */
dwg_type_name(const Dwg_Object_Type type)361 const char *dwg_type_name (const Dwg_Object_Type type)
362 {
363 #if 1
364   if (type <= DWG_TYPE_LAYOUT)
365     return _dwg_type_names_fixed[type];
366   else if ((unsigned)type >= 500 && type <= DWG_TYPE_XYPARAMETERENTITY)
367     return _dwg_type_names_variable[type - 500];
368   else if (type == DWG_TYPE_UNKNOWN_ENT)
369     return "UNKNOWN_ENT";
370   else if (type == DWG_TYPE_UNKNOWN_OBJ)
371     return "UNKNOWN_OBJ";
372   else if (type == DWG_TYPE_PROXY_ENTITY)
373     return "ACAD_PROXY_ENTITY";
374   else if (type == DWG_TYPE_PROXY_OBJECT)
375     return "ACAD_PROXY_OBJECT";
376   else if (type == DWG_TYPE_FREED)
377     return "FREED";
378   else
379     return NULL;
380 #else
381   const struct _obj_type_name *s = (struct _obj_type_name *)_dwg_type_name;
382   // linear, TODO better binary search. Or a switch jumptable, as in free.
383   // just 12 unhandled are missing in objects.inc
384   for (; s->type != DWG_TYPE_UNKNOWN_OBJ; s++)
385     {
386       if (type == s->type)
387         return s->name;
388     }
389   return NULL;
390 #endif
391 }
392 
393 // gperf lookup: name -> type, dxfname
dwg_name_type(const char * name)394 Dwg_Object_Type dwg_name_type (const char *name)
395 {
396 #if 1
397   Dwg_Object_Type type;
398   if (dwg_object_name (name, NULL, &type, NULL, NULL))
399     return type;
400   else
401     return DWG_TYPE_UNUSED;
402 #else
403   struct _obj_type_name *s = (struct _obj_type_name *)_dwg_type_name;
404   for (; s->type != DWG_TYPE_UNKNOWN_OBJ; s++)
405     {
406       if (strEQ (name, s->name))
407         return s->type;
408     }
409   return DWG_TYPE_UNUSED;
410 #endif
411 }
412 
413 bool
is_type_stable(const Dwg_Object_Type type)414 is_type_stable (const Dwg_Object_Type type)
415 {
416   // clang-format off
417   return !is_type_unstable (type)
418       && !is_type_debugging (type)
419       && !is_type_unstable (type)
420       && type != DWG_TYPE_UNKNOWN_OBJ
421       && type != DWG_TYPE_UNKNOWN_ENT
422       && type != DWG_TYPE_FREED;
423   // clang-format on
424 }
425 
426 bool
is_type_unstable_all(const Dwg_Object_Type type)427 is_type_unstable_all (const Dwg_Object_Type type)
428 {
429   return is_type_unstable (type)
430       || is_type_debugging (type);
431 }
432 
is_type_unstable(const Dwg_Object_Type type)433 bool is_type_unstable (const Dwg_Object_Type type)
434 {
435 #if 1
436   return is_class_unstable (dwg_type_name (type));
437 #else
438   // unsorted, only linear
439   for (int i = 0; i < ARRAY_SIZE(_classes_unstable); i++)
440     {
441       if (type == _classes_unstable[i])
442         return true;
443     }
444 #endif
445   return false;
446 }
is_type_debugging(const Dwg_Object_Type type)447 bool is_type_debugging (const Dwg_Object_Type type)
448 {
449 #if 1
450   return is_class_debugging (dwg_type_name (type));
451 #else
452   // unsorted, only linear
453   for (int i = 0; i < ARRAY_SIZE(_classes_debugging); i++)
454     {
455       if (type == _classes_debugging[i])
456         return true;
457     }
458 #endif
459   return false;
460 }
is_type_unhandled(const Dwg_Object_Type type)461 bool is_type_unhandled (const Dwg_Object_Type type)
462 {
463 #if 1
464   return is_class_unhandled (dwg_type_name (type));
465 #else
466   // unsorted, only linear
467   for (int i = 0; i < ARRAY_SIZE(_classes_unhandled); i++)
468     {
469       if (type == _classes_unhandled[i])
470         return true;
471     }
472 #endif
473   return false;
474 }
475 
is_class_stable(const char * name)476 bool is_class_stable (const char* name)
477 {
478 #if 1
479   // hash lookup
480   Dwg_Class_Stability stable;
481   if (dwg_object_name (name, NULL, NULL, NULL, &stable))
482     return stable == DWG_CLASS_STABLE;
483   else
484     return false;
485 #else
486   return is_type_stable (dwg_name_type (name));
487 #endif
488 }
is_class_unstable(const char * name)489 bool is_class_unstable (const char* name)
490 {
491 #if 1
492   // hash lookup
493   Dwg_Class_Stability stable;
494   if (dwg_object_name (name, NULL, NULL, NULL, &stable))
495     return stable == DWG_CLASS_UNSTABLE;
496   else
497     return false;
498 #else
499   return is_type_unstable (dwg_name_type (name));
500 #endif
501 }
is_class_debugging(const char * name)502 bool is_class_debugging (const char* name)
503 {
504 #if 1
505   // hash lookup
506   Dwg_Class_Stability stable;
507   if (dwg_object_name (name, NULL, NULL, NULL, &stable))
508     return stable == DWG_CLASS_DEBUGGING;
509   else
510     return false;
511 #else
512   return is_type_debugging (dwg_name_type (name));
513 #endif
514 }
is_class_unhandled(const char * name)515 bool is_class_unhandled (const char* name)
516 {
517 #if 1
518   // hash lookup
519   Dwg_Class_Stability stable;
520   if (dwg_object_name (name, NULL, NULL, NULL, &stable))
521     return stable == DWG_CLASS_UNHANDLED;
522   else
523     return true;
524 #else
525   return is_type_unhandled (dwg_name_type (name));
526 #endif
527 }
528 
dwg_find_class(const Dwg_Data * restrict dwg,const char * dxfname,BITCODE_BS * numberp)529 bool dwg_find_class (const Dwg_Data *restrict dwg, const char* dxfname, BITCODE_BS *numberp)
530 {
531   assert(dwg);
532   assert(dxfname);
533   // linear search is good enough, with ~20 classes
534   for (BITCODE_BS i = 0; i < dwg->num_classes; i++)
535     {
536       // ->dxfname is always ASCII/UTF-8, dxfname_u is the TU counterpart
537       if (dwg->dwg_class[i].dxfname && strEQ (dwg->dwg_class[i].dxfname, dxfname))
538         {
539           if (numberp)
540             *numberp = dwg->dwg_class[i].number;
541           return true;
542         }
543     }
544   return false;
545 }
546 
547 // Similar to _dwg_type_name, just with immediate access, no linear/binary search.
548 static const char *_dwg_dxfnames_fixed[] = {
549   NULL, /* UNUSED = 0x00, */
550   "TEXT", /* 0x01 */
551   "ATTRIB", /* 0x02 */
552   "ATTDEF", /* 0x03, */
553   "BLOCK", /* 0x04, */
554   "ENDBLK", /* 0x05, */
555   "SEQEND", /* 0x06, */
556   "INSERT", /* 0x07, */
557   "INSERT", /* MINSERT 0x08, */
558   "TRACE",  /* TRACE_old = 0x09, old TRACE r10-r11 only */
559   "VERTEX", /* _2D 0x0a, */
560   "VERTEX", /* _3D 0x0b, */
561   "VERTEX", /* _MESH 0x0c, */
562   "VERTEX", /* _PFACE 0x0d, */
563   "VERTEX", /* _PFACE_FACE 0x0e, */
564   "POLYLINE", /* _2D 0x0f, */
565   "POLYLINE", /* _3D 0x10, */
566   "ARC",      /* 0x11, */
567   "CIRCLE",   /* 0x12, */
568   "LINE",     /* 0x13, */
569   "DIMENSION", /* _ORDINATE 0x14, */
570   "DIMENSION", /* _LINEAR 0x15, */
571   "DIMENSION", /* _ALIGNED 0x16, */
572   "DIMENSION", /* _ANG3PT 0x17, */
573   "DIMENSION", /* _ANG2LN 0x18, */
574   "DIMENSION", /* _RADIUS 0x19, */
575   "DIMENSION", /* _DIAMETER 0x1A, */
576   "POINT", /* 0x1b, */
577   "3DFACE", /* 0x1c, */
578   "POLYLINE", /* POLYLINE_PFACE 0x1d, */
579   "POLYLINE", /* POLYLINE_MESH 0x1e, */
580   "SOLID", /* 0x1f, */
581   "TRACE", /* 0x20, */
582   "SHAPE", /* 0x21, */
583   "VIEWPORT", /* 0x22, */
584   "ELLIPSE", /* 0x23, */
585   "SPLINE", /* 0x24, */
586   "REGION", /* 0x25, */
587   "3DSOLID", /* 0x26, */
588   "BODY", /* 0x27, */
589   "RAY", /* 0x28, */
590   "XLINE", /* 0x29, */
591   "DICTIONARY", /* 0x2a, */
592   "OLEFRAME", /* 0x2b, */
593   "MTEXT", /* 0x2c, */
594   "LEADER", /* 0x2d, */
595   "TOLERANCE", /* 0x2e, */
596   "MLINE", /* 0x2f, */
597   "BLOCK_CONTROL", /* 0x30, */
598   "BLOCK_HEADER", /* 0x31, */
599   "LAYER_CONTROL", /* 0x32, */
600   "LAYER",         /* 0x33, */
601   "STYLE_CONTROL", /* 0x34, 52 SHAPEFILE_CONTROL */
602   "STYLE", /* 0x35, */
603   NULL, /* DWG_TYPE_<UNKNOWN> = 0x36, */
604   NULL, /* DWG_TYPE_<UNKNOWN> = 0x37, */
605   "LTYPE_CONTROL", /* 0x38, */
606   "LTYPE", /* 0x39, */
607   NULL, /* DWG_TYPE_<UNKNOWN> = 0x3a, */
608   NULL, /* DWG_TYPE_<UNKNOWN> = 0x3b, */
609   "VIEW_CONTROL", /* 0x3c, */
610   "VIEW", /* 0x3d, */
611   "UCS_CONTROL", /* 0x3e, */
612   "UCS", /* 0x3f, */
613   "VPORT_CONTROL", /* 0x40, */
614   "VPORT", /* 0x41, */
615   "APPID_CONTROL", /* 0x42, */
616   "APPID", /* 0x43, */
617   "DIMSTYLE_CONTROL", /* 0x44, */
618   "DIMSTYLE", /* 0x45, */
619   "VX_CONTROL", /* 0x46, */
620   "VX_TABLE_RECORD", /* 0x47, */
621   "GROUP", /* 0x48, */
622   "MLINESTYLE", /* 0x49, */
623   "OLE2FRAME", /* 0x4a, */
624   "DUMMY", /* 0x4b, */
625   "LONG_TRANSACTION", /* 0x4c, */
626   "LWPOLYLINE", /* 0x4d */
627   "HATCH", /* 0x4e, */
628   "XRECORD", /* 0x4f, */
629   "ACDBPLACEHOLDER", /* 0x50, */
630   "VBA_PROJECT", /* 0x51, */
631   "LAYOUT" /* 0x52 */
632 };
633 
634 /* Non-fixed types > 500. Not stored as type, but as fixedtype. */
635 static const char *_dwg_dxfnames_variable[] =
636   {
637     /* Start auto-generated dxfnames. Do not modify */
638     "ACDSRECORD",                           	/* 500 */
639     "ACDSSCHEMA",                           	/* 501 */
640     "ACMECOMMANDHISTORY",                   	/* 502 */
641     "ACMESCOPE",                            	/* 503 */
642     "ACMESTATEMGR",                         	/* 504 */
643     "ACSH_BOOLEAN_CLASS",                   	/* 505 */
644     "ACSH_BOX_CLASS",                       	/* 506 */
645     "ACSH_BREP_CLASS",                      	/* 507 */
646     "ACSH_CHAMFER_CLASS",                   	/* 508 */
647     "ACSH_CONE_CLASS",                      	/* 509 */
648     "ACSH_CYLINDER_CLASS",                  	/* 510 */
649     "ACSH_EXTRUSION_CLASS",                 	/* 511 */
650     "ACSH_FILLET_CLASS",                    	/* 512 */
651     "ACSH_HISTORY_CLASS",                   	/* 513 */
652     "ACSH_LOFT_CLASS",                      	/* 514 */
653     "ACSH_PYRAMID_CLASS",                   	/* 515 */
654     "ACSH_REVOLVE_CLASS",                   	/* 516 */
655     "ACSH_SPHERE_CLASS",                    	/* 517 */
656     "ACSH_SWEEP_CLASS",                     	/* 518 */
657     "ACSH_TORUS_CLASS",                     	/* 519 */
658     "ACSH_WEDGE_CLASS",                     	/* 520 */
659     "ACDB_ALDIMOBJECTCONTEXTDATA_CLASS",    	/* 521 */
660     "ALIGNMENTPARAMETERENTITY",             	/* 522 */
661     "ACDB_ANGDIMOBJECTCONTEXTDATA_CLASS",   	/* 523 */
662     "ACDB_ANNOTSCALEOBJECTCONTEXTDATA_CLASS",	/* 524 */
663     "ARCALIGNEDTEXT",                       	/* 525 */
664     "ARC_DIMENSION",                        	/* 526 */
665     "ACDBASSOC2DCONSTRAINTGROUP",           	/* 527 */
666     "ACDBASSOC3POINTANGULARDIMACTIONBODY",  	/* 528 */
667     "ACDBASSOCACTION",                      	/* 529 */
668     "ACDBASSOCACTIONPARAM",                 	/* 530 */
669     "ACDBASSOCALIGNEDDIMACTIONBODY",        	/* 531 */
670     "ACDBASSOCARRAYACTIONBODY",             	/* 532 */
671     "ACDBASSOCARRAYMODIFYACTIONBODY",       	/* 533 */
672     "ACDBASSOCARRAYMODIFYPARAMETERS",       	/* 534 */
673     "ACDBASSOCARRAYPATHPARAMETERS",         	/* 535 */
674     "ACDBASSOCARRAYPOLARPARAMETERS",        	/* 536 */
675     "ACDBASSOCARRAYRECTANGULARPARAMETERS",  	/* 537 */
676     "ACDBASSOCASMBODYACTIONPARAM",          	/* 538 */
677     "ACDBASSOCBLENDSURFACEACTIONBODY",      	/* 539 */
678     "ACDBASSOCCOMPOUNDACTIONPARAM",         	/* 540 */
679     "ACDBASSOCDEPENDENCY",                  	/* 541 */
680     "ACDBASSOCDIMDEPENDENCYBODY",           	/* 542 */
681     "ACDBASSOCEDGEACTIONPARAM",             	/* 543 */
682     "ACDBASSOCEDGECHAMFERACTIONBODY",       	/* 544 */
683     "ACDBASSOCEDGEFILLETACTIONBODY",        	/* 545 */
684     "ACDBASSOCEXTENDSURFACEACTIONBODY",     	/* 546 */
685     "ACDBASSOCEXTRUDEDSURFACEACTIONBODY",   	/* 547 */
686     "ACDBASSOCFACEACTIONPARAM",             	/* 548 */
687     "ACDBASSOCFILLETSURFACEACTIONBODY",     	/* 549 */
688     "ACDBASSOCGEOMDEPENDENCY",              	/* 550 */
689     "ACDBASSOCLOFTEDSURFACEACTIONBODY",     	/* 551 */
690     "ACDBASSOCMLEADERACTIONBODY",           	/* 552 */
691     "ACDBASSOCNETWORK",                     	/* 553 */
692     "ACDBASSOCNETWORKSURFACEACTIONBODY",    	/* 554 */
693     "ACDBASSOCOBJECTACTIONPARAM",           	/* 555 */
694     "ACDBASSOCOFFSETSURFACEACTIONBODY",     	/* 556 */
695     "ACDBASSOCORDINATEDIMACTIONBODY",       	/* 557 */
696     "ACDBASSOCOSNAPPOINTREFACTIONPARAM",    	/* 558 */
697     "ACDBASSOCPATCHSURFACEACTIONBODY",      	/* 559 */
698     "ACDBASSOCPATHACTIONPARAM",             	/* 560 */
699     "ACDBASSOCPERSSUBENTMANAGER",           	/* 561 */
700     "ACDBASSOCPLANESURFACEACTIONBODY",      	/* 562 */
701     "ACDBASSOCPOINTREFACTIONPARAM",         	/* 563 */
702     "ACDBASSOCRESTOREENTITYSTATEACTIONBODY",	/* 564 */
703     "ACDBASSOCREVOLVEDSURFACEACTIONBODY",   	/* 565 */
704     "ACDBASSOCROTATEDDIMACTIONBODY",        	/* 566 */
705     "ACDBASSOCSWEPTSURFACEACTIONBODY",      	/* 567 */
706     "ACDBASSOCTRIMSURFACEACTIONBODY",       	/* 568 */
707     "ACDBASSOCVALUEDEPENDENCY",             	/* 569 */
708     "ACDBASSOCVARIABLE",                    	/* 570 */
709     "ACDBASSOCVERTEXACTIONPARAM",           	/* 571 */
710     "BASEPOINTPARAMETERENTITY",             	/* 572 */
711     "ACDB_BLKREFOBJECTCONTEXTDATA_CLASS",   	/* 573 */
712     "BLOCKALIGNEDCONSTRAINTPARAMETER",      	/* 574 */
713     "BLOCKALIGNMENTGRIP",                   	/* 575 */
714     "BLOCKALIGNMENTPARAMETER",              	/* 576 */
715     "BLOCKANGULARCONSTRAINTPARAMETER",      	/* 577 */
716     "BLOCKARRAYACTION",                     	/* 578 */
717     "BLOCKBASEPOINTPARAMETER",              	/* 579 */
718     "BLOCKDIAMETRICCONSTRAINTPARAMETER",    	/* 580 */
719     "BLOCKFLIPACTION",                      	/* 581 */
720     "BLOCKFLIPGRIP",                        	/* 582 */
721     "BLOCKFLIPPARAMETER",                   	/* 583 */
722     "BLOCKGRIPLOCATIONCOMPONENT",           	/* 584 */
723     "BLOCKHORIZONTALCONSTRAINTPARAMETER",   	/* 585 */
724     "BLOCKLINEARCONSTRAINTPARAMETER",       	/* 586 */
725     "BLOCKLINEARGRIP",                      	/* 587 */
726     "BLOCKLINEARPARAMETER",                 	/* 588 */
727     "BLOCKLOOKUPACTION",                    	/* 589 */
728     "BLOCKLOOKUPGRIP",                      	/* 590 */
729     "BLOCKLOOKUPPARAMETER",                 	/* 591 */
730     "BLOCKMOVEACTION",                      	/* 592 */
731     "BLOCKPARAMDEPENDENCYBODY",             	/* 593 */
732     "BLOCKPOINTPARAMETER",                  	/* 594 */
733     "BLOCKPOLARGRIP",                       	/* 595 */
734     "BLOCKPOLARPARAMETER",                  	/* 596 */
735     "BLOCKPOLARSTRETCHACTION",              	/* 597 */
736     "BLOCKPROPERTIESTABLE",                 	/* 598 */
737     "BLOCKPROPERTIESTABLEGRIP",             	/* 599 */
738     "BLOCKRADIALCONSTRAINTPARAMETER",       	/* 600 */
739     "ACDB_BLOCKREPRESENTATION_DATA",        	/* 601 */
740     "BLOCKROTATEACTION",                    	/* 602 */
741     "BLOCKROTATIONGRIP",                    	/* 603 */
742     "BLOCKROTATIONPARAMETER",               	/* 604 */
743     "BLOCKSCALEACTION",                     	/* 605 */
744     "BLOCKSTRETCHACTION",                   	/* 606 */
745     "BLOCKUSERPARAMETER",                   	/* 607 */
746     "BLOCKVERTICALCONSTRAINTPARAMETER",     	/* 608 */
747     "BLOCKVISIBILITYGRIP",                  	/* 609 */
748     "BLOCKVISIBILITYPARAMETER",             	/* 610 */
749     "BLOCKXYGRIP",                          	/* 611 */
750     "BLOCKXYPARAMETER",                     	/* 612 */
751     "CAMERA",                               	/* 613 */
752     "CELLSTYLEMAP",                         	/* 614 */
753     "CONTEXTDATAMANAGER",                   	/* 615 */
754     "CSACDOCUMENTOPTIONS",                  	/* 616 */
755     "ACDBCURVEPATH",                        	/* 617 */
756     "DATALINK",                             	/* 618 */
757     "DATATABLE",                            	/* 619 */
758     "DBCOLOR",                              	/* 620 */
759     "ACDBDETAILVIEWSTYLE",                  	/* 621 */
760     "DGNDEFINITION",                        	/* 622 */
761     "DGNUNDERLAY",                          	/* 623 */
762     "DICTIONARYVAR",                        	/* 624 */
763     "ACDBDICTIONARYWDFLT",                  	/* 625 */
764     "DIMASSOC",                             	/* 626 */
765     "ACDB_DMDIMOBJECTCONTEXTDATA_CLASS",    	/* 627 */
766     "DWFDEFINITION",                        	/* 628 */
767     "DWFUNDERLAY",                          	/* 629 */
768     "ACAD_DYNAMICBLOCKPROXYNODE",           	/* 630 */
769     "ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION",	/* 631 */
770     "ACAD_EVALUATION_GRAPH",                	/* 632 */
771     "EXTRUDEDSURFACE",                      	/* 633 */
772     "ACDB_FCFOBJECTCONTEXTDATA_CLASS",      	/* 634 */
773     "FIELD",                                	/* 635 */
774     "FIELDLIST",                            	/* 636 */
775     "FLIPPARAMETERENTITY",                  	/* 637 */
776     "GEODATA",                              	/* 638 */
777     "GEOMAPIMAGE",                          	/* 639 */
778     "POSITIONMARKER",                       	/* 640 */
779     "GRADIENT_BACKGROUND",                  	/* 641 */
780     "GROUND_PLANE_BACKGROUND",              	/* 642 */
781     "HELIX",                                	/* 643 */
782     "RAPIDRTRENDERENVIRONMENT",             	/* 644 */
783     "IDBUFFER",                             	/* 645 */
784     "IMAGE",                                	/* 646 */
785     "IMAGEDEF",                             	/* 647 */
786     "IMAGEDEF_REACTOR",                     	/* 648 */
787     "IMAGE_BACKGROUND",                     	/* 649 */
788     "INDEX",                                	/* 650 */
789     "LARGE_RADIAL_DIMENSION",               	/* 651 */
790     "LAYERFILTER",                          	/* 652 */
791     "LAYER_INDEX",                          	/* 653 */
792     "LAYOUTPRINTCONFIG",                    	/* 654 */
793     "ACDB_LEADEROBJECTCONTEXTDATA_CLASS",   	/* 655 */
794     "LIGHT",                                	/* 656 */
795     "LIGHTLIST",                            	/* 657 */
796     "LINEARPARAMETERENTITY",                	/* 658 */
797     "LOFTEDSURFACE",                        	/* 659 */
798     "MATERIAL",                             	/* 660 */
799     "MENTALRAYRENDERSETTINGS",              	/* 661 */
800     "MESH",                                 	/* 662 */
801     "ACDB_MLEADEROBJECTCONTEXTDATA_CLASS",  	/* 663 */
802     "MLEADERSTYLE",                         	/* 664 */
803     "ACDBMOTIONPATH",                       	/* 665 */
804     "MPOLYGON",                             	/* 666 */
805     "ACDB_MTEXTATTRIBUTEOBJECTCONTEXTDATA_CLASS",	/* 667 */
806     "ACDB_MTEXTOBJECTCONTEXTDATA_CLASS",    	/* 668 */
807     "MULTILEADER",                          	/* 669 */
808     "COORDINATION_MODEL",                   	/* 670 */
809     "ACDBNAVISWORKSMODELDEF",               	/* 671 */
810     "NPOCOLLECTION",                        	/* 672 */
811     "NURBSURFACE",                          	/* 673 */
812     "OBJECT_PTR",                           	/* 674 */
813     "ACDB_ORDDIMOBJECTCONTEXTDATA_CLASS",   	/* 675 */
814     "PARTIAL_VIEWING_INDEX",                	/* 676 */
815     "PDFDEFINITION",                        	/* 677 */
816     "PDFUNDERLAY",                          	/* 678 */
817     "ACDBPERSSUBENTMANAGER",                	/* 679 */
818     "PLANESURFACE",                         	/* 680 */
819     "PLOTSETTINGS",                         	/* 681 */
820     "ACDBPOINTCLOUD",                       	/* 682 */
821     "ACDBPOINTCLOUDCOLORMAP",               	/* 683 */
822     "ACDBPOINTCLOUDDEF",                    	/* 684 */
823     "ACDBPOINTCLOUDDEFEX",                  	/* 685 */
824     "ACDBPOINTCLOUDDEF_REACTOR",            	/* 686 */
825     "ACDBPOINTCLOUDDEF_REACTOR_EX",         	/* 687 */
826     "ACDBPOINTCLOUDEX",                     	/* 688 */
827     "POINTPARAMETERENTITY",                 	/* 689 */
828     "ACDBPOINTPATH",                        	/* 690 */
829     "POLARGRIPENTITY",                      	/* 691 */
830     "ACDB_RADIMLGOBJECTCONTEXTDATA_CLASS",  	/* 692 */
831     "ACDB_RADIMOBJECTCONTEXTDATA_CLASS",    	/* 693 */
832     "RAPIDRTRENDERSETTINGS",                	/* 694 */
833     "RASTERVARIABLES",                      	/* 695 */
834     "RENDERENTRY",                          	/* 696 */
835     "RENDERENVIRONMENT",                    	/* 697 */
836     "RENDERGLOBAL",                         	/* 698 */
837     "RENDERSETTINGS",                       	/* 699 */
838     "REVOLVEDSURFACE",                      	/* 700 */
839     "ROTATIONPARAMETERENTITY",              	/* 701 */
840     "RTEXT",                                	/* 702 */
841     "SCALE",                                	/* 703 */
842     "SECTIONOBJECT",                        	/* 704 */
843     "ACDBSECTIONVIEWSTYLE",                 	/* 705 */
844     "SECTION_MANAGER",                      	/* 706 */
845     "SECTION_SETTINGS",                     	/* 707 */
846     "SKYLIGHT_BACKGROUND",                  	/* 708 */
847     "SOLID_BACKGROUND",                     	/* 709 */
848     "SORTENTSTABLE",                        	/* 710 */
849     "SPATIAL_FILTER",                       	/* 711 */
850     "SPATIAL_INDEX",                        	/* 712 */
851     "SUN",                                  	/* 713 */
852     "SUNSTUDY",                             	/* 714 */
853     "SWEPTSURFACE",                         	/* 715 */
854     "ACAD_TABLE",                           	/* 716 */
855     "TABLE",                                	/* 717 */
856     "TABLEGEOMETRY",                        	/* 718 */
857     "TABLESTYLE",                           	/* 719 */
858     "ACDB_TEXTOBJECTCONTEXTDATA_CLASS",     	/* 720 */
859     "TVDEVICEPROPERTIES",                   	/* 721 */
860     "VISIBILITYGRIPENTITY",                 	/* 722 */
861     "VISIBILITYPARAMETERENTITY",            	/* 723 */
862     "VISUALSTYLE",                          	/* 724 */
863     "WIPEOUT",                              	/* 725 */
864     "WIPEOUTVARIABLES",                     	/* 726 */
865     "EXACXREFPANELOBJECT",                  	/* 727 */
866     "XYPARAMETERENTITY",                    	/* 728 */
867   /* End auto-generated dxfnames */
868 };
869 
870 /* Find the dxfname for our internal object/entity name.
871  * The reverse of the _alias() functions, replaces dxf_encode_alias (name).
872  * Only needed for the add API.
873  * Some names return either NULL or one of many possibilities,
874  * like UNDERLAY => PDFUNDERLAY.
875  */
dwg_type_dxfname(const Dwg_Object_Type type)876 const char* dwg_type_dxfname (const Dwg_Object_Type type)
877 {
878   if (type <= DWG_TYPE_LAYOUT)
879     return _dwg_dxfnames_fixed[type];
880   else if ((unsigned)type >= 500 && type <= DWG_TYPE_XYPARAMETERENTITY)
881     return _dwg_dxfnames_variable[type - 500];
882   // DWG_TYPE_PROXY_ENTITY = 0x1f2, /* 498 */
883   // DWG_TYPE_PROXY_OBJECT = 0x1f3, /* 499 */
884   else if (type == DWG_TYPE_PROXY_ENTITY)
885     return "ACAD_PROXY_ENTITY";
886   else if (type == DWG_TYPE_PROXY_OBJECT)
887     return "ACAD_PROXY_OBJECT";
888   else if (type == DWG_TYPE_FREED || type == DWG_TYPE_UNKNOWN_ENT || type == DWG_TYPE_UNKNOWN_OBJ)
889     return NULL;
890   else
891     {
892       //LOG_ERROR ("Unkown object type %d", type)
893       return NULL;
894     }
895 }
896 
897 // dxfname => name
898 void
object_alias(char * restrict name)899 object_alias (char *restrict name)
900 {
901   const int len = strlen (name);
902   // check aliases (dxfname => name)
903   if (strEQc (name, "ACAD_PROXY_OBJECT"))
904     strcpy (name, "PROXY_OBJECT");
905   else if (strEQc (name, "ACDBPERSSUBENTMANAGER"))
906     strcpy (name, "PERSUBENTMGR");
907   else if (strEQc (name, "ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION"))
908     strcpy (name, "DYNAMICBLOCKPURGEPREVENTER");
909   else if (strEQc (name, "EXACXREFPANELOBJECT"))
910     strcpy (name, "XREFPANELOBJECT");
911   else if (strstr (name, "_BACKGROUND"))
912     strcpy (name, "BACKGROUND");
913   // ACDB_*OBJECTCONTEXTDATA_CLASS => *OBJECTCONTEXTDATA
914   else if (memBEGINc (name, "ACAD_") && len > 28 && strEQc (&name[len-6], "_CLASS"))
915     {
916       name[len-6] = '\0';
917       if (is_dwg_object (&name[5]))
918         memmove (name, &name[5], len - 4);
919       else
920         name[len-6] = '_';
921     }
922   // strip ACAD_ prefix
923   else if (memBEGINc (name, "ACAD_") && is_dwg_object (&name[5]))
924     memmove (name, &name[5], len - 4);
925   // strip the ACDB prefix
926   else if (memBEGINc (name, "ACDB") && is_dwg_object (&name[4]))
927     memmove (name, &name[4], len - 3);
928 }
929 
930 // dxfname => name
931 void
entity_alias(char * restrict name)932 entity_alias (char *restrict name)
933 {
934   const int len = strlen (name);
935   // check aliases (dxfname => name)
936   if (strEQc (name, "ACAD_TABLE"))
937     strcpy (name, "TABLE");
938   else if (strEQc (name, "ACAD_PROXY_ENTITY"))
939     strcpy (name, "PROXY_ENTITY");
940   /* else if (strEQc (name, "ACAD_PROXY_ENTITY_WRAPPER"))
941     strcpy (name, "PROXY_ENTITY_WRAPPER"); */
942   else if (strEQc (name, "ACDBPLACEHOLDER"))
943     strcpy (name, "PLACEHOLDER");
944   else if (strEQc (name, "POLYLINE"))
945     strcpy (name, "POLYLINE_2D"); // other POLYLINE_* by flag or subclass?
946   else if (strEQc (name, "VERTEX"))
947     strcpy (name, "VERTEX_2D"); // other VERTEX_* by flag?
948   else if (strEQc (name, "SURFACE"))
949     strcpy (name, "PLANESURFACE");
950   else if (strEQc (name, "COORDINATION_MODEL")) //??
951     strcpy (name, "NAVISWORKSMODEL");
952   else if (strEQc (name, "POSITIONMARKER"))
953     strcpy (name, "GEOPOSITIONMARKER");
954   // if (strEQc (name, "BLOCK"))
955   //  strcpy (name, "BLOCK_HEADER");
956   // else if (strEQc (name, "VERTEX_MESH") || strEQc (name, "VERTEX_PFACE"))
957   //  strcpy (name, "VERTEX_3D");
958   // else if (strEQc (name, "DIMENSION"))
959   //  strcpy (name, "DIMENSION_ANG2LN");   // allocate room for the largest
960   // strip a ACAD_ prefix
961   else if (memBEGINc (name, "ACAD_") && is_dwg_entity (&name[5]))
962     memmove (name, &name[5], len - 4);
963   // strip the ACDB prefix
964   else if (memBEGINc (name, "ACDB") && is_dwg_entity (&name[4]))
965     memmove (name, &name[4], len - 3);
966 }
967 
has_entity_DD(const Dwg_Object * obj)968 bool has_entity_DD (const Dwg_Object* obj)
969 {
970   const Dwg_Version_Type version = obj->parent->header.version;
971   const Dwg_Object_Type type = obj->fixedtype;
972   if (version < R_2000)
973     return false;
974   if (type == DWG_TYPE_LWPOLYLINE ||
975       type == DWG_TYPE_LINE ||
976       type == DWG_TYPE_INSERT ||
977       type == DWG_TYPE_MINSERT ||
978       type == DWG_TYPE_TABLE)
979     return true;
980   return false;
981 }
982 
obj_has_strings(const Dwg_Object * obj)983 bool obj_has_strings (const Dwg_Object* obj)
984 {
985   const Dwg_Version_Type version = obj->parent->header.from_version;
986   const Dwg_Object_Type type = obj->fixedtype;
987   if (version >= R_2007)
988     return obj->has_strings ? true : false;
989   if (dwg_obj_is_table (obj))
990       return true;
991   if (type == DWG_TYPE_TEXT ||
992       type == DWG_TYPE_ATTRIB ||
993       type == DWG_TYPE_ATTDEF ||
994       type == DWG_TYPE_BLOCK ||
995       type == DWG_TYPE_DIMENSION_ORDINATE ||
996       type == DWG_TYPE_DIMENSION_LINEAR ||
997       type == DWG_TYPE_DIMENSION_ALIGNED ||
998       type == DWG_TYPE_DIMENSION_ANG3PT ||
999       type == DWG_TYPE_DIMENSION_ANG2LN ||
1000       type == DWG_TYPE_DIMENSION_RADIUS ||
1001       type == DWG_TYPE_DIMENSION_DIAMETER ||
1002       type == DWG_TYPE_LARGE_RADIAL_DIMENSION ||
1003       type == DWG_TYPE_ARC_DIMENSION ||
1004       type == DWG_TYPE_SHAPE ||
1005       type == DWG_TYPE_VIEWPORT ||
1006       type == DWG_TYPE__3DSOLID ||
1007       type == DWG_TYPE_REGION ||
1008       type == DWG_TYPE_BODY ||
1009       type == DWG_TYPE_DICTIONARY ||
1010       type == DWG_TYPE_DICTIONARYVAR ||
1011       type == DWG_TYPE_DICTIONARYWDFLT ||
1012       type == DWG_TYPE_MTEXT ||
1013       type == DWG_TYPE_TOLERANCE ||
1014       type == DWG_TYPE_BLOCK_HEADER ||
1015       type == DWG_TYPE_GROUP ||
1016       type == DWG_TYPE_MLINESTYLE ||
1017       type == DWG_TYPE_HATCH ||
1018       type == DWG_TYPE_MPOLYGON ||
1019       type == DWG_TYPE_IMAGEDEF ||
1020       type == DWG_TYPE_LAYER_INDEX ||
1021       type == DWG_TYPE_PLOTSETTINGS ||
1022       type == DWG_TYPE_LAYOUT ||
1023       type == DWG_TYPE_OLE2FRAME ||
1024       type == DWG_TYPE_FIELD ||
1025       type == DWG_TYPE_GEODATA ||
1026       type == DWG_TYPE_TABLECONTENT ||
1027       type == DWG_TYPE_TABLE ||
1028       type == DWG_TYPE_TABLESTYLE ||
1029       type == DWG_TYPE_CELLSTYLEMAP ||
1030       type == DWG_TYPE_SCALE ||
1031       type == DWG_TYPE_MULTILEADER ||
1032       type == DWG_TYPE_MLEADERSTYLE ||
1033       type == DWG_TYPE_PDFDEFINITION ||
1034       type == DWG_TYPE_DGNDEFINITION ||
1035       type == DWG_TYPE_DWFDEFINITION ||
1036       type == DWG_TYPE_SECTIONOBJECT ||
1037       type == DWG_TYPE_SECTION_SETTINGS ||
1038       type == DWG_TYPE_VISUALSTYLE ||
1039       type == DWG_TYPE_LIGHT ||
1040       type == DWG_TYPE_LIGHTLIST ||
1041       type == DWG_TYPE_SUN ||
1042       type == DWG_TYPE_RENDERSETTINGS ||
1043       type == DWG_TYPE_MENTALRAYRENDERSETTINGS ||
1044       type == DWG_TYPE_RAPIDRTRENDERSETTINGS ||
1045       type == DWG_TYPE_DBCOLOR ||
1046       type == DWG_TYPE_MATERIAL ||
1047       type == DWG_TYPE_LAYERFILTER ||
1048       type == DWG_TYPE_ASSOCDEPENDENCY ||
1049       type == DWG_TYPE_ASSOCEDGEACTIONPARAM ||
1050       type == DWG_TYPE_CONTEXTDATAMANAGER ||
1051       (type >= DWG_TYPE_ACSH_BOOLEAN_CLASS && type <= DWG_TYPE_ACSH_WEDGE_CLASS) ||
1052       (type >= DWG_TYPE_ASSOC2DCONSTRAINTGROUP && type <= DWG_TYPE_ASSOCVERTEXACTIONPARAM) ||
1053       dwg_has_subclass (obj->name, "AcDbEvalVariant") ||
1054       dwg_has_subclass (obj->name, "AcDbValueParam") ||
1055       dwg_has_subclass (obj->name, "AcDbAssocActionParam") ||
1056       dwg_has_subclass (obj->name, "AcDbAssocDependency") ||
1057       dwg_has_subclass (obj->name, "AcDbEvalExpr") ||
1058       dwg_has_subclass (obj->name, "AdDbAssocIndexPersSubentId") ||
1059       dwg_has_subclass (obj->name, "AcDbAssocPersSubentId") ||
1060       dwg_has_subclass (obj->name, "AcDbAssocEdgePersSubentId") ||
1061       dwg_has_subclass (obj->name, "AcDbBlockElement") ||
1062       dwg_has_subclass (obj->name, "AcDbBlockGripExpr") ||
1063       type == DWG_TYPE_DIMASSOC ||
1064       type == DWG_TYPE_SUNSTUDY ||
1065       type == DWG_TYPE_GEOPOSITIONMARKER ||
1066       type == DWG_TYPE_NAVISWORKSMODELDEF ||
1067       type == DWG_TYPE_DATATABLE ||
1068       type == DWG_TYPE_DATALINK ||
1069       type == DWG_TYPE_DETAILVIEWSTYLE ||
1070       type == DWG_TYPE_SECTIONVIEWSTYLE ||
1071       type == DWG_TYPE_IBL_BACKGROUND ||
1072       type == DWG_TYPE_IMAGE_BACKGROUND ||
1073       type == DWG_TYPE_RENDERENTRY ||
1074       type == DWG_TYPE_RENDERENVIRONMENT ||
1075       type == DWG_TYPE_RENDERGLOBAL ||
1076       type == DWG_TYPE_ARCALIGNEDTEXT ||
1077       type == DWG_TYPE_RTEXT ||
1078       type == DWG_TYPE_POINTCLOUD ||
1079       type == DWG_TYPE_POINTCLOUDEX ||
1080       type == DWG_TYPE_POINTCLOUDDEF ||
1081       type == DWG_TYPE_POINTCLOUDDEFEX ||
1082       type == DWG_TYPE_POINTCLOUDCOLORMAP ||
1083       type == DWG_TYPE_ASSOCVARIABLE ||
1084       dwg_has_subclass (obj->name, "AcDbCompoundObjectId") ||
1085       type == DWG_TYPE_BLOCKPOLARPARAMETER ||
1086       type == DWG_TYPE_ASSOCDIMDEPENDENCYBODY ||
1087       type == DWG_TYPE_BLOCKANGULARCONSTRAINTPARAMETER ||
1088       dwg_has_subclass (obj->name, "AcDbAssocArrayActionBody") ||
1089       dwg_has_subclass (obj->name, "AcDbAssocArrayCommonParameters") ||
1090       dwg_has_subclass (obj->name, "AcDbImpAssocDimDependencyBodyBase") ||
1091       dwg_has_subclass (obj->name, "AcDbBlockConstraintParameter") ||
1092       type == DWG_TYPE_BLOCKLOOKUPACTION ||
1093       type == DWG_TYPE_BLOCKLOOKUPPARAMETER ||
1094       type == DWG_TYPE_BLOCKPOINTPARAMETER ||
1095       type == DWG_TYPE_BLOCKUSERPARAMETER ||
1096       0
1097       )
1098     return true;
1099   return false;
1100 }
1101