📄 swfdec_player_manager.c
字号:
}const char *parse_string (const char *input, char **output){ const char *start = input; g_assert (output); if (input == NULL) return NULL; while (*input && !g_ascii_isspace (*input)) input++; if (input == start) return NULL; *output = g_strndup (start, input - start); return parse_skip (input);}const char *parse_uint (const char *input, guint *output){ char *end; guint result; g_assert (output); if (input == NULL) return NULL; result = strtoul (input, &end, 10); if (input == end || (*end != '\0' && !g_ascii_isspace (*end))) return NULL; *output = result; return parse_skip (end);}static voidbreakpoint_hit_cb (SwfdecDebugger *debugger, guint id, SwfdecPlayerManager *manager){ if (id == 0) { if (!swfdec_debugger_get_current (debugger, &manager->interrupt_script, &manager->interrupt_line)) { g_assert_not_reached (); } } else { if (!swfdec_debugger_get_breakpoint (debugger, id, &manager->interrupt_script, &manager->interrupt_line)) { g_assert_not_reached (); } swfdec_player_manager_output (manager, "Breakpoint %u", id); } swfdec_player_manager_do_interrupt (manager);}static voidcommand_run (SwfdecPlayerManager *manager, const char *arg){ const char *s; if (arg == NULL) { swfdec_player_manager_error (manager, "Must give something to run"); } s = swfdec_debugger_run (SWFDEC_DEBUGGER (manager->player), arg); if (s) swfdec_player_manager_output (manager, "%s", s); else swfdec_player_manager_error (manager, "Error running given command");}static voidcommand_play (SwfdecPlayerManager *manager, const char *arg){ swfdec_player_manager_set_playing (manager, TRUE);}static voidcommand_stop (SwfdecPlayerManager *manager, const char *arg){ swfdec_player_manager_set_playing (manager, FALSE);}static voidcommand_iterate (SwfdecPlayerManager *manager, const char *arg){ guint msecs = swfdec_player_manager_iterate (manager); if (msecs == 0) { swfdec_player_manager_error (manager, "Cannot iterate this player"); } else { swfdec_player_manager_error (manager, "advanced player %u.%03us", msecs / 1000, msecs % 1000); }}static voidcommand_continue (SwfdecPlayerManager *manager, const char *arg){ if (swfdec_player_manager_get_interrupted (manager)) swfdec_player_manager_continue (manager); else swfdec_player_manager_error (manager, "Not interrupted, cannot continue");}static voidset_breakpoint (gpointer script, gpointer debugger){ swfdec_debugger_set_breakpoint (debugger, script, 0);}static voidcommand_next (SwfdecPlayerManager *manager, const char *arg){ if (!swfdec_player_manager_get_interrupted (manager)) swfdec_player_manager_error (manager, "Not interrupted, cannot continue"); else swfdec_player_manager_next (manager);}static voidcommand_break (SwfdecPlayerManager *manager, const char *arg){ char *str; const char *next; guint line; next = parse_uint (arg, &line); if (next) { if (swfdec_player_manager_get_interrupted (manager)) { if (line < manager->interrupt_script->n_commands) { guint id = swfdec_debugger_set_breakpoint (SWFDEC_DEBUGGER (manager->player), manager->interrupt_script, line); swfdec_player_manager_output (manager, "%u: %s line %u: %s", id, manager->interrupt_script->script->name, line, manager->interrupt_script->commands[line].description); } else { swfdec_player_manager_error (manager, "Can't set breakpoint at line %u, script only has %u lines", line, manager->interrupt_script->n_commands); } } else { swfdec_player_manager_error (manager, "Not interrupted"); } return; } next = parse_string (arg, &str); if (next) { if (strcasecmp (str, "start") == 0) { swfdec_debugger_foreach_script (SWFDEC_DEBUGGER (manager->player), set_breakpoint, manager->player); swfdec_player_manager_output (manager, "set breakpoint at start of every script"); } else { swfdec_player_manager_error (manager, "FIXME: implement"); } }}static voidcommand_breakpoints (SwfdecPlayerManager *manager, const char *arg){ guint i, n, line; SwfdecDebugger *debugger; SwfdecDebuggerScript *script; debugger = SWFDEC_DEBUGGER (manager->player); n = swfdec_debugger_get_n_breakpoints (debugger); for (i = 1; i <= n; i++) { if (swfdec_debugger_get_breakpoint (debugger, i, &script, &line)) { swfdec_player_manager_output (manager, "%u: %s line %u: %s", i, script->script->name, line, script->commands[line].description); } }}static voidcommand_delete (SwfdecPlayerManager *manager, const char *arg){ guint id; if (arg == NULL) { guint i, n; SwfdecDebugger *debugger = SWFDEC_DEBUGGER (manager->player); n = swfdec_debugger_get_n_breakpoints (debugger); for (i = 1; i <= n; i++) { swfdec_debugger_unset_breakpoint (debugger, i); } } else if (parse_uint (arg, &id)) { swfdec_debugger_unset_breakpoint (SWFDEC_DEBUGGER (manager->player), id); } else { swfdec_player_manager_error (manager, "no breakpoint '%s'", arg); }}static voidcommand_stack (SwfdecPlayerManager *manager, const char *arg){ JSStackFrame *frame = NULL; guint i, min, max; if (!swfdec_player_manager_get_interrupted (manager)) { swfdec_player_manager_error (manager, "Not interrupted"); return; } JS_FrameIterator (manager->player->jscx, &frame); min = 1; max = frame->sp - frame->spbase; for (i = min; i <= max; i++) { const char *s = swfdec_js_to_string (manager->player->jscx, frame->sp[-i]); swfdec_player_manager_output (manager, "%2u: %s", i, s); }}typedef struct { SwfdecPlayerManager *manager; const char * string;} FindData;static voiddo_find (gpointer scriptp, gpointer datap){ SwfdecDebuggerScript *script = scriptp; FindData *data = datap; guint i; for (i = 0; i < script->n_commands; i++) { if (strstr (script->commands[i].description, data->string)) { swfdec_player_manager_output (data->manager, "%s %u: %s", script->script->name, i, script->commands[i].description); } }}static voidcommand_find (SwfdecPlayerManager *manager, const char *arg){ FindData data = { manager, arg }; if (arg == NULL) { swfdec_player_manager_error (manager, "What should be found?"); } swfdec_debugger_foreach_script (SWFDEC_DEBUGGER (manager->player), do_find, &data);}static voidcommand_enumerate (SwfdecPlayerManager *manager, const char *arg){ jsval rval; JSObject *obj; JSIdArray *array; const char *s, *t; guint i; if (!swfdec_js_run (manager->player, arg, &rval)) { swfdec_player_manager_error (manager, "Invalid command"); return; } if (!JSVAL_IS_OBJECT (rval)) { swfdec_player_manager_error (manager, "Given expression is not an object"); return; } obj = JSVAL_TO_OBJECT (rval); array = JS_Enumerate (manager->player->jscx, obj); if (array == NULL) { swfdec_player_manager_error (manager, "Error enumerating"); return; } s = swfdec_js_to_string (manager->player->jscx, rval); if (s == NULL) { swfdec_player_manager_error (manager, "Cannot convert object to string"); } swfdec_player_manager_output (manager, "properties for %s:", s); for (i = 0; i < array->length; i++) { if (!JS_IdToValue (manager->player->jscx, array->vector[i], &rval)) continue; s = swfdec_js_to_string (manager->player->jscx, rval); if (s == NULL) continue; if (!JS_GetProperty (manager->player->jscx, obj, s, &rval) || !(t = swfdec_js_to_string (manager->player->jscx, rval))) t = "<error querying value>"; swfdec_player_manager_output (manager, " %s: %s", s, t); } JS_DestroyIdArray (manager->player->jscx, array);}static void command_help (SwfdecPlayerManager *manager, const char *arg);/* NB: the first word in the command string is used, partial matches are ok */struct { const char * name; void (* func) (SwfdecPlayerManager *manager, const char *arg); const char * description;} commands[] = { { "help", command_help, "print all available commands and a quick description" }, { "run", command_run, "run the argument as a JavaScript script" }, { "play", command_play, "play the movie" }, { "stop", command_stop, "stop the movie" }, { "iterate", command_iterate, "iterate the movie once" }, { "break", command_break, "add breakpoint at [start]" }, { "breakpoints", command_breakpoints, "show all breakpoints" }, { "delete", command_delete, "delete a breakpoint" }, { "continue", command_continue, "continue when stopped inside a breakpoint" }, { "next", command_next, "step forward one command when stopped inside a breakpoint" }, { "stack", command_stack, "print the arguments on the stack" }, { "find", command_find, "find the given argument verbatim in all scripts" }, { "enumerate",command_enumerate, "enumerate all properties of the given object" },};static voidcommand_help (SwfdecPlayerManager *manager, const char *arg){ guint i; swfdec_player_manager_output (manager, "The following commands are available:"); for (i = 0; i < G_N_ELEMENTS (commands); i++) { swfdec_player_manager_output (manager, "%s: %s", commands[i].name, commands[i].description); }}voidswfdec_player_manager_execute (SwfdecPlayerManager *manager, const char *command){ guint i; const char *args; char *run; g_return_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager)); g_return_if_fail (command != NULL); parse_skip (command); swfdec_player_manager_send_message (manager, SWFDEC_MESSAGE_INPUT, "%s", command); args = parse_string (command, &run); if (args == NULL) return; for (i = 0; i < G_N_ELEMENTS(commands); i++) { if (g_ascii_strncasecmp (commands[i].name, run, strlen (run)) == 0) { commands[i].func (manager, *args == '\0' ? NULL : args); g_free (run); return; } } swfdec_player_manager_error (manager, "No such command '%s'", run); g_free (run);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -