1%{// -*- mode: c -*-
2/*****************************************************************************/
3/*  LibreDWG - free implementation of the DWG file format                    */
4/*                                                                           */
5/*  Copyright (C) 2020 Free Software Foundation, Inc.                        */
6/*                                                                           */
7/*  This library is free software, licensed under the terms of the GNU       */
8/*  General Public License as published by the Free Software Foundation,     */
9/*  either version 3 of the License, or (at your option) any later version.  */
10/*  You should have received a copy of the GNU General Public License        */
11/*  along with this program.  If not, see <http://www.gnu.org/licenses/>.    */
12/*****************************************************************************/
13
14/*
15 * dxfclasses.c: create classes, lookup the initial class values from its DXF name.
16 *               generated via gperf from dxfclasses.in
17 *
18 * written Reini Urban
19 */
20
21#include <stdio.h>
22#include <stdint.h>
23#include <string.h>
24#include <stdbool.h>
25#include "config.h"
26#include "dwg.h"
27#include "common.h"
28// other imports
29int dwg_add_class (Dwg_Data *restrict dwg, const char *const restrict dxfname,
30                   const char *const restrict cppname, const char *const restrict appname,
31                   const bool is_entity);
32// export
33EXPORT int dwg_require_class (Dwg_Data *restrict dwg,
34                              const char *const restrict dxfname, const int len);
35
36// v3.1 changed len type from unsigned int to size_t (gperf d519d1a821511eaa22eae6d9019a548aea21e6)
37#ifdef GPERF_VERSION
38#  if GPERF_VERSION < 301
39#    define SIZE_TYPE unsigned int
40#  else
41#    define SIZE_TYPE size_t
42#  endif
43#else
44#  define SIZE_TYPE size_t
45#endif
46// internal
47static const struct Dwg_DXFClass *in_word_set (register const char *str, register SIZE_TYPE len);
48
49enum apptypes
50{
51  ODBXCLASS,
52  ODBX_OR_A2000CLASS,
53  A2000CLASS,
54  SCENEOECLASS,
55  ISMCLASS,
56  EXPRESSCLASS,
57  POINTCLOUDCLASS,
58  DGNLSCLASS,
59  AEC60CLASS,
60  SPECIALCLASS,
61};
62#define ODBX ODBXCLASS
63#define ISM ISMCLASS
64#define SCENEOE SCENEOECLASS
65#define EXPRESS EXPRESSCLASS
66#define POINTCLOUD POINTCLOUDCLASS
67#define DGNLS DGNLSCLASS
68#define AEC60 AEC60CLASS
69#define SPECIAL SPECIALCLASS
70//%null-strings
71
72%}
73%7bit
74%language=ANSI-C
75%struct-type
76%readonly-tables
77%pic
78
79struct Dwg_DXFClass {int name; const char *const cppname; unsigned apptype:4; unsigned isent:1;};
80
81%%
82# Entities
83LWPOLYLINE,	"AcDbPolyline",		ODBX,	1
84HATCH,		"AcDbHatch",		ODBX,	1
85OLE2FRAME,	"AcDbOle2Frame",	ODBX,	1
86ARC_DIMENSION,	"AcDbArcDimension",	ODBX,	1
87MULTILEADER,	"AcDbMLeader",		ODBX,	1
88ACAD_TABLE,	"AcDbTable",		ODBX,	1
89PDFUNDERLAY, 	"AcDbPdfReference",   	ODBX,	1
90DGNUNDERLAY, 	"AcDbDgnReference",   	ODBX,	1
91DWFUNDERLAY, 	"AcDbDwfReference",   	ODBX,	1
92#
93ACDBDICTIONARYWDFLT,		"AcDbDictionaryWithDefault",	ODBX_OR_A2000CLASS,	0
94ACDBPLACEHOLDER,		"AcDbPlaceHolder",		ODBX_OR_A2000CLASS,	0
95ACAD_PROXY_ENTITY_WRAPPER,	"AcDbProxyEntityWrapper",	ODBX_OR_A2000CLASS,	0
96ACAD_PROXY_OBJECT_WRAPPER,	"AcDbProxyObjectWrapper",	ODBX_OR_A2000CLASS,	0
97#
98DICTIONARYVAR,	"AcDbDictionaryVar",	A2000CLASS,	0
99LAYOUT,		"AcDbLayout",		A2000CLASS,	0
100SORTENTSTABLE,	"AcDbSortentsTable",	A2000CLASS,	0
101#
102VBA_PROJECT,	"AcDbVbaProject",	ODBX,	0
103XRECORD,	"AcDbXrecord",		ODBX,	0
104LAYER_INDEX,	"AcDbLayerIndex",	ODBX,	0
105SPATIAL_INDEX,	"AcDbSpatialIndex",	ODBX,	0
106SPATIAL_FILTER,	"AcDbSpatialFilter",	ODBX,	0
107IDBUFFER,	"AcDbIdBuffer",		ODBX,	0
108VISUALSTYLE,	"AcDbVisualStyle",	ODBX,	0
109TABLESTYLE,	"AcDbTableStyle",	ODBX,	0
110TABLECONTENT,	"AcDbTableContent",	ODBX,	0
111TABLEGEOMETRY,	"AcDbTableGeometry",	ODBX,	0
112CELLSTYLEMAP,	"AcDbCellStyleMap",	ODBX,	0
113DATATABLE,	"AcDbDataTable",	ODBX,	0
114SCALE,		"AcDbScale",		ODBX,	0
115DGNDEFINITION, 	"AcDbDgnDefinition",   	ODBX,	0
116DWFDEFINITION, 	"AcDbDwfDefinition",   	ODBX,	0
117PDFDEFINITION, 	"AcDbPdfDefinition",   	ODBX,	0
118#
119IMAGE,		"AcDbRasterImage",	ISM,	1
120IMAGEDEF,	"AcDbRasterImageDef",	ISM,	0
121IMAGEDEF_REACTOR,"AcDbRasterImageDefReactor",	ISM,	0
122RASTERVARIABLES,"AcDbRasterVariables",	ISM,	0
123#
124LIGHT,		"AcDbLight",		SCENEOE, 1
125LIGHTLIST,	"AcDbLightList",	SCENEOE, 0
126SUN, 		"AcDbSun",		SCENEOE, 0
127SUNSTUDY,	"AcDbSunStudy",		SCENEOE, 0
128#
129DIMASSOC, 	"AcDbDimAssoc",		SPECIAL, 0
130WIPEOUT,	"AcDbWipeout", 		SPECIAL, 1
131WIPEOUTVARIABLES,"AcDbWipeoutVariables",	ODBX,	0
132RTEXT, 		"AcDbRText", 		EXPRESS, 1
133ARCALIGNEDTEXT, "AcDbArcAlignedText",	EXPRESS, 1
134MLEADERSTYLE,	"AcDbMLeaderStyle",	SPECIAL, 0
135#
136MATERIAL,		"AcDbMaterial",		ODBX,	0
137PLOTSETTINGS,		"AcDbPlotSettings",	ODBX,	0
138ACDBSECTIONVIEWSTYLE,	"AcDbSectionViewStyle",	ODBX,	0
139ACDBDETAILVIEWSTYLE,	"AcDbDetailViewStyle",	ODBX,	0
140POSITIONMARKER,		"AcDbGeoPositionMarker",ODBX,	0
141ACAD_EVALUATION_GRAPH,	"AcDbEvalGraph",	ODBX,	0
142#
143SURFACE,		"AcDbSurface",		ODBX,	1
144EXTRUDEDSURFACE,	"AcDbExtrudedSurface",	ODBX,	1
145LOFTEDSURFACE,		"AcDbLoftedSurface",	ODBX,	1
146NURBSURFACE,		"AcDbNurbSurface",	ODBX,	1
147PLANESURFACE,		"AcDbPlaneSurface",	ODBX,	1
148REVOLVEDSURFACE,	"AcDbRevolvedSurface",	ODBX,	1
149SWEPTSURFACE,		"AcDbSweptSurface",	ODBX,	1
150#
151ACSH_BOOLEAN_CLASS,	"AcDbShBoolean",	ODBX,	0
152ACSH_BOX_CLASS,		"AcDbShBox",		ODBX,	0
153ACSH_BREP_CLASS,	"AcDbShBrep",		ODBX,	0
154ACSH_CHAMFER_CLASS,	"AcDbShChamfer",	ODBX,	0
155ACSH_CONE_CLASS,	"AcDbShCone",		ODBX,	0
156ACSH_CYLINDER_CLASS,	"AcDbShCylinder",	ODBX,	0
157ACSH_EXTRUSION_CLASS,	"AcDbShExtrusion",	ODBX,	0
158ACSH_FILLET_CLASS,	"AcDbShFillet",		ODBX,	0
159ACSH_HISTORY_CLASS,	"AcDbShHistory",	ODBX,	0
160ACSH_LOFT_CLASS,	"AcDbShLoft",		ODBX,	0
161ACSH_PYRAMID_CLASS,	"AcDbShPyramid",	ODBX,	0
162ACSH_REVOLVE_CLASS,	"AcDbShRevolve",	ODBX,	0
163ACSH_SPHERE_CLASS,	"AcDbShSphere",		ODBX,	0
164ACSH_SWEEP_CLASS,	"AcDbShSweep",		ODBX,	0
165ACSH_TORUS_CLASS,	"AcDbShTorus",		ODBX,	0
166ACSH_WEDGE_CLASS,	"AcDbShWedge",		ODBX,	0
167#
168ACDBASSOCPERSSUBENTMANAGER,	"AcDbAssocPersSubentManager",	ODBX,	0
169ACDBPERSSUBENTMANAGER, 		"AcDbPersSubentManager",	ODBX, 0
170ACDBASSOCNETWORK,		"AcDbAssocNetwork",		ODBX,	0
171ACDBASSOCACTION,		"AcDbAssocAction",		ODBX,	0
172ACDBASSOCALIGNEDDIMACTIONBODY,	"AcDbAssocAlignedDimActionBody",	ODBX,	0
173ACDBASSOCOSNAPPOINTREFACTIONPARAM,"AcDbAssocOsnapPointRefActionParam",	ODBX,	0
174ACDBASSOCVERTEXACTIONPARAM,	"AcDbAssocVertexActionParam",	ODBX,	0
175ACDBASSOCGEOMDEPENDENCY,	"AcDbAssocGeomDependency",	ODBX,	0
176ACDBASSOCDEPENDENCY,		"AcDbAssocDependency",		ODBX,	0
177ACDBASSOCDIMDEPENDENCYBODY,	"AcDbAssocDimDependencyBody",	ODBX,	0
178ACDBBLOCKPARAMDEPENDENCYBODY,	"AcDbBlockParameterDependencyBody",	ODBX,	0
179#
180ACDBASSOC3POINTANGULARDIMACTIONBODY,"AcDbAssoc3PointAngularDimActionBody",	ODBX,	0
181ACDBASSOCALIGNEDIMACTIONBODY,	"AcDbAssocAlignedDimActionBody",	ODBX,	0
182ACDBASSOCORDINATEDIMACTIONBODY,	"AcDbAssocOrdinatedDimActionBody",	ODBX,	0
183ACDBASSOCROTATEDDIMACTIONBODY,	"AcDbAssocRotatedDimActionBody",	ODBX,	0
184#
185ACDBASSOCARRAYMODIFYACTIONBODY,	"AcDbAssocArrayModifyActionBody",	ODBX,	0
186ACDBASSOCARRAYACTIONBODY,	"AcDbAssocArrayActionBody",		ODBX,	0
187ACDBASSOCEDGECHAMFERACTIONBODY,	"AcDbAssocEdgeChamferActionBody",	ODBX,	0
188ACDBASSOCEDGEFILLETACTIONBODY,	"AcDbAssocEdgeFilletActionBody",	ODBX,	0
189ACDBASSOCMLEADERACTIONBODY,	"AcDbAssocMLeaderActionBody",		ODBX,	0
190CONTEXTDATAMANAGER,		"AcDbContextDataManager",		ODBX,	0
191#
192ACDBASSOCBLENDSURFACEACTIONBODY,	"AcDbAssocBlendSurfaceActionBody",	ODBX,	0
193ACDBASSOCEXTENDSURFACEACTIONBODY,	"AcDbAssocExtendSurfaceActionBody",	ODBX,	0
194ACDBASSOCEXTRUDEDSURFACEACTIONBODY,	"AcDbAssocExtrudedSurfaceActionBody",	ODBX,	0
195ACDBASSOCFILLETSURFACEACTIONBODY,	"AcDbAssocFilletSurfaceActionBody",	ODBX,	0
196ACDBASSOCLOFTEDSURFACEACTIONBODY,	"AcDbAssocLoftedSurfaceActionBody",	ODBX,	0
197ACDBASSOCNETWORKSURFACEACTIONBODY,	"AcDbAssocNetworkSurfaceActionBody",	ODBX,	0
198ACDBASSOCOFFSETSURFACEACTIONBODY,	"AcDbAssocOffsetSurfaceActionBody",	ODBX,	0
199ACDBASSOCPLANESURFACEACTIONBODY,	"AcDbAssocPlaneSurfaceActionBody",	ODBX,	0
200ACDBASSOCPATCHSURFACEACTIONBODY,	"AcDbAssocPatchSurfaceActionBody",	ODBX,	0
201ACDBASSOCRESTOREENTITYSTATEACTIONBODY,	"AcDbAssocRestoreEntityStateActionBody",ODBX,	0
202ACDBASSOCREVOLVEDSURFACEACTIONBODY,	"AcDbAssocRevolvedSurfaceActionBody",	ODBX,	0
203ACDBASSOCSWEPTSURFACEACTIONBODY,	"AcDbAssocSweptSurfaceActionBody",	ODBX,	0
204ACDBASSOCTRIMSURFACEACTIONBODY,		"AcDbAssocTrimSurfaceActionBody",	ODBX,	0
205#
206ACDBASSOCACTIONPARAM,			"AcDbAssocActionParam",		ODBX,	0
207ACDBASSOCASMBODYACTIONPARAM,		"AcDbAssocAsmbodyActionParam",	ODBX,	0
208ACDBASSOCCOMPOUNDACTIONPARAM,		"AcDbAssocCompoundActionParam",	ODBX,	0
209ACDBASSOCEDGEACTIONPARAM,		"AcDbAssocEdgeActionParam",	ODBX,	0
210ACDBASSOCFACEACTIONPARAM,		"AcDbAssocFaceActionParam",	ODBX,	0
211ACDBASSOCPATHACTIONPARAM,		"AcDbAssocPathActionParam",	ODBX,	0
212ACDBASSOCOBJECTACTIONPARAM,		"AcDbAssocObjectActionParam",	ODBX,	0
213ACDBASSOCPOINTREFACTIONPARAM,		"AcDbAssocPointRefActionParam",	ODBX,	0
214#
215ACDBASSOCARRAYMODIFYPARAMETERS,		"AcDbAssocArrayModifyParameters",	ODBX,	0
216ACDBASSOCARRAYPATHPARAMETERS,		"AcDbAssocArrayPathParameters",		ODBX,	0
217ACDBASSOCARRAYPOLARPARAMETERS,		"AcDbAssocArrayPolarParameters",	ODBX,	0
218ACDBASSOCARRAYRECTANGULARPARAMETERS,	"AcDbAssocArrayRectangularParameters",	ODBX,	0
219#
220ALIGNMENTPARAMETERENTITY,		"AcDbBlockAlignmentParameterEntity",	ODBX,	1
221BASEPOINTPARAMETERENTITY,		"AcDbBlockBasepointParameterEntity",	ODBX,	1
222FLIPPARAMETERENTITY,			"AcDbBlockFlipParameterEntity",		ODBX,	1
223LINEARPARAMETERENTITY,			"AcDbBlockLinearParameterEntity",      	ODBX,	1
224POINTPARAMETERENTITY,			"AcDbBlockPointParameterEntity",      	ODBX,	1
225ROTATIONPARAMETERENTITY,		"AcDbBlockRotationParameterEntity",     ODBX,	1
226POLARGRIPENTITY,			"AcDbBlockPolarGripEntity",		ODBX,	1
227XYPARAMETERENTITY,			"AcDbBlockXYParameterEntity",		ODBX,	1
228# more Dynblocks
229ACDB_BLOCKREPRESENTATION_DATA,		"AcDbBlockRepresentationData",     	ODBX,	0
230BLOCKARRAYACTION,			"AcDbBlockArrayAction",     		ODBX,	0
231BLOCKANGULARCONSTRAINTPARAMETER,	"AcDbBlockAngularConstraintParameter",  ODBX,	0
232BLOCKDIAMETRICCONSTRAINTPARAMETER,	"AcDbBlockDiametricConstraintParameter",ODBX,	0
233BLOCKRADIALCONSTRAINTPARAMETER,		"AcDbBlockRadialConstraintParameter",	ODBX,	0
234BLOCKALIGNEDCONSTRAINTPARAMETER,	"AcDbBlockAlignedConstraintParameter",  ODBX,	0
235BLOCKLINEARCONSTRAINTPARAMETER,		"AcDbBlockLinearConstraintParameter",	ODBX,	0
236BLOCKHORIZONTALCONSTRAINTPARAMETER,	"AcDbBlockHorizontalConstraintParameter",ODBX,	0
237BLOCKVERTICALCONSTRAINTPARAMETER,	"AcDbBlockVerticalConstraintParameter",	ODBX,	0
238BLOCKMOVEACTION,			"AcDbBlockMoveAction",			ODBX,	0
239BLOCKFLIPACTION,			"AcDbBlockFlipAction",			ODBX,	0
240BLOCKLOOKUPACTION,			"AcDbBlockLookupAction",		ODBX,	0
241BLOCKROTATEACTION,			"AcDbBlockRotateAction",		ODBX,	0
242BLOCKSCALEACTION,			"AcDbBlockScaleAction",			ODBX,	0
243BLOCKPOLARSTRETCHACTION,		"AcDbBlockPolarStretchAction",	       	ODBX,	0
244BLOCKSTRETCHACTION,			"AcDbBlockStretchAction",	       	ODBX,	0
245BLOCKLOOKUPPARAMETER,			"AcDbBlockLookupParameter",		ODBX,	0
246BLOCKPOINTPARAMETER,			"AcDbBlockPointParameter",		ODBX,	0
247BLOCKROTATIONPARAMETER,			"AcDbBlockRotationParameter",		ODBX,	0
248BLOCKPOLARPARAMETER,			"AcDbBlockPolarParameter",		ODBX,	0
249BLOCKPOLARGRIP,				"AcDbBlockPolarGrip",			ODBX,	0
250BLOCKROTATIONGRIP,			"AcDbBlockRotationGrip",		ODBX,	0
251BLOCKVISIBILITYGRIP,			"AcDbBlockVisibilityGrip",		ODBX,	0
252BLOCKXYGRIP,				"AcDbBlockXYGrip",			ODBX,	0
253BLOCKGRIPLOCATIONCOMPONENT,		"AcDbBlockGripExpr",			ODBX,	0
254BLOCKALIGNMENTGRIP,			"AcDbBlockAlignmentGrip",		ODBX,	0
255BLOCKALIGNMENTPARAMETER,		"AcDbBlockAlignmentParameter",		ODBX,	0
256BLOCKLINEARPARAMETER,			"AcDbBlockLinearParameter",		ODBX,	0
257BLOCKBASEPOINTPARAMETER,		"AcDbBlockBasepointParameter",		ODBX,	0
258BLOCKFLIPPARAMETER,			"AcDbBlockFlipParameter",		ODBX,	0
259BLOCKFLIPGRIP,				"AcDbBlockFlipGrip",			ODBX,	0
260BLOCKLINEARGRIP,			"AcDbBlockLinearGrip",			ODBX,	0
261BLOCKLOOKUPGRIP,			"AcDbBlockLookupGrip",			ODBX,	0
262BLOCKUSERPARAMETER,   			"AcDbBlockUserParameter",		ODBX,	0
263BLOCKXYPARAMETER,			"AcDbBlockXYParameter",			ODBX,	0
264BLOCKVISIBILITYPARAMETER,		"AcDbBlockVisibilityParameter",		ODBX,	0
265BLOCKPROPERTIESTABLE,			"AcDbBlockPropertiesTable",		ODBX,	0
266BLOCKPROPERTIESTABLEGRIP,   		"AcDbBlockPropertiesTableGrip",		ODBX,	0
267ACDB_DYNAMICBLOCKPROXYNODE,		"AcDbDynamicBlockProxyNode",	       	ODBX,	0
268ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION,"AcDbDynamicBlockPurgePreventer",      	ODBX,	0
269#
270ACDBCURVEPATH,   			"AcDbCurvePath",			SCENEOE,	0
271ACDBMOTIONPATH,   			"AcDbMotionPath",			SCENEOE,	0
272ACDBPOINTPATH,   			"AcDbPointPath",			SCENEOE,	0
273MENTALRAYRENDERSETTINGS,   		"AcDbMentalRayRenderSettings",		SCENEOE,	0
274RAPIDRTRENDERSETTINGS,   		"AcDbRapidRTRenderSettings",		ODBX,		0
275RENDERENVIRONMENT,   			"AcDbRenderEnvironment",		SCENEOE,	0
276RENDERGLOBAL,   			"AcDbRenderGlobal",			SCENEOE,	0
277RENDERENTRY, 	  			"AcDbRenderEntry",			SCENEOE,	0
278RAPIDRTRENDERENVIRONMENT,   		"AcDbIBLBackground",			SCENEOE,	0
279SKYLIGHT_BACKGROUND,	   		"AcDbSkyBackground",			SCENEOE,	0
280IMAGE_BACKGROUND,	   		"AcDbImageBackground",			SCENEOE,	0
281SOLID_BACKGROUND,	   		"AcDbSolidBackground",			SCENEOE,	0
282GROUND_PLANE_BACKGROUND,	   	"AcDbGroundPlaneBackground",		SCENEOE,	0
283GRADIENT_BACKGROUND,	   		"AcDbGradientBackground",		SCENEOE,	0
284#
285ACDB_ALDIMOBJECTCONTEXTDATA_CLASS,	"AcDbAlignedDimensionObjectContextData",ODBX,	0
286ACDB_ANGDIMOBJECTCONTEXTDATA_CLASS,	"AcDbAngularDimensionObjectContextData",ODBX,	0
287ACDB_ANNOTSCALEOBJECTCONTEXTDATA_CLASS,	"AcDbAnnotScaleObjectContextData",	ODBX,	0
288ACDB_BLKREFOBJECTCONTEXTDATA_CLASS,	"AcDbBlkrefObjectContextData",		ODBX,	0
289ACDB_DMDIMOBJECTCONTEXTDATA_CLASS,	"AcDbDiametricDimensionObjectContextData",ODBX,	0
290ACDB_FCFOBJECTCONTEXTDATA_CLASS,	"AcDbFcfObjectContextData",		ODBX,	0
291ACDB_LEADEROBJECTCONTEXTDATA_CLASS,	"AcDbLeaderObjectContextData",		ODBX,	0
292ACDB_MLEADEROBJECTCONTEXTDATA_CLASS,	"AcDbMLeaderObjectContextData",		ODBX,	0
293ACDB_ORDDIMOBJECTCONTEXTDATA_CLASS,	"AcDbOrdinateDimensionObjectContextData",	ODBX,	0
294ACDB_RADIMLGOBJECTCONTEXTDATA_CLASS,	"AcDbRadialDimensionLargeObjectContextData",	ODBX,	0
295ACDB_RADIMOBJECTCONTEXTDATA_CLASS,	"AcDbRadialDimensionObjectContextData",	ODBX,	0
296ACDB_TEXTOBJECTCONTEXTDATA_CLASS,	"AcDbTextObjectContextData",		ODBX,	0
297#
298ACDBPOINTCLOUD,				"AcDbPointCloud",			POINTCLOUD, 1
299ACDBPOINTCLOUDEX,			"AcDbPointCloudEx",			POINTCLOUD, 1
300ACDBPOINTCLOUDDEF,			"AcDbPointCloudDef",			POINTCLOUD, 0
301ACDBPOINTCLOUDDEFEX,			"AcDbPointCloudDefEx",			POINTCLOUD, 0
302ACDBPOINTCLOUDDEF_REACTOR,		"AcDbPointCloudDefReactor",		POINTCLOUD, 0
303ACDBPOINTCLOUDDEF_REACTOR_EX,		"AcDbPointCloudDefReactorEx",		POINTCLOUD, 0
304ACDBPOINTCLOUDCOLORMAP,			"AcDbPointCloudColorMap",		POINTCLOUD, 0
305#
306EXACXREFPANELOBJECT,			"ExAcXREFPanelObject",		SPECIAL, 0
307NPOCOLLECTION,				"AcDbImpNonPersistentObjectsCollection", ODBX, 0
308PARTIAL_VIEWING_FILTER,			"OdDbPartialViewingFilter",	SPECIAL, 0
309PARTIAL_VIEWING_INDEX,			"OdDbPartialViewingIndex",	SPECIAL, 0
310LSDEFINITION,				"AcDbLSDefinition",		DGNLS, 0
311LSSTROKEPATTERNCOMPONENT,	       	"AcDbLSStrokePatternComponent",	DGNLS, 0
312LSINTERNALCOMPONENT,			"AcDbLSInternalComponent",	DGNLS, 0
313LSCOMPOUNDCOMPONENT,			"AcDbLSCompoundComponent",	DGNLS, 0
314LSPOINTCOMPONENT,			"AcDbLSPointComponent",		DGNLS, 0
315LSSYMBOLCOMPONENT,			"AcDbLSSymbolComponent",	DGNLS, 0
316AEC_REFEDIT_STATUS_TRACKER,		"AecDbRefEditStatusTracker",    AEC60, 0
317%%
318
319/* Create classes on demand.
320   Returns found or new klass->number id (always >=500), <0 on error.
321   -1 out of memory (from dwg_add_class())
322   -2 unknown class for dxfname.
323   -3 invalid apptype for class. (should not happen)
324*/
325EXPORT int
326dwg_require_class (Dwg_Data *restrict dwg, const char *const restrict dxfname, const int len)
327{
328  const struct Dwg_DXFClass* result;
329  for (BITCODE_BL i = 0; i < dwg->num_classes; i++)
330    {
331      Dwg_Class *klass = &dwg->dwg_class[i];
332      if (strEQ (klass->dxfname, dxfname))
333        return klass->number;
334    }
335
336  result = in_word_set (dxfname, len);
337  if (result)
338    {
339      switch ((enum apptypes)result->apptype)
340        {
341        case ODBXCLASS:
342          return dwg_add_class (dwg, dxfname, result->cppname, "ObjectDBX Classes", result->isent);
343        case ODBX_OR_A2000CLASS:
344          return dwg_add_class (dwg, dxfname, result->cppname,
345                         dwg->header.from_version <= R_2000 ? "AutoCAD 2000" : "ObjectDBX Classes",
346                         result->isent);
347        case A2000CLASS:
348          return dwg_add_class (dwg, dxfname, result->cppname, "AutoCAD 2000", result->isent);
349        case SCENEOECLASS:
350          return dwg_add_class (dwg, dxfname, result->cppname, "SCENEOE", result->isent);
351        case ISMCLASS:
352          return dwg_add_class (dwg, dxfname, result->cppname, "ISM", result->isent);
353        case POINTCLOUDCLASS:
354          return dwg_add_class (dwg, dxfname, result->cppname, "AcDbPointCloudObj", result->isent); //appname?
355        case DGNLSCLASS:
356          return dwg_add_class (dwg, dxfname, result->cppname, "AcDgnLS", result->isent);
357        case AEC60CLASS:
358          return dwg_add_class (dwg, dxfname, result->cppname, "AecArchBase60|Product Desc: "
359                                "Autodesk Architectural Desktop 2007", result->isent);
360        case EXPRESSCLASS:
361          {
362            char appname[128];
363            strcpy (appname, dxfname);
364            strcat (appname, "|AutoCAD Express Tool");
365            return dwg_add_class (dwg, dxfname, result->cppname, appname, result->isent);
366          }
367        case SPECIALCLASS:
368          {
369            char appname[128];
370            if (strEQc (dxfname, "MLEADERSTYLE"))
371              strcpy (appname, "ACDB_MLEADERSTYLE_CLASS");
372            else if (strEQc (dxfname, "WIPEOUT"))
373              strcpy (appname, "Wipeout|Product Desc:     WipeOut Dbx Application");
374            else if (strEQc (dxfname, "DIMASSOC"))
375              strcpy (appname, "AcDbDimAssoc|Product Desc:     AcDim ARX App For Dimension");
376            else if (memBEGINc (dxfname, "PARTIAL_VIEWING_"))
377              strcpy (appname, "OdDbPartialViewing|https://www.opendesign.com Teigha(R) Core Db");
378            else
379              {
380                strcpy (appname, result->cppname);
381                strcat (appname, "|Unknown ARX App");
382              }
383            return dwg_add_class (dwg, dxfname, result->cppname, appname, result->isent);
384          }
385          break;
386        default:
387          fprintf (stderr, "dxfclass_require: Invalid apptype %d", (int)result->apptype);
388          return -3;
389        }
390    }
391  return -2;
392}
393
394/*
395 * Local variables:
396 *   c-file-style: "gnu"
397 * End:
398 * vim: expandtab shiftwidth=4 cinoptions='\:2=2' :
399 */
400