diff options
Diffstat (limited to 'libslang/src/util/bcdump.c')
-rw-r--r-- | libslang/src/util/bcdump.c | 457 |
1 files changed, 457 insertions, 0 deletions
diff --git a/libslang/src/util/bcdump.c b/libslang/src/util/bcdump.c new file mode 100644 index 0000000..04c64e4 --- /dev/null +++ b/libslang/src/util/bcdump.c @@ -0,0 +1,457 @@ +#include <stdio.h> +#include <stdio.h> +#include "sl-feat.h" +#include "slang.h" +#include "_slang.h" + +static void dump_token (_SLang_Token_Type *t) +{ + char buf [256], *b; + + b = buf; + + if (SLang_Error) + return; + + switch (t->type) + { + case IDENT_TOKEN: + b = t->v.s_val; + break; + + case CHAR_TOKEN: + case INT_TOKEN: + sprintf (buf, "%ld", t->v.long_val); + break; + + case DOUBLE_TOKEN: + b = t->v.s_val; + break; + + case STRING_TOKEN: + sprintf (buf, "\"%s\"", t->v.s_val); + break; + + case PLUSPLUS_TOKEN: + sprintf (buf, "++%s", t->v.s_val); + break; + + case POST_PLUSPLUS_TOKEN: + sprintf (buf, "%s++", t->v.s_val); + break; + + case MINUSMINUS_TOKEN: + sprintf (buf, "--%s", t->v.s_val); + break; + + case POST_MINUSMINUS_TOKEN: + sprintf (buf, "%s--", t->v.s_val); + break; + + case MINUSEQS_TOKEN: + sprintf (buf, "-=%s", t->v.s_val); + break; + + case PLUSEQS_TOKEN: + sprintf (buf, "+=%s", t->v.s_val); + break; + + case ASSIGN_TOKEN: + sprintf (buf, "=%s", t->v.s_val); + break; + + case EOF_TOKEN: + b = "EOF_TOKEN"; + break; + + case NOP_TOKEN: + b = "NOP_TOKEN"; + break; + + case FOREVER_TOKEN: + b = "forever"; + break; + + case ARG_TOKEN: + b = "__args"; + break; + + case EARG_TOKEN: + b = "__eargs"; + break; + + case FARG_TOKEN: + b = "__farg"; + break; + + case _INLINE_ARRAY_TOKEN: + b = "__inline_array"; + break; + + case _INLINE_IMPLICIT_ARRAY_TOKEN: + b = "__inline_implicit_array"; + break; + + case IFNOT_TOKEN: + b = "!if"; + break; + + case ABS_TOKEN: + b = "abs"; + break; + + case LT_TOKEN: + b = "<"; + break; + + case LE_TOKEN: + b = "<="; + break; + + case GT_TOKEN: + b = ">"; + break; + + case GE_TOKEN: + b = ">="; + break; + + case EQ_TOKEN: + b = "=="; + break; + + case NE_TOKEN: + b = "!="; + break; + + case AND_TOKEN: + b = "and"; + break; + + case IF_TOKEN: + b = "if"; + break; + + case POP_TOKEN: + b = "pop"; + break; + + case ANDELSE_TOKEN: + b = "andelse"; + break; + + case BXOR_TOKEN: + b = "xor"; + break; + + case BAND_TOKEN: + b = "&"; + break; + + case BOR_TOKEN: + b = "|"; + break; + + case BNOT_TOKEN: + b = "~"; + break; + + case SHR_TOKEN: + b = "shr"; + break; + + case CHS_TOKEN: + b = "chs"; + break; + + case SHL_TOKEN: + b = "shl"; + break; + + case SQR_TOKEN: + b = "sqr"; + break; + + case CASE_TOKEN: + b = "case"; + break; + + case SIGN_TOKEN: + b = "sign"; + break; + + case BREAK_TOKEN: + b = "break"; + break; + + case STATIC_TOKEN: + b = "static"; + break; + + case STRUCT_TOKEN: + b = "struct"; + break; + + case RETURN_TOKEN: + b = "return"; + break; + + case SWITCH_TOKEN: + b = "switch"; + break; + + case EXCH_TOKEN: + b = "exch"; + break; + + case CONT_TOKEN: + b = "continue"; + break; + + case EXITBLK_TOKEN: + b = "EXIT_BLOCK"; + break; + + case ERRBLK_TOKEN: + b = "ERROR_BLOCK"; + break; + + case USRBLK0_TOKEN: + b = "USER_BLOCK0"; + break; + + case USRBLK1_TOKEN: + b = "USER_BLOCK1"; + break; + + case USRBLK2_TOKEN: + b = "USER_BLOCK2"; + break; + + case USRBLK3_TOKEN: + b = "USER_BLOCK3"; + break; + + case USRBLK4_TOKEN: + b = "USER_BLOCK4"; + break; + + case ELSE_TOKEN: + b = "else"; + break; + + case MUL2_TOKEN: + b = "mul2"; + break; + + case DEFINE_TOKEN: + b = ")"; + break; + + case DEFINE_STATIC_TOKEN: + b = ")static"; + break; + + case LOOP_TOKEN: + b = "loop"; + break; + + case MOD_TOKEN: + b = "mod"; + break; + + case DO_TOKEN: + b = "do"; + break; + + case DOWHILE_TOKEN: + b = "do_while"; + break; + + case WHILE_TOKEN: + b = "while"; + break; + + case OR_TOKEN: + b = "or"; + break; + + case VARIABLE_TOKEN: + b = "variable"; + break; + + case _SCALAR_ASSIGN_TOKEN: + sprintf (buf, "=%s", t->v.s_val); + break; + + case _SCALAR_PLUSEQS_TOKEN: + sprintf (buf, "+=%s", t->v.s_val); + break; + + case _SCALAR_MINUSEQS_TOKEN: + sprintf (buf, "-=%s", t->v.s_val); + break; + + case _SCALAR_PLUSPLUS_TOKEN: + sprintf (buf, "++%s", t->v.s_val); + break; + + case _SCALAR_POST_PLUSPLUS_TOKEN: + sprintf (buf, "%s++", t->v.s_val); + break; + + case _SCALAR_MINUSMINUS_TOKEN: + sprintf (buf, "--%s", t->v.s_val); + break; + + case _SCALAR_POST_MINUSMINUS_TOKEN: + sprintf (buf, "%s--", t->v.s_val); + break; + + case _DEREF_ASSIGN_TOKEN: + sprintf (buf, "=@%s", t->v.s_val); + break; + + case _REF_TOKEN: + sprintf (buf, "%s __ref", t->v.s_val); + break; + + case ORELSE_TOKEN: + b = "orelse"; + break; + + case _FOR_TOKEN: + b = "_for"; + break; + + case FOR_TOKEN: + b = "for"; + break; + + case NOT_TOKEN: + b = "not"; + break; + + case OBRACKET_TOKEN: + b = "["; + break; + + case CBRACKET_TOKEN: + b = "]"; + break; + + case OPAREN_TOKEN: + b = "("; + break; + + case CPAREN_TOKEN: + b = ")"; + break; + + case OBRACE_TOKEN: + b = "{"; + break; + + case CBRACE_TOKEN: + b = "}"; + break; + + case DEREF_TOKEN: + b = "@"; + break; + + case COMMA_TOKEN: + b = ","; + break; + + case SEMICOLON_TOKEN: + b = ";"; + break; + + case COLON_TOKEN: + b = ":"; + break; + + case ADD_TOKEN: + b = "+"; + break; + + case SUB_TOKEN: + b = "-"; + break; + + /* case MUL_TOKEN: */ + /* b = "*"; */ + /* break; */ + + case DIV_TOKEN: + b = "/"; + break; + + case ARRAY_TOKEN: + b = "__aget"; + break; + + case _ARRAY_ASSIGN_TOKEN: + b = "__aput"; + break; + + case DOT_TOKEN: + sprintf (buf, "%s .", t->v.s_val); + break; + + case METHOD_TOKEN: + sprintf (buf, "%s __eargs __method_call", t->v.s_val); + break; + + case _STRUCT_ASSIGN_TOKEN: + b = "__struct_eqs"; break; + case _STRUCT_PLUSEQS_TOKEN: + b = "__struct_pluseqs"; break; + case _STRUCT_MINUSEQS_TOKEN: + b = "__struct_minuseqs"; break; + case _STRUCT_PLUSPLUS_TOKEN: + b = "__struct_plusplus"; break; + case _STRUCT_POST_PLUSPLUS_TOKEN: + b = "__struct_pplusplus"; break; + case _STRUCT_MINUSMINUS_TOKEN: + b = "__struct_minusminus"; break; + case _STRUCT_POST_MINUSMINUS_TOKEN: + b = "__struct_pminusminus"; break; + + case _NULL_TOKEN: b = "NULL"; break; + + case USING_TOKEN: + b = "__using__"; break; + case FOREACH_TOKEN: + b = "__foreach__"; break; + + default: + sprintf (buf, "____UNKNOWN___0x%X", t->type); + break; + } + + fprintf (stdout, "0x%2X: %s\n", t->type, b); +} + + +int main (int argc, char **argv) +{ + char *file; + + if (argc == 2) + { + /* fprintf (stderr, "Usage: %s <filename>\n", argv[0]); */ + file = argv[1]; + /* return 1; */ + } + else file = NULL; + + if (-1 == SLang_init_slang ()) + return 1; + + _SLcompile_ptr = dump_token; + SLang_load_file (file); + + return SLang_Error; +} |