| |
| /* 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; |
| } |