|
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); } |
|---|