void arcan_set_namespace_defaults() { /* when CWD is correctly set to the installation path */ char* respath = "./resources"; size_t len = strlen(respath); /* typically inside build-directory */ if (!arcan_isdir(respath)){ respath = "../resources"; } char debug_dir[ len + sizeof("/logs") ]; char state_dir[ len + sizeof("/savestates") ]; char font_dir[ len + sizeof("/fonts") ]; snprintf(debug_dir, sizeof(debug_dir), "%s/logs", respath); snprintf(state_dir, sizeof(state_dir), "%s/savestates", respath); snprintf(font_dir, sizeof(font_dir), "%s/fonts", respath); arcan_softoverride_namespace(respath, RESOURCE_APPL_SHARED); arcan_softoverride_namespace(state_dir, RESOURCE_SYS_APPLSTATE); arcan_softoverride_namespace(debug_dir, RESOURCE_SYS_DEBUG); arcan_softoverride_namespace(font_dir, RESOURCE_SYS_FONT); arcan_softoverride_namespace("./", RESOURCE_SYS_BINS); arcan_softoverride_namespace("./", RESOURCE_SYS_LIBS); }
char* arcan_find_resource(const char* label, enum arcan_namespaces space, enum resource_type ares) { if (label == NULL || verify_traverse(label) == NULL) return NULL; size_t label_len = strlen(label); for (int i = 1, j = 0; i <= RESOURCE_SYS_ENDM; i <<= 1, j++){ if ((space & i) == 0 || !namespaces.paths[j]) continue; char scratch[ namespaces.lenv[j] + label_len + 2 ]; snprintf(scratch, sizeof(scratch), label[0] == '/' ? "%s%s" : "%s/%s", namespaces.paths[j], label ); if ( ((ares & ARES_FILE) && arcan_isfile(scratch)) || ((ares & ARES_FOLDER) && arcan_isdir(scratch)) ) return strdup(scratch); } return NULL; }
static char* unix_find(const char* fname) { char* res = NULL; char* pathtbl[] = { ".", NULL, /* fill in with HOME */ "/usr/local/share/arcan", "/usr/share/arcan", NULL /* NULL terminates */ }; if (getenv("HOME")){ size_t len = strlen( getenv("HOME") ) + 9; pathtbl[1] = malloc(len); snprintf(pathtbl[1], len, "%s/.arcan", getenv("HOME") ); } else pathtbl[1] = strdup(""); size_t fn_l = strlen(fname); for (char** base = pathtbl; *base != NULL; base++){ char buf[ fn_l + strlen(*base) + 2 ]; snprintf(buf, sizeof(buf), "%s/%s", *base, fname); if (arcan_isdir(buf)){ res = strdup(buf); break; } } free(pathtbl[1]); return res; }
/* * current several namespaces are (legacy) specified relative * to the old resources namespace, since those are expanded in * set_namespace_defaults where the command-line switch isn't * available, we have to generate these dependent namespaces * overrides as well. */ static void override_resspaces(const char* respath) { size_t len = strlen(respath); if (len == 0 || !arcan_isdir(respath)){ arcan_warning("-p argument ignored, invalid path specified."); return; } char debug_dir[ len + sizeof("/logs") ]; char state_dir[ len + sizeof("/savestates") ]; char font_dir[ len + sizeof("/fonts") ]; snprintf(debug_dir, sizeof(debug_dir), "%s/logs", respath); snprintf(state_dir, sizeof(state_dir), "%s/savestates", respath); snprintf(font_dir, sizeof(font_dir), "%s/fonts", respath); arcan_override_namespace(respath, RESOURCE_APPL_SHARED); arcan_override_namespace(debug_dir, RESOURCE_SYS_DEBUG); arcan_override_namespace(state_dir, RESOURCE_APPL_STATE); arcan_override_namespace(font_dir, RESOURCE_SYS_FONT); }