📄 mix_vm_command.c
字号:
g_return_if_fail (dis != NULL); if (dis->editor) g_free (dis->editor); dis->editor = (edit_tplt) ? g_strdup (edit_tplt) : NULL; if (dis->config && dis->editor) mix_config_update (dis->config, EDITOR_KEY_, dis->editor);}voidmix_vm_cmd_dispatcher_set_assembler (mix_vm_cmd_dispatcher_t *dis, const gchar *asm_tplt){ g_return_if_fail (dis != NULL); if (dis->assembler) g_free (dis->assembler); dis->assembler = (asm_tplt) ? g_strdup (asm_tplt) : NULL; if (dis->config && dis->assembler) mix_config_update (dis->config, ASM_KEY_, dis->assembler);}const gchar *mix_vm_cmd_dispatcher_get_editor (const mix_vm_cmd_dispatcher_t *dis){ g_return_val_if_fail (dis != NULL, NULL); return dis->editor;}const gchar *mix_vm_cmd_dispatcher_get_assembler (const mix_vm_cmd_dispatcher_t *dis){ g_return_val_if_fail (dis != NULL, NULL); return dis->assembler;}const gchar *mix_vm_cmd_dispatcher_get_src_file_path (const mix_vm_cmd_dispatcher_t *dis){ static gchar *PATH = NULL; const mix_vm_t *vm = mix_vm_cmd_dispatcher_get_vm (dis); const mix_src_file_t *f = mix_vm_get_src_file (vm); if (PATH) { g_free (PATH); PATH = NULL; } if (f) PATH = mix_file_complete_name (mix_src_file_get_path (f), MIX_SRC_DEFEXT); return PATH;}const gchar *mix_vm_cmd_dispatcher_get_program_path (const mix_vm_cmd_dispatcher_t *dis){ g_return_val_if_fail (dis != NULL, NULL); return dis->program;}/* install hooks */voidmix_vm_cmd_dispatcher_pre_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, mix_vm_cmd_hook_t hook, gpointer data){ hook_ *phook; g_return_if_fail (dis != NULL); g_return_if_fail (cmd < MIX_CMD_INVALID); phook = g_new (hook_, 1); phook->func = hook; phook->data = data; dis->pre_hooks[cmd] = g_slist_append (dis->pre_hooks[cmd], phook);}voidmix_vm_cmd_dispatcher_post_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, mix_vm_cmd_hook_t hook, gpointer data){ hook_ *phook; g_return_if_fail (dis != NULL); g_return_if_fail (cmd < MIX_CMD_INVALID); phook = g_new (hook_, 1); phook->func = hook; phook->data = data; dis->post_hooks[cmd] = g_slist_append (dis->post_hooks[cmd], phook);}voidmix_vm_cmd_dispatcher_global_pre_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_cmd_global_hook_t hook, gpointer data){ global_hook_ *phook; g_return_if_fail (dis != NULL); phook = g_new (global_hook_, 1); phook->func = hook; phook->data = data; dis->global_pre = g_slist_append (dis->global_pre, phook);}voidmix_vm_cmd_dispatcher_global_post_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_cmd_global_hook_t hook, gpointer data){ global_hook_ *phook; g_return_if_fail (dis != NULL); phook = g_new (global_hook_, 1); phook->func = hook; phook->data = data; dis->global_post = g_slist_append (dis->global_post, phook);}/* dispatch a command */gboolean /* TRUE if success, FALSE otherwise */mix_vm_cmd_dispatcher_dispatch (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, const gchar *arg){ g_return_val_if_fail (dis != NULL, FALSE); if (dis->global_pre) exec_global_hook_list_ (dis->global_pre, dis, cmd, arg); if (cmd < MIX_CMD_INVALID) { if (dis->pre_hooks[cmd]) exec_hook_list_ (dis->pre_hooks[cmd], dis, arg); fflush (dis->out); fflush (dis->err); dis->result = (commands_[cmd].func)(dis, arg); fflush (dis->out); fflush (dis->err); if (dis->post_hooks[cmd]) exec_hook_list_ (dis->post_hooks[cmd], dis, arg); fflush (dis->out); fflush (dis->err); } else { fprintf (dis->err, "Unknown command. Try: help\n"); } if (dis->global_post) exec_global_hook_list_ (dis->global_post, dis, cmd, arg); fflush (dis->out); fflush (dis->err); return dis->result;}/* dispatch a command in text format */gbooleanmix_vm_cmd_dispatcher_dispatch_text (mix_vm_cmd_dispatcher_t *dis, const gchar *text){ gchar *cp, *arg = ""; int k = 0; g_return_val_if_fail (dis != NULL, FALSE); g_return_val_if_fail (text != NULL, FALSE); cp = g_strdup (text); while (cp[k] && !isspace (cp[k])) ++k; if (cp[k]) { cp[k] = '\0'; ++k; while (cp[k] && isspace (cp[k])) ++k; arg = cp + k; } (void) mix_vm_cmd_dispatcher_dispatch_split_text (dis, cp, arg); g_free (cp); return dis->result;}/* dispatch a command in text format, with command and arg split */gbooleanmix_vm_cmd_dispatcher_dispatch_split_text (mix_vm_cmd_dispatcher_t *dis, const gchar *command, const gchar *arg){ mix_vm_command_info_t *info; g_return_val_if_fail (dis, FALSE); if (!command) return FALSE; if (!arg) arg = ""; info = (mix_vm_command_info_t *)g_hash_table_lookup (dis->commands, command); if (info) { if (dis->global_pre) exec_global_hook_list_ (dis->global_pre, dis, MIX_CMD_LOCAL, arg); fflush (dis->out); fflush (dis->err); dis->result = info->func (dis, arg); fflush (dis->out); fflush (dis->err); if (dis->global_post) exec_global_hook_list_ (dis->global_post, dis, MIX_CMD_LOCAL, arg); fflush (dis->out); fflush (dis->err); } else dis->result = mix_vm_cmd_dispatcher_dispatch (dis, mix_vm_command_from_string (command), arg); return dis->result;}/* get the last dispatch's result */gbooleanmix_vm_cmd_dispatcher_get_last_result (const mix_vm_cmd_dispatcher_t *dis){ g_return_val_if_fail (dis != NULL, FALSE); return dis->result;}/* get total uptime */mix_time_tmix_vm_cmd_dispatcher_get_uptime (const mix_vm_cmd_dispatcher_t *dis){ g_return_val_if_fail (dis != NULL, 0); return dis->uptime;}/* get program total time */mix_time_tmix_vm_cmd_dispatcher_get_progtime (const mix_vm_cmd_dispatcher_t *dis){ g_return_val_if_fail (dis != NULL, 0); return dis->progtime;}/* get time lapse */mix_time_tmix_vm_cmd_dispatcher_get_laptime (const mix_vm_cmd_dispatcher_t *dis){ g_return_val_if_fail (dis != NULL, 0); return dis->laptime;}/* toggle time printing */voidmix_vm_cmd_dispatcher_print_time (mix_vm_cmd_dispatcher_t * dis, gboolean print){ g_return_if_fail (dis != NULL); dis->printtime = print;}/* get the mix vm */const mix_vm_t *mix_vm_cmd_dispatcher_get_vm (const mix_vm_cmd_dispatcher_t *dis){ g_return_val_if_fail (dis != NULL, NULL); return dis->vm;}/* src file info */gulongmix_vm_cmd_dispatcher_get_src_file_lineno (const mix_vm_cmd_dispatcher_t *dis){ g_return_val_if_fail (dis != NULL, 0); return mix_vm_get_break_lineno (dis->vm);}const gchar *mix_vm_cmd_dispatcher_get_src_file_line (const mix_vm_cmd_dispatcher_t *dis, gulong line, gboolean cr){ const mix_src_file_t *file; g_return_val_if_fail (dis != NULL, NULL); file = mix_vm_get_src_file (dis->vm); if (line == 0 || file == NULL) return cr? "" : "\n"; if (cr) return mix_src_file_get_line (file, line); else { enum {BUFF_SIZE = 256}; static gchar BUFFER[BUFF_SIZE]; int len = snprintf (BUFFER, BUFF_SIZE, "%s", mix_src_file_get_line (file, line)); if (len > 0 && BUFFER[len - 1] == '\n') BUFFER[len - 1] = '\0'; return BUFFER; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -