root/trunk/tools/tools/smart_import.d

Revision 838, 1.3 kB (checked in by FeepingCreature, 1 year ago)

Prevent infloop in modern gdc compilers

Line 
1 module tools.smart_import;
2
3 char[] import_treecon(char[] base, ref char[] i) {
4   auto start_i = i;
5   char[][] res; bool done;
6   char[] buffer;
7   int q;
8   while (i.length) {
9     if (i[0] == '[') {
10       i = i [1 .. $];
11       string y = i;
12       auto sup = import_treecon(base~buffer, y); buffer = "";
13       i = y;
14       char[] buf;
15       while (sup.length) {
16         if (sup[0] == ',') {
17           res ~= buf;
18           buf = "";
19         } else buf ~= sup[0];
20         sup = sup[1 .. $];
21       }
22       if (buf.length) res ~= buf;
23     } else {
24       if (i[0] == ',' || i[0] == ']') {
25         if (buffer.length) {
26           res ~= base~buffer;
27           buffer = "";
28         }
29       } else if (i[0] == ' ' || i[0] == '\r' || i[0] == '\n') {
30         // ignore whitespace
31       } else buffer ~= i[0];
32       if (i[0] == ']') {
33         i = i[1 .. $];
34         done = true;
35         break;
36       }
37       i = i[1 .. $];
38     }
39   }
40   if (done) {
41     string cc_res;
42     foreach (int k, char[] str; res) {
43       if (base.length) {
44         if (k) cc_res = cc_res ~ ", ";
45         cc_res = cc_res ~ str;
46       } else {
47         cc_res = cc_res ~ "import "~str~"; ";
48       }
49     }
50     return cc_res;
51   }
52   else assert(false, "Import tree [] pair unclosed: "~start_i~"!");
53 }
54
55 char[] expandImport(char[] i) { i = i~"]"; return import_treecon("", i); }
Note: See TracBrowser for help on using the browser.