static void print_string(char * str) { char buf[256]; int badchar = 0; size_t outlen = 0; if (!str) return; for(;; str++) { if (outlen && (*str == 0 || badchar || outlen > sizeof(buf)-8)) { buf[outlen] = 0; if (badchar == '\n') { prv("writeln('%s');", buf); badchar = 0; } else { prv("write('%s');", buf); } outlen = 0; } if (badchar) { prv("write(chr(%d));", badchar); badchar = 0; } if (!*str) break; if (*str >= ' ' && *str <= '~' && *str != '\\' && *str != '\'') { buf[outlen++] = *str; } else { badchar = (*str & 0xFF); } } }
static void print_dstring(void) { char * str = get_string(); char buf[256]; int gotnl = 0; size_t outlen = 0; if (!str) return; for(;; str++) { if (outlen && (*str == 0 || gotnl || outlen > sizeof(buf)-8)) { buf[outlen] = 0; if (gotnl) { buf[outlen-2] = 0; prv("writeln(\"%s\");", buf); } else prv("write(\"%s\");", buf); gotnl = 0; outlen = 0; } if (!*str) break; if (*str == '\n') gotnl = 1; if (*str >= ' ' && *str <= '~' && *str != '"' && *str != '\\') { buf[outlen++] = *str; } else if (*str == '"' || *str == '\\') { buf[outlen++] = '\\'; buf[outlen++] = *str; } else if (*str == '\n') { buf[outlen++] = '\\'; buf[outlen++] = 'n'; } else if (*str == '\t') { buf[outlen++] = '\\'; buf[outlen++] = 't'; } else { char buf2[16]; int n; sprintf(buf2, "\\%03o", *str & 0xFF); for(n=0; buf2[n]; n++) buf[outlen++] = buf2[n]; } } }
static void print_string(void) { char * str = get_string(); char buf[256]; int badchar = 0; size_t outlen = 0; if (!str) return; for(;; str++) { if (outlen && (*str == 0 || badchar || outlen > sizeof(buf)-8)) { buf[outlen] = 0; if (badchar == '\n') { prv("echo '%s'", buf); badchar = 0; } else { do_output++; prv("echon '%s'", buf); } outlen = 0; } if (badchar) { prv("o %d", badchar); badchar = 0; do_output++; } if (!*str) break; if (*str == '-' && outlen == 0) { badchar = (*str & 0xFF); } else if (*str >= ' ' && *str <= '~' && *str != '\\' && *str != '\'') { buf[outlen++] = *str; } else { badchar = (*str & 0xFF); } } }
openssl::Key BackendOpenSsl::internal_private_key(const ecdsa256::PrivateKey& generic) const { openssl::Key key(NID_X9_62_prime256v1); openssl::BigNumber prv(generic.key); EC_KEY_set_private_key(key, prv); // OpenSSL requires public key, so we recreate it from private key openssl::BigNumberContext ctx; const EC_GROUP* group = EC_KEY_get0_group(key); openssl::Point pub(group); openssl::check(EC_POINT_mul(group, pub, prv, nullptr, nullptr, ctx)); EC_KEY_set_public_key(key, pub); openssl::check(EC_KEY_check_key(key)); return key; }
void lima_lower_to_gp_ir(lima_shader_t* shader) { ir_dead_branches_visitor dbv; dbv.run(shader->linked_shader->ir); shader->ir.gp.gp_prog = lima_gp_ir_prog_create(); gp_ir_visitor v(shader->ir.gp.gp_prog, &shader->symbols, shader->glsl_symbols, &dbv); v.run(shader->linked_shader->ir); phi_rewrite_visitor prv(&v); prv.run(shader->linked_shader->ir); unsigned temp_size = shader->symbols.temporary_table.total_size; shader->ir.gp.gp_prog->temp_alloc = (temp_size + 3) / 4; }
void outcmd(int ch, int count) { if (curr_offset >= 0) { if (ch == '>') { curr_offset += count; return; } if (ch == '<' && curr_offset > count) { curr_offset -= count; return; } if (ch != '"' && ch != '~') { pr("typeset -i M P V"); prv("P=%d", curr_offset); curr_offset = -1; } } switch(ch) { case '!': pr("#!/bin/ksh"); pr("(eval 'set -o sh +o sh') 2>/dev/null && set +o sh 2>/dev/null"); pr("(eval 'set -o posix +o posix') 2>/dev/null && set +o posix 2>/dev/null"); pr("if (eval 'typeset -i M P V && M[1]=3 && ((M[500]+=1,1)) &&"); pr(" ((M[1]+=1)) && [[ ${M[1]} -eq 4 && ${M[500]} -eq 1 ]]' ) 2>/dev/null"); pr("then :"); pr("else"); pr(" echo 'ERROR: The shell must be Ksh93 compatible' >&2"); pr(" exit 1"); pr("fi"); pr(""); pr("(eval 'set -f +B') 2>/dev/null && set -f +B 2>/dev/null"); pr("export LC_ALL=C"); pr(""); pr("brainfuck() {"); ind++; curr_offset = tapeinit; break; case 'X': shcode(); pr("echo Infinite Loop 2>&1 ; exit 1"); break; case '=': if (in_arith) prv(" M[P]=%d,", count); else prv("M[P]=%d", count); break; case 'B': arith(); if(bytecell) pr(" M[P]&=255,"); pr(" V=M[P],"); break; case 'M': arith(); prv(" M[P]+=V*%d,", count); break; case 'N': arith(); prv(" M[P]-=V*%d,", count); break; case 'S': arith(); pr(" M[P]+=V,"); break; case 'Q': arith(); prv(" V)) && ((M[P]=%d,", count); shcode(); break; case 'm': arith(); prv(" V)) && ((M[P]+=V*%d,", count); shcode(); break; case 'n': arith(); prv(" V)) && ((M[P]-=V*%d,", count); shcode(); break; case 's': arith(); pr(" V)) && ((M[P]+=V,"); shcode(); break; case '+': arith(); prv(" M[P]+=%d,", count); break; case '-': arith(); prv(" M[P]-=%d,", count); break; case '>': arith(); prv(" P+=%d,", count); break; case '<': arith(); prv(" P-=%d,", count); break; case '.': shcode(); pr("o $((M[P]&255))"); do_output++; break; case ',': shcode(); pr("getch"); do_input++; break; case '"': shcode(); print_string(); break; case '[': shcode(); if(bytecell) { pr("while (( (M[P]&=255) != 0)) ; do"); } else { pr("while ((M[P])) ; do"); } ind++; break; case ']': shcode(); ind--; pr("done"); break; case '~': shcode(); ind--; pr("}"); if (do_output) { pr("echon() { printf \"%%s\" \"$*\" ;}"); pr("if ((BASH_VERSINFO[0]>0)) ; then"); pr(" # Bash works but so slooooow"); pr(" o(){ printf -v C '\\\\%%04o' $1; echo -n -e \"$C\" ; }"); pr("elif ( ( eval ': ${.sh.version}' ) 2>/dev/null >&2 ) ; then"); pr(" # A real Ksh93 has a fast printf"); pr(" o(){ printf \"\\\\x$(printf %%02x $1)\";}"); pr("else"); pr(" # Hopefully the ksh88 version is quick"); pr(" o() { typeset -i8 N ; N=$1; print -n - \\\\0$(print ${N#*#});}"); pr(" echon() { print -n - \"$*\" ;}"); pr("fi"); /* Safe fallback */ pr("[ \"`{ o 65;echon A;} 2>/dev/null`\" != AA ] && {"); pr(" o() { echo $1 | awk '{printf \"%%c\",$1;}';}"); pr(" echon() { awk -v S=\"$*\" 'BEGIN{printf \"%%s\",S;}';}"); pr("}"); } if (do_input) { pr(""); pr("getch() {"); pr(" [ \"$goteof\" = \"y\" ] && return;"); pr(" [ \"$gotline\" != \"y\" ] && {"); pr(" if read -r line"); pr(" then"); pr(" gotline=y"); pr(" else"); pr(" goteof=y"); pr(" return"); pr(" fi"); pr(" }"); pr(" [ \"$line\" = \"\" ] && {"); pr(" gotline=n"); pr(" ((M[P]=10))"); pr(" return"); pr(" }"); ind++; pr("if ((BASH_VERSINFO[0]>0)) ; then"); pr(" c=\"${line:0:1}\""); pr(" line=\"${line:1}\""); pr(" printf -v C %%d \"'$c\""); pr(""); pr("elif ( line=nnynnn; j=2; [[ \"${line:j:1}\" == y ]] ) 2>/dev/null ; then"); pr(" c=\"${line:0:1}\""); pr(" line=\"${line:1}\""); pr(" C=$(printf %%d \"'$c\")"); pr(""); pr("else"); pr(" C=\"$line\""); pr(" while [ ${#C} -gt 1 ] ; do C=\"${C%%?}\"; done"); pr(" line=\"${line#?}\""); pr(" C=`echo \"$C\" |dd bs=1 count=1 2>/dev/null |od -d |awk 'NR==1{print 0+$2;}'`"); pr("fi"); pr("((M[P]=C))"); ind--; pr("}"); } pr(""); pr("set -e"); pr("brainfuck"); break; } }
void outcmd(int ch, int count) { struct instruction * n = calloc(1, sizeof*n), *n2; if (!n) { perror("bf2pas"); exit(42); } icount ++; n->ch = ch; n->count = count; n->icount = icount; if (ch == '"') n->cstr=strdup(get_string()); if (!last) { pgm = n; } else { last->next = n; } last = n; if (n->ch == '[') { n->ino = ++lblcount; n->loop = jmpstack; jmpstack = n; } else if (n->ch == ']') { n->loop = jmpstack; jmpstack = jmpstack->loop; n->loop->loop = n; } if (ch != '~') return; loutcmd(0, 0, 0); if (icount < MAXWHILE) { for(n=pgm; n; n=n->next) loutcmd(n->ch, n->count, n); } else { for(n=pgm; n; n=n->next) { if (n->ch != ']') continue; if (n->icount-n->loop->icount <= MAXWHILE) continue; loutcmd(1000, 1, n->loop); for(n2 = n->loop->next; n != n2; n2=n2->next) { if (n2->ch == '[' && n2->loop->icount-n2->icount > MAXWHILE) { loutcmd(n2->ch, n2->count, n); prv("bf%d()", n2->ino); n2 = n2->loop; loutcmd(n2->ch, n2->count, n); } else loutcmd(n2->ch, n2->count, n2); } loutcmd(1001, 1, n); } for(n=pgm; n; n=n->next) { if (n->ch != '[' || n->loop->icount-n->icount <= MAXWHILE) loutcmd(n->ch, n->count, n); else { loutcmd(n->ch, n->count, n); prv("bf%d()", n->ino); n=n->loop; loutcmd(n->ch, n->count, n); } } } while(pgm) { n = pgm; pgm = pgm->next; if (n->cstr) free(n->cstr); memset(n, '\0', sizeof*n); free(n); } }
void loutcmd(int ch, int count, struct instruction *n) { switch(ch) { case 1000: prv("procedure bf%d();", n->ino); pr("begin"); ind++; break; case 1001: ind--; pr("end;"); break; case 0: pr("var"); ind++; if (bytecell) prv("tape : packed array [0..%d] of byte;", tapesz); else prv("tape : packed array [0..%d] of longint;", tapesz); pr("tapepos : longint;"); pr("v : longint;"); pr("inch : char;"); ind --; pr(""); break; case '!': pr("begin"); ind ++; prv("tapepos := %d;", tapeinit); break; case '=': prv("tape[tapepos] := %d;", count); break; case 'B': pr("v := tape[tapepos];"); break; case 'M': prv("tape[tapepos] := tape[tapepos] + %d*v;", count); break; case 'N': prv("tape[tapepos] := tape[tapepos] - %d*v;", count); break; case 'S': pr("tape[tapepos] := tape[tapepos] + v;"); break; case 'Q': prv("if v <> 0 then tape[tapepos] := %d;", count); break; case 'm': prv("if v <> 0 then tape[tapepos] := tape[tapepos] + %d*v;", count); break; case 'n': prv("if v <> 0 then tape[tapepos] := tape[tapepos] - %d*v;", count); break; case 's': pr("if v <> 0 then tape[tapepos] := tape[tapepos] + v;"); break; case '+': prv("tape[tapepos] := tape[tapepos] + %d;", count); break; case '-': prv("tape[tapepos] := tape[tapepos] - %d;", count); break; case '<': prv("tapepos := tapepos - %d;", count); break; case '>': prv("tapepos := tapepos + %d;", count); break; case '[': pr("while tape[tapepos] <> 0 do begin"); ind++; break; case 'X': pr("{Infinite Loop};"); break; case ']': ind--; pr("end;"); break; case ',': pr("if not eof then begin read(inch); tape[tapepos] := ord(inch); end;"); break; case '.': pr("write(chr(tape[tapepos]));"); break; case '"': print_string(n->cstr); break; case '~': ind --; pr("end."); break; } }
void outcmd(int ch, int count) { switch(ch) { case '!': ofd = stdout; pr("module f**k;"); /* Required to prevent really stupid error messages. */ pr("import std.stdio;"); pr("void main(){"); ind++; if (bytecell) { prv("char[] mem; mem.length = %d; mem[] = 0;", tapesz); prv("int m = %d;", tapeinit); pr("int v;"); } else { prv("int[] mem; mem.length = %d; mem[] = 0;", tapesz); prv("int v, m = %d;", tapeinit); } pr("stdout.setvbuf(0, _IONBF);"); break; case '~': ind--; pr("}"); break; case 'X': pr("throw new Exception(\"Trivial Infinite Loop Hit.\");"); break; case '=': prv("mem[m] = %d;", count); break; case 'B': pr("v = mem[m];"); break; case 'M': prv("mem[m] += v*%d;", count); break; case 'N': prv("mem[m] -= v*%d;", count); break; case 'S': pr("mem[m] += v;"); break; case 'Q': prv("if(v) mem[m] = %d;", count); break; case 'm': prv("if(v) mem[m] += v*%d;", count); break; case 'n': prv("if(v) mem[m] -= v*%d;", count); break; case 's': pr("if(v) mem[m] += v;"); break; case '+': prv("mem[m] +=%d;", count); break; case '-': prv("mem[m] -=%d;", count); break; case '>': prv("m += %d;", count); break; case '<': prv("m -= %d;", count); break; case '.': pr("write(cast(char)mem[m]);"); break; case '"': print_dstring(); break; case ',': pr("v = getchar(); if(v!=EOF) mem[m] = v;"); break; case '[': pr("while(mem[m]) {"); ind++; break; case ']': ind--; pr("}"); break; } }