int source_set_exec_line(struct sviewer *sview, const char *path, int sel_line, int exe_line) { if (path) { /* If they passed us a path, try to locate that node */ sview->cur = source_get_node(sview, path); /* Not found.... */ if (!sview->cur) { /* Check that the file exists */ if (!fs_verify_file_exists(path)) return 5; /* Add a new node for this file */ sview->cur = source_add(sview, path); } } /* Buffer the file if it's not already */ if (load_file(sview->cur)) return 4; /* Update line, if set */ if (sel_line > 0) sview->cur->sel_line = clamp_line(sview, sel_line - 1); /* Set executing line if passed a valid value */ if (exe_line == -1) { sview->cur->exe_line = -1; } else if (exe_line > 0) { sview->cur->exe_line = clamp_line(sview, exe_line - 1); } return 0; }
void if_display_help(void) { char cgdb_help_file[FSUTIL_PATH_MAX]; int ret_val = 0; fs_util_get_path(PKGDATADIR, "cgdb.txt", cgdb_help_file); /* File doesn't exist. Try to find cgdb.txt in the build dir in case * the user is running a built cgdb binary directly. */ if (!fs_verify_file_exists(cgdb_help_file)) fs_util_get_path(TOPBUILDDIR, "doc/cgdb.txt", cgdb_help_file); ret_val = source_set_exec_line(src_viewer, cgdb_help_file, 1, 0); if (ret_val == 0) { src_viewer->cur->language = TOKENIZER_LANGUAGE_CGDBHELP; source_highlight(src_viewer->cur); if_draw(); } else if (ret_val == 5) /* File does not exist */ if_display_message("No such file: ", WIN_REFRESH, 0, "%s", cgdb_help_file); }
int filedlg_add_file_choice(struct filedlg *fd, const char *file_choice) { int length; int index, i; int equal = 1; /* Not set to 0, because 0 *is* equal */ if (file_choice == NULL || *file_choice == '\0') return -1; /* Make sure file exists. If temp files are used to create an * executable, and the temp files are deleted, they pollute the * file open dialog with files you can't actually open. * * The downside to not showing them all is that a user might * not understand why certain files aren't showing up. O well. */ if (file_choice[0] != '*') { if (fs_verify_file_exists(file_choice) == 0) return -4; } /* find index to insert by comparing: * Absolute paths go to the end * Relative paths go before the absolute paths */ for (i = 0; i < sbcount(fd->buf->files); i++) { /* Don't add duplicate entry's ... gdb outputs duplicates */ if ((equal = strcmp(fd->buf->files[i], file_choice)) == 0) return -3; else if (equal < 0) { /* Inserting filename, stop before relative path */ if ((file_choice[0] != '.' && file_choice[0] != '/') && fd->buf->files[i][0] == '.') break; /* Inserting filename, stop before absolute path */ if (file_choice[0] != '/' && fd->buf->files[i][0] == '/') break; } else if (equal > 0) { /* Found ( file_choice is greater ) */ /* Inserting Absolute path, it goes to the end */ if (file_choice[0] == '/' && fd->buf->files[i][0] != '/') continue; /* Inserting relative path, continue until before absolute or relative path */ if (file_choice[0] == '.' && (fd->buf->files[i][0] != '.' && fd->buf->files[i][0] != '/')) continue; break; } } index = i; sbpush(fd->buf->files, NULL); /* shift everything down and then insert into index */ for (i = sbcount(fd->buf->files) - 1; i > index; i--) fd->buf->files[i] = fd->buf->files[i - 1]; fd->buf->files[index] = cgdb_strdup(file_choice); if ((length = strlen(file_choice)) > fd->buf->max_width) fd->buf->max_width = length; return 0; }