/* @@@HEAD@@@ // Information about opcodes. */ #include <ctype.h> #include "config.h" #include "defs.h" #include "y.tab.h" #include "opcodes.h" #include "operators.h" #include "old_ops.h" #include "functions.h" #include "util.h" #define NUM_OPERATORS (sizeof(op_info) / sizeof(*op_info)) Op_info op_table[LAST_TOKEN]; static int first_function; static Op_info op_info[] = { { COMMENT, "COMMENT", op_comment, STRING }, { POP, "POP", op_pop }, { SET_LOCAL, "SET_LOCAL", op_set_local, VAR }, { SET_OBJ_VAR, "SET_OBJ_VAR", op_set_obj_var, IDENT }, { IF, "IF", op_if, JUMP }, { IF_ELSE, "IF_ELSE", op_if, JUMP }, { ELSE, "ELSE", op_else, JUMP }, { FOR_RANGE, "FOR_RANGE", op_for_range, JUMP, INTEGER }, { FOR_LIST, "FOR_LIST", op_for_list, JUMP, INTEGER }, { WHILE, "WHILE", op_while, JUMP, JUMP }, { SWITCH, "SWITCH", op_switch, JUMP }, { CASE_VALUE, "CASE_VALUE", op_case_value, JUMP }, { CASE_RANGE, "CASE_RANGE", op_case_range, JUMP }, { LAST_CASE_VALUE, "LAST_CASE_VALUE", op_last_case_value, JUMP }, { LAST_CASE_RANGE, "LAST_CASE_RANGE", op_last_case_range, JUMP }, { END_CASE, "END_CASE", op_end_case, JUMP }, { DEFAULT, "DEFAULT", op_default }, { END, "END", op_end, JUMP }, { BREAK, "BREAK", op_break, JUMP, INTEGER }, { CONTINUE, "CONTINUE", op_continue, JUMP, INTEGER }, { RETURN, "RETURN", op_return }, { RETURN_EXPR, "RETURN_EXPR", op_return_expr }, { CATCH, "CATCH", op_catch, JUMP, ERROR }, { CATCH_END, "CATCH_END", op_catch_end, JUMP }, { HANDLER_END, "HANDLER_END", op_handler_end }, { ZERO, "ZERO", op_zero }, { ONE, "ONE", op_one }, { INTEGER, "INTEGER", op_integer, INTEGER }, { FLOAT, "FLOAT", op_float, INTEGER }, { STRING, "STRING", op_string, STRING }, { DBREF, "DBREF", op_dbref, INTEGER }, { SYMBOL, "SYMBOL", op_symbol, IDENT }, { ERROR, "ERROR", op_error, IDENT }, { NAME, "NAME", op_name, IDENT }, { GET_LOCAL, "GET_LOCAL", op_get_local, VAR }, { GET_OBJ_VAR, "GET_OBJ_VAR", op_get_obj_var, IDENT }, { START_ARGS, "START_ARGS", op_start_args }, { PASS, "PASS", op_pass }, { MESSAGE, "MESSAGE", op_message, IDENT }, { EXPR_MESSAGE, "EXPR_MESSAGE", op_expr_message }, { LIST, "LIST", op_list }, { DICT, "DICT", op_dict }, { BUFFER, "BUFFER", op_buffer }, { FROB, "FROB", op_frob }, { INDEX, "INDEX", op_index }, { AND, "AND", op_and, JUMP }, { OR, "OR", op_or, JUMP }, { CONDITIONAL, "CONDITIONAL", op_if, JUMP }, { SPLICE, "SPLICE", op_splice }, { CRITICAL, "CRITICAL", op_critical, JUMP }, { CRITICAL_END, "CRITICAL_END", op_critical_end }, { PROPAGATE, "PROPAGATE", op_propagate, JUMP }, { PROPAGATE_END, "PROPAGATE_END", op_propagate_end }, /* Arithmetic and relational operators (arithop.c). */ { '!', "!", op_not }, { NEG, "NEG", op_negate }, { '*', "*", op_multiply }, { '/', "/", op_divide }, { '%', "%", op_modulo }, { '+', "+", op_add }, { SPLICE_ADD, "SPLICE_ADD", op_splice_add }, { '-', "-", op_subtract }, { EQ, "EQ", op_equal }, { NE, "NE", op_not_equal }, { '>', ">", op_greater }, { GE, ">=", op_greater_or_equal }, { '<', "<", op_less }, { LE, "<=", op_less_or_equal }, { IN, "IN", op_in }, #if 0 { '&', "&", op_bwand }, { '|', "|", op_bwor }, { SR, ">>", op_bwshr }, { SL, "<<", op_bwshl }, #endif { METHOD, "method", func_method }, { THIS, "this", func_this }, { DEFINER, "definer", func_definer }, { SENDER, "sender", func_sender }, { CALLER, "caller", func_caller }, { TASK_ID, "task_id", func_task_id }, /* Generic data manipulation (dataop.c). */ { TYPE, "type", func_type }, { CLASS, "class", func_class }, { TOINT, "toint", func_toint }, { TOFLOAT, "tofloat", func_tofloat }, { TOSTR, "tostr", func_tostr }, { TOLITERAL, "toliteral", func_toliteral }, { TODBREF, "todbref", func_todbref }, { TOSYM, "tosym", func_tosym }, { TOERR, "toerr", func_toerr }, { VALID, "valid", func_valid }, /* Operations on strings (stringop.c). */ { STRFMT, "strfmt", op_strfmt }, { STRLEN, "strlen", op_strlen }, { SUBSTR, "substr", op_substr }, { EXPLODE, "explode", op_explode }, { STRSUB, "strsub", op_strsub }, { PAD, "pad", op_pad }, { MATCH_BEGIN, "match_begin", op_match_begin }, { MATCH_TEMPLATE, "match_template", op_match_template }, { MATCH_PATTERN, "match_pattern", op_match_pattern }, { MATCH_REGEXP, "match_regexp", op_match_regexp }, { CRYPT, "crypt", op_crypt }, { UPPERCASE, "uppercase", op_uppercase }, { LOWERCASE, "lowercase", op_lowercase }, { STRCMP, "strcmp", op_strcmp }, /* List manipulation (listop.c). */ { LISTLEN, "listlen", op_listlen }, { SUBLIST, "sublist", op_sublist }, { INSERT, "insert", op_insert }, { REPLACE, "replace", op_replace }, { DELETE, "delete", op_delete }, { SETADD, "setadd", op_setadd }, { SETREMOVE, "setremove", op_setremove }, { UNION, "union", op_union }, /* Dictionary manipulation (dictop.c). */ { DICT_KEYS, "dict_keys", op_dict_keys }, { DICT_ADD, "dict_add", op_dict_add }, { DICT_DEL, "dict_del", op_dict_del }, { DICT_CONTAINS, "dict_contains", op_dict_contains }, /* Buffer manipulation (bufferop.c). */ { BUFFER_LEN, "buffer_len", op_buffer_len }, { BUFFER_RETRIEVE, "buffer_retrieve", op_buffer_retrieve }, { BUFFER_APPEND, "buffer_append", op_buffer_append }, { BUFFER_REPLACE, "buffer_replace", op_buffer_replace }, { BUFFER_ADD, "buffer_add", op_buffer_add }, { BUFFER_TRUNCATE, "buffer_truncate", op_buffer_truncate }, { BUFFER_TAIL, "buffer_tail", op_buffer_tail }, { BUFFER_TO_STRINGS,"buffer_to_strings",op_buffer_to_strings }, { BUFFER_TO_STRING,"buffer_to_string",op_buffer_to_string }, { BUFFER_FROM_STRINGS,"buffer_from_strings",op_buffer_from_strings }, { BUFFER_FROM_STRING,"buffer_from_string",op_buffer_from_string }, { VERSION, "version", op_version }, { RANDOM, "random", op_random }, { TIME, "time", op_time }, { LOCALTIME, "localtime", op_localtime }, { MTIME, "mtime", op_mtime }, { TIMESTAMP, "timestamp", op_timestamp }, { STRFTIME, "strftime", op_strftime }, { CTIME, "ctime", op_ctime }, { MIN, "min", op_min }, { MAX, "max", op_max }, { ABS, "abs", op_abs }, { GET_DBREF, "get_dbref", op_get_dbref }, { TICKS_LEFT, "ticks_left", func_ticks_left }, { TOKENIZE_CML, "tokenize_cml", op_tokenize_cml }, { BUF_TO_VEIL_PACKETS, "buf_to_veil_packets", op_buf_to_veil_packets }, { BUF_FROM_VEIL_PACKETS, "buf_from_veil_packets", op_buf_from_veil_packets }, { ERROR_FUNC, "error", func_error }, { TRACEBACK, "traceback", func_traceback }, { THROW, "throw", func_throw }, { RETHROW, "rethrow", func_rethrow }, /* Input and output (ioop.c). */ { ECHO_FUNC, "echo", op_echo }, { ECHO_FILE, "echo_file", op_echo_file }, { STAT_FILE, "stat_file", op_stat_file }, { READ_FILE, "read_file", op_read_file }, { CLOSE_CONNECTION, "close_connection", op_close_connection }, /* Operations on the current object (objectop.c). */ { ADD_PARAMETER, "add_parameter", func_add_parameter }, { PARAMETERS, "parameters", func_parameters }, { DEL_PARAMETER, "del_parameter", func_del_parameter }, { SET_VAR, "set_var", func_set_var }, { GET_VAR, "get_var", func_get_var }, { CLEAR_VAR, "clear_var", func_clear_var }, { COMPILE, "compile", func_compile_to_method }, { SET_METHOD_FLAGS, "set_method_flags", func_set_method_flags }, { SET_METHOD_STATE, "set_method_state", func_set_method_state }, { METHOD_ARGS, "method_args", func_method_args }, { METHOD_FLAGS, "method_flags", func_method_flags }, { METHOD_STATE, "method_state", func_method_state }, { METHODS, "methods", func_methods }, { FIND_METHOD, "find_method", func_find_method }, { FIND_NEXT_METHOD, "find_next_method", func_find_next_method }, { LIST_METHOD, "list_method", func_list_method }, { DEL_METHOD, "del_method", func_del_method }, { PARENTS, "parents", func_parents }, { CHILDREN, "children", func_children }, { ANCESTORS, "ancestors", func_ancestors }, { HAS_ANCESTOR, "has_ancestor", func_has_ancestor }, { SIZE, "size", func_size }, /* administrative / system operations (sysop.c). */ { CREATE, "create", func_create }, { CHPARENTS, "chparents", func_chparents }, { DESTROY, "destroy", func_destroy }, { LOG, "log", func_log }, { BACKUP, "backup", func_backup }, { BINARY_DUMP, "binary_dump", func_binary_dump }, { TEXT_DUMP, "text_dump", func_text_dump }, { EXECUTE, "execute", func_execute }, { SHUTDOWN, "shutdown", func_shutdown }, { SET_HEARTBEAT, "set_heartbeat", func_set_heartbeat }, { DATA, "data", func_data }, { ADD_OBJNAME, "add_objname", func_add_objname }, { DEL_OBJNAME, "del_objname", func_del_objname }, { TICK, "tick", func_tick }, { RESUME, "resume", func_resume }, { SUSPEND, "suspend", func_suspend }, { TASKS, "tasks", func_tasks }, { CANCEL, "cancel", func_cancel }, { PAUSE, "pause", func_pause }, { CALLERS, "callers", func_callers }, { LOAD, "load", op_load }, { STATUS, "status", op_status }, { BIND_FUNCTION, "bind_function", func_bind_function }, { UNBIND_FUNCTION, "unbind_function", func_unbind_function }, { NEXT_DBREF, "next_dbref", op_next_dbref }, { HOSTNAME, "hostname", op_hostname }, { IP, "ip", op_ip }, { BIND_PORT, "bind_port", op_bind_port }, { UNBIND_PORT, "unbind_port", op_unbind_port }, { OPEN_CONNECTION, "open_connection", op_open_connection }, { REASSIGN_CONNECTION, "reassign_connection", op_reassign_connection } }; void init_op_table(void) { int i; for (i = 0; i < NUM_OPERATORS; i++) { op_info[i].binding = INV_OBJNUM; op_info[i].symbol = ident_get(op_info[i].name); op_table[op_info[i].opcode] = op_info[i]; } /* Look for first opcode with a lowercase name to find the first * function. */ for (i = 0; i < NUM_OPERATORS; i++) { if (islower(*op_info[i].name)) break; } first_function = i; } int find_function(char *name) { int i; for (i = first_function; i < NUM_OPERATORS; i++) { if (strcmp(op_info[i].name, name) == 0) return op_info[i].opcode; } return -1; }