/**
* Generator for text printing Malbolge Unshackled programs.
* Usage:
* This tool reads some UTF-8 encoded text from STDIN and writes
* Malbolge Unshackled code to STDOUT
* Copyright (C) 2017 Matthias Lutter
* Please visit
*
* This tool is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This tool is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* For a copy of the GNU General Public License, see
* .
*/
#include
#include
#include
#include
const char* normalization = "+b(29e*j1VMEKLyC})8&m#~W>qxdRp0wkrUo[D7,XT"
"cA\"lI.v%{gJh4G\\-=O@5`_3i= 33 && code[i] < 127) {
// denormalize this char!
long long j;
for (j=0;j max_len) {
if (unicode) {
*unicode = -1;
}
UTF_WARNING("warning: invalid utf-8 sequence\n");
return max_len;
}
in++;
int len = 1;
while (left) {
len++;
if (*in < 0x80 || *in >= 0xC0) {
if (unicode) {
*unicode = -1;
}
UTF_WARNING("warning: invalid utf-8 sequence\n");
return len;
}
if (unicode) {
*unicode <<= 6;
*unicode |= (int)(*in & 0x3F);
}
in++;
left--;
}
if (unicode) {
if ((*unicode & 0xFFFF) > 0xFFFD) {
// non-character
*unicode = -1;
UTF_WARNING("warning: unicode non-character symbol\n");
}
if (*unicode >= 0xFDD0 && *unicode <= 0xFDEF) {
// non-character
*unicode = -1;
UTF_WARNING("warning: unicode non-character symbol\n");
}
if (*unicode >= 0xD800 && *unicode <= 0xDFFF) {
// surrogates must not appear in utf-8
*unicode = -1;
UTF_WARNING("warning: surrogate in utf-8\n");
}
if (*unicode > 0x10FFFD) {
// invalid
*unicode = -1;
UTF_WARNING("warning: invalid unicode symbol\n");
}
}
return len;
}
#undef UTF_WARNING
int get_width(int number) {
int width = 1;
int max = 2;
while (number > max) {
width++;
max *= 3;
max += 2;
}
return width;
}
void set_gen_init_03(long long value, int width, int omit_last_rot);
void initialize_memory_cell(long long value, long long c_start_offset,
int min_rot_width, int* needed_rotwidth);
void add_code(const char* code);
int get_trit(int position, long long value);
void inc_min_rotwidth(int* min_rot_width, int needed_backjump_rotwidth,
long long c_start_offset){
if (!min_rot_width) {
return;
}
while (*min_rot_width < needed_backjump_rotwidth) {
unsigned int i;
long long twos = 2;
/* erzeuge IRGENDWO (-> in var1) C0, erzeuge dann ...0222222 mit
maximal vielen 2en, crazie das in C0, springe ans ziel mit
movd; kehre von dort zurueck! */
/* -> am besten in var1 */
for (i=0;i<*min_rot_width;i++) { /* width */
add_code("ooooooooj*jo");
}
/* erzeuge C0 an position var1 */
add_code("*oooojpjoooooojpjoooooojpjo");
/* erzeuge ...0222222 */
for (i=1;i<*min_rot_width;i++) {
twos *= 3;
twos += 2;
}
set_gen_init_03(twos, *min_rot_width, 0);
add_code("oj*op");
/* crazie das in var1, erhalte ...100000 */
add_code("oojpjo");
// ERZEUGE BACK-JUMP-address!!
{
long long max_value_C1_rot_width = 1;
long long address_gen_size;
long long inner_reset_point;
for (i=1;i<*min_rot_width;i++) {
max_value_C1_rot_width *= 3;
max_value_C1_rot_width += 1;
}
inner_reset_point = current_code_size;
address_gen_size = 150; /* start with this */
do {
long long backjump_address = c_start_offset
+ current_code_size + address_gen_size;
if (backjump_address > 2*max_value_C1_rot_width) {
fprintf(stderr,"error: cannot increase rotation "
"width as required");
exit(1);
}
add_code("*oooooojpjoooooooojpjo");
long long gen = 0;
long long tmp = backjump_address;
long long factor = 1;
long long i;
for (i=0;i<*min_rot_width;i++) {
if (tmp % 3==0) {
gen += factor;
}else{
gen += 2*factor;
}
factor *= 3;
tmp /= 3;
}
set_gen_init_03(gen, *min_rot_width, 0);
/*printf("bja1-gen: %d\n",gen); */
add_code("oooojpjo");
gen = 0;
tmp = backjump_address;
factor = 1;
for (i=0;i<*min_rot_width;i++) {
if (tmp % 3==1) {
gen += 2*factor;
}else{
gen += factor;
}
factor *= 3;
tmp /= 3;
}
set_gen_init_03(gen, *min_rot_width, 0);
/*printf("bja2-gen: %d\n",gen); */
add_code("oooojpjo");
add_code("oooooooooji");
if (backjump_address+1 >=
c_start_offset + current_code_size) {
while (backjump_address+1
> c_start_offset + current_code_size) {
add_code("o");
}
add_code("jo");
/*printf("bja: %d\n",backjump_address); */
break;
}
address_gen_size += c_start_offset + current_code_size
- backjump_address;
current_code_size = inner_reset_point;
code[inner_reset_point] = 0;
}while(1);
}
/* gehe zu ...10000, kehre danach sofort zurueck */
add_code("ooooojjojooj");
*min_rot_width *= 2;
}
}
void add_code(const char* cd) {
long long length = strlen(cd);
code = (char*)realloc(code, current_code_size + length + 1);
if (!code) {
fprintf(stderr, "error: cannot reallocate memory\n");
exit(1);
}
memcpy(code+current_code_size,cd,length+1);
current_code_size += length;
}
int main(int argc, char* argv[]) {
int i;
// GENERATED PROGRAM WILL PRINT THE CONTENT OF THE VARIABLE BELOW
const char* out_string = 0;
long long out_len = 0;
if (argc > 1){
long long pos = 0;
for (i=1;i0)
pos--;
out_s[pos]=0;
out_string = out_s;
out_len = pos;
}else{
// If no command line arguments are given, read from STDIN.
// Read 59.000 characters at most.
long long pos = 0;
long long cur_max_len = 65535;
int result = 0;
char* out_s = (char*)malloc(cur_max_len+1);
if (!out_s) {
fprintf(stderr, "error: cannot allocate memory\n");
return 1;
}
if (stdin == 0){
printf("error: cannot access STDIN\n");
return -1;
}
while (!feof(stdin)){
if (pos >= cur_max_len) {
cur_max_len += 65536;
out_s = (char*)realloc(out_s, cur_max_len+1);
if (!out_s) {
fprintf(stderr, "error: cannot reallocate memory\n");
return 1;
}
}
result = fread(out_s+pos,1,1,stdin);
if (result<0){
printf("error while reading from STDIN\n");
return -1;
}
if (result==0)
break;
pos++;
}
out_s[pos]=0;
out_string = out_s;
out_len = pos;
}
long long c = 19391; // oder aehnlich
const char* init_module =
"bCBA@?>=<;:9876543210/.-,I*)(E~%$#\"RQ}|{zyxwvutsrD0|nQl,"
"+*)(f%dF\"a3_^]\\[ZYXWVUTSRQJmNMLKJIHGFEDCBA@?>=<;:987654"
"3210/.-,+*)('&%$#dc~}|_^yrwZutsrqpinPlOjihgf_dcEaD_^]\\UZ"
"YX:V9TSRQPONGLK.IHGF?DCB$@#>=<;4987w/v3210/.-,+$k('&%|#\""
"!~w`{zyxwputslUponmlkjiKgf_Hcba`_^]\\[ZYXWP9TSRQPONMFKJCH"
"A*EDCBA@?>=<|:98y6543210).-,%*#j'&%$#\"!~}|^ty\\wvutslkTo"
"nmlkjcLafedc\\aD_X]\\[TY=<;49z"
"765.3,+r/.-,l*)(!h%$#\"!~}|{zyxwvunWrqponmlkjihgfed]Fa`_^"
"]\\[ZYXW9UTSRK4ONMLKJIHGFEDCBA@?8!<;:9876543210/.-,%l)('&"
"%$#\"!~}|^t]xqvYnsrqpinQlejihafIdc\\a`Y^A\\[ZSXQ:8NSRQJ3N"
"MLKJIHGFEDC%;$?8=<}49876543210qp',+*)('&%$#\"!b}`{zyrwpuX"
"mrqpohmlOdihgfedcba`_^]\\?=S=<"
";:987654us+r/(-,m*#('&%$#\"!~a`{tyxwvutsrqpoRmPkjibg`eHcb"
"[`_X]@UZYXWPUT7RKPONMLKJIHGFED'%;$?8=~;:387054u2+0/.-,+*)"
"('&%$ecyb}v{z]xwputsrqponQPkjchgfedcba`_B]@[ZSXWPU8SLQPOH"
"ML/JIBGFEDCBA@?>=<}{3z705v321*/(om%*)j'&}$#\"!~}|{zyxwZXn"
"WrkpoRmlkdihgfedcFE`_^W\\[ZYXWVUT7R5PONGLEJ-HG@ED=B%@9>=<"
"5:9z765.3210/.-,+*)jh~g${\"c~}v{zsxwZutslqponmlkjihgJH^Gb"
"[`_B]\\[ZSXWVUTS65PONMFKJIHGFED'B%@?>7<5:9z7654-210/.-,+*"
")jh~g${dbx}|_zyxwputsrqponmlOMcLg`edGba`_^W\\[ZYX;:UTSRQJ"
"ONMLKJI,G*EDCYXQVUNSR5PONMLKJIHG"
"F?DCB%#9\"=6;:{876543210/.-&m*)j'&%$#\"!~}|{zs\\wZutslqjo"
"RmfkjibgfIdcba`_^]\\[ZYRWV97M6QJ31GLK.IHGFEDCBA@?>7<;|z2y"
"6/43t10/.-,+*)('&%|e\"!~a|{zyxwvutsrqpiRmlOjibgf_dGb[`_^W"
"\\[>YXWVUTSRQPONMFK.,B+F?DC&A@?>=<;:98765.3tr*q.',+l)('&%"
"$#\"!~}|{zs\\wvutWrqponmlkjihgfe^Gba`C^]\\UZSX;VUNSRKP3HM"
"LKJCHG*EDCBA@?>=<;:981xv.u2+0/p-,+*)('&%$#\"!~w`^t]xqvuXs"
"rqponmlkjihgfe^Gba`_^A\\[ZYXWVUTSRQPONG0KJIH+FED=B;@?\"=<"
";:9876543210/(o,l$k(!hf|#\"c~}|{zyxwvutsrqpiRmOeNibgfIdcb"
"a`_^]\\[ZYXWVUN7RQPONM0KJIHGFEDCBA@?>=<5|98765v3,10/(-n%*"
")('~%$e\"!~}|{zyxwvutsrqjSnmOeNibgJe^cbaZ_^A\\[ZYXWVUTSRQ"
"PONMF/JI+A*E>CB%@?>=<;:9876543210)p-,+*)('h%$#\"!~}|{zyxw"
"vutslUponmlkNihg`e^cbE`_^]\\[ZYXWVUTSRQPI2MLK-C,G@E(CB;@?"
"8=~;498705v-210/(om%*)j'&%$#\"!~}|{zyxwvunWrqpRhQlejiLgfe"
"dcba`_^]\\[ZYXWVO87RQ4ONMLKJIHGFEDCBA@?>7~}:{876/4-2s0/(-"
",%*k\"'&%${\"!b}|{zyxwvutsrqponmleNihgfH^Gb[`C^]V[ZSXW:UT"
"SRQPONMLKJIHGFED=&A@?>~6}:387x543210/.-,+*)('&%$#zc~a|{^y"
"xwvutsrqponmlkjihg`IdGbE`_X]\\UZ=XQVUTMRQ4ONMLKJIHGFEDCBA"
"@?>=6}:9876v.u2+0q.-,%*#jh~%$e\"!~}|{zyxwvutsrqpongPkjihg"
"I_Hc\\a`C^]\\?TYYRWVUNS6KPONMFKJ-H"
"GF)DCBA:?>!<;:9876543210/.n&m*#('h%$#d!~}|uzy\\wvutsrqpon"
"mlkjiKaJe^cbED_XA\\[ZYXWVUTSR5PO21LE.IHGFEDCBA@?\"=~;:927"
"05v32+0/(-n%*)('~%$ed!xa|{zyxwvutsrqponPfOjchgJId]Fa`_^]\\"
"[ZYXWVUTS5K4OHML/.IHA*EDCBA@?>=<;:{87xw43,s0/.-,+*)('&%f"
"#\"cb}|u^yxwvutsrqponmlkjLbKf_dcFE`_XA\\[ZYXWVUTSRQPONM/E"
".IBGF)(CBA:#>=<;:98765432s0/po,+*#j'&%$#\"!~}|{zy\\wZunsr"
"qjoRglkjibgfIHcbaZC^]\\[ZYXWVUTSRQPON0F/JCH+F?DCB;@?\"!<;"
":3z76543210/.-,+*)('g}f#z!~a`{zyxqvutsrqponmlkjihKfeHGba`"
"_X]\\[ZYXWVUTSRQPO2M0KJCHG@E(=BA@?8=<}|9876/43210/.-,+*)("
"'&%$#\"bxa|uzy\\[vutslqponmlkjihgfedcba`_AW@[TYX;:UTSRQJO"
"NMLKJIHGFEDCB%@?\"!<;:9816543210/.-,+*)j'h%$#z!x}`uzyxwpu"
"tWVqponmfkjihgfedcba`_^]\\[Z="
"<5:9876543210/.-,+*)i!h%|#\"cb}|{zyxqvutsrqponmlkjMhgJIdc"
"ba`_X]\\[ZYXWVUTSRQ4O2MLKDIBG*ED=BA:?\"7<;:9276wv3210/.',"
"+*)('&%$#\"!~}|{z\\r[votWrqjonglkNMhgfedc\\a`_^]\\[ZYXWVU"
"TSRQ3I2MFKJ-,GFEDCBA:?>=<;:987654u21rq.-,+*)(!&%$#\"!~}|{"
"zy\\wZutmrqjoRmfkjibgfIHcba`_^]V[ZYXWVUTSRQPONML.D-HAF)DC"
"B;@9\"~6;:{z7654321*/.-,+*)('&%$#\"!~`v_zsxwvutmVqponmlkj"
"ihgJedcbaZC^]\\[ZYXWVUT7R5PONGLEJ-HG@ED=B%@9>=<5:{27654-2"
"10/.'n+*)('&%$#\"!~}|{]s\\wpuXsrqjohmPkdihg`edcbaZC^]\\[Z"
"YXWVUTSRQP2H1LEJIHGFEDCBA:#>=<;:98765432+r/.-,+*)('&%$#zc"
"~`v_zs\\ZputsrqponmleNiKaJe^cba`_^]\\[ZYRWVUTSRQPONMLKJIH"
"GFEDCBA@?>=<;:98y65432s0/.-,+*)('&}$#\"!~}|{zyxwvutsrqpon"
"mlkjihgfedcFa`_^]@[>YXWPUNSRQPONMLKJIBGFEDCBA@?>=<;:98765"
"43210/.-,+*)(i&%$#\"!~}|^t]xqvutsrqponmlejihgfedcba`_^]\\"
"[ZYXWVUTSRQPONMLK.IHGFEDCBA#9\"=6;:9876543210/(-,+*)('&%$"
"#\"!~}|{zyxwvutsrqponQlkjihKfedcba`_^]\\[ZSXWVUTSRQPONMLK"
"JIHGFEDCBA@?>=<;|98765v3t10).-&+l)\"'&%|#dy~}|{tyxwvutsrq"
"ponmfkjihgfedcba`_^]\\[ZYXWVUTSRQPON1LKJIHGFED&<%@9>!<;49"
"816w4-210).-,+*)('&%$#\"y~}|{zyxwvutsrqponmlkjihgfedcbaD_"
"^]\\[ZYXW9O8SLQPONMLKJIHGFED=BA@?>=<;:9876543210/.-,+*)('"
"&g$#\"!~a|{zyxwvutsrqpohmlkjihgfedcba`_^]\\[ZYXWVUTSRQ4ON"
"MLK.I,GFE>C=<"
";:9870543210/.-,+*)('&%$#\"!~}|{zyxwZutsrqponmOeNibgfedcb"
"a`_^]\\[ZYRWVUTSRQPONMLKJIHGFEDCBA@?>=<}:9876w43210/.-,+*"
")('&}$#\"!~}|{zyxwvutsrqponmlkjihgJedcbaD_^]\\[ZYXWVUTSRQ"
"JONMLKJIHGFEDCBA@?>=<;:987654u210/.-,+*j\"i&}$e\"y~}|uz]r"
"wvutmVTjonmlkjihgfedcbaZ_^]\\[ZYXWVUTSRQPONMLKJIHGFED'BA@"
"?>=<;:z2y6/43210q(-,+*)('&%$#\"!~}|{zyxwvutsrqTonmlkNihgf"
"eH]ba`_^]\\[ZYXWVUTSRQPONMLKJIH+FEDCB%@#>=6;:387654u,10/."
"-,+*)('&%$#\"!~}|{zyxwvuXsrqponmlkMcLg`eHc\\a`_X]@UZYXWP9"
"7MRQPON1FKJIHGFEDCBA@?>=<;:987654321r/.-,+*)('g}f#z!~}|{^"
"yrwvutsrqponmlkjihgfedcba`_^A\\[ZYX;VUTSR5PINMLKJIHGFEDCB"
"A@?>=<;:98765v3210/p-,+*)j'~%$#\"!~}|{zyxwvutsrqponmlkjMh"
"gfedcba`BXA\\UZ=XWPUTMR5JONMLE.,BGFEDC&A:?>=<;:9876543210"
"/.-,+*)('&g$#\"!~}|{z\\r[votsrqpSnmfkjihgfedcba`_^]\\[ZYX"
"WVUTS6QPONM0KJIHG*ED=BA@?>=<;:9876543210/.-,+*k('&%$e\"c~"
"}v{zsx[votsrkponmlOjibgfedcba`_^]\\[ZYXWVUTSRQPO2MLKJIHGF"
"E'=&A:?\"=6;:9276543t10).-,+*)('&%$#\"!~}|{zyxwvutWrqponm"
"lkjLbKf_dcba`C^]\\UZYXWVUTSRQPONMLKJIHGFEDC&A@?>=~;:987x5"
"43,10/.-,+*)('&%$#\"!~}|{zyx[vutsrUponmlOjihafedcba`_^]\\"
"[ZYXWVUTSRQPO2MLKJIHGFE'=&A:?\"=<;4927x5.321*/p',+*)\"ig}"
"$#\"!~a|{zsxwvutsrqponmlkjihgfedcbaD_^]\\[ZYXW9O8SLQPONM0"
"KJIHGFEDCB;@?>=<;:9876543210q.-,+*k('&%$e\"!~}|{zyxwputsr"
"qponmlkjihgfeHcba`_B]@[ZYRWPU8SRKPOHM0KDIHG@E(=BA@?8=<;:9"
"z76543210/.',+*)('&%$#\"!~}|{z]xwvutsrqpRhQlejMhg`ed]bE`Y"
"^]\\UZ=RWVUTMRQPON1LKJIHGFEDC=<;:987654321r/.-,+*)('"
"g}f#z!~}|{^yxwvutsrUjonmlkjihgfedcbE`_^]\\?ZYXWV9TSRQPONM"
"0EJIHGFEDCBA@?>=~;:987x5v321*/(-n+$)('~%f{\"!~}v{zyxwZuts"
"rqponQfkjihgfedcba`_^A\\[ZYXWVUT6L5PIN1LKJCHAF)D=BA@9>=<;"
":{87654321r).-,+*)('&%$#\"!b}|{zyxwvuWmVqjonmPeNihgfedcba"
"`_^]\\[ZY=<;|98765v3t10/(-&+l)"
"\"'&%|#dy~}|{tyxwZoXsrqponmlkjihgfedcFa`_^]\\[ZY;Q:UNSRQ4"
"I2MLKJIHGFEDCBA@?>=~;:9876543s+r/(-,+l)\"'h%$#\"!~}|{zyxw"
"vutsVqponmPkjiLg`eHcba`_^]\\[ZYXWVUTS6QPONM0K.IHG@E>C&A:?"
">=6;|38765.321r/(-n+*)('&%$#\"!~}|{zy\\wvutsrqpoQgPkdihgJ"
"e^cFa`_^]\\[ZYXWVUTSRQ4ONMLKJIHG)?(C=<;:987x543210/.-m%l)\"'h}$#\"!x}"
"|{^yxqZutsrqponmlkjihgfeHcba`_^]\\[=S=<;|98765v321r/.-&+l)('&%$#\"!~}|{zyxwZutsrqToRmlk"
"dibgJed]baZ_BW\\[ZYRWVU8SRQJO2MLKJIHGFEDCBA@?>=~;:9876543"
"s+r/(-,+l)('~%f#\"!~}|{zyxwvutsrqTonmlkjihgI_Hc\\a`_B]\\["
"ZYRW:UTSRQPONMLKJIHGFE(CBA@?\"=<;|98765.3t10/.-,+*)('&%$#"
"\"!b}|{zy\\wZunsrqjoRglkjibgfeHcba`_X]@[ZYXWVUTSRQPONMLK."
"IHGFEDCBA#9\"=6;|92765.321r/.-,+$)j'&%$#\"!~}|{zyxwvuXsrq"
"ponmlkMcLg`edcFa`_^]\\U>YXWVUTSRQPONMLKJI,GFEDC&A@?\"=<;:"
"981x543210/.-,+*)('&%f#\"!~}`{^yxwpunsVqpinmfkNchgfe^cbaD"
"_^]\\[ZS=}5|92765v3210/.'n+*)("
"'&%$#\"!~}|{zy\\wvutsrqpoQgPkdihgJedcba`_^W@[ZYXWVUTSRQPO"
"NMLK.IHGFE(CBA$?>=<;:981x543210/.-,+*)('&%f#\"!~}`{^yrwvu"
"nsVkponmfkjiLgfedcba`YB]\\[ZYXWVUTSRQPONM0KJIHGFEDC%;$?8="
"~;49870543t10/.-,+*#j'&%$#\"!~}|{zyxwvuXsrqponmlkMcLg`edc"
"Fa`_^]\\[ZYRW:UTSRQPONMLKJIHGFE(CBA@?\"=<;|987654321*/p-,"
"+*)('&%$#\"!~}|{^yxwvuXsVqpohmfkNihafe^cF[`_^]V[ZY=<;|987654321q)p-&+*)j'&%$#\"!~}v{^yx"
"wvutsrqponmlkjiLgfedcba`_AW@[TYXW:UTSRQPONMLKDI,GFEDCBA@?"
">=<;:987x54321r/.-n+*)('&%$#\"!x}`{zyxwvutsrqponmlkNihgfe"
"HcFaZ_^]V[>SXWVUNSRQ4ONMLKJIHGFE>C&A@?>=<;:987654321r/.-,"
"+*)('g}f#z!b}v{zyrwvuXsrqponmlkjibgJedcba`_^]\\[ZYXWVU8SR"
"QPONMLK-C,G@EDC&A@?>=<;:9876/v3210/.-,+*)('&%$#d!~}|{^yxw"
"ZutsrqponmlkjcLgfedcba`_^]\\[ZYXW:UTSRQ4O2MLKDIBG*ED=BA:?"
"\"7<;:92765v3210/.-,+*)(!h%$#\"!~}|{zyxwvutsVqponmlkjiKaJ"
"e^cbaD_^]\\[ZYXWVUTM6QPONMLKJIHGFEDCBA$?>=<;:987w/v3,10/p"
"-,+*)('&%$#\"!x}`{zyxwvutsrqponmlkNihgfeHcbaD_^]\\[ZYXWVU"
"TSLQ4ONMLKJIHGFEDCBA@?\"=<;:9z765v3210/.-,+*)('~%f#\"!~}|"
"{zyxwvutsrqTonmlkjihgI_Hc\\ECY^]\\?ZYXWVUTSRQPONGL/JIHGFE"
"DCBA@?>=<;:{876543210p(o,%*)(i&%$#\"!~}|{zyxwpYtsrqponmlk"
"jihgfedGba`_^A\\[Z=XWVUTSRQPONMLKD-HGFEDCBA@?>=<;:98y6543"
"2s0q.',+*#(i~%$#\"y~}|_zyxwvutsrqponmfOjihgfedcba`_^]\\[Z"
"=XWVUTSRQP2H1LEJ-HAFED=BA@#>=<;:987654321*q.-,+*)('&%$#\""
"!~}|_zyxwvutsrTjSnglkjMhgfedcba`_^]\\[ZSX;VUTSRQPONMLKJIH"
"GF)DCBA@#>=<}:9876543210/.-,%*k('&%$#\"!~}|{zyxwvYtsrqpSn"
"QlkdihafI^cba`Y^]\\?ZYXWVUTSRQPONMLEJ-HGFEDCBA@?>=<;:98y6"
"543210/.n&m*#('&g$#\"!~}|{zyxwvutmrUponmlkjihgfedcba`C^]\\"
"[ZYXWV8N7RKPON1LKJIHGFEDCBA@?>=6}:9876543210/.-,+*k('&%$"
"e\"!~a|{zyxwvutsrqponmfOjihgfedcba`_^]\\[Z=XWVUT7R5PONGLE"
"J-HG@ED=B%:?>=<5:98y6543210/.-,+*)('~g$#\"!~}|{zyxwvutsrU"
"ponmlkjihJ`Id]bE`_X]\\UZYX;VUTSRQPONMLKJIHG@)DCBA@?>=<;:9"
"87654u210/.-,+*j\"i&}$#\"c~}|{zyxwvutsrqponglOjihgfedcba`"
"_^]\\[Z=XWVUT7RQP3NMLKJIHGFEDCBA@?>7<}:9876543210/.-,+*k("
"'&%$e\"c~}|uzsx[votsrkponQlkjihgfedcba`_^]\\UZ=XWVUTSRQPO"
"NMLKJIH+FEDCBA@?>~6}:3zx0543t10/.-,+*)('&%$#\"!x}`{zyxwvu"
"tsrqponmlkNihgfedcbaCYB]V[ZY=<"
";:98765432+r/.-,+*)('&%$#\"!~}`{zyxwZutsVqponmlkjihgfedcb"
"a`_^]\\[ZYXWVUTSRQPONMLE.IHGFEDCBA@?>=<;:9z76543t1r/.-&+$"
")j'~%$#z!bw|{zyrwvuXsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQP"
"ONG0KJIHGFEDCBA@?>=<;|987654321q)p-&+l)('~%|#d!x}|{ty\\qv"
"utslqpoRmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHA*EDCBA@?>"
"=<;:98765v3210/.-,+k#j'~%$#d!~}|{zyxwvutsrqponmlkjihgfedc"
"ba`_^]\\[ZYRW:UTSRQPONMLKJIHGFE(CBA@?\"=<;|9876543210/.-,"
"+*)('&%$#\"!~}|{zyxwvutsrqjoRmlkjihgfedcba`_^]@[ZYXW:U8SR"
"QJOHM0KDIHG@E(=BA@?8=<;|9876543210/.-,+*)('&%$#\"!~}|{zyx"
"wvutsrqjoRmlkjihgfedcba`_^]@[ZYXWVUTS5K4OHMLK.IHGFEDCBA@?"
">=<;:9876543210/.-,+*)('&%$#z!b}|{zyxwvutsrqponmPkjihgfed"
"cE[D_X]\\[>YXWVUTSRQPONM0E.IHGFEDCBA@?>=<;:9z76543t10/p-,"
"+*)('&%$#\"!bw`{zyxwvutsrqponmlkNihgfeHcFa`_X]V[>YRWVUNS6"
"KPONMFKJI,GFEDCBA@?>=<;|3z76543210/.-,+*)('h%$#\"!~}|{]s\\"
"wputsVqponmlkjihgfeH]Fa`_^]\\[ZYXWVUTSRQ4ONMLKJIHG)?(C=~;:3z76543210/.-,+*)('h%$#\"!b}`{zyrwpuXslqpohm"
"Pejihg`edcFa`_^]\\[ZYXWVU8SRK4ONMLKJIHGFEDCBA@?\"=<;:9876"
"5u-t1*/p-,+$)\"'h%|#\"!x}`uzyxwputsVqponmlkjihgfeHcb[D_^]"
"\\[ZYXWVUTSRQPO2MLKJIHGFE'=&A:?>=~;:9876543210/p-,+$)j'&%"
"$#\"!~}|{zyxwvuXsrqpoRmlkNihgfedcba`_^]@[ZYRW:UTSRQPONMLK"
"JIHGFE(CBA@?\"=~;:92705v3,10/(-n%*)('~%$#d!~}|{zyxwvutsVq"
"pohmPkjihgfedcba`_^]\\[>YXWVUTSRQ3I2MFKJI,GFEDCBA@?>=<;|9"
"8705v3210/.-,+*)('&%$#d!~}|{zyxwYoXslqpoRmlkjihgfedcbaD_^"
"]\\U>YXWVUTSRQPONMLKJI,GFEDC&A@?\"=<;:987654321r/.-,%l)('"
"&%$#\"!~}|{zyxwZutsrqToRmlkdibgJe^cbaZ_BW\\[ZYRWVU8SRQPON"
"MLKJIHG*EDCB;$?>=<;:9876543210/p-,+*)('&%e{d!x}|{^yxwvuts"
"rqponmPkjihaJedcba`_^]\\[ZYXWVU8SRQPONMLK-C,G@EDC&A@?>=<;"
":98765v3210/(-n+*)('&%$#\"!~}|{zy\\wvutsVqpoRmlkjihgfedcb"
"aD_^]\\[TYYXWVUTS"
"RQ3I2MFKJI,GFEDCBA@?>=<;|98765.3t10/.-,+*)('&%$#\"!b}|{zy"
"xwvuWmVqjonmPkjihgfedcba`_B]\\[ZYXQ:UTSRQPONMLKJIHGFE(CBA"
"@?\"=<;|9876543210/.-n+*)('&}f#\"!~}|{zyxwvutsrqTonmlkNiL"
"gfe^c\\aD_X]\\[TY=<;:3z7654321"
"0/.-,+*)('h%$#\"!~}|{]s\\wputsVqponmlkjihgfeHcba`_^W@[ZYX"
"WVUTSRQPONMLK.IHGFEDCBA#9\"=6;:9z76543210/.-,+l)('&%$#z!b"
"}|{zyxwvutsrqponmPkjihgJedcFa`_^]\\[ZYXWVU8SRQPONMFK.IHGF"
"EDCBA@?>=<;:9z76543t1r/.-&+$)j'~%$#z!bw|{zyrwvuXsrqponmlk"
"jihgJedcba`_X]@[ZYXWVUTSRQPONMLK.IHGFEDCBA#9\"=6;:9z76543"
"210/.-,+l)('&%$#z!b}|{zyxwvutsrqponmPkjihgfedcE[D_X]\\[>Y"
"XWVUTSRQPONM0KJIHGFED=&A@?>=<;:987654321r/.-,+l)('h%$#\"!"
"~}|{zyxwZutsrqpongPkjihgfedcba`_^]\\[>YXWVU8S6QPOHMFK.IBG"
"FE>C&;@?>=6;:9z76543210/.-,+l)('&%$#\"yb}|{zyxwvutsrqponm"
"PkjihgfedcE[D_X]\\[>YXWVUTSRQPONM0KJIHGFED=&A@?>=<;:98765"
"4321r/.-,+*)('g}f#z!~}`{zyxwvutsrqpoRmlkjihgfe^cFa`_^]\\["
"ZYXWVUTSRQ4ONMLK.IHG*EDCBA@?>=<;:9z76543210/(-n+*)('&%$#\""
"!~}|{zy\\wvutsVqTonmfkdiLgf_dc\\aD_X]\\[TY=<;:98705v3210/.-,+*)('&%$#d!~}|{zyxwYoXslqp"
"oRmlkjihgfedcbaD_^]\\[ZYXWPU8SRQPONMLKJIHGFEDC&A@?>=<;:9y"
"1x5.321r/.-,+*)('&%$#d!~}|{zyxwvoXsrqponmlkjihgfedcFa`_^]"
"@[ZY=<;{3z70543t10/.-,+*)('&%f#\"!~}|{zyxqZutsr"
"qponmlkjihgfeHcba`_^]\\[=S=<;:"
"927x543210/.-,+*)('&%f#\"!~}`{zy\\wvutsrqponmlkNihgfedcba"
"`_X]@[ZYXWVUTSRQPONMLK.IHGFE(C&A@?8=6;|98165.3t1*/.-&+l#("
"'&%|#\"!b}|{zyxwvutsrqTonmlkjihgfe^cFa`_^]\\[ZYXWVUTSRQ4O"
"NMLKJIHG)?(CC7<;49z70543,1r).-,+$"
")('h%$#\"!~}|{zyxwZutsrqponmlkjihaJedcba`_^]\\[ZYXWVU8SRQ"
"PONMLK-C,G@EDC&A@?>=<;:98765v3210/.-,+*)('&}f#\"!~}|{zyxw"
"vutsrqTonmlkjihgI_Hc\\a`_B]\\[ZYXWVUTSRQ4ONMLKJIHGFEDCBA@"
"?8=~;:9876543210/.-,+l)('&%f#\"!b}|{zyxwvutsrqTonmlkjihgf"
"edcba`_X]@[ZYXWVUTSRQPONMLK.IHGFE(CBA$?>=<;:9876543t10/.-"
",+*)('&%$#\"!x}`{zyxwvutsrqponmlkNihgfedcbaCYB]V[>YXQVUNS"
"6QJONMFK.CHGFE>'%;@?>!<;:9876543210q.-,+*)('&%$#\"!~}|uz]"
"xwvutsrqponmlkjihKfedcba`_^@V?ZSXWV9TSRQPONMLKJIH+FEDCBA@"
"?>=<;:98765.u210/.-,+*)('&%$#\"c~}|{z]xwvYtsrqponmlkjihKf"
"edcba`_^]\\[ZYXWVUN7RQPONMLKJIHGFEDCB%@?>=<}:{876/4-2s*/."
"-,%*)(i&%$#\"!~}|{zyx[vutsrqponmlkjihgfe^Gba`_^]\\[ZYXWVU"
"TSR5PONMLKJIH*@)D=B%:?>=<5:98y6543210/.-,+*k('&%$#\"!~}|{"
"zyxwvunWrqponmlkjihgfedcbE`_^]\\[ZYX:P9TMRQP3NMLKJIHGFEDC"
"B%@?>=<;:9876543210/.',m*)('&%$#\"!~}|{zyx[vutsrUponQlkji"
"hgfedcba`C^]\\[ZYXWVUTSRQPONMLEJ-HGFEDCBA@?>=<;:98y65432s"
"0q(-,+*#('&g$#\"!~}|{zyxwvYtsrqponmlkjihgfedcb[`C^]\\[ZYX"
"WVUTSRQPON1LKJIHGFED&<%@9>!6;:981654u210/.-,+*)('&g$#\"!~"
"}|{zyxwvutsrqpinQlkjihgfedcba`_^]\\?ZYXWVUTSR4J3NGLKJ-HGF"
"EDCBA@?>=<}:9876543210/.-,+*)('~g$#\"!~}|{zyxwvutsrUponml"
"OjihKfedcba`_^]\\[Z=XWVUTSRQPONMLKJIHGFE>'BA@?>=<;:987654"
"32s0/.-,m*k('&}${\"c~}v{zsxwvYtsrqponmlkjihKfedcba`_^]\\["
"ZYXWVUTSL5PONMLKJIHGFEDCBA@#>=<;:9876v.u2+rp(-,+l)('&%$#\""
"!~}|{^yxwvutsrqponmlkjihgf_Hcba`_^]\\[ZYXWVUTS6QPONMLKJI"
"+A*E>CBA$?>=<;:9876543t10/.-,+*)('&%$#\"!~}|{ty\\wvutsrqp"
"onmlkjihgJedcbaD_^]@[ZYXWVUTSRQPO2MLKJIHGFEDCBA@?>=<;:927"
"x543210/.-,+*)('&%f#\"!~}`{^yxwpunsVqjonmfkjiLgfedcba`_^]"
"\\[>YXWVUTSRQPONMLKJIHGFE>C&A@?>=<;:987654321r/.-,+*)('g}"
"f#z!b}|uzyr[YotsrUponmlkjihgfedGba`_^]\\[ZYXWVUTSRQPONGL/"
"JIHGFEDCBA@?>=<;:{876543210p(o,%*)(i&%$#\"!~}|{zyx[vutsrq"
"ponmlkjihgfedcbaZC^]\\[ZYXWVUTSRQPON1LKJIH+FED'BA@?>=<;:9"
"876w43210/.-,+*)('&%$#\"!~}v_zyxwvutsrqponmlkjMhgfedGbE`_"
"^W\\UZYX;VUTSRQPONMLKJ-HGFEDCBA@?>=<;:9876543,s0/.-,+*)('"
"&%$#\"!~a|{zyxwvutVlUpiRPfkjiLgfedcba`_^]\\[>YXWVUTSRQPON"
"MLKJIHGFED=&A@?>=<;:987654321r/.-,+*)('g}f#z!~}`{zyxwvuts"
"rqpoRmlkjihgfedcba`_^]\\[ZYXWPU8SRQPONMLKJIHGFEDC&A@?>=~;"
":9z76543210/.-,+l)('&%$#\"!~}|{zyxwvutsrqjoRmlkjihgfedcba"
"`_^]@[ZYXW:UTS6QPONMLKJIHGFE(CBA@?>=<;:9876543210/.-&+l)("
"'&%$#\"!~}|{zyxwZutsrqponmOeNibgJedc\\aZCAW\\[Z=XWVUTSRQP"
"ONML/JIHGFEDCBA@?>=<;:987654-2s0/.-,+*)('&%$#\"!~a|{zyxwv"
"utVlUpinmlOjihgfedcba`_^A\\[ZYXWVUTSRQPONMLKJIHGFE>'BA@?>"
"=<;:98765432s0/.-,m*)(i&%$#\"!~}|{zyx[vutsrqponmlkjihgfed"
"cba`_XA\\[ZYXWVUTSRQPONML/JIHGF)DCB%@?>=<;:987654u210/.-,"
"+*)('&%$#\"!~}|{zyr[vutsrqponmlkjihgfIdcba`_^]\\>T=XQV9TS"
"LQPIN1LEJIHAF)>CBA@9\"~6;:9z76543210/.-,+l)('&%$#\"!~}|{z"
"yxwvutsrqpiRmlkjihgfedcba`_^]@[ZYXWVUTS5K4OHMLK.IHGFEDCBA"
"@?>=~;:9876543210/.-,+*)('&%$#z!b}|{zyxwvutsrqponmPkjihgJ"
"edcFa`_^]\\[ZYXWVU8SRQPONMLKJIHGFEDCBA@?>=<;49z76543210/."
"-,+*)('h%$#\"!b}|{^yxwvutsrqponmPkjihgfedcba`_^]\\[ZYXWVU"
"TSLQ4ONMLKJIHGFEDCBA@?\"=<;:98765u-t1*/.-n+*)('&%$#\"!~}`"
"{zyxwvutsrqponmlkjihgfedc\\aD_^]\\[ZYXWVUTSRQPO2MLKJIHGFE"
"'=&A:?>=~;:9876543210/p-,+*)('&%$#\"!~}|{zyxwvutsrkTonmlk"
"jihgfedcba`_B]\\[ZY=<;:9876543"
"210/.-,%l)('&%$#\"!~}|{zyxwZutsrqToRmlkdibgfeHcba`_^]\\[Z"
"YXW:UTSRQPONMLKJIHGFEDCBA@?>=<5|9876543210/.-,+*)j'&%$#\""
"!~}_u^yrwZutmrqjoRmfkjibgJ_dcbaZCAW\\[Z=XWVUTSRQPONML/JIH"
"GFEDCBA@?>=<;:987654321*q.-,+*)('&%$#\"!~}|_zyxwvutsrTjSn"
"glkjMhgfedcba`_^]\\?ZYXWVUTSRQPONMLKJIHGFEDCBA@9>!<;:9876"
"543210/.-,m*)('&g$#\"c~}|{zyxwvutsrUponmlkjihgfedcba`_^]\\"
"[ZYXWVOT7RQPONMLKJIHGFEDCB%@?>=<}:{876/4-2s*/.-,%*)(i&%$"
"#\"!~}|{zyx[vutsrqponmlkjihgfedcba`_^]\\UZ=XWVUTSRQPONMLK"
"JIH+FEDCBA@?>~6}:38y654-2+0q(-,+*#('&g$#\"!~}|{zyxwvYtsrq"
"ponmlkjihgfedcba`_^]\\[ZSX;VUTSRQPONMLKJIHGF)DCBA@?>=<|4{"
"81654u210/.-,+*)('&g$#\"!~}|{zyxwvutsrqponmlkjihg`Idcba`_"
"^]\\[ZYXWVUT7RQPON1LKJ-HGFEDCBA@?>=<}:9876543210/.-,+*)('"
"&%$#\"!~}v_zyxwvutsrqponmlkjMhgfedGbE`_X]\\UZ=RWVUTMRQP3N"
"MLKJIHGFEDCB%@?>=<;:9876543210/.-,+*)('&%|e\"!~}|{zyxwvut"
"srqpSnmlkjihgfH^Gb[`_^A\\[ZYXWVUTSRQP3NMLKJIHGFEDCBA@?>=<"
";:9876543,s0/.-,+*)('&%$#\"!~a|{zyxwvutVlUpinmlOjihgfedcb"
"a`_^A\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@9>!<;:9876543210/.-,m*"
")('&g$#\"c~}|{zyxwvutsrUponmlkjihgfedcba`_^]\\[ZYXWVUTMR5"
"PONMLKJIHGFEDCBA@#>=<;:{8y654-2+0q.-&+*#(i~%$#\"y~}|_zyxw"
"vutsrqponQlkjihgfedcba`_^]\\[ZYXWVUTSRQPIN1LKJIHGFEDCBA@?"
">=<}:98765432r*q.',m*)\"'&}$#\"c~}|{zyxwvutsrUponmlkjihgf"
"edcba`_^]\\[ZYXWVUTMR5PONMLKJIHGFEDCBA@#>=<;:9876v.u2+0/."
"o,+*)('&%$#\"!~a|{zyxwvutsrqponmlkjihgfedcba`_XA\\[ZYXWVU"
"TSRQPONML/JIHGF)DCB%@?>=<;:987654u210/.-,+*)('&%$#\"!~}|{"
"zyxwvutslUponmlkjihgfedcba`C^]\\[Z=X;VUTMRKP3NMFKJCH+F?DC"
"B;@?>!<;:9876543210q.-,+*)('&%$#\"!~}|{zyxwvutsrqpohQlkji"
"hgfedcba`_^]\\?ZYXWVUTSR4J3NG0.DIHG*EDCBA@?>=<;:9z7654321"
"0/.-,+*)('&%$#\"!~}|{zyxqZutsrqponmlkjihgfeHcba`_^]\\[=S<"
"WPUTS6QPONMLKJIHGFE(CBA@?>=<;:9876543210/.-,+*)('&%|#d!~}"
"|{zyxwvutsrqpoRmlkjiLgfeHcba`_^]\\[ZYXW:UTSRQPONMLKJIHGFE"
"DCBA@?>=<;:98705v3210/.-,+*)('&%$#d!~}|{^y\\wvotslqTinmlk"
"dihgJedcba`_^]\\[ZY=<;:927x543"
"210/.-,+*)('&%f#\"!~}|{zy[qZunsrqTonmlkjihgfedcFa`_^]\\[Z"
"YXWVUTSRQPONMLKJIHGFEDC=<;:9876543210/p-,+*)('&%e{d!"
"x}|{^yxwvutsrqponmPkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLE.IHG"
"FEDCBA@?>=<;:9z76543t10/p-,+*)('&%$#\"!b}|{zyxwvutsrqponm"
"lkjihgfedcba`_^W@[ZYXWVUTSRQPONMLK.IHGFE(C&A@?8=6;|98165."
"3t+0/.-&+*)j'&%$#\"!~}|{zy\\wvutsrqponmlkjihgfedcba`_^]\\"
"[ZYXQ:UTSRQPONMLKJIHGFE(CBA@?>=<;{3z705v32+0/(-,+l)('&%$#"
"\"!~}|{^yxwvutsrqponmlkjihgfedcba`_^]\\[ZS=}5|92765v3210/.-,+*)('h%$#\"!~}|{zyxwvutsrqp"
"onmlkjihgfedc\\aD_^]\\[ZYXWVUTSRQPO2MLKJI,GFE(CBA@?>=<;:9"
"87x543210/.-,+*)('&%$#\"!~}|{zyxwvutslqTonmlkjihgfedcba`_"
"B]\\[ZY=<;:9876543210/.-,+*)('"
"&%|#d!~}|{zyxwvutsrqpoRmlkjihgfeG]FaZ_B]\\UZYRW:OTSRQJ31G"
"LKJ-HGFEDCBA@?>=<}:9876543210/.-,+*)('&%$#\"!~}|{zyxqvYts"
"rqponmlkjihgfedGba`_^]\\[Z=<;"
":9876543210/.-,+*)('&%$#\"!xa|{zyxwvutsrqponmlOjihgfIdcbE"
"`_^]\\[ZYXWVUT7RQPONMLKJIHGFEDCBA@?>=<;:987654321*q.-,+*)"
"('&%$#\"!~}|_zyxwvYtWrqjonglOdihgf_dcbE`_^]\\[ZYXWVUT7RQP"
"ONMLKJIHGFEDCBA@?>=<;:987654321*q.-,+*)('&%$#\"!~}|_zyxwv"
"utsrTjSnglkjMhgfedcba`_^]\\?ZYXWVUTSRQPONMLKJIHGFEDCBA@?>"
"=<;:92y6543210/.-,+*)('&g$#\"!~}|{z\\r[votsrUponmlkjihgfe"
"dGba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@9>!<;:9876543210/.-"
",m*)('&g$#\"c~}|{zyxwvutsrUponmlkjihgfedcba`_^]\\[ZYXWVUT"
"SRQPONGL/JIHGFEDCBA@?>=<;:{87654u2s0/.',%*k('~%${\"cx}|{z"
"sxwvYtsrqponmlkjihKfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFED=B"
"%@?>=<;:9876543210q.-,+*)('&f|e\"y~a|{tyxqvutWrqponmlkjih"
"gfIdcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCB;@#>=<;:9876543210"
"/.o,+*)('&%$dzc~w|{z]xwvutsrqponmlOjihgfedcba`_^]\\[ZYXWV"
"UTSRQPONMLKJIHG@)DCBA@?>=<;:987654u210/.o,+*k('&%$#\"!~}|"
"{z]xwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUN7RQPONMLKJIHGFED"
"CB%@?>=<}:98y6543210/.-,+*k('&%$#\"!~}|{zyxwvutsrqponmlkj"
"ihgfedc\\E`_^]\\[ZYXWVUTSRQP3NMLKJIHGF(>'B;@#>=<5:38y6/43"
"2+0q(-,+*#jh~%$#d!~}|{zyxwvutsVqponmlkjihgfedcba`_^]\\[ZY"
"XWVUTSRQPONG0KJIHGFEDCBA@?>=<;|98765v3210/.-,+*";
int needed_rotwidth = 10;
code = (char*)malloc(1);
if (!code) {
fprintf(stderr, "error: cannot allocate memory\n");
return 1;
}
retry:
code[0]=0;
current_code_size=0;
int min_rot_width = 10;
inc_min_rotwidth(&min_rot_width, needed_rotwidth, c);
int unicode;
int len;
int old_unicode = -1;
const char* tmp = out_string;
const char* end = out_string + out_len;
do {
unicode = 0;
len = next_unicode(&unicode, tmp, end-tmp);
if (unicode >= 0 && unicode == old_unicode) {
add_code("= 0){
if (get_width(unicode) > min_rot_width) {
needed_rotwidth = get_width(unicode);
// restart process with new rotwidth
goto retry;
}
int tmp = needed_rotwidth;
initialize_memory_cell(unicode,c,min_rot_width,
&needed_rotwidth);
if (tmp != needed_rotwidth) {
// restart process with new rotwidth
goto retry;
}
}
tmp += len;
}while(len > 0 && tmp < end);
add_code("v");
while ((current_code_size + c) % 94 != 17) {
add_code("o");
}
add_code("<<");
denormalize(code,c);
printf("%s",init_module);
printf("%s\n",code);
}
void initialize_memory_cell(long long value, long long c_start_offset,
int min_rot_width, int* needed_rotwidth) {
// generate cell_position in var2, value in var1,
// return-address (c-register) in var3
// call ROTATION-MODULE
// load C1, jump to [var2], crazy, jump to [var2], crazy,
// jump to var1, rot, jump to [var2], crazy
// continue...
// alternative (fuer hello world):
// generate value in var1, return-address (c-register) in var3
// call ROTATION-MODULE
// jump to var1, rot, out
// continue...
// expect D=65
// generate only trits startig with ...0:
// generate 2 by crz 2, 1
// generate 1 by crz 2, 2
// generate 0 by crz 1, 1
int i;
for (i=0;i min_rot_width) {
*needed_rotwidth = get_width(backjump_address);
// error occured...
}
add_code("*oooooojpjoooooooojpjo");
long long gen = 0;
long long tmp = backjump_address;
long long factor = 1;
while (tmp!=0) {
if (tmp % 3==0) {
gen += factor;
}else{
gen += 2*factor;
}
factor *= 3;
tmp /= 3;
}
set_gen_init_03(gen, min_rot_width, 0);
//printf("bja1-gen: %d\n",gen);
add_code("oooojpjo");
gen = 0;
tmp = backjump_address;
factor = 1;
while (tmp!=0) {
if (tmp % 3==1) {
gen += 2*factor;
}else{
gen += factor;
}
factor *= 3;
tmp /= 3;
}
set_gen_init_03(gen, min_rot_width, 0);
//printf("bja2-gen: %d\n",gen);
add_code("oooojpjo");
add_code("oooooooooji");
if (backjump_address+1
>= c_start_offset + current_code_size) {
while (backjump_address+1
> c_start_offset + current_code_size) {
add_code("o");
}
add_code("jo");
//printf("bja: %d\n",backjump_address);
break;
}
address_gen_size += c_start_offset + current_code_size
- backjump_address;
current_code_size = reset_point;
code[reset_point] = 0;
}while(1);
add_code("oooooj*j<");
}
void set_gen_init_03(long long value, int width, int omit_last_rot) {
int i;
// expect: const-gen-module; address 54 == C1; A=C1
// if value == C1
// return(success)
// expect D=65
add_code("*opjp");
int anything_set = 0;
// D=68, A=C1
for (i=0;i