⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvgenh.c

📁 DataDraw is an ultra-fast persistent database for high performance programs written in C. It s so fa
💻 C
📖 第 1 页 / 共 4 页
字号:
/*    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 + -