static void scalarstr (Tobj to) { switch (Tgettype (to)) { case T_INTEGER: appendi (Tgetinteger (to)); break; case T_REAL: appendd (Tgetreal (to)); break; case T_STRING: appends ("\""), appends (Tgetstring (to)), appends ("\""); break; case T_CODE: codestr (to, 0); break; } }
int main () { int num = -1234567890; printf("number: %d\n", num); printf("string: %s\n", itos(num)); double real = -25.93333333; printf("number: %f\n", real); printf("string: %s\n", dtos(real)); double zero = 0.0; printf("number: %f\n", zero); printf("string: %s\n", dtos(zero)); OutputBuffer *buf = createBuffer(); append(buf, "number: "); appendi(buf, num); append(buf, "\nfloat: "); appendd(buf, real); append(buf, "\nzero: "); appendd(buf, zero); append(buf, "\n"); printf("buffer:\n\n%s\n", readBuffer(buf, 0)); destroyBuffer(buf); }
static void codestr (Tobj co, int ci) { int ct, ct1; int ci1, ci2; if (highci == ci) appends (" >> "); switch ((ct = TCgettype (co, ci))) { case C_ASSIGN: codestr (co, (ci1 = TCgetfp (co, ci))); appends (" = "); codestr (co, TCgetnext (co, ci1)); break; case C_OR: case C_AND: case C_EQ: case C_NE: case C_LT: case C_LE: case C_GT: case C_GE: case C_PLUS: case C_MINUS: case C_MUL: case C_DIV: case C_MOD: codestr (co, (ci1 = TCgetfp (co, ci))); switch (ct) { case C_OR: appends (" | "); break; case C_AND: appends (" & "); break; case C_EQ: appends (" == "); break; case C_NE: appends (" ~= "); break; case C_LT: appends (" < "); break; case C_LE: appends (" <= "); break; case C_GT: appends (" > "); break; case C_GE: appends (" >= "); break; case C_PLUS: appends (" + "); break; case C_MINUS: appends (" - "); break; case C_MUL: appends (" * "); break; case C_DIV: appends (" / "); break; case C_MOD: appends (" % "); break; } codestr (co, TCgetnext (co, ci1)); break; case C_NOT: appends ("~"); codestr (co, TCgetfp (co, ci)); break; case C_UMINUS: appends ("-"); codestr (co, TCgetfp (co, ci)); break; case C_PEXPR: appends ("("); codestr (co, TCgetfp (co, ci)); appends (")"); break; case C_FCALL: codestr (co, (ci1 = TCgetfp (co, ci))); appends (" ("); codestr (co, TCgetnext (co, ci1)); appends (")"); break; case C_INTEGER: appendi (TCgetinteger (co, ci)); break; case C_REAL: appendd (TCgetreal (co, ci)); break; case C_STRING: appends ("\""), appends (TCgetstring (co, ci)), appends ("\""); break; case C_GVAR: case C_LVAR: ci1 = TCgetfp (co, ci); appends (TCgetstring (co, ci1)); if (ct == C_LVAR) ci1 = TCgetnext (co, ci1); for ( ci1 = TCgetnext (co, ci1); ci1 != C_NULL; ci1 = TCgetnext (co, ci1) ) { switch (TCgettype (co, ci1)) { case C_STRING: appends ("."), appends (TCgetstring (co, ci1)); break; case C_INTEGER: appends ("["); appendi (TCgetinteger (co, ci1)); appends ("]"); break; case C_REAL: appends ("["); appendd (TCgetreal (co, ci1)); appends ("]"); break; default: appends ("["); codestr (co, ci1); appends ("]"); } } break; case C_PVAR: appends ("<var>"); break; case C_FUNCTION: ci1 = TCgetnext (co, TCgetnext (co, TCgetfp (co, ci))); appends ("function ("); codestr (co, ci1); ci1 = TCgetnext (co, ci1); if (TCgettype (co, ci1) == C_INTERNAL) { appends (") internal \""); appends (Ifuncs[TCgetinteger (co, TCgetfp (co, ci1))].name); appends ("\""); } else { appends (") {"); INDINC (2); for (; ci1 != C_NULL; ci1 = TCgetnext (co, ci1)) { appendnl (); if (TCgettype (co, ci1) == C_DECL) appends ("local "), codestr (co, ci1), appends (";"); else codestr (co, ci1); } INDDEC (2); appendnl (); appends ("}"); } break; case C_TCONS: appends ("["); INDINC (2); ci1 = TCgetfp (co, ci); while (ci1 != C_NULL) { appendnl (); codestr (co, ci1); appends (" = "); ci1 = TCgetnext (co, ci1); codestr (co, ci1); appends (";"); ci1 = TCgetnext (co, ci1); } INDDEC (2); appendnl (); appends ("]"); break; case C_DECL: ci1 = TCgetfp (co, ci); while (ci1 != C_NULL) { appends (TCgetstring (co, ci1)); ci1 = TCgetnext (co, ci1); if (ci1 != C_NULL) appends (", "); } break; case C_STMT: ci1 = TCgetfp (co, ci); if (ci1 == C_NULL) { appends (";"); break; } if (TCgetnext (co, ci1) == C_NULL) { codestr (co, ci1); ct1 = TCgettype (co, ci1); if (!C_ISSTMT (ct1)) appends (";"); } else { appends (" {"); INDINC (2); for (; ci1 != C_NULL; ci1 = TCgetnext (co, ci1)) { appendnl (); codestr (co, ci1); } INDDEC (2); appendnl (); appends ("}"); } break; case C_IF: ci1 = TCgetfp (co, ci); appends ("if ("); codestr (co, ci1); appends (")"); ci1 = TCgetnext (co, ci1); ci2 = TCgetfp (co, ci1); if (ci2 == C_NULL || TCgetnext (co, ci2) == C_NULL) { INDINC (2); appendnl (); codestr (co, ci1); INDDEC (2); } else { codestr (co, ci1); } ci1 = TCgetnext (co, ci1); if (ci1 == C_NULL) break; if (ci2 == C_NULL || TCgetnext (co, ci2) == C_NULL) { appendnl (); appends ("else"); } else { appends (" else"); } ci2 = TCgetfp (co, ci1); if (ci2 == C_NULL || TCgetnext (co, ci2) == C_NULL) { INDINC (2); appendnl (); codestr (co, ci1); INDDEC (2); } else { codestr (co, ci1); } break; case C_WHILE: ci1 = TCgetfp (co, ci); appends ("while ("); codestr (co, ci1); ci1 = TCgetnext (co, ci1); ci2 = TCgetfp (co, ci1); if (ci2 == C_NULL || TCgetnext (co, ci2) == C_NULL) { appends (")"); INDINC (2); appendnl (); codestr (co, ci1); INDDEC (2); } else { appends (")"); codestr (co, ci1); } break; case C_FOR: ci1 = TCgetfp (co, ci); appends ("for ("); codestr (co, ci1); appends ("; "); ci1 = TCgetnext (co, ci1); codestr (co, ci1); appends ("; "); ci1 = TCgetnext (co, ci1); codestr (co, ci1); ci1 = TCgetnext (co, ci1); ci2 = TCgetfp (co, ci1); if (ci2 == C_NULL || TCgetnext (co, ci2) == C_NULL) { appends (")"); INDINC (2); appendnl (); codestr (co, ci1); INDDEC (2); } else { appends (")"); codestr (co, ci1); } break; case C_FORIN: ci1 = TCgetfp (co, ci); appends ("for ("); codestr (co, ci1); appends (" in "); ci1 = TCgetnext (co, ci1); codestr (co, ci1); ci1 = TCgetnext (co, ci1); ci2 = TCgetfp (co, ci1); if (ci2 == C_NULL || TCgetnext (co, ci2) == C_NULL) { appends (")"); INDINC (2); appendnl (); codestr (co, ci1); INDDEC (2); } else { appends (")"); codestr (co, ci1); } break; case C_BREAK: appends ("break;"); break; case C_CONTINUE: appends ("continue;"); break; case C_RETURN: ci1 = TCgetfp (co, ci); appends ("return"); if (ci1 != C_NULL) { appends (" "); codestr (co, ci1); } appends (";"); break; case C_ARGS: ci1 = TCgetfp (co, ci); while (ci1 != C_NULL) { codestr (co, ci1); ci1 = TCgetnext (co, ci1); if (ci1 != C_NULL) appends (", "); } break; default: panic1 (POS, "codestr", "bad object type: %d", ct); } }