]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/NameMangling.java
(refs #7250) Merging master, minor CHR bugfixes
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / utils / NameMangling.java
1 package org.simantics.scl.compiler.internal.codegen.utils;
2
3 public class NameMangling {
4
5     private static final boolean[] NORMAL_CHAR = new boolean[128];
6     private static final char[] REWRITE_CHAR = new char[128];
7     private static final char[] INVERSE_REWRITE_CHAR = new char[128];
8     private static final char ESCAPE_CHAR = (char)164;
9     
10     static {
11         for(char c='a';c<='z';++c)
12             NORMAL_CHAR[c] = true;
13         for(char c='A';c<='Z';++c)
14             NORMAL_CHAR[c] = true;
15         for(char c='0';c<='9';++c)
16             NORMAL_CHAR[c] = true;
17         NORMAL_CHAR['_'] = true;
18         NORMAL_CHAR['-'] = true;
19         NORMAL_CHAR['|'] = true;
20         NORMAL_CHAR['+'] = true;
21         NORMAL_CHAR['?'] = true;
22         NORMAL_CHAR['*'] = true;
23         NORMAL_CHAR['!'] = true;
24         NORMAL_CHAR['@'] = true;
25         NORMAL_CHAR[':'] = true;
26         NORMAL_CHAR['$'] = true;        
27         NORMAL_CHAR['&'] = true;
28         NORMAL_CHAR['%'] = true;
29         NORMAL_CHAR['='] = true;
30         NORMAL_CHAR['#'] = true;
31         
32         REWRITE_CHAR['/'] = 'd';
33         REWRITE_CHAR['>'] = 'g';
34         REWRITE_CHAR['<'] = 'l';
35         REWRITE_CHAR['.'] = 'p';
36         REWRITE_CHAR[';'] = 's';
37         
38         for(char c=0;c<128;++c) {
39             char r = REWRITE_CHAR[c];
40             if(r != 0)
41                 INVERSE_REWRITE_CHAR[r] = c;
42         }
43             
44     }
45     
46     public static String mangle(String name) {
47         int length = name.length();
48         for(int i=0;i<length;++i) {
49             char c = name.charAt(i);
50             if(c >= 128 || !NORMAL_CHAR[c]) {
51                 StringBuilder b = new StringBuilder(name.substring(0, i));
52                 boolean normalMode = true;
53                 for(;i<length;++i) {
54                     c = name.charAt(i);
55                     if(c < 128 && NORMAL_CHAR[c]) {
56                         if(!normalMode) {
57                             b.append(ESCAPE_CHAR);
58                             normalMode = true;
59                         }
60                         b.append(c);
61                     }
62                     else {
63                         if(normalMode) {
64                             b.append(ESCAPE_CHAR);
65                             normalMode = false;
66                         }
67                         char r = c < 128 ? REWRITE_CHAR[c] : 0;
68                         if(r == 0) {
69                             b.append((int)c);
70                             b.append(ESCAPE_CHAR);
71                         }
72                         else {
73                             b.append(r);
74                         }
75                     }
76                 }
77                 return b.toString();
78             }
79         }
80         return name;
81     }
82     
83     public static String demangle(String name) {
84         int length = name.length();
85         for(int i=0;i<length;++i) {
86             char c = name.charAt(i);
87             if(c == ESCAPE_CHAR) {
88                 StringBuilder b = new StringBuilder(name.substring(0, i));
89                 boolean normalMode = false;
90                 for(++i;i<length;++i) {
91                     c = name.charAt(i);
92                     if(c == ESCAPE_CHAR)
93                         normalMode = !normalMode;
94                     else if(normalMode)
95                         b.append(c);
96                     else {
97                         if(c >= '0' && c <= '9') {
98                             int l = name.substring(i).indexOf(ESCAPE_CHAR);
99                             char r = (char)Integer.parseInt(name.substring(i, i+l));
100                             i+=l;
101                             b.append(r);
102                         }
103                         else
104                             b.append(INVERSE_REWRITE_CHAR[c]);
105                     }
106                 }
107                 return b.toString();
108             }
109         }
110         return name;
111     }
112     
113     public static void test(String name) {
114         String name2 = mangle(name);
115         String name3 = demangle(name2);
116         System.out.println(name + " -> " + name2 + " -> " + name3);
117     }
118     
119     public static void main(String[] args) {
120         test("hello");
121         test("hello_world");
122         test("++");
123         test("$");
124         test("{}");
125         test("<");
126         test("<=");
127         test(">");
128         test(">=");
129         
130         for(int i=28;i<256;++i) {
131             if(Character.isJavaIdentifierStart(i))
132                 System.out.print(new String(Character.toChars(i)) + "(" + i + ")");
133         }
134         System.out.println();
135         System.out.println("----------------------------------------------------");
136         for(int i=28;i<256;++i) {
137             if(Character.isJavaIdentifierPart(i))
138                 System.out.print(new String(Character.toChars(i)) + "(" + i + ")");
139         }
140         System.out.println();
141     }
142     
143 }