Skip to content

Instantly share code, notes, and snippets.

@Tpaefawzen
Last active March 7, 2026 10:14
Show Gist options
  • Select an option

  • Save Tpaefawzen/a78400763245c2f916d1bda9b6278b92 to your computer and use it in GitHub Desktop.

Select an option

Save Tpaefawzen/a78400763245c2f916d1bda9b6278b92 to your computer and use it in GitHub Desktop.
Partly Deobfuscated IOCCC 2019/lynn: Compiler and Runtime for Haskell Subset
%.c: %.hs
( ../prog < $<; cat ../prog.c) > $@ || (rm $@; false)
#define x 0 /**/
//! Usage:
//! (prog < file.hs; cat prog.c) > file.c
//! $CC -o file file.c && ./file
#include <stdio.h>
typedef unsigned int u32;
enum { L = 1 << 26 };
// ## Virtual machine
typedef enum OutputMode {
OutputMode_Numeric,
OutputMode_Byte,
} OutputMode;
typedef struct Runtime {
u32 *mem;
u32 *ip;
u32 sp;
OutputMode o_mode;
} Runtime;
static Runtime vm;
// ## Memory operation for virtual machine
/// Get argument for the instruction
static u32 w(u32 idx) {
return vm.mem[vm.ip[idx] + 1];
}
/// Indirect load
static u32 U(u32 idx) {
return vm.mem[w(idx) + 1];
}
/// Push an application
/// Lowercase el
static u32 l(u32 arg0, u32 arg1) {
vm.mem[vm.sp++] = arg0;
vm.mem[vm.sp++] = arg1;
return vm.sp - 2;
}
/// Load and apply and push
static u32 G(u32 arg0, u32 arg1) {
return l(w(arg0), w(arg1));
}
// ## Instructions (Operations) for virtual machine
/// 0th: load, or, apply, primitive
/// prim_val is in 18, 19, 20, 21, 22, 23.
static void O(u32 prim_val) {
u32 *D = vm.mem + vm.ip[2];
*D = w(2);
*++D = l(w(1), prim_val - 8);
vm.ip += 2;
}
/// 1st
static void b(void) {
u32 *D = vm.mem + vm.ip[2];
*D = w(2);
*++D = vm.ip[1];
vm.ip += 2;
}
/// 2nd
static void f(void) {
u32 *D = vm.mem + vm.ip[3];
*D = G(1, 3);
*++D = G(2, 3);
vm.ip += 3;
}
/// 3rd
static void u(void) {
u32 *D = vm.mem + vm.ip[3];
*D = G(1, 3);
*++D = w(2);
vm.ip += 3;
}
/// 4th
static void s(void) {
u32 *D = vm.mem + vm.ip[3];
*D = G(2, 3);
*++D = w(1);
vm.ip += 3;
}
/// 5th
static void c(void) {
u32 *D = vm.mem + vm.ip[3];
*D = w(1);
*++D = G(2, 3);
vm.ip += 3;
}
/// 6th
static void a(void) {
u32 *D = vm.mem + vm.ip[2];
*D = w(2);
*++D = w(1);
vm.ip += 2;
}
/// 7th: read a byte
static void t(void) {
u32 *D = vm.mem + vm.ip[1];
*D = 9;
int S;
// Doing either pushing empty list or concatenation of something?
*++D = (S = getchar()) < 0 ? 8 : l(l(17, l(1, S)), l(7, 0));
vm.ip += 1;
}
/// 8th: (:)?
static void e(void) {
u32 *D = vm.mem + vm.ip[2];
*D = 9;
*++D = w(1);
vm.ip += 2;
}
/// 9th
static void d(void) {
u32 *D = vm.mem + vm.ip[2];
*D = w(1);
*++D = w(2);
vm.ip += 2;
}
/// 10th: (<=)
static void _(void) {
u32 *D = vm.mem + vm.ip[2];
*D = 9;
*++D = U(1) > U(2) ? l(8, 9) : 8;
vm.ip += 2;
}
/// 11th: multvm.iple
static void p(void) {
u32 *D = vm.mem + vm.ip[2];
*D = 1;
*++D = U(1) * U(2);
vm.ip += 2;
}
/// 12th: add
static void r(void) {
u32 *D = vm.mem + vm.ip[2];
*D = 1;
*++D = U(1) + U(2);
vm.ip += 2;
}
/// 13th: subtract
static void o(void) {
u32 *D = vm.mem + vm.ip[2];
*D = 1;
*++D = U(1) - U(2);
vm.ip += 2;
}
/// 14th: divide
static void g(void) {
u32 *D = vm.mem + vm.ip[2];
*D = 1;
*++D = U(1) / U(2);
vm.ip += 2;
}
/// 15th: output: (:)
static void R(void) {
u32 *D = vm.mem + vm.ip[2];
*D = l(w(2), printf(vm.o_mode == OutputMode_Byte ? "%c" : "%u,", U(1)));
*++D = l(23, 9);
vm.ip += 2;
}
/// 16th
static void A(void) {
u32 *D = vm.mem + vm.ip[1];
*D = w(1);
*++D = vm.ip[1];
vm.ip += 1;
}
/// 17th
static void m(void) {
u32 *D = vm.mem + vm.ip[4];
*D = G(4, 1);
*++D = w(2);
vm.ip += 4;
}
/// ==0: halt.
static int Runtime_step(void) {
static void (*cmds[])() = {O, b, f, u, s, c, a, t, e,
d, _, p, r, o, g, R, A, m};
u32 op_val = *vm.ip;
if (op_val == 0) {
return 0;
} else if (op_val < 18) {
cmds[op_val]();
} else if (op_val < 24) {
O(op_val);
} else {
*--vm.ip = vm.mem[op_val];
}
return 1;
}
/// In base85.
static char literal_y[] = "33Yb59@&iBFApt;[[h3V19\\3<:4cJ!U 2eT18pC,Qqik4J:sh?HUXMrR(-l0R\"!eKZcI!@E(@B,C/*!aogn5LbK/e=2CmReb+6,]kD!iOC9DEOC9Dc1EV6976c?&s)Be;P;E^tl2eUYkg*#Yf:6^d[Mg_P;VGCr823^L_<X+j2,%nD20Ls lmpi&I(*hV=+p aTO`r.b1<i[/R\\t1,KBt)\\%;\\@27H>^#d6B!tb-on27d%i_OS5(W5eV-=M14kYO);Fe7k!N41<iX*T,kHW,&)_l&L)'0:Jj%j7^h+JU /9pZn&Td:&T%'TE<7>LW%m/R\\rON3-=G]^akjT778YCJ7B8e-5E#RX R=Ig8#/pDdAI;=a[ ISbp't+ZLJ;lUO71C)b5[Y)qTWmFJ)G1ehmS<.`n3RnE IG+G_A`CE=?hZU)bScgt7R3GNs+V(HQLL_R)n4;]#cUR.p>5!^4T3pQg^o//WLATCE18mSUme[Q<53e:')Q_%<L$1lKOnFD(R3%*jj85VW+#8Wt*Ud,1D7AKcdh<9r%igC$2</HD7X$K_0Rr/>L.*D2%;[0B+#8UANT1.tSd/^@L$&a6^g@jYNMC7O<rPWO5AfA;C'9WnLn9E:0d:R\\hAZ^m=/09d.R$Jd%:Gp hB-g4&N!VO)$;iED1:F`^`UrnWCSZ!L$Tdma!_hn7H0F$^MT(-Ln9F_Ljfp9*h8Er!<.g.h_7@b0l03?a+]`=dIoY>WCKOk&#[9FCQ#WFoga(tK<[PG6@5k2KY\\ oW':M;e//kd\"[l,_V?UlZ,m(Hh?O81mhM!G18 ]7m?X7e^[7EZYj[;kR,YXD\\X,!k6.HF8Z(V^^nBYea^NIL:]lG0(/\\Ik<m`>jPam;F-A,(tVN+bG@<L'J 1D8dE*hN87:TsccSKVE7KP+k8^5qZIkJG_fH_$MS--5(!*St/1:b+g8("
"/*";
/// Commands to indicate what encoding to use for each retrieved bytes or something from literal_y
static char literal_n[] = {
[0] = ' ', [1] = '$', [2] = '6', [3] = 'I', [4] = '7',
[5] = 'H', [6] = '#', [7] = 'v', [8] = ' ', [9] = 'J',
[10] = 'w', [11] = '\t', [12] = '{', [13] = '\v', [14] = '}',
[15] = '\f', [16] = ';', [17] = '\t', [18] = ' ', [19] = '\v',
[20] = ' ', [21] = '}', [22] = '\f', [23] = ' ', [24] = '}',
[25] = '\f', [26] = ' ', [27] = '\f', [28] = ' ', [29] = '\f',
[30] = ' ', [31] = '\v', [32] = ' ', [33] = '}', [34] = '\f',
[35] = ' ', [36] = '\v', [37] = '\t', [38] = ' ', [39] = '}',
[40] = ' ', [41] = '}', [42] = '\t', [43] = ' ', [44] = ';',
[45] = '\f', [46] = ' ', [47] = '}', [48] = '\f', [49] = ' ',
[50] = '\f', [51] = '\t', [52] = ' ', [53] = '{', [54] = '\f',
[55] = '\v', [56] = ' ', [57] = '}', [58] = ' ', [59] = '\f',
[60] = '\t', [61] = ' ', [62] = '}', [63] = '\f', [64] = ' ',
[65] = ';', [66] = '\t', [67] = ' ', [68] = '\f', [69] = '\f',
[70] = ' ', [71] = '\t', [72] = '\t', [73] = ' ', [74] = '{',
[75] = '\f', [76] = ' ', [77] = '{', [78] = '\v', [79] = '\v',
[80] = ' ', [81] = '\t', [82] = ' ', [83] = '\v', [84] = '\v',
[85] = '\v', [86] = ' ', [87] = '\f', [88] = ' ', [89] = '}',
[90] = '\v', [91] = '\v', [92] = ' ', [93] = '}', [94] = ' ',
[95] = '}', [96] = '\v', [97] = '\v', [98] = ' ', [99] = '\f',
[100] = '\v', [101] = '\v', [102] = ' ', [103] = '\f', [104] = '\v',
[105] = '\v', [106] = ' ', [107] = ';', [108] = '\v', [109] = '\v',
[110] = ' ', [111] = '\v', [112] = ' ', [113] = ';', [114] = '\v',
[115] = '\v', [116] = ' ', [117] = '\t', [118] = '\v', [119] = '\v',
[120] = ' ', [121] = '}', [122] = '\v', [123] = '\v', [124] = ' ',
[125] = '\v', [126] = '\t', [127] = ' ', [128] = ';', [129] = '\v',
[130] = '\v', [131] = ' ', [132] = '\t', [133] = '\v', [134] = '\v',
[135] = ' ', [136] = '}', [137] = '\v', [138] = '\v', [139] = ' ',
[140] = '}', [141] = '\v', [142] = '\v', [143] = ' ', [144] = ';',
[145] = '\f', [146] = ' ', [147] = '}', [148] = '\t', [149] = ' ',
[150] = '}', [151] = '\t', [152] = ' ', [153] = '}', [154] = '\v',
[155] = '\v', [156] = ' ', [157] = ';', [158] = '\f', [159] = ' ',
[160] = '}', [161] = '\t', [162] = ' ', [163] = '\f', [164] = '\f',
[165] = ' ', [166] = '\v', [167] = '\t', [168] = ' ', [169] = '\f',
[170] = '\f', [171] = ' ', [172] = '\t', [173] = '\v', [174] = '\v',
[175] = ' ', [176] = '}', [177] = '\v', [178] = '\v', [179] = ' ',
[180] = ';', [181] = '\v', [182] = '\v', [183] = ' ', [184] = '\t',
[185] = '\v', [186] = '\v', [187] = ' ', [188] = '}', [189] = '\v',
[190] = '\v', [191] = ' ', [192] = '{', [193] = '\t', [194] = ' ',
[195] = '\f', [196] = '\f', [197] = ' ', [198] = '\f', [199] = '\v',
[200] = '\v', [201] = ' ', [202] = '\t', [203] = '\v', [204] = '\v',
[205] = ' ', [206] = '}', [207] = '\t', [208] = ' ', [209] = ';',
[210] = '\f', [211] = ' ', [212] = '}', [213] = '\f', [214] = ' ',
[215] = '}', [216] = '\v', [217] = '\v', [218] = ' ', [219] = '\t',
[220] = '\v', [221] = '\v', [222] = ' ', [223] = ';', [224] = ' ',
[225] = '\f', [226] = '\f', [227] = ' ', [228] = ';', [229] = '\f',
[230] = ' ', [231] = '}', [232] = '\f', [233] = ' ', [234] = '\t',
[235] = '\f', [236] = ' ', [237] = '}', [238] = '\f', [239] = ' ',
[240] = ';', [241] = '\v', [242] = '\v', [243] = ' ', [244] = '\f',
[245] = '\v', [246] = '\v', [247] = ' ', [248] = '{', [249] = '\t',
[250] = ' ', [251] = '}', [252] = '\f', [253] = ' ', [254] = '\f',
[255] = '\v', [256] = '\v', [257] = ' ', [258] = '\v', [259] = ' ',
[260] = '{', [261] = '\f', [262] = '\v', [263] = ' ', [264] = '}',
[265] = '\v', [266] = '\v', [267] = ' ', [268] = ';', [269] = '\v',
[270] = '\v', [271] = ' ', [272] = '}', [273] = '\f', [274] = ' ',
[275] = '{', [276] = '\f', [277] = '\v', [278] = ' ', [279] = ';',
[280] = '\t', [281] = ' ', [282] = '{', [283] = '\f', [284] = '\v',
[285] = ' ', [286] = '\f', [287] = '\v', [288] = '\v', [289] = ' ',
[290] = ';', [291] = '\t', [292] = ' ', [293] = '{', [294] = '\f',
[295] = '\v', [296] = ' ', [297] = '\f', [298] = '\t', [299] = ' ',
[300] = '}', [301] = '\f', [302] = ' ', [303] = '\v', [304] = ' ',
[305] = ';', [306] = '\v', [307] = '\v', [308] = ' ', [309] = ';',
[310] = '\v', [311] = '\v', [312] = ' ', [313] = ';', [314] = '\t',
[315] = '\v', [316] = ' ', [317] = '{', [318] = '\v', [319] = '\v',
[320] = ' ', [321] = '{', [322] = '\f', [323] = '\v', [324] = ' ',
[325] = '}', [326] = '\f', [327] = '\v', [328] = ' ', [329] = '}',
[330] = '\v', [331] = '\v', [332] = ' ', [333] = '\t', [334] = '\f',
[335] = '\v', [336] = ' ', [337] = ';', [338] = '\v', [339] = '\v',
[340] = ' ', [341] = '\t', [342] = '\v', [343] = '\v', [344] = ' ',
[345] = ';', [346] = '\v', [347] = '\v', [348] = ' ', [349] = '{',
[350] = '\f', [351] = '\v', [352] = ' ', [353] = '\t', [354] = '\v',
[355] = '\v', [356] = ' ', [357] = '}', [358] = ' ', [359] = '\f',
[360] = '\v', [361] = '\v', [362] = ' ', [363] = '\f', [364] = '\f',
[365] = '\v', [366] = ' ', [367] = '{', [368] = '\v', [369] = '}',
[370] = ' ', [371] = '\f', [372] = '\v', [373] = '\v', [374] = ' ',
[375] = '}', [376] = '\v', [377] = '\v', [378] = ' ', [379] = '\v',
[380] = '\v', [381] = '}', [382] = ' ', [383] = '}', [384] = '\f',
[385] = ' ', [386] = '\f', [387] = '\f', [388] = ' ', [389] = '{',
[390] = '\t', [391] = '\v', [392] = ' ', [393] = ';', [394] = '\f',
[395] = ' ', [396] = '\f', [397] = '\f', [398] = ' ', [399] = '\v',
[400] = ' ', [401] = '{', [402] = '\t', [403] = ' ', [404] = '\f',
[405] = '\f', [406] = ' ', [407] = '\t', [408] = '\f', [409] = ' ',
[410] = ';', [411] = '\f', [412] = ' ', [413] = '}', [414] = ' ',
[415] = '{', [416] = '\t', [417] = ' ', [418] = '\t', [419] = '\f',
[420] = ' ', [421] = '}', [422] = ' ', [423] = '}', [424] = '\f',
[425] = ' ', [426] = '\v', [427] = '\f', [428] = '}', [429] = ' ',
[430] = '}', [431] = '\t', [432] = ' ', [433] = '\f', [434] = ' ',
[435] = '\f', [436] = ' ', [437] = '\f', [438] = '\f', [439] = ' ',
[440] = ';', [441] = '\v', [442] = '}', [443] = ' ', [444] = ';',
[445] = '\t', [446] = ' ', [447] = '\f', [448] = '\t', [449] = ' ',
[450] = '}', [451] = '\f', [452] = ' ', [453] = '}', [454] = '\t',
[455] = ' ', [456] = '}', [457] = '\t', [458] = '\v', [459] = ' ',
[460] = '\f', [461] = '\v', [462] = '}', [463] = ' ', [464] = '}',
[465] = '\f', [466] = '}', [467] = ' ', [468] = '}', [469] = '\f',
[470] = ' ', [471] = '\v', [472] = '\f', [473] = '}', [474] = ' ',
[475] = '\f', [476] = '\t', [477] = ' ', [478] = '}', [479] = '\t',
[480] = ' ', [481] = '{', [482] = '\f', [483] = '}', [484] = ' ',
[485] = ' ', [486] = ':', [487] = '!', [488] = '#', [489] = '$',
[490] = '%', [491] = '&', [492] = '*', [493] = '+', [494] = '.',
[495] = '/', [496] = '<', [497] = '=', [498] = '>', [499] = '?',
[500] = '@', [501] = '\\', [502] = '^', [503] = '|', [504] = '-',
[505] = '~', [506] = '\t', [507] = '\t', [508] = '\t', [509] = ' ',
[510] = '\v', [511] = '\v', [512] = '\v', [513] = ' ', [514] = '\f',
[515] = '\t', [516] = ' ', [517] = ' ', [518] = ' ', [519] = '\n',
[520] = '\t', [521] = '\v', [522] = '\f', [523] = '}', [524] = ' ',
[525] = '{', [526] = '\v', [527] = '\v', [528] = ' ', [529] = '{',
[530] = '\v', [531] = '\v', [532] = ' ', [533] = '\f', [534] = '\f',
[535] = ' ', [536] = '}', [537] = '\f', [538] = ' ', [539] = ' ',
[540] = '-', [541] = '-', [542] = '\t', [543] = '\t', [544] = '\t',
[545] = ' ', [546] = '\f', [547] = '\t', [548] = ' ', [549] = ';',
[550] = '\f', [551] = '}', [552] = ' ', [553] = ';', [554] = '\f',
[555] = ' ', [556] = '\v', [557] = '\t', [558] = ' ', [559] = ';',
[560] = '\f', [561] = ' ', [562] = '}', [563] = '\f', [564] = ' ',
[565] = '\v', [566] = '\t', [567] = ' ', [568] = '}', [569] = '\f',
[570] = ' ', [571] = '\f', [572] = '\t', [573] = ' ', [574] = '\v',
[575] = '\f', [576] = '\v', [577] = ' ', [578] = ';', [579] = '\v',
[580] = '\v', [581] = ' ', [582] = '{', [583] = '\f', [584] = '\v',
[585] = ' ', [586] = '{', [587] = '\f', [588] = '\v', [589] = ' ',
[590] = '\v', [591] = '\f', [592] = '\v', [593] = ' ', [594] = '}',
[595] = ' ', [596] = '}', [597] = '\v', [598] = '\v', [599] = ' ',
[600] = '\f', [601] = '\v', [602] = '\v', [603] = ' ', [604] = '}',
[605] = '\f', [606] = ' ', [607] = '{', [608] = '\f', [609] = '\v',
[610] = ' ', [611] = '\v', [612] = '\f', [613] = '}', [614] = ' ',
[615] = '\t', [616] = '\v', [617] = '\v', [618] = ' ', [619] = ';',
[620] = '\v', [621] = '\v', [622] = ' ', [623] = '\t', [624] = '\t',
[625] = ' ', [626] = '}', [627] = '\v', [628] = '\t', [629] = ' ',
[630] = '\t', [631] = '\v', [632] = '\v', [633] = ' ', [634] = '\v',
[635] = '\v', [636] = '\v', [637] = ' ', [638] = ' ', [639] = '\\',
[640] = '\'', [641] = '"', [642] = '\t', [643] = '\t', [644] = '\f',
[645] = '}', [646] = ' ', [647] = '{', [648] = '\f', [649] = '\v',
[650] = ' ', [651] = ';', [652] = '\f', [653] = ' ', [654] = '\t',
[655] = '\t', [656] = ' ', [657] = '}', [658] = '\v', [659] = '{',
[660] = '\f', [661] = ' ', [662] = '\v', [663] = '\v', [664] = '\v',
[665] = ' ', [666] = '}', [667] = '\t', [668] = '}', [669] = ' ',
[670] = '}', [671] = '\v', [672] = '\v', [673] = ' ', [674] = '\v',
[675] = '\v', [676] = '\v', [677] = ' ', [678] = '\t', [679] = '\f',
[680] = '}', [681] = ' ', [682] = ';', [683] = '\v', [684] = '\f',
[685] = ' ', [686] = '\v', [687] = '\f', [688] = '}', [689] = ' ',
[690] = '}', [691] = '\f', [692] = '}', [693] = ' ', [694] = '\f',
[695] = '\f', [696] = '\v', [697] = ' ', [698] = '\f', [699] = '\v',
[700] = '\f', [701] = ' ', [702] = '}', [703] = '\f', [704] = '}',
[705] = ' ', [706] = '}', [707] = '\f', [708] = ' ', [709] = ' ',
[710] = ':', [711] = '\t', [712] = '\f', [713] = '\v', [714] = '}',
[715] = ' ', [716] = '\v', [717] = '\t', [718] = ' ', [719] = '\v',
[720] = '\v', [721] = '\v', [722] = ' ', [723] = '}', [724] = '\f',
[725] = ' ', [726] = '}', [727] = '\t', [728] = ' ', [729] = '}',
[730] = '\f', [731] = ' ', [732] = '\v', [733] = '\v', [734] = '\t',
[735] = ' ', [736] = '\f', [737] = '\v', [738] = '\t', [739] = ' ',
[740] = '}', [741] = '\f', [742] = '\v', [743] = ' ', [744] = '\v',
[745] = '\f', [746] = '\v', [747] = ' ', [748] = '{', [749] = '\f',
[750] = '\t', [751] = ' ', [752] = '\f', [753] = '\t', [754] = '{',
[755] = '\f', [756] = ' ', [757] = '\v', [758] = '\f', [759] = '\v',
[760] = ' ', [761] = ';', [762] = '\f', [763] = '\f', [764] = ' ',
[765] = '\v', [766] = '\v', [767] = '\t', [768] = ' ', [769] = '\f',
[770] = '\v', [771] = '\f', [772] = ' ', [773] = '\t', [774] = '\v',
[775] = '\t', [776] = ' ', [777] = ' ', [778] = 'o', [779] = 'f',
[780] = '\t', [781] = '\v', [782] = '\v', [783] = '\v', [784] = ' ',
[785] = ';', [786] = '\t', [787] = '\v', [788] = ' ', [789] = '\f',
[790] = '\t', [791] = '\v', [792] = ' ', [793] = '}', [794] = ' ',
[795] = '\f', [796] = '\f', [797] = ' ', [798] = '{', [799] = '\t',
[800] = '\v', [801] = ' ', [802] = '}', [803] = '\t', [804] = '\v',
[805] = ' ', [806] = '}', [807] = '\t', [808] = '\v', [809] = ' ',
[810] = '\f', [811] = '\f', [812] = ' ', [813] = '\f', [814] = '\t',
[815] = ' ', [816] = '}', [817] = '\f', [818] = '\v', [819] = ' ',
[820] = '\f', [821] = '\v', [822] = '}', [823] = ' ', [824] = '{',
[825] = '\f', [826] = '\v', [827] = ' ', [828] = '\t', [829] = '\v',
[830] = '\f', [831] = ' ', [832] = '\f', [833] = '\f', [834] = ' ',
[835] = '}', [836] = '\f', [837] = ' ', [838] = '\f', [839] = '\v',
[840] = '\v', [841] = ' ', [842] = ';', [843] = '\t', [844] = '\v',
[845] = ' ', [846] = '\t', [847] = '\v', [848] = '\v', [849] = ' ',
[850] = '\v', [851] = '\t', [852] = ' ', [853] = '{', [854] = '\f',
[855] = '\t', [856] = ' ', [857] = '{', [858] = '\f', [859] = '\t',
[860] = ' ', [861] = '}', [862] = '\f', [863] = ' ', [864] = '}',
[865] = '\t', [866] = ' ', [867] = ';', [868] = '\v', [869] = '}',
[870] = ' ', [871] = '\t', [872] = '\v', [873] = '}', [874] = ' ',
[875] = '{', [876] = '\v', [877] = '}', [878] = ' ', [879] = ';',
[880] = '\f', [881] = ' ', [882] = '}', [883] = '\f', [884] = ' ',
[885] = '\f', [886] = '\f', [887] = ' ', [888] = '}', [889] = '\t',
[890] = '\f', [891] = ' ', [892] = '\t', [893] = '\v', [894] = '\f',
[895] = ' ', [896] = '}', [897] = '\v', [898] = '}', [899] = ' ',
[900] = '\f', [901] = '\v', [902] = '}', [903] = ' ', [904] = '\f',
[905] = '\v', [906] = '\f', [907] = ' ', [908] = '\f', [909] = '\f',
[910] = ' ', [911] = '\v', [912] = '\v', [913] = '\v', [914] = ' ',
[915] = ';', [916] = '\t', [917] = ' ', [918] = '}', [919] = '\f',
[920] = '}', [921] = ' ', [922] = '\t', [923] = '\v', [924] = '\v',
[925] = ' ', [926] = '\t', [927] = '\f', [928] = '\v', [929] = ' ',
[930] = '{', [931] = '\t', [932] = ' ', [933] = ' ', [934] = '-',
[935] = '>', [936] = '\t', [937] = '\v', [938] = '\v', [939] = '\v',
[940] = ' ', [941] = '\f', [942] = '\t', [943] = '{', [944] = '\f',
[945] = ' ', [946] = '\t', [947] = '\t', [948] = '{', [949] = '\f',
[950] = ' ', [951] = '\t', [952] = '\v', [953] = '\f', [954] = ' ',
[955] = '\v', [956] = '\f', [957] = '\v', [958] = ' ', [959] = '\v',
[960] = '\t', [961] = '\v', [962] = ' ', [963] = ';', [964] = '\t',
[965] = ' ', [966] = '\f', [967] = '\v', [968] = '}', [969] = ' ',
[970] = ';', [971] = '\t', [972] = ' ', [973] = '\f', [974] = '\f',
[975] = '}', [976] = ' ', [977] = '}', [978] = '\f', [979] = '}',
[980] = ' ', [981] = '\f', [982] = '\v', [983] = ';', [984] = ' ',
[985] = '\t', [986] = '\f', [987] = '}', [988] = ' ', [989] = '\v',
[990] = '\f', [991] = '\v', [992] = ' ', [993] = '\t', [994] = '\f',
[995] = '\f', [996] = ' ', [997] = '}', [998] = '\t', [999] = ' ',
[1000] = '\f', [1001] = '\f', [1002] = '}', [1003] = ' ', [1004] = '}',
[1005] = '\f', [1006] = '}', [1007] = ' ', [1008] = '\v', [1009] = '\t',
[1010] = ' ', [1011] = '\t', [1012] = '\v', [1013] = '}', [1014] = ' ',
[1015] = '\t', [1016] = '\t', [1017] = ' ', [1018] = '{', [1019] = '\f',
[1020] = '}', [1021] = ' ', [1022] = '\t', [1023] = '\f', [1024] = '\v',
[1025] = ' ', [1026] = '\v', [1027] = '\f', [1028] = '\f', [1029] = ' ',
[1030] = '\f', [1031] = '\f', [1032] = '}', [1033] = ' ', [1034] = '\v',
[1035] = '\v', [1036] = ';', [1037] = ' ', [1038] = '}', [1039] = '\f',
[1040] = '\f', [1041] = ' ', [1042] = '\t', [1043] = '\v', [1044] = '}',
[1045] = ' ', [1046] = '}', [1047] = '\f', [1048] = '}', [1049] = ' ',
[1050] = '}', [1051] = '\f', [1052] = '}', [1053] = ' ', [1054] = '}',
[1055] = '\f', [1056] = '}', [1057] = ' ', [1058] = '{', [1059] = '\f',
[1060] = '\v', [1061] = ' ', [1062] = '}', [1063] = '\v', [1064] = '}',
[1065] = ' ', [1066] = '\f', [1067] = '\v', [1068] = '}', [1069] = ' ',
[1070] = '\f', [1071] = '\v', [1072] = '}', [1073] = ' ', [1074] = ';',
[1075] = '\f', [1076] = '\v', [1077] = ' ', [1078] = '\f', [1079] = '\v',
[1080] = '}', [1081] = ' ', [1082] = '\v', [1083] = '\f', [1084] = '\v',
[1085] = ' ', [1086] = '{', [1087] = '\f', [1088] = '\v', [1089] = ' ',
[1090] = '}', [1091] = '\v', [1092] = '}', [1093] = ' ', [1094] = ';',
[1095] = '\t', [1096] = '\v', [1097] = ' ', [1098] = ';', [1099] = '\t',
[1100] = '\v', [1101] = ' ', [1102] = '{', [1103] = '\f', [1104] = '}',
[1105] = ' ', [1106] = ';', [1107] = '\f', [1108] = '\v', [1109] = ' ',
[1110] = ';', [1111] = '\t', [1112] = '\v', [1113] = ' ', [1114] = '\f',
[1115] = '\f', [1116] = '}', [1117] = ' ', [1118] = ';', [1119] = '\f',
[1120] = '\f', [1121] = ' ', [1122] = '\f', [1123] = '\f', [1124] = '}',
[1125] = ' ', [1126] = '}', [1127] = '\v', [1128] = ';', [1129] = ' ',
[1130] = '{', [1131] = '\t', [1132] = '}', [1133] = ' ', [1134] = '{',
[1135] = '\f', [1136] = ' ', [1137] = '\t', [1138] = ' ', [1139] = ';',
[1140] = '\f', [1141] = ' ', [1142] = ';', [1143] = ' ', [1144] = ' ',
[1145] = '\v', [1146] = '\t', [1147] = '\v', [1148] = ' ', [1149] = '\t',
[1150] = '\v', [1151] = '}', [1152] = ' ', [1153] = '\f', [1154] = '\f',
[1155] = '\v', [1156] = ' ', [1157] = '}', [1158] = '\f', [1159] = '}',
[1160] = ' ', [1161] = '}', [1162] = '\f', [1163] = '}', [1164] = ' ',
[1165] = '}', [1166] = '\f', [1167] = '}', [1168] = ' ', [1169] = '}',
[1170] = '\f', [1171] = '}', [1172] = ' ', [1173] = ';', [1174] = '\f',
[1175] = '}', [1176] = ' ', [1177] = '\f', [1178] = '\f', [1179] = '}',
[1180] = ' ', [1181] = '\f', [1182] = '\v', [1183] = ';', [1184] = ' ',
[1185] = '}', [1186] = '\f', [1187] = '\f', [1188] = ' ', [1189] = '{',
[1190] = '\t', [1191] = '\f', [1192] = ' ', [1193] = '{', [1194] = '\v',
[1195] = '}', [1196] = ' ', [1197] = ';', [1198] = '\f', [1199] = ' ',
[1200] = ' ', [1201] = 'l', [1202] = 'e', [1203] = 't', [1204] = '\t',
[1205] = ';', [1206] = '\f', [1207] = ' ', [1208] = ' ', [1209] = 'i',
[1210] = 'n', [1211] = '\t', [1212] = '\t', [1213] = '\f', [1214] = ' ',
[1215] = '}', [1216] = '\f', [1217] = ' ', [1218] = ';', [1219] = '\f',
[1220] = '}', [1221] = ' ', [1222] = '\f', [1223] = '\f', [1224] = '}',
[1225] = ' ', [1226] = '\v', [1227] = '\v', [1228] = ';', [1229] = ' ',
[1230] = '}', [1231] = '\f', [1232] = '\f', [1233] = ' ', [1234] = '}',
[1235] = ' ', [1236] = '{', [1237] = '\v', [1238] = '}', [1239] = ' ',
[1240] = ';', [1241] = '\f', [1242] = ' ', [1243] = ' ', [1244] = 'c',
[1245] = 'a', [1246] = 's', [1247] = 'e', [1248] = '\t', [1249] = ';',
[1250] = '\f', [1251] = ' ', [1252] = '}', [1253] = '\v', [1254] = '\v',
[1255] = ' ', [1256] = '\t', [1257] = '\f', [1258] = ' ', [1259] = '\v',
[1260] = '\f', [1261] = '}', [1262] = ' ', [1263] = '\v', [1264] = '\t',
[1265] = ' ', [1266] = ';', [1267] = '\f', [1268] = '}', [1269] = ' ',
[1270] = '\f', [1271] = '\f', [1272] = '}', [1273] = ' ', [1274] = '}',
[1275] = '\t', [1276] = ' ', [1277] = '{', [1278] = '\f', [1279] = '}',
[1280] = ' ', [1281] = '{', [1282] = '\v', [1283] = '\v', [1284] = ' ',
[1285] = '\v', [1286] = '\f', [1287] = '}', [1288] = ' ', [1289] = '{',
[1290] = '\t', [1291] = ' ', [1292] = ';', [1293] = '\f', [1294] = '}',
[1295] = ' ', [1296] = '\f', [1297] = '\f', [1298] = '}', [1299] = ' ',
[1300] = '\f', [1301] = '\v', [1302] = ';', [1303] = ' ', [1304] = '{',
[1305] = '\t', [1306] = '\f', [1307] = ' ', [1308] = '{', [1309] = '\v',
[1310] = '}', [1311] = ' ', [1312] = '{', [1313] = '\t', [1314] = '\v',
[1315] = ' ', [1316] = '}', [1317] = '\v', [1318] = '\t', [1319] = ' ',
[1320] = '{', [1321] = '\t', [1322] = ' ', [1323] = '\f', [1324] = '\f',
[1325] = ' ', [1326] = ';', [1327] = '\t', [1328] = ' ', [1329] = '}',
[1330] = '\f', [1331] = '}', [1332] = ' ', [1333] = '}', [1334] = '\f',
[1335] = '}', [1336] = ' ', [1337] = '\f', [1338] = '\f', [1339] = '}',
[1340] = ' ', [1341] = '}', [1342] = '\f', [1343] = '\v', [1344] = ' ',
[1345] = '\t', [1346] = '\t', [1347] = ' ', [1348] = '\t', [1349] = '\f',
[1350] = '}', [1351] = ' ', [1352] = ';', [1353] = '\f', [1354] = '}',
[1355] = ' ', [1356] = '\f', [1357] = '\f', [1358] = '}', [1359] = ' ',
[1360] = ';', [1361] = '\f', [1362] = '}', [1363] = ' ', [1364] = '\f',
[1365] = '\f', [1366] = '}', [1367] = ' ', [1368] = '}', [1369] = '\f',
[1370] = '\f', [1371] = ' ', [1372] = '}', [1373] = '\f', [1374] = '\f',
[1375] = ' ', [1376] = '\t', [1377] = '\t', [1378] = '}', [1379] = ' ',
[1380] = '\f', [1381] = '\f', [1382] = '\f', [1383] = ' ', [1384] = '\t',
[1385] = '\t', [1386] = ' ', [1387] = '\v', [1388] = '\t', [1389] = ' ',
[1390] = '\t', [1391] = '\v', [1392] = ';', [1393] = ' ', [1394] = ' ',
[1395] = '\f', [1396] = '\v', [1397] = ';', [1398] = ' ', [1399] = '\t',
[1400] = '\v', [1401] = ';', [1402] = ' ', [1403] = '\t', [1404] = ' ',
[1405] = '\v', [1406] = ' ', [1407] = '}', [1408] = ' ', [1409] = '{',
[1410] = '\f', [1411] = ';', [1412] = ' ', [1413] = '{', [1414] = '\f',
[1415] = ';', [1416] = ' ', [1417] = '{', [1418] = '\f', [1419] = ';',
[1420] = ' ', [1421] = '}', [1422] = ' ', [1423] = '\t', [1424] = ' ',
[1425] = '}', [1426] = ' ', [1427] = '}', [1428] = ' ', [1429] = '\f',
[1430] = '\v', [1431] = ';', [1432] = ' ', [1433] = '}', [1434] = ' ',
[1435] = '}', [1436] = '\f', [1437] = '\f', [1438] = ' ', [1439] = '\v',
[1440] = ' ', [1441] = '\f', [1442] = '\v', [1443] = ';', [1444] = ' ',
[1445] = ' ', [1446] = '}', [1447] = ' ', [1448] = '\v', [1449] = ' ',
[1450] = '{', [1451] = '\f', [1452] = ' ', [1453] = ';', [1454] = '\v',
[1455] = '\v', [1456] = ' ', [1457] = ' ', [1458] = '{', [1459] = '\f',
[1460] = ';', [1461] = ' ', [1462] = '}', [1463] = ' ', [1464] = '}',
[1465] = ' ', [1466] = '\v', [1467] = '\f', [1468] = ';', [1469] = ' ',
[1470] = '{', [1471] = '\f', [1472] = ';', [1473] = ' ', [1474] = '}',
[1475] = '\f', [1476] = ';', [1477] = ' ', [1478] = '}', [1479] = ' ',
[1480] = '}', [1481] = '\f', [1482] = ';', [1483] = ' ', [1484] = '\v',
[1485] = ' ', [1486] = '}', [1487] = '\f', [1488] = ';', [1489] = ' ',
[1490] = '\v', [1491] = ' ', [1492] = '\f', [1493] = '\f', [1494] = ' ',
[1495] = '}', [1496] = '\f', [1497] = ';', [1498] = ' ', [1499] = '\f',
[1500] = '\f', [1501] = ' ', [1502] = '\v', [1503] = '\f', [1504] = ';',
[1505] = ' ', [1506] = '}', [1507] = '\v', [1508] = ';', [1509] = ' ',
[1510] = ';', [1511] = '\v', [1512] = ';', [1513] = ' ', [1514] = '\f',
[1515] = '\f', [1516] = ' ', [1517] = '}', [1518] = '\f', [1519] = ';',
[1520] = ' ', [1521] = ';', [1522] = '\f', [1523] = ' ', [1524] = '\t',
[1525] = ' ', [1526] = ';', [1527] = '\t', [1528] = ' ', [1529] = '}',
[1530] = '\f', [1531] = ';', [1532] = ' ', [1533] = '}', [1534] = ' ',
[1535] = '}', [1536] = '\f', [1537] = ' ', [1538] = ';', [1539] = '\f',
[1540] = '}', [1541] = ' ', [1542] = '\f', [1543] = '\v', [1544] = '\v',
[1545] = ' ', [1546] = ' ', [1547] = ':', [1548] = ' ', [1549] = '<',
[1550] = '=', [1551] = ' ', [1552] = '*', [1553] = ' ', [1554] = '+',
[1555] = ' ', [1556] = '-', [1557] = ' ', [1558] = '/', [1559] = '\t',
[1560] = '}', [1561] = '\f', [1562] = ';', [1563] = ' ', [1564] = '{',
[1565] = '\f', [1566] = '\v', [1567] = ' ', [1568] = '}', [1569] = '\f',
[1570] = ' ', [1571] = '\t', [1572] = '\f', [1573] = '}', [1574] = ' ',
[1575] = '{', [1576] = '\v', [1577] = '}', [1578] = ' ', [1579] = '\v',
[1580] = '\t', [1581] = '}', [1582] = ' ', [1583] = '\v', [1584] = '\f',
[1585] = ';', [1586] = ' ', [1587] = '}', [1588] = '\f', [1589] = '\f',
[1590] = ' ', [1591] = '\f', [1592] = '\t', [1593] = '\v', [1594] = ' ',
[1595] = '{', [1596] = '\t', [1597] = '}', [1598] = ' ', [1599] = '\t',
[1600] = '\f', [1601] = '}', [1602] = ' ', [1603] = ';', [1604] = '\f',
[1605] = '\v', [1606] = ' ', [1607] = '}', [1608] = '\t', [1609] = ' ',
[1610] = ' ', [1611] = 'd', [1612] = 'a', [1613] = 't', [1614] = 'a',
[1615] = '\t', [1616] = '\v', [1617] = '\f', [1618] = '\f', [1619] = ' ',
[1620] = '\v', [1621] = '\t', [1622] = ' ', [1623] = '\v', [1624] = '\t',
[1625] = '}', [1626] = ' ', [1627] = '\v', [1628] = '\v', [1629] = ';',
[1630] = ' ', [1631] = '}', [1632] = '\f', [1633] = ';', [1634] = ' ',
[1635] = ';', [1636] = '\t', [1637] = '}', [1638] = ' ', [1639] = '{',
[1640] = '\v', [1641] = '\v', [1642] = ' ', [1643] = '{', [1644] = '\f',
[1645] = ';', [1646] = ' ', [1647] = '\v', [1648] = '\t', [1649] = '\f',
[1650] = ' ', [1651] = '{', [1652] = '\t', [1653] = '\f', [1654] = ' ',
[1655] = '\v', [1656] = '\t', [1657] = '\f', [1658] = ' ', [1659] = '}',
[1660] = '\f', [1661] = '\f', [1662] = ' ', [1663] = '\v', [1664] = '\v',
[1665] = ';', [1666] = ' ', [1667] = ';', [1668] = '\v', [1669] = ';',
[1670] = ' ', [1671] = '\f', [1672] = '\t', [1673] = '\v', [1674] = ' ',
[1675] = '}', [1676] = '\t', [1677] = '}', [1678] = ' ', [1679] = '\v',
[1680] = '\t', [1681] = '}', [1682] = ' ', [1683] = '}', [1684] = '\f',
[1685] = ';', [1686] = ' ', [1687] = '\v', [1688] = '\v', [1689] = '\v',
[1690] = ' ', [1691] = '\v', [1692] = '\t', [1693] = '}', [1694] = ' ',
[1695] = ';', [1696] = '\f', [1697] = ' ', [1698] = '}', [1699] = ' ',
[1700] = ';', [1701] = '\f', [1702] = '}', [1703] = ' ', [1704] = '{',
[1705] = '\t', [1706] = '}', [1707] = ' ', [1708] = '{', [1709] = '\t',
[1710] = '}', [1711] = ' ', [1712] = '}', [1713] = '\v', [1714] = '\v',
[1715] = ' ', [1716] = '\v', [1717] = '\t', [1718] = ' ', [1719] = '}',
[1720] = '\f', [1721] = '\v', [1722] = ' ', [1723] = '\v', [1724] = '\t',
[1725] = ' ', [1726] = ';', [1727] = '\v', [1728] = '\v', [1729] = ' ',
[1730] = ';', [1731] = '\t', [1732] = '{', [1733] = '\f', [1734] = ' ',
[1735] = '\v', [1736] = '\t', [1737] = '}', [1738] = ' ', [1739] = '}',
[1740] = ' ', [1741] = '{', [1742] = '\t', [1743] = ' ', [1744] = '\v',
[1745] = ' ', [1746] = '}', [1747] = '\t', [1748] = '}', [1749] = ' ',
[1750] = '\v', [1751] = '\t', [1752] = '}', [1753] = ' ', [1754] = '{',
[1755] = '\f', [1756] = ';', [1757] = ' ', [1758] = '\t', [1759] = '\f',
[1760] = ' ', [1761] = ';', [1762] = '\f', [1763] = '}', [1764] = ' ',
[1765] = '}', [1766] = '\t', [1767] = '}', [1768] = ' ', [1769] = '\v',
[1770] = '\t', [1771] = '}', [1772] = ' ', [1773] = '{', [1774] = '\t',
[1775] = '\f', [1776] = ' ', [1777] = '{', [1778] = '\t', [1779] = '\v',
[1780] = ' ', [1781] = '\f', [1782] = '\v', [1783] = '\v', [1784] = ' ',
[1785] = '\t', [1786] = '\f', [1787] = ' ', [1788] = '\t', [1789] = '\v',
[1790] = '\f', [1791] = ' ', [1792] = ';', [1793] = '\f', [1794] = ';',
[1795] = ' ', [1796] = '#', [1797] = 'd', [1798] = 'e', [1799] = 'f',
[1800] = 'i', [1801] = 'n', [1802] = 'e', [1803] = ' ', [1804] = 'x',
[1805] = ' ', [1806] = '\\',
};
typedef struct PredefLoader {
char *n, *T, *v;
} PredefLoader;
static PredefLoader ldr = {
.n = literal_n,
.T = literal_n + 19,
.v = literal_n + 12,
};
typedef struct Base85 {
u32 a;
u32 mask;
char *y;
} Base85;
static Base85 b85 = {
.a = 0,
.mask = 1<<0,
.y = literal_y,
};
// ## Utilities to uncompress and decode predefined program
static u32 Z(void) {
u32 local0 = *ldr.T++;
return local0 == 9 ? 8 : l(l(17, l(1, local0)), Z());
}
/// initialized with 0, 1, 1
///
/// each args and idx change to:
/// 1. 0, 1, 1, 0
/// 2. idx1, 6, 2, idx1
/// 3. idx1+(idx2/2*6), 18, 1, idx2
/// 4. idx1+(idx2/2*6)+idx3*18, 54, 2, idx3
/// 5. idx1+(idx2/2*6)+idx3*18+(idx4/2*54), 162, 1, idx4
/// 6. ...
static u32 N(u32 arg0, u32 arg1, u32 arg2) {
for (u32 idx;;) {
for (idx = 0; ldr.v[idx] != *ldr.T; idx++)
;
ldr.T++;
if (idx >= 6)
return arg0;
arg0 = arg0 + idx / arg2 * arg1;
arg1 = arg1 * 6 / arg2;
arg2 = 3 - arg2;
}
}
static u32 Base85_takeBit(void) {
if ( (b85.mask >>= 1) == 0) {
b85.mask = (u32)1 << 31;
b85.a = 0;
for (u32 itr = 5; itr--;)
b85.a = 85 * b85.a + *b85.y++ - 32;
}
return (b85.a & b85.mask) ? 1 : 0;
}
/// Extract compressed bytes
static u32 W(u32 arg0, u32 *argD) {
u32 my_byte = arg0 << 1;
my_byte |= Base85_takeBit();
u32 idx_n = 0;
for (;;) {
if (ldr.n[idx_n] == 9)
return W(my_byte, argD);
if (ldr.n[idx_n] == my_byte + 32)
break;
idx_n += 1;
}
switch (idx_n) {
case 0:
idx_n = W(0, argD);
return l(idx_n, W(0, argD));
default:
idx_n -= 1;
if (idx_n >= 2)
return idx_n;
}
u32 C = N(0, 1, 1);
if (idx_n != 0)
return l(idx_n, C);
switch (C) {
case 0:
return Z();
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
return C + 15;
default:
return (argD-C)[7]; // XXX: pointer and unsigned value
}
}
static u32 root_mem[L] = { x };
static Runtime vm = {
.mem = root_mem,
// .sp = vm.mem[0], /* HACK: not comptime-known */
.ip = root_mem + L - 3,
.o_mode = OutputMode_Byte,
};
int main(void) {
vm.sp = vm.mem[0];
u32 *D = vm.mem+2;
int load_compiler = vm.sp == 0;
if (load_compiler) {
vm.sp = 24;
vm.o_mode = OutputMode_Numeric;
for (D = vm.mem + L / 2;;) {
if ( (*D = W(0, D)) == 0) break;
D++;
}
puts(ldr.T);
}
*vm.ip = l(l(l(*--D, l(7, 0)), 0), l(23, 9));
while (Runtime_step()) {}
if (load_compiler) puts(b85.y);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment