blob: 46961ca61741f23736d3bfcad3606268b30e8dcc [file] [log] [blame]
Jack Palevichae54f1f2009-05-08 14:54:15 -07001/*
2 **
3 ** Copyright 2009, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 ** http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
Jack Palevich88311482009-05-08 13:57:37 -070017
Jack Palevichae54f1f2009-05-08 14:54:15 -070018/* Based upon the freeware version of the Obfuscated Tiny C Compiler
Jack Palevichd1605302009-05-08 15:26:24 -070019 * by Francis Bellard. <francis@bellard.org>.
Jack Palevichae54f1f2009-05-08 14:54:15 -070020 */
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25
Jack Palevich50791f52009-05-08 15:44:22 -070026static int d, z, C, h, K, q, G, W;
27static char* L;
28static char* P;
29static char* ac;
30static char* v;
31static char* D;
32static char* M;
33static char* R;
34static FILE* Q;
Jack Palevichae54f1f2009-05-08 14:54:15 -070035
Jack Palevich50791f52009-05-08 15:44:22 -070036static void ab (int j);
37static void w();
Jack Palevichae54f1f2009-05-08 14:54:15 -070038
Jack Palevich50791f52009-05-08 15:44:22 -070039static void addToSymbolTable(char e) {
40 *D++ = e;
Jack Palevich88311482009-05-08 13:57:37 -070041}
Jack Palevichae54f1f2009-05-08 14:54:15 -070042
Jack Palevich50791f52009-05-08 15:44:22 -070043static void next() {
Jack Palevichae54f1f2009-05-08 14:54:15 -070044 if (L) {
45 h = *(char*) L++;
46 if (h == 2) {
47 L = 0;
48 h = W;
49 }
50 } else
51 h = fgetc(Q);
Jack Palevich88311482009-05-08 13:57:37 -070052}
Jack Palevichae54f1f2009-05-08 14:54:15 -070053
Jack Palevich50791f52009-05-08 15:44:22 -070054static int X() {
55 return isalnum(h) || h == '_';
Jack Palevich88311482009-05-08 13:57:37 -070056}
Jack Palevichae54f1f2009-05-08 14:54:15 -070057
Jack Palevich50791f52009-05-08 15:44:22 -070058static void Y() {
Jack Palevichae54f1f2009-05-08 14:54:15 -070059 if (h == 92) {
Jack Palevich50791f52009-05-08 15:44:22 -070060 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -070061 if (h == 110)
62 h = 10;
63 }
Jack Palevich88311482009-05-08 13:57:37 -070064}
Jack Palevichae54f1f2009-05-08 14:54:15 -070065
Jack Palevich50791f52009-05-08 15:44:22 -070066static void ad() {
Jack Palevichae54f1f2009-05-08 14:54:15 -070067 int j, m;
68 while (isspace(h) | h == 35) {
69 if (h == 35) {
Jack Palevich50791f52009-05-08 15:44:22 -070070 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -070071 ad();
72 if (d == 536) {
73 ad();
Jack Palevich50791f52009-05-08 15:44:22 -070074 addToSymbolTable(32);
Jack Palevichae54f1f2009-05-08 14:54:15 -070075 *(int*) d = 1;
76 *(int*) (d + 4) = (int) D;
77 }
Jack Palevich50791f52009-05-08 15:44:22 -070078 while (h != '\n') {
79 addToSymbolTable(h);
80 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -070081 }
Jack Palevich50791f52009-05-08 15:44:22 -070082 addToSymbolTable(h);
83 addToSymbolTable(2);
Jack Palevichae54f1f2009-05-08 14:54:15 -070084 }
Jack Palevich50791f52009-05-08 15:44:22 -070085 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -070086 }
87 C = 0;
88 d = h;
89 if (X()) {
Jack Palevich50791f52009-05-08 15:44:22 -070090 addToSymbolTable(32);
Jack Palevichae54f1f2009-05-08 14:54:15 -070091 M = D;
92 while (X()) {
Jack Palevich50791f52009-05-08 15:44:22 -070093 addToSymbolTable(h);
94 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -070095 }
96 if (isdigit(d)) {
97 z = strtol(M, 0, 0);
98 d = 2;
99 } else {
100 *(char*) D = 32;
101 d = strstr(R, M - 1) - R;
102 *(char*) D = 0;
103 d = d * 8 + 256;
104 if (d > 536) {
Jack Palevichd1605302009-05-08 15:26:24 -0700105 d = ((int) P) + d;
Jack Palevichae54f1f2009-05-08 14:54:15 -0700106 if (*(int*) d == 1) {
Jack Palevich50791f52009-05-08 15:44:22 -0700107 L = (char*) (*(int*) (d + 4));
Jack Palevichae54f1f2009-05-08 14:54:15 -0700108 W = h;
Jack Palevich50791f52009-05-08 15:44:22 -0700109 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -0700110 ad();
111 }
112 }
113 }
114 } else {
Jack Palevich50791f52009-05-08 15:44:22 -0700115 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -0700116 if (d == 39) {
117 d = 2;
118 Y();
119 z = h;
Jack Palevich50791f52009-05-08 15:44:22 -0700120 next();
121 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -0700122 } else if (d == 47 & h == 42) {
Jack Palevich50791f52009-05-08 15:44:22 -0700123 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -0700124 while (h) {
125 while (h != 42)
Jack Palevich50791f52009-05-08 15:44:22 -0700126 next();
127 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -0700128 if (h == 47)
129 h = 0;
130 }
Jack Palevich50791f52009-05-08 15:44:22 -0700131 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -0700132 ad();
133 } else {
134 char* e = "++#m--%am*@R<^1c/@%[_[H3c%@%[_[H3c+@.B#d-@%:_^BKd<<Z/03e>>`/03e<=0f>=/f<@.f>@1f==&g!='g&&k||#l&@.BCh^@.BSi|@.B+j~@/%Yd!@&d*@b";
135 while (j = *(char*) e++) {
136 m = *(char*) e++;
137 z = 0;
138 while ((C = *(char*) e++ - 98) < 0)
139 z = z * 64 + C + 64;
140 if (j == d & (m == h | m == 64)) {
141 if (m == h) {
Jack Palevich50791f52009-05-08 15:44:22 -0700142 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -0700143 d = 1;
144 }
145 break;
146 }
147 }
148 }
149 }
Jack Palevich88311482009-05-08 13:57:37 -0700150}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700151
Jack Palevich50791f52009-05-08 15:44:22 -0700152static void ae( g) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700153 while( g&&g!=-1) {
154 *(char*) q++=g;
155 g=g>>8;
156 }
Jack Palevich88311482009-05-08 13:57:37 -0700157}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700158
Jack Palevich50791f52009-05-08 15:44:22 -0700159static void A(e) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700160 int g;
161 while( e) {
162 g=*(int*) e;
163 *(int*) e=q-e-4;
164 e=g;
165 }
Jack Palevich88311482009-05-08 13:57:37 -0700166}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700167
Jack Palevich50791f52009-05-08 15:44:22 -0700168static int s( g, e) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700169 ae(g);
170 *(int*) q = e;
171 e = q;
172 q = q + 4;
173 return e;
Jack Palevich88311482009-05-08 13:57:37 -0700174}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700175
Jack Palevich50791f52009-05-08 15:44:22 -0700176static int H(e) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700177 s(184,e);
Jack Palevich88311482009-05-08 13:57:37 -0700178}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700179
Jack Palevich50791f52009-05-08 15:44:22 -0700180static int B(e) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700181 return s(233,e);
Jack Palevich88311482009-05-08 13:57:37 -0700182}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700183
Jack Palevich50791f52009-05-08 15:44:22 -0700184static int S( j, e) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700185 ae(1032325);
186 return s(132 + j, e);
Jack Palevich88311482009-05-08 13:57:37 -0700187}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700188
Jack Palevich50791f52009-05-08 15:44:22 -0700189static void Z(e) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700190 ae( 49465);
191 H(0);
192 ae( 15);
193 ae( e+144);
194 ae( 192);
Jack Palevich88311482009-05-08 13:57:37 -0700195}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700196
Jack Palevich50791f52009-05-08 15:44:22 -0700197static void N( j, e) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700198 ae(j + 131);
199 s((e < 512) << 7 | 5, e);
Jack Palevich88311482009-05-08 13:57:37 -0700200}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700201
Jack Palevich50791f52009-05-08 15:44:22 -0700202static void T (j) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700203 int g,e,m,aa;
204 g=1;
205 if( d == 34) {
206 H(v);
207 while( h!=34) {
208 Y ();
209 *(char*) v++=h;
Jack Palevich50791f52009-05-08 15:44:22 -0700210 next ();
Jack Palevichae54f1f2009-05-08 14:54:15 -0700211 }
212 *(char*) v=0;
213 v= (char*) (((int)v) +4&-4);
Jack Palevich50791f52009-05-08 15:44:22 -0700214 next ();
Jack Palevichae54f1f2009-05-08 14:54:15 -0700215 ad();
216 }
217 else {
218 aa=C;
219 m= z;
220 e=d;
221 ad();
222 if( e == 2) {
223 H(m);
224 }
225 else if( aa == 2) {
226 T(0);
227 s(185,0);
228 if( e == 33)Z(m);
229 else ae( m);
230 }
231 else if( e == 40) {
232 w ();
233 ad();
234 }
235 else if( e == 42) {
236 ad();
237 e=d;
238 ad();
239 ad();
240 if( d == 42) {
241 ad();
242 ad();
243 ad();
244 ad();
245 e=0;
246 }
247 ad();
248 T(0);
249 if( d == 61) {
250 ad();
251 ae( 80);
252 w ();
253 ae( 89);
254 ae( 392+(e == 256));
255 }
256 else if( e) {
257 if( e == 256)ae( 139);
258 else ae( 48655);
259 q++;
260 }
261 }
262 else if( e == 38) {
263 N(10,*(int*) d);
264 ad();
265 }
266 else {
267 g=*(int*) e;
268 if(!g)g=dlsym(0,M);
269 if( d == 61&j) {
270 ad();
271 w ();
272 N(6,g);
273 }
274 else if( d!= 40) {
275 N(8,g);
276 if( C == 11) {
277 N(0,g);
278 ae( z);
279 ad();
280 }
281 }
282 }
283 }
284 if( d == 40) {
285 if( g == 1)ae( 80);
286 m= s(60545,0);
287 ad();
288 j=0;
289 while( d!= 41) {
290 w ();
291 s(2393225,j);
292 if( d == 44)ad();
293 j=j +4;
294 }
295 *(int*) m= j;
296 ad();
297 if(!g) {
298 e=e +4;
299 *(int*) e=s(232,*(int*) e);
300 }
301 else if( g == 1) {
302 s(2397439,j);
303 j=j +4;
304 }
305 else {
306 s(232,g-q-5);
307 }
308 if( j)s(50305,j);
309 }
Jack Palevich88311482009-05-08 13:57:37 -0700310}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700311
Jack Palevich50791f52009-05-08 15:44:22 -0700312static void O (j) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700313 int e,g,m;
314 if( j--== 1)T(1);
315 else {
316 O (j);
317 m= 0;
318 while( j == C) {
319 g=d;
320 e=z;
321 ad();
322 if( j>8) {
323 m= S(e,m);
324 O (j);
325 }
326 else {
327 ae( 80);
328 O (j);
329 ae( 89);
330 if( j == 4|j == 5) {
331 Z(e);
332 }
333 else {
334 ae( e);
335 if( g == 37)ae( 146);
336 }
337 }
338 }
339 if( m&&j>8) {
340 m= S(e,m);
341 H(e^1);
342 B(5);
343 A(m);
344 H(e);
345 }
346 }
Jack Palevich88311482009-05-08 13:57:37 -0700347}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700348
Jack Palevich50791f52009-05-08 15:44:22 -0700349static void w() {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700350 O(11);
Jack Palevich88311482009-05-08 13:57:37 -0700351}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700352
Jack Palevich50791f52009-05-08 15:44:22 -0700353static int U() {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700354 w();
355 return S(0, 0);
Jack Palevich88311482009-05-08 13:57:37 -0700356}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700357
Jack Palevich50791f52009-05-08 15:44:22 -0700358static void I (j) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700359 int m,g,e;
360 if( d == 288) {
361 ad();
362 ad();
363 m= U ();
364 ad();
365 I (j);
366 if( d == 312) {
367 ad();
368 g=B(0);
369 A(m);
370 I (j);
371 A(g);
372 }
373 else {
374 A(m);
375 }
376 }
377 else if( d == 352|d == 504) {
378 e=d;
379 ad();
380 ad();
381 if( e == 352) {
382 g=q;
383 m= U ();
384 }
385 else {
386 if( d!= 59)w ();
387 ad();
388 g=q;
389 m= 0;
390 if( d!= 59)m= U ();
391 ad();
392 if( d!= 41) {
393 e=B(0);
394 w ();
395 B(g-q-5);
396 A(e);
397 g=e +4;
398 }
399 }
400 ad();
401 I(&m);
402 B(g-q-5);
403 A(m);
404 }
405 else if( d == 123) {
406 ad();
407 ab(1);
408 while( d!= 125)I (j);
409 ad();
410 }
411 else {
412 if( d == 448) {
413 ad();
414 if( d!= 59)w ();
415 K=B(K);
416 }
417 else if( d == 400) {
418 ad();
419 *(int*) j=B(*(int*) j);
420 }
421 else if( d!= 59)w ();
422 ad();
423 }
Jack Palevich88311482009-05-08 13:57:37 -0700424}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700425
Jack Palevich50791f52009-05-08 15:44:22 -0700426static void ab (int j) {
Jack Palevichae54f1f2009-05-08 14:54:15 -0700427 int m;
428 while( d == 256 | d != -1 & !j ) {
429 if( d == 256) {
430 ad();
431 while( d!= 59) {
432 if( j ) {
433 G=G +4;
434 *(int*) d=-G;
435 }
436 else {
437 *(char**) d = v;
438 v=v +4;
439 }
440 ad();
441 if( d == 44)ad();
442 }
443 ad();
444 }
445 else {
446 A(*(int*)(d +4));
447 *(int*) d=q;
448 ad();
449 ad();
450 m= 8;
451 while( d!= 41) {
452 *(int*) d=m;
453 m= m +4;
454 ad();
455 if( d == 44)ad();
456 }
457 ad();
458 K=G=0;
459 ae( 15042901);
460 m= s(60545,0);
461 I(0);
462 A(K);
463 ae( 50121);
464 *(int*) m= G;
465 }
466 }
Jack Palevich88311482009-05-08 13:57:37 -0700467}
Jack Palevichae54f1f2009-05-08 14:54:15 -0700468
469int main( int argc, char** argv) {
470 Q = stdin;
471 if (argc-- > 1) {
472 char* file = argv[1];
473 argv += 1;
474 Q = fopen(file, "r");
475 if (Q == NULL) {
476 fprintf(stderr, "Could not open file \"%s\"\n", file);
477 return -1;
478 }
479 }
480 D = strcpy(R = calloc(1, 99999),
481 " int if else while break return for define main ") + 48;
482 v = calloc(1, 99999);
Jack Palevichd1605302009-05-08 15:26:24 -0700483 ac = calloc(1, 99999);
484 q = (int) ac;
Jack Palevichae54f1f2009-05-08 14:54:15 -0700485 P = calloc(1, 99999);
Jack Palevich50791f52009-05-08 15:44:22 -0700486 next();
Jack Palevichae54f1f2009-05-08 14:54:15 -0700487 ad();
488 ab(0);
489#if 1
490 fwrite(R, 1, 99999, stdout);
491 fwrite(ac, 1, 99999, stdout);
492 fwrite(P, 1, 99999, stdout);
493 return 0;
494#else
495 return (*(int(*)()) *(int*) (P + 592))(argc, argv);
496#endif
Jack Palevich88311482009-05-08 13:57:37 -0700497}
498