Пример #1
0
Файл: cgdb.c Проект: i4fumi/cgdb
static void process_commands(struct tgdb *tgdb)
{
    struct tgdb_response *item;

    while ((item = tgdb_get_response(tgdb)) != NULL) {
        switch (item->header) {
                /* This updates all the breakpoints */
            case TGDB_UPDATE_BREAKPOINTS:
            {
                struct sviewer *sview = if_get_sview();
                char *file;
                struct tgdb_list *list =
                        item->choice.update_breakpoints.breakpoint_list;
                tgdb_list_iterator *iterator;
                struct tgdb_breakpoint *tb;

                source_clear_breaks(if_get_sview());
                iterator = tgdb_list_get_first(list);

                while (iterator) {
                    /* For each breakpoint */
                    tb = (struct tgdb_breakpoint *)
                            tgdb_list_get_item(iterator);

                    file = tb->file;

                    if (tb->enabled)
                        source_enable_break(sview, file, tb->line);
                    else
                        source_disable_break(sview, file, tb->line);

                    iterator = tgdb_list_next(iterator);
                }

                if_show_file(NULL, 0);
                break;
            }

                /* This means a source file or line number changed */
            case TGDB_UPDATE_FILE_POSITION:
            {
                struct tgdb_file_position *tfp;

                tfp = item->choice.update_file_position.file_position;

                /* Update the file */
                source_reload(if_get_sview(), tfp->absolute_path, 0);

                if_show_file(tfp->absolute_path, tfp->line_number);

                source_set_relative_path(if_get_sview(),
                        tfp->absolute_path, tfp->relative_path);

                break;
            }

                /* This is a list of all the source files */
            case TGDB_UPDATE_SOURCE_FILES:
            {
                struct tgdb_list *list =
                        item->choice.update_source_files.source_files;
                tgdb_list_iterator *i = tgdb_list_get_first(list);
                char *s;

                if_clear_filedlg();

                while (i) {
                    s = tgdb_list_get_item(i);
                    if_add_filedlg_choice(s);
                    i = tgdb_list_next(i);
                }

                if_set_focus(FILE_DLG);
                kui_input_acceptable = 1;
                break;
            }

                /* The user is trying to get a list of source files that make up
                 * the debugged program but libtgdb is claiming that gdb knows
                 * none. */
            case TGDB_SOURCES_DENIED:
                if_display_message("Error:", 0,
                        " No sources available! Was the program compiled with debug?");
                kui_input_acceptable = 1;
                break;

                /* This is the absolute path to the last file the user requested */
            case TGDB_FILENAME_PAIR:
            {
                const char *apath = item->choice.filename_pair.absolute_path;
                const char *rpath = item->choice.filename_pair.relative_path;

                if_show_file((char *) apath, 1);
                source_set_relative_path(if_get_sview(), apath, rpath);
                break;
            }

                /* The source file requested does not exist */
            case TGDB_ABSOLUTE_SOURCE_DENIED:
            {
                struct tgdb_source_file *file =
                        item->choice.absolute_source_denied.source_file;
                if_show_file(NULL, 0);
                /* com can be NULL when tgdb orig requests main file */
                if (file->absolute_path != NULL)
                    if_display_message("No such file:", 0, " %s",
                            file->absolute_path);
                break;
            }
            case TGDB_INFERIOR_EXITED:
            {
                /*
                 * int *status = item->data;
                 * This could eventually go here, but for now, the update breakpoint 
                 * display function makes the status bar go back to the name of the file.
                 *
                 * if_display_message ( "Program exited with value", 0, " %d", *status );
                 */

                /* Clear the cache */
                break;
            }
            case TGDB_UPDATE_COMPLETIONS:
            {
                struct tgdb_list *list =
                        item->choice.update_completions.completion_list;
                do_tab_completion(list);
                break;
            }
            case TGDB_UPDATE_CONSOLE_PROMPT_VALUE:
            {
                const char *new_prompt =
                        item->choice.update_console_prompt_value.prompt_value;
                change_prompt(new_prompt);
                break;
            }
            case TGDB_QUIT:
                cleanup();
                exit(0);
                break;
                /* Default */
            default:
                break;
        }
    }
}
Пример #2
0
int internal_if_input(int key, int *last_key)
{
    /* Normally, CGDB_KEY_ESC, but can be configured by the user */
    int cgdb_mode_key = cgdbrc_get_int(CGDBRC_CGDB_MODE_KEY);

    /* The cgdb mode key, puts the debugger into command mode */
    if (focus != CGDB && key == cgdb_mode_key) {
        enum Focus new_focus = CGDB;

        /* Depending on which cgdb was in, it can free some memory here that
         * it was previously using. */
        if (focus == CGDB_STATUS_BAR && sbc_kind == SBC_NORMAL) {
            ibuf_free(cur_sbc);
            cur_sbc = NULL;
        } else if (focus == CGDB_STATUS_BAR && sbc_kind == SBC_REGEX) {
            ibuf_free(regex_cur);
            regex_cur = NULL;

            hl_regex_free(&src_viewer->hlregex);

            src_viewer->cur->sel_rline = orig_line_regex;
            src_viewer->cur->sel_line = orig_line_regex;
            sbc_kind = SBC_NORMAL;
        }
        else if (focus == GDB && sbc_kind == SBC_REGEX)
        {
            ibuf_free(regex_cur);
            regex_cur = NULL;

            gdb_scroller->in_search_mode = 0;
            sbc_kind = SBC_NORMAL;

            new_focus = GDB;
        }

        if_set_focus(new_focus);
        return 0;
    }
    /* If you are already in cgdb mode, the cgdb mode key does nothing */
    else if (key == cgdb_mode_key)
        return 0;

    /* Check for global keystrokes */
    switch (focus) {
        case CGDB:
            return cgdb_input(key, last_key);
        case GDB:
            return gdb_input(key, last_key);
        case FILE_DLG:
        {
            char filedlg_file[MAX_LINE];
            int ret = filedlg_recv_char(fd, key, filedlg_file, last_key_pressed);

            /* The user cancelled */
            if (ret == -1) {
                if_set_focus(CGDB);
                return 0;
                /* Needs more data */
            } else if (ret == 0) {
                return 0;
                /* The user picked a file */
            } else if (ret == 1) {
                if_show_file(filedlg_file, 0, 0);
                if_set_focus(CGDB);
                return 0;
            }
        }
            return 0;
        case CGDB_STATUS_BAR:
            return status_bar_input(src_viewer, key);
    }

    /* Never gets here */
    return 0;
}