GtStr* gt_get_gtdata_path(const char *prog, GtError *err) { GtStr *path; const char **defaultpath; int had_err = 0; gt_error_check(err); gt_assert(prog); path = gt_str_new(); had_err = gt_file_find_exec_in_path(path, prog, err); if (!had_err) { gt_assert(gt_str_length(path)); gt_str_append_cstr(path, GTDATADIR); if (gt_file_exists_and_is_dir(gt_str_get(path))) return path; gt_str_set_length(path, gt_str_length(path) - strlen(GTDATADIR)); gt_str_append_cstr(path, UPDIR); gt_str_append_cstr(path, GTDATADIR); if (gt_file_exists_and_is_dir(gt_str_get(path))) return path; for (defaultpath = GTDATA_DEFAULT_PATHS; *defaultpath; defaultpath++) { gt_str_reset(path); gt_str_append_cstr(path, *defaultpath); if (gt_file_exists_and_is_dir(gt_str_get(path))) return path; } if (!gt_file_exists_and_is_dir(gt_str_get(path))) { gt_error_set(err, "could not find gtdata%c directory", GT_PATH_SEPARATOR); had_err = -1; } } if (had_err) { gt_str_delete(path); return NULL; } return path; }
GthBSSMParam* gth_bssm_param_load(const char *filename, GtError *err) { GthBSSMParam *bssm_param = NULL; GtStr *path = gt_str_new(); int had_err = 0; gt_error_check(err); if (gt_file_exists(filename)) gt_str_append_cstr(path, filename); else { if (strchr(filename, GT_PATH_SEPARATOR)) { gt_error_set(err, "filename \"%s\" contains illegal symbol '%c': the " "path list specified by environment variable \"%s\" " "cannot be searched for it", filename, GT_PATH_SEPARATOR, BSSMENVNAME); had_err = -1; } /* check for file path in environment variable */ if (!had_err) had_err = gt_file_find_in_env(path, filename, BSSMENVNAME, err); if (!had_err && !gt_str_length(path)) { gt_error_set(err, "file \"%s\" not found in directory list specified " "by environment variable %s", filename, BSSMENVNAME); had_err = -1; } if (!had_err) { /* path found -> append filename */ gt_str_append_char(path, GT_PATH_SEPARATOR); gt_str_append_cstr(path, filename); } else { /* check for file path relative to binary */ int new_err = gt_file_find_exec_in_path(path, gt_error_get_progname(err), NULL); if (!new_err) { gt_assert(gt_str_length(path)); gt_str_append_char(path, GT_PATH_SEPARATOR); gt_str_append_cstr(path, "bssm"); gt_str_append_char(path, GT_PATH_SEPARATOR); gt_str_append_cstr(path, filename); if (gt_file_exists(gt_str_get(path))) { gt_error_unset(err); had_err = 0; } } } } if (!had_err) { if (!(bssm_param = bssm_param_plain_read(gt_str_get(path), err))) had_err = -1; if (had_err) { /* loading new plain text format didn't work -> try old binary format */ if ((bssm_param = load_old_binary_format(path, filename, NULL))) { /* loading binary format worked -> unset error */ gt_error_unset(err); had_err = 0; } } } gt_str_delete(path); if (had_err) { gth_bssm_param_delete(bssm_param); return NULL; } return bssm_param; }