📄 dvgenh.c
字号:
/* DataDraw Copyright(C) 1992-2006 Bill Cox <bill@billrocks.org> This program can be distributed under the terms of the GNU Library GPL. See the file COPYING.LIB.*/#include "dv.h"static char *dvPrefix;/*-------------------------------------------------------------------------------------------------- Write out constructor/destructor variable declarations.--------------------------------------------------------------------------------------------------*/static void writeClassConstructorDestructorVariables( dvClass theClass){ char *name = dvClassGetName(theClass); dvWrtemp(dvFile, "extern void(*%0%1ConstructorCallback)(%2%1);\n", dvPrefix, name, dvClassGetPrefix(theClass)); if(dvClassGetMemoryStyle(theClass) != MEM_CREATE_ONLY) { dvWrtemp(dvFile, "extern void(*%0%1DestructorCallback)(%2%1);\n", dvPrefix, name, dvClassGetPrefix(theClass)); }}/*-------------------------------------------------------------------------------------------------- Write out all the constructor/destructor variable declarations.--------------------------------------------------------------------------------------------------*/static void writeConstructorDestructorVariables( dvModule module){ dvClass theClass; dvWrtemp(dvFile, "/*----------------------------------------------------------------------------------------\n" " Constructor/Destructor hooks.\n" "----------------------------------------------------------------------------------------*/\n" ); dvForeachModuleClass(module, theClass) { writeClassConstructorDestructorVariables(theClass); } dvEndForeachModuleClass; fputs("\n", dvFile);}/*-------------------------------------------------------------------------------------------------- Write out the general/internal fields in root struct for theClass.--------------------------------------------------------------------------------------------------*/static void writeClassRootMemoryManagementFields( dvClass theClass){ char *name = dvClassGetName(theClass); if(dvClassGetBaseClass(theClass) == dvClassNull) { if(dvClassGetMemoryStyle(theClass) == MEM_FREE_LIST) { dvWrtemp(dvFile, " %0%1 firstFree%1;\n", dvPrefix, name); } dvWrtemp(dvFile, " %1 used%0, allocated%0;\n", name, dvClassGetReferenceTypeName(theClass)); } else { dvWrtemp(dvFile, " %1 allocated%0;\n", name, dvClassGetReferenceTypeName(theClass)); }}/*-------------------------------------------------------------------------------------------------- Write out the property fields in root struct for theClass.--------------------------------------------------------------------------------------------------*/static void writeClassRootPropertyFields( dvClass theClass){ char *name = dvClassGetName(theClass); dvProperty prop; dvForeachClassProperty(theClass, prop) { if(dvPropertyArray(prop)) { dvWrtemp(dvFile, " uint32 used%0%1, allocated%0%1, free%0%1;\n", name, dvPropertyGetName(prop)); } } dvEndForeachClassProperty;}/*-------------------------------------------------------------------------------------------------- Write root structure fields for theClass.--------------------------------------------------------------------------------------------------*/static void writeClassRootFields( dvClass theClass){ writeClassRootMemoryManagementFields(theClass); writeClassRootPropertyFields(theClass);}/*-------------------------------------------------------------------------------------------------- Write out the general/internal macros in root struct for theClass.--------------------------------------------------------------------------------------------------*/static void writeClassRootMemoryManagementMacros( dvClass theClass){ char *name = dvClassGetName(theClass); char *preString, *postString; if(dvClassGetBaseClass(theClass) == dvClassNull) { if(dvClassGetMemoryStyle(theClass) == MEM_FREE_LIST) { dvWrtemp(dvFile, "#define %0FirstFree%1() %0RootData.firstFree%1\n", dvPrefix, name); preString = dvSwrtemp(!dvClassUndo(theClass)? "" : " \\\n (void)utRecordGlobal(%0ModuleID, %2, &%0RootData.firstFree%1, true)," " \\\n ", dvPrefix, name, utSprintf("%u", dvClassGetReferenceSize(theClass) >> 3)); postString = dvSwrtemp(!dvClassRedo(theClass)? "" : ", \\\n (void)utRecordGlobal(%0ModuleID, %2, &%0RootData.firstFree%1, false)", dvPrefix, name, utSprintf("%u", dvClassGetReferenceSize(theClass) >> 3)); dvWrtemp(dvFile, "#define %0SetFirstFree%1(value) (%2%0RootData.firstFree%1 = (value)%3)\n", dvPrefix, name, preString, postString); } dvWrtemp(dvFile, "#define %0Used%1() %0RootData.used%1\n" "#define %0Allocated%1() %0RootData.allocated%1\n", dvPrefix, name); preString = dvSwrtemp(!dvClassUndo(theClass)? "" : " \\\n (void)utRecordGlobal(%0ModuleID, %2, &%0RootData.used%1, true), \\\n ", dvPrefix, name, utSprintf("%u", dvClassGetReferenceSize(theClass) >> 3)); postString = dvSwrtemp(!dvClassRedo(theClass)? "" : ", \\\n (void)utRecordGlobal(%0ModuleID, %2, &%0RootData.used%1, false)", dvPrefix, name, utSprintf("%u", dvClassGetReferenceSize(theClass) >> 3)); dvWrtemp(dvFile, "#define %0SetUsed%1(value) (%2%0RootData.used%1 = (value)%3)\n", dvPrefix, name, preString, postString); preString = dvSwrtemp(!dvClassUndo(theClass)? "" : " \\\n (void)utRecordGlobal(%0ModuleID, %2, &%0RootData.allocated%1, true)," " \\\n ", dvPrefix, name, utSprintf("%u", dvClassGetReferenceSize(theClass) >> 3)); postString = dvSwrtemp(!dvClassRedo(theClass)? "" : ", \\\n (void)utRecordGlobal(%0ModuleID, %2, &%0RootData.allocated%1, false)", dvPrefix, name, utSprintf("%u", dvClassGetReferenceSize(theClass) >> 3)); dvWrtemp(dvFile, "#define %0SetAllocated%1(value) (%2%0RootData.allocated%1 = (value)%3)\n", dvPrefix, name, preString, postString); } else { dvWrtemp(dvFile, "#define %0Allocated%1() %0RootData.allocated%1\n", dvPrefix, name); preString = dvSwrtemp(!dvClassUndo(theClass)? "" : " \\\n (void)utRecordGlobal(%0ModuleID, %2, &%0RootData.allocated%1, true)," " \\\n", dvPrefix, name, utSprintf("%u", dvClassGetReferenceSize(theClass) >> 3)); postString = dvSwrtemp(!dvClassRedo(theClass)? "" : ", \\\n (void)utRecordGlobal(%0ModuleID, %2, &%0RootData.allocated%1, false)", dvPrefix, name, utSprintf("%u", dvClassGetReferenceSize(theClass) >> 3)); dvWrtemp(dvFile, "#define %0SetAllocated%1(value) (%2%0RootData.allocated%1 = (value)%3)\n", dvPrefix, name, preString, postString); }}/*-------------------------------------------------------------------------------------------------- Write out the property macros in root struct for theClass.--------------------------------------------------------------------------------------------------*/static void writeClassRootPropertyMacros( dvClass theClass){ char *name = dvClassGetName(theClass); dvProperty prop; char *preString, *postString; dvForeachClassProperty(theClass, prop) { if(dvPropertyArray(prop)) { dvWrtemp(dvFile, "#define %0Used%1%2() %0RootData.used%1%2\n" "#define %0Allocated%1%2() %0RootData.allocated%1%2\n" "#define %0Free%1%2() %0RootData.free%1%2\n", dvPrefix, name, dvPropertyGetName(prop)); preString = dvSwrtemp(!dvClassUndo(theClass)? "" : " \\\n (void)utRecordGlobal(%0ModuleID, sizeof(uint32), &%0RootData.used%1%2," " true), \\\n ", dvPrefix, name, dvPropertyGetName(prop)); postString = dvSwrtemp(!dvClassRedo(theClass)? "" : ", \\\n (void)utRecordGlobal(%0ModuleID, sizeof(uint32), &%0RootData.used%1%2," " false)", dvPrefix, name, dvPropertyGetName(prop)); dvWrtemp(dvFile, "#define %0SetUsed%1%2(value) (%3%0RootData.used%1%2 = (value)%4)\n", dvPrefix, name, dvPropertyGetName(prop), preString, postString); preString = dvSwrtemp(!dvClassUndo(theClass)? "" : " \\\n (void)utRecordGlobal(%0ModuleID, sizeof(uint32), " "&%0RootData.allocated%1%2, true), \\\n ", dvPrefix, name, dvPropertyGetName(prop)); postString = dvSwrtemp(!dvClassRedo(theClass)? "" : ", \\\n (void)utRecordGlobal(%0ModuleID, sizeof(uint32), " "&%0RootData.allocated%1%2, false)", dvPrefix, name, dvPropertyGetName(prop)); dvWrtemp(dvFile, "#define %0SetAllocated%1%2(value) (%3%0RootData.allocated%1%2 = (value)%4)\n", dvPrefix, name, dvPropertyGetName(prop), preString, postString); preString = dvSwrtemp(!dvClassUndo(theClass)? "" : " \\\n (void)utRecordGlobal(%0ModuleID, sizeof(uint32), " "&%0RootData.free%1%2, true), \\\n ", dvPrefix, name, dvPropertyGetName(prop)); postString = dvSwrtemp(!dvClassRedo(theClass)? "" : ", \\\n (void)utRecordGlobal(%0ModuleID, sizeof(uint32), " "&%0RootData.free%1%2, false)", dvPrefix, name, dvPropertyGetName(prop)); dvWrtemp(dvFile, "#define %0SetFree%1%2(value) (%3%0RootData.free%1%2 = (value)%4)\n", dvPrefix, name, dvPropertyGetName(prop), preString, postString); } } dvEndForeachClassProperty;}/*-------------------------------------------------------------------------------------------------- Write out the macros for the gen/internal fields in root struct for theClass.--------------------------------------------------------------------------------------------------*/static void writeClassRootMacros( dvClass theClass){ writeClassRootMemoryManagementMacros(theClass); writeClassRootPropertyMacros(theClass);}/*-------------------------------------------------------------------------------------------------- Write the root structure and associated macros.--------------------------------------------------------------------------------------------------*/static void writeRoot( dvModule module){ dvClass theClass; dvWrtemp(dvFile, "/*----------------------------------------------------------------------------------------\n" " Root structure\n" "----------------------------------------------------------------------------------------*/\n" "struct %0RootType_ {\n" " uint32 hash; /* This depends only on the structure of the database */\n", dvPrefix); dvForeachModuleClass(module, theClass) { writeClassRootFields(theClass); } dvEndForeachModuleClass; dvWrtemp(dvFile, "};\nextern struct %0RootType_ %0RootData;\n\n", dvPrefix); dvWrtemp(dvFile, "#define %0Hash() (%0RootData.hash)\n", dvPrefix); dvForeachModuleClass(module, theClass) { writeClassRootMacros(theClass); } dvEndForeachModuleClass; fputs("\n", dvFile);}/*-------------------------------------------------------------------------------------------------- Write the temporary variable union.--------------------------------------------------------------------------------------------------*/static void writeTempUnion(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -