1
2 /* Compiler implementation of the D programming language
3 * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved
4 * written by Walter Bright
5 * http://www.digitalmars.com
6 * Distributed under the Boost Software License, Version 1.0.
7 * http://www.boost.org/LICENSE_1_0.txt
8 * https://github.com/D-Programming-Language/dmd/blob/master/src/idgen.c
9 */
10
11 // Program to generate string files in d data structures.
12 // Saves much tedious typing, and eliminates typo problems.
13 // Generates:
14 // id.h
15 // id.c
16
17 #include "root/dsystem.h"
18
19 struct Msgtable
20 {
21 const char* ident; // name to use in DMD source
22 const char* name; // name in D executable
23 };
24
25 Msgtable msgtable[] =
26 {
27 { "IUnknown", NULL },
28 { "Object", NULL },
29 { "object", NULL },
30 { "string", NULL },
31 { "wstring", NULL },
32 { "dstring", NULL },
33 { "max", NULL },
34 { "min", NULL },
35 { "This", "this" },
36 { "_super", "super" },
37 { "ctor", "__ctor" },
38 { "dtor", "__dtor" },
39 { "__xdtor", "__xdtor" },
40 { "__fieldDtor", "__fieldDtor" },
41 { "__aggrDtor", "__aggrDtor" },
42 { "postblit", "__postblit" },
43 { "__xpostblit", "__xpostblit" },
44 { "__fieldPostblit", "__fieldPostblit" },
45 { "__aggrPostblit", "__aggrPostblit" },
46 { "classInvariant", "__invariant" },
47 { "unitTest", "__unitTest" },
48 { "require", "__require" },
49 { "ensure", "__ensure" },
50 { "_init", "init" },
51 { "__sizeof", "sizeof" },
52 { "__xalignof", "alignof" },
53 { "_mangleof", "mangleof" },
54 { "stringof", NULL },
55 { "_tupleof", "tupleof" },
56 { "length", NULL },
57 { "remove", NULL },
58 { "ptr", NULL },
59 { "array", NULL },
60 { "funcptr", NULL },
61 { "dollar", "__dollar" },
62 { "ctfe", "__ctfe" },
63 { "offset", NULL },
64 { "offsetof", NULL },
65 { "ModuleInfo", NULL },
66 { "ClassInfo", NULL },
67 { "classinfo", NULL },
68 { "typeinfo", NULL },
69 { "outer", NULL },
70 { "Exception", NULL },
71 { "RTInfo", NULL },
72 { "Throwable", NULL },
73 { "Error", NULL },
74 { "withSym", "__withSym" },
75 { "result", "__result" },
76 { "returnLabel", "__returnLabel" },
77 { "line", NULL },
78 { "empty", "" },
79 { "p", NULL },
80 { "q", NULL },
81 { "__vptr", NULL },
82 { "__monitor", NULL },
83 { "gate", "__gate" },
84 { "__c_long", NULL },
85 { "__c_ulong", NULL },
86 { "__c_longlong", NULL },
87 { "__c_ulonglong", NULL },
88 { "__c_long_double", NULL },
89 { "cpp_type_info_ptr", "__cpp_type_info_ptr" },
90 { "_assert", "assert" },
91 { "_unittest", "unittest" },
92 { "_body", "body" },
93
94 { "TypeInfo", NULL },
95 { "TypeInfo_Class", NULL },
96 { "TypeInfo_Interface", NULL },
97 { "TypeInfo_Struct", NULL },
98 { "TypeInfo_Enum", NULL },
99 { "TypeInfo_Pointer", NULL },
100 { "TypeInfo_Vector", NULL },
101 { "TypeInfo_Array", NULL },
102 { "TypeInfo_StaticArray", NULL },
103 { "TypeInfo_AssociativeArray", NULL },
104 { "TypeInfo_Function", NULL },
105 { "TypeInfo_Delegate", NULL },
106 { "TypeInfo_Tuple", NULL },
107 { "TypeInfo_Const", NULL },
108 { "TypeInfo_Invariant", NULL },
109 { "TypeInfo_Shared", NULL },
110 { "TypeInfo_Wild", "TypeInfo_Inout" },
111 { "elements", NULL },
112 { "_arguments_typeinfo", NULL },
113 { "_arguments", NULL },
114 { "_argptr", NULL },
115 { "destroy", NULL },
116 { "xopEquals", "__xopEquals" },
117 { "xopCmp", "__xopCmp" },
118 { "xtoHash", "__xtoHash" },
119
120 { "LINE", "__LINE__" },
121 { "FILE", "__FILE__" },
122 { "MODULE", "__MODULE__" },
123 { "FUNCTION", "__FUNCTION__" },
124 { "PRETTY_FUNCTION", "__PRETTY_FUNCTION__" },
125 { "DATE", "__DATE__" },
126 { "TIME", "__TIME__" },
127 { "TIMESTAMP", "__TIMESTAMP__" },
128 { "VENDOR", "__VENDOR__" },
129 { "VERSIONX", "__VERSION__" },
130 { "EOFX", "__EOF__" },
131
132 { "nan", NULL },
133 { "infinity", NULL },
134 { "dig", NULL },
135 { "epsilon", NULL },
136 { "mant_dig", NULL },
137 { "max_10_exp", NULL },
138 { "max_exp", NULL },
139 { "min_10_exp", NULL },
140 { "min_exp", NULL },
141 { "min_normal", NULL },
142 { "re", NULL },
143 { "im", NULL },
144
145 { "C", NULL },
146 { "D", NULL },
147 { "Windows", NULL },
148 { "Pascal", NULL },
149 { "System", NULL },
150 { "Objective", NULL },
151
152 { "exit", NULL },
153 { "success", NULL },
154 { "failure", NULL },
155
156 { "keys", NULL },
157 { "values", NULL },
158 { "rehash", NULL },
159
160 { "future", "__future" },
161 { "property", NULL },
162 { "nogc", NULL },
163 { "safe", NULL },
164 { "trusted", NULL },
165 { "system", NULL },
166 { "disable", NULL },
167
168 // For inline assembler
169 { "___out", "out" },
170 { "___in", "in" },
171 { "__int", "int" },
172 { "_dollar", "$" },
173 { "__LOCAL_SIZE", NULL },
174
175 // For operator overloads
176 { "uadd", "opPos" },
177 { "neg", "opNeg" },
178 { "com", "opCom" },
179 { "add", "opAdd" },
180 { "add_r", "opAdd_r" },
181 { "sub", "opSub" },
182 { "sub_r", "opSub_r" },
183 { "mul", "opMul" },
184 { "mul_r", "opMul_r" },
185 { "div", "opDiv" },
186 { "div_r", "opDiv_r" },
187 { "mod", "opMod" },
188 { "mod_r", "opMod_r" },
189 { "eq", "opEquals" },
190 { "cmp", "opCmp" },
191 { "iand", "opAnd" },
192 { "iand_r", "opAnd_r" },
193 { "ior", "opOr" },
194 { "ior_r", "opOr_r" },
195 { "ixor", "opXor" },
196 { "ixor_r", "opXor_r" },
197 { "shl", "opShl" },
198 { "shl_r", "opShl_r" },
199 { "shr", "opShr" },
200 { "shr_r", "opShr_r" },
201 { "ushr", "opUShr" },
202 { "ushr_r", "opUShr_r" },
203 { "cat", "opCat" },
204 { "cat_r", "opCat_r" },
205 { "assign", "opAssign" },
206 { "addass", "opAddAssign" },
207 { "subass", "opSubAssign" },
208 { "mulass", "opMulAssign" },
209 { "divass", "opDivAssign" },
210 { "modass", "opModAssign" },
211 { "andass", "opAndAssign" },
212 { "orass", "opOrAssign" },
213 { "xorass", "opXorAssign" },
214 { "shlass", "opShlAssign" },
215 { "shrass", "opShrAssign" },
216 { "ushrass", "opUShrAssign" },
217 { "catass", "opCatAssign" },
218 { "postinc", "opPostInc" },
219 { "postdec", "opPostDec" },
220 { "index", "opIndex" },
221 { "indexass", "opIndexAssign" },
222 { "slice", "opSlice" },
223 { "sliceass", "opSliceAssign" },
224 { "call", "opCall" },
225 { "_cast", "opCast" },
226 { "opIn", NULL },
227 { "opIn_r", NULL },
228 { "opStar", NULL },
229 { "opDot", NULL },
230 { "opDispatch", NULL },
231 { "opDollar", NULL },
232 { "opUnary", NULL },
233 { "opIndexUnary", NULL },
234 { "opSliceUnary", NULL },
235 { "opBinary", NULL },
236 { "opBinaryRight", NULL },
237 { "opOpAssign", NULL },
238 { "opIndexOpAssign", NULL },
239 { "opSliceOpAssign", NULL },
240 { "pow", "opPow" },
241 { "pow_r", "opPow_r" },
242 { "powass", "opPowAssign" },
243
244 { "classNew", "new" },
245 { "classDelete", "delete" },
246
247 // For foreach
248 { "apply", "opApply" },
249 { "applyReverse", "opApplyReverse" },
250
251 // Ranges
252 { "Fempty", "empty" },
253 { "Ffront", "front" },
254 { "Fback", "back" },
255 { "FpopFront", "popFront" },
256 { "FpopBack", "popBack" },
257
258 // For internal functions
259 { "aaLen", "_aaLen" },
260 { "aaKeys", "_aaKeys" },
261 { "aaValues", "_aaValues" },
262 { "aaRehash", "_aaRehash" },
263 { "monitorenter", "_d_monitorenter" },
264 { "monitorexit", "_d_monitorexit" },
265 { "criticalenter", "_d_criticalenter" },
266 { "criticalexit", "_d_criticalexit" },
267 { "__ArrayEq", NULL },
268 { "__ArrayPostblit", NULL },
269 { "__ArrayDtor", NULL },
270 { "dup", NULL },
271 { "_aaApply", NULL },
272 { "_aaApply2", NULL },
273
274 // For pragma's
275 { "Pinline", "inline" },
276 { "lib", NULL },
277 { "mangle", NULL },
278 { "msg", NULL },
279 { "startaddress", NULL },
280
281 // For special functions
282 { "tohash", "toHash" },
283 { "tostring", "toString" },
284 { "getmembers", "getMembers" },
285
286 // Special functions
287 { "__alloca", "alloca" },
288 { "main", NULL },
289 { "WinMain", NULL },
290 { "DllMain", NULL },
291 { "tls_get_addr", "___tls_get_addr" },
292 { "entrypoint", "__entrypoint" },
293
294 // varargs implementation
295 { "va_start", NULL },
296
297 // Builtin functions
298 { "std", NULL },
299 { "core", NULL },
300 { "attribute", NULL },
301 { "math", NULL },
302 { "sin", NULL },
303 { "cos", NULL },
304 { "tan", NULL },
305 { "_sqrt", "sqrt" },
306 { "_pow", "pow" },
307 { "atan2", NULL },
308 { "rndtol", NULL },
309 { "expm1", NULL },
310 { "exp2", NULL },
311 { "yl2x", NULL },
312 { "yl2xp1", NULL },
313 { "fabs", NULL },
314 { "bitop", NULL },
315 { "bsf", NULL },
316 { "bsr", NULL },
317 { "bswap", NULL },
318
319 // Traits
320 { "isAbstractClass", NULL },
321 { "isArithmetic", NULL },
322 { "isAssociativeArray", NULL },
323 { "isFinalClass", NULL },
324 { "isTemplate", NULL },
325 { "isPOD", NULL },
326 { "isNested", NULL },
327 { "isFloating", NULL },
328 { "isIntegral", NULL },
329 { "isScalar", NULL },
330 { "isStaticArray", NULL },
331 { "isUnsigned", NULL },
332 { "isVirtualFunction", NULL },
333 { "isVirtualMethod", NULL },
334 { "isAbstractFunction", NULL },
335 { "isFinalFunction", NULL },
336 { "isOverrideFunction", NULL },
337 { "isStaticFunction", NULL },
338 { "isRef", NULL },
339 { "isOut", NULL },
340 { "isLazy", NULL },
341 { "hasMember", NULL },
342 { "identifier", NULL },
343 { "getProtection", NULL },
344 { "parent", NULL },
345 { "getMember", NULL },
346 { "getOverloads", NULL },
347 { "getVirtualFunctions", NULL },
348 { "getVirtualMethods", NULL },
349 { "classInstanceSize", NULL },
350 { "allMembers", NULL },
351 { "derivedMembers", NULL },
352 { "isSame", NULL },
353 { "compiles", NULL },
354 { "parameters", NULL },
355 { "getAliasThis", NULL },
356 { "getAttributes", NULL },
357 { "getFunctionAttributes", NULL },
358 { "getFunctionVariadicStyle", NULL },
359 { "getParameterStorageClasses", NULL },
360 { "getLinkage", NULL },
361 { "getUnitTests", NULL },
362 { "getVirtualIndex", NULL },
363 { "getPointerBitmap", NULL },
364
365 // For C++ mangling
366 { "allocator", NULL },
367 { "basic_string", NULL },
368 { "basic_istream", NULL },
369 { "basic_ostream", NULL },
370 { "basic_iostream", NULL },
371 { "char_traits", NULL },
372
373 // Compiler recognized UDA's
374 { "udaSelector", "selector" },
375
376 // C names, for undefined identifier error messages
377 { "C_NULL", "NULL" },
378 { "C_TRUE", "TRUE" },
379 { "C_FALSE", "FALSE" },
380 { "C_unsigned", "unsigned" },
381 { "C_wchar_t", "wchar_t" },
382 };
383
384
main()385 int main()
386 {
387 {
388 FILE *fp = fopen("id.h","wb");
389 if (!fp)
390 {
391 printf("can't open id.h\n");
392 exit(EXIT_FAILURE);
393 }
394
395 fprintf(fp, "// File generated by idgen.c\n");
396 fprintf(fp, "#ifndef DMD_ID_H\n");
397 fprintf(fp, "#define DMD_ID_H 1\n");
398 fprintf(fp, "class Identifier;\n");
399 fprintf(fp, "struct Id\n");
400 fprintf(fp, "{\n");
401
402 for (unsigned i = 0; i < sizeof(msgtable) / sizeof(msgtable[0]); i++)
403 {
404 const char *id = msgtable[i].ident;
405 fprintf(fp," static Identifier *%s;\n", id);
406 }
407
408 fprintf(fp, " static void initialize();\n");
409 fprintf(fp, "};\n");
410 fprintf(fp, "#endif\n");
411
412 fclose(fp);
413 }
414
415 {
416 FILE *fp = fopen("id.c","wb");
417 if (!fp)
418 {
419 printf("can't open id.c\n");
420 exit(EXIT_FAILURE);
421 }
422
423 fprintf(fp, "// File generated by idgen.c\n");
424 fprintf(fp, "#include \"identifier.h\"\n");
425 fprintf(fp, "#include \"id.h\"\n");
426 fprintf(fp, "#include \"mars.h\"\n");
427
428 for (unsigned i = 0; i < sizeof(msgtable) / sizeof(msgtable[0]); i++)
429 {
430 const char *id = msgtable[i].ident;
431 const char *p = msgtable[i].name;
432
433 if (!p)
434 p = id;
435 fprintf(fp,"Identifier *Id::%s;\n", id);
436 }
437
438 fprintf(fp, "void Id::initialize()\n");
439 fprintf(fp, "{\n");
440
441 for (unsigned i = 0; i < sizeof(msgtable) / sizeof(msgtable[0]); i++)
442 {
443 const char *id = msgtable[i].ident;
444 const char *p = msgtable[i].name;
445
446 if (!p)
447 p = id;
448 fprintf(fp," %s = Identifier::idPool(\"%s\");\n", id, p);
449 }
450
451 fprintf(fp, "}\n");
452
453 fclose(fp);
454 }
455
456 {
457 FILE *fp = fopen("id.d","wb");
458 if (!fp)
459 {
460 printf("can't open id.d\n");
461 exit(EXIT_FAILURE);
462 }
463
464 fprintf(fp, "// File generated by idgen.c\n");
465 fprintf(fp, "\n");
466 fprintf(fp, "module ddmd.id;\n");
467 fprintf(fp, "\n");
468 fprintf(fp, "import ddmd.identifier, ddmd.tokens;\n");
469 fprintf(fp, "\n");
470 fprintf(fp, "struct Id\n");
471 fprintf(fp, "{\n");
472
473 for (unsigned i = 0; i < sizeof(msgtable) / sizeof(msgtable[0]); i++)
474 {
475 const char *id = msgtable[i].ident;
476 const char *p = msgtable[i].name;
477
478 if (!p)
479 p = id;
480 fprintf(fp, " extern (C++) static __gshared Identifier %s;\n", id);
481 }
482
483 fprintf(fp, "\n");
484 fprintf(fp, " extern (C++) static void initialize()\n");
485 fprintf(fp, " {\n");
486
487 for (unsigned i = 0; i < sizeof(msgtable) / sizeof(msgtable[0]); i++)
488 {
489 const char *id = msgtable[i].ident;
490 const char *p = msgtable[i].name;
491
492 if (!p)
493 p = id;
494 fprintf(fp," %s = Identifier.idPool(\"%s\");\n", id, p);
495 }
496
497 fprintf(fp, " }\n");
498 fprintf(fp, "}\n");
499
500 fclose(fp);
501 }
502
503 return EXIT_SUCCESS;
504 }
505