/* In most Omicron files, the letter case is arbitrary. Try miscellaneous * variations till we finally give up */ static gchar* omicron_fix_file_name(const gchar *parname, const gchar *orig, GError **error) { gchar *filename, *dirname, *base; guint len, i; if (!g_path_is_absolute(orig)) { dirname = g_path_get_dirname(parname); filename = g_build_filename(dirname, orig, NULL); } else { dirname = g_path_get_dirname(orig); base = g_path_get_basename(orig); filename = g_build_filename(dirname, base, NULL); g_free(base); } g_free(dirname); base = filename + strlen(filename) - strlen(orig); len = strlen(base); gwy_debug("Trying <%s> (original)", filename); if (g_file_test(filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK)) return filename; /* All upper */ for (i = 0; i < len; i++) base[i] = g_ascii_toupper(base[i]); gwy_debug("Trying <%s>", filename); if (g_file_test(filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK)) return filename; /* All lower */ for (i = 0; i < len; i++) base[i] = g_ascii_tolower(base[i]); gwy_debug("Trying <%s>", filename); if (g_file_test(filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK)) return filename; /* Capitalize */ base[0] = g_ascii_toupper(base[0]); gwy_debug("Trying <%s>", filename); if (g_file_test(filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK)) return filename; g_free(filename); err_DATA_PART(error, orig); return NULL; }
static GwyContainer* stmprg_load(const gchar *filename, G_GNUC_UNUSED GwyRunType mode, GError **error) { GwyContainer *meta, *container = NULL; StmprgFile stmprgfile; guchar *buffer = NULL; gsize size = 0; GError *err = NULL; GwyDataField *dfield; char *filename_ta, *ptr; gboolean ok; if (!gwy_file_get_contents(filename, &buffer, &size, &err)) { err_GET_FILE_CONTENTS(error, &err); return NULL; } if (size < MAGIC_SIZE || memcmp(buffer, MAGIC_TXT, MAGIC_SIZE) != 0) { err_FILE_TYPE(error, "Omicron STMPRG"); gwy_file_abandon_contents(buffer, size, NULL); return NULL; } gwy_clear(&stmprgfile, 1); ok = read_parameters(buffer, size, &stmprgfile, error); gwy_file_abandon_contents(buffer, size, NULL); if (!ok) return NULL; filename_ta = g_strdup(filename); ptr = filename_ta + strlen(filename_ta) - 1; while (g_ascii_isdigit(*ptr) && ptr > filename_ta+1) ptr--; if (ptr == filename_ta+1) { err_DATA_PART(error, filename); g_free(filename_ta); return NULL; } /* Accept lowercase and uppercase and try the same case for data file */ if (*ptr == 'p' && *(ptr - 1) == 't') *ptr = 'a'; if (*ptr == 'P' && *(ptr - 1) == 'T') *ptr = 'A'; if (!gwy_file_get_contents(filename_ta, &buffer, &size, &err)) { g_free(filename_ta); err_GET_FILE_CONTENTS(error, &err); return NULL; } g_free(filename_ta); dfield = read_datafield(buffer, size, &stmprgfile, error); if (dfield) { container = gwy_container_new(); gwy_container_set_object_by_name(container, "/0/data", dfield); g_object_unref(dfield); /* FIXME: with documentation, we could perhaps do better */ gwy_app_channel_title_fall_back(container, 0); meta = stmprg_get_metadata(&stmprgfile); gwy_container_set_object_by_name(container, "/0/meta", meta); g_object_unref(meta); gwy_file_channel_import_log_add(container, 0, NULL, filename); } gwy_file_abandon_contents(buffer, size, NULL); return container; }