/* Compiler implementation of the D programming language * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved * written by Walter Bright * http://www.digitalmars.com * Distributed under the Boost Software License, Version 1.0. * http://www.boost.org/LICENSE_1_0.txt * https://github.com/D-Programming-Language/dmd/blob/master/src/idgen.c */ // Program to generate string files in d data structures. // Saves much tedious typing, and eliminates typo problems. // Generates: // id.h // id.c #include "root/dsystem.h" struct Msgtable { const char* ident; // name to use in DMD source const char* name; // name in D executable }; Msgtable msgtable[] = { { "IUnknown", NULL }, { "Object", NULL }, { "object", NULL }, { "string", NULL }, { "wstring", NULL }, { "dstring", NULL }, { "max", NULL }, { "min", NULL }, { "This", "this" }, { "_super", "super" }, { "ctor", "__ctor" }, { "dtor", "__dtor" }, { "__xdtor", "__xdtor" }, { "__fieldDtor", "__fieldDtor" }, { "__aggrDtor", "__aggrDtor" }, { "postblit", "__postblit" }, { "__xpostblit", "__xpostblit" }, { "__fieldPostblit", "__fieldPostblit" }, { "__aggrPostblit", "__aggrPostblit" }, { "classInvariant", "__invariant" }, { "unitTest", "__unitTest" }, { "require", "__require" }, { "ensure", "__ensure" }, { "_init", "init" }, { "__sizeof", "sizeof" }, { "__xalignof", "alignof" }, { "_mangleof", "mangleof" }, { "stringof", NULL }, { "_tupleof", "tupleof" }, { "length", NULL }, { "remove", NULL }, { "ptr", NULL }, { "array", NULL }, { "funcptr", NULL }, { "dollar", "__dollar" }, { "ctfe", "__ctfe" }, { "offset", NULL }, { "offsetof", NULL }, { "ModuleInfo", NULL }, { "ClassInfo", NULL }, { "classinfo", NULL }, { "typeinfo", NULL }, { "outer", NULL }, { "Exception", NULL }, { "RTInfo", NULL }, { "Throwable", NULL }, { "Error", NULL }, { "withSym", "__withSym" }, { "result", "__result" }, { "returnLabel", "__returnLabel" }, { "line", NULL }, { "empty", "" }, { "p", NULL }, { "q", NULL }, { "__vptr", NULL }, { "__monitor", NULL }, { "gate", "__gate" }, { "__c_long", NULL }, { "__c_ulong", NULL }, { "__c_longlong", NULL }, { "__c_ulonglong", NULL }, { "__c_long_double", NULL }, { "cpp_type_info_ptr", "__cpp_type_info_ptr" }, { "_assert", "assert" }, { "_unittest", "unittest" }, { "_body", "body" }, { "TypeInfo", NULL }, { "TypeInfo_Class", NULL }, { "TypeInfo_Interface", NULL }, { "TypeInfo_Struct", NULL }, { "TypeInfo_Enum", NULL }, { "TypeInfo_Pointer", NULL }, { "TypeInfo_Vector", NULL }, { "TypeInfo_Array", NULL }, { "TypeInfo_StaticArray", NULL }, { "TypeInfo_AssociativeArray", NULL }, { "TypeInfo_Function", NULL }, { "TypeInfo_Delegate", NULL }, { "TypeInfo_Tuple", NULL }, { "TypeInfo_Const", NULL }, { "TypeInfo_Invariant", NULL }, { "TypeInfo_Shared", NULL }, { "TypeInfo_Wild", "TypeInfo_Inout" }, { "elements", NULL }, { "_arguments_typeinfo", NULL }, { "_arguments", NULL }, { "_argptr", NULL }, { "destroy", NULL }, { "xopEquals", "__xopEquals" }, { "xopCmp", "__xopCmp" }, { "xtoHash", "__xtoHash" }, { "LINE", "__LINE__" }, { "FILE", "__FILE__" }, { "MODULE", "__MODULE__" }, { "FUNCTION", "__FUNCTION__" }, { "PRETTY_FUNCTION", "__PRETTY_FUNCTION__" }, { "DATE", "__DATE__" }, { "TIME", "__TIME__" }, { "TIMESTAMP", "__TIMESTAMP__" }, { "VENDOR", "__VENDOR__" }, { "VERSIONX", "__VERSION__" }, { "EOFX", "__EOF__" }, { "nan", NULL }, { "infinity", NULL }, { "dig", NULL }, { "epsilon", NULL }, { "mant_dig", NULL }, { "max_10_exp", NULL }, { "max_exp", NULL }, { "min_10_exp", NULL }, { "min_exp", NULL }, { "min_normal", NULL }, { "re", NULL }, { "im", NULL }, { "C", NULL }, { "D", NULL }, { "Windows", NULL }, { "Pascal", NULL }, { "System", NULL }, { "Objective", NULL }, { "exit", NULL }, { "success", NULL }, { "failure", NULL }, { "keys", NULL }, { "values", NULL }, { "rehash", NULL }, { "future", "__future" }, { "property", NULL }, { "nogc", NULL }, { "safe", NULL }, { "trusted", NULL }, { "system", NULL }, { "disable", NULL }, // For inline assembler { "___out", "out" }, { "___in", "in" }, { "__int", "int" }, { "_dollar", "$" }, { "__LOCAL_SIZE", NULL }, // For operator overloads { "uadd", "opPos" }, { "neg", "opNeg" }, { "com", "opCom" }, { "add", "opAdd" }, { "add_r", "opAdd_r" }, { "sub", "opSub" }, { "sub_r", "opSub_r" }, { "mul", "opMul" }, { "mul_r", "opMul_r" }, { "div", "opDiv" }, { "div_r", "opDiv_r" }, { "mod", "opMod" }, { "mod_r", "opMod_r" }, { "eq", "opEquals" }, { "cmp", "opCmp" }, { "iand", "opAnd" }, { "iand_r", "opAnd_r" }, { "ior", "opOr" }, { "ior_r", "opOr_r" }, { "ixor", "opXor" }, { "ixor_r", "opXor_r" }, { "shl", "opShl" }, { "shl_r", "opShl_r" }, { "shr", "opShr" }, { "shr_r", "opShr_r" }, { "ushr", "opUShr" }, { "ushr_r", "opUShr_r" }, { "cat", "opCat" }, { "cat_r", "opCat_r" }, { "assign", "opAssign" }, { "addass", "opAddAssign" }, { "subass", "opSubAssign" }, { "mulass", "opMulAssign" }, { "divass", "opDivAssign" }, { "modass", "opModAssign" }, { "andass", "opAndAssign" }, { "orass", "opOrAssign" }, { "xorass", "opXorAssign" }, { "shlass", "opShlAssign" }, { "shrass", "opShrAssign" }, { "ushrass", "opUShrAssign" }, { "catass", "opCatAssign" }, { "postinc", "opPostInc" }, { "postdec", "opPostDec" }, { "index", "opIndex" }, { "indexass", "opIndexAssign" }, { "slice", "opSlice" }, { "sliceass", "opSliceAssign" }, { "call", "opCall" }, { "_cast", "opCast" }, { "opIn", NULL }, { "opIn_r", NULL }, { "opStar", NULL }, { "opDot", NULL }, { "opDispatch", NULL }, { "opDollar", NULL }, { "opUnary", NULL }, { "opIndexUnary", NULL }, { "opSliceUnary", NULL }, { "opBinary", NULL }, { "opBinaryRight", NULL }, { "opOpAssign", NULL }, { "opIndexOpAssign", NULL }, { "opSliceOpAssign", NULL }, { "pow", "opPow" }, { "pow_r", "opPow_r" }, { "powass", "opPowAssign" }, { "classNew", "new" }, { "classDelete", "delete" }, // For foreach { "apply", "opApply" }, { "applyReverse", "opApplyReverse" }, // Ranges { "Fempty", "empty" }, { "Ffront", "front" }, { "Fback", "back" }, { "FpopFront", "popFront" }, { "FpopBack", "popBack" }, // For internal functions { "aaLen", "_aaLen" }, { "aaKeys", "_aaKeys" }, { "aaValues", "_aaValues" }, { "aaRehash", "_aaRehash" }, { "monitorenter", "_d_monitorenter" }, { "monitorexit", "_d_monitorexit" }, { "criticalenter", "_d_criticalenter" }, { "criticalexit", "_d_criticalexit" }, { "__ArrayEq", NULL }, { "__ArrayPostblit", NULL }, { "__ArrayDtor", NULL }, { "dup", NULL }, { "_aaApply", NULL }, { "_aaApply2", NULL }, // For pragma's { "Pinline", "inline" }, { "lib", NULL }, { "mangle", NULL }, { "msg", NULL }, { "startaddress", NULL }, // For special functions { "tohash", "toHash" }, { "tostring", "toString" }, { "getmembers", "getMembers" }, // Special functions { "__alloca", "alloca" }, { "main", NULL }, { "WinMain", NULL }, { "DllMain", NULL }, { "tls_get_addr", "___tls_get_addr" }, { "entrypoint", "__entrypoint" }, // varargs implementation { "va_start", NULL }, // Builtin functions { "std", NULL }, { "core", NULL }, { "attribute", NULL }, { "math", NULL }, { "sin", NULL }, { "cos", NULL }, { "tan", NULL }, { "_sqrt", "sqrt" }, { "_pow", "pow" }, { "atan2", NULL }, { "rndtol", NULL }, { "expm1", NULL }, { "exp2", NULL }, { "yl2x", NULL }, { "yl2xp1", NULL }, { "fabs", NULL }, { "bitop", NULL }, { "bsf", NULL }, { "bsr", NULL }, { "bswap", NULL }, // Traits { "isAbstractClass", NULL }, { "isArithmetic", NULL }, { "isAssociativeArray", NULL }, { "isFinalClass", NULL }, { "isTemplate", NULL }, { "isPOD", NULL }, { "isNested", NULL }, { "isFloating", NULL }, { "isIntegral", NULL }, { "isScalar", NULL }, { "isStaticArray", NULL }, { "isUnsigned", NULL }, { "isVirtualFunction", NULL }, { "isVirtualMethod", NULL }, { "isAbstractFunction", NULL }, { "isFinalFunction", NULL }, { "isOverrideFunction", NULL }, { "isStaticFunction", NULL }, { "isRef", NULL }, { "isOut", NULL }, { "isLazy", NULL }, { "hasMember", NULL }, { "identifier", NULL }, { "getProtection", NULL }, { "parent", NULL }, { "getMember", NULL }, { "getOverloads", NULL }, { "getVirtualFunctions", NULL }, { "getVirtualMethods", NULL }, { "classInstanceSize", NULL }, { "allMembers", NULL }, { "derivedMembers", NULL }, { "isSame", NULL }, { "compiles", NULL }, { "parameters", NULL }, { "getAliasThis", NULL }, { "getAttributes", NULL }, { "getFunctionAttributes", NULL }, { "getFunctionVariadicStyle", NULL }, { "getParameterStorageClasses", NULL }, { "getLinkage", NULL }, { "getUnitTests", NULL }, { "getVirtualIndex", NULL }, { "getPointerBitmap", NULL }, // For C++ mangling { "allocator", NULL }, { "basic_string", NULL }, { "basic_istream", NULL }, { "basic_ostream", NULL }, { "basic_iostream", NULL }, { "char_traits", NULL }, // Compiler recognized UDA's { "udaSelector", "selector" }, // C names, for undefined identifier error messages { "C_NULL", "NULL" }, { "C_TRUE", "TRUE" }, { "C_FALSE", "FALSE" }, { "C_unsigned", "unsigned" }, { "C_wchar_t", "wchar_t" }, }; int main() { { FILE *fp = fopen("id.h","wb"); if (!fp) { printf("can't open id.h\n"); exit(EXIT_FAILURE); } fprintf(fp, "// File generated by idgen.c\n"); fprintf(fp, "#ifndef DMD_ID_H\n"); fprintf(fp, "#define DMD_ID_H 1\n"); fprintf(fp, "class Identifier;\n"); fprintf(fp, "struct Id\n"); fprintf(fp, "{\n"); for (unsigned i = 0; i < sizeof(msgtable) / sizeof(msgtable[0]); i++) { const char *id = msgtable[i].ident; fprintf(fp," static Identifier *%s;\n", id); } fprintf(fp, " static void initialize();\n"); fprintf(fp, "};\n"); fprintf(fp, "#endif\n"); fclose(fp); } { FILE *fp = fopen("id.c","wb"); if (!fp) { printf("can't open id.c\n"); exit(EXIT_FAILURE); } fprintf(fp, "// File generated by idgen.c\n"); fprintf(fp, "#include \"identifier.h\"\n"); fprintf(fp, "#include \"id.h\"\n"); fprintf(fp, "#include \"mars.h\"\n"); for (unsigned i = 0; i < sizeof(msgtable) / sizeof(msgtable[0]); i++) { const char *id = msgtable[i].ident; const char *p = msgtable[i].name; if (!p) p = id; fprintf(fp,"Identifier *Id::%s;\n", id); } fprintf(fp, "void Id::initialize()\n"); fprintf(fp, "{\n"); for (unsigned i = 0; i < sizeof(msgtable) / sizeof(msgtable[0]); i++) { const char *id = msgtable[i].ident; const char *p = msgtable[i].name; if (!p) p = id; fprintf(fp," %s = Identifier::idPool(\"%s\");\n", id, p); } fprintf(fp, "}\n"); fclose(fp); } { FILE *fp = fopen("id.d","wb"); if (!fp) { printf("can't open id.d\n"); exit(EXIT_FAILURE); } fprintf(fp, "// File generated by idgen.c\n"); fprintf(fp, "\n"); fprintf(fp, "module ddmd.id;\n"); fprintf(fp, "\n"); fprintf(fp, "import ddmd.identifier, ddmd.tokens;\n"); fprintf(fp, "\n"); fprintf(fp, "struct Id\n"); fprintf(fp, "{\n"); for (unsigned i = 0; i < sizeof(msgtable) / sizeof(msgtable[0]); i++) { const char *id = msgtable[i].ident; const char *p = msgtable[i].name; if (!p) p = id; fprintf(fp, " extern (C++) static __gshared Identifier %s;\n", id); } fprintf(fp, "\n"); fprintf(fp, " extern (C++) static void initialize()\n"); fprintf(fp, " {\n"); for (unsigned i = 0; i < sizeof(msgtable) / sizeof(msgtable[0]); i++) { const char *id = msgtable[i].ident; const char *p = msgtable[i].name; if (!p) p = id; fprintf(fp," %s = Identifier.idPool(\"%s\");\n", id, p); } fprintf(fp, " }\n"); fprintf(fp, "}\n"); fclose(fp); } return EXIT_SUCCESS; }