diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-05-25 22:01:51 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-05-25 22:02:15 (GMT) |
commit | eef3392134b489fbff7c96046581c987ff7192bd (patch) | |
tree | d9926feb13b8a5008cc0013e7ad0a5adb9c73637 /src/core | |
parent | 2d16cca046ff80f2be3eea6934dd1dd8f4b807d1 (diff) |
Provided a way to relocate built binaries.
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/paths.c | 81 | ||||
-rw-r--r-- | src/core/paths.h | 6 |
2 files changed, 85 insertions, 2 deletions
diff --git a/src/core/paths.c b/src/core/paths.c index f58f46c..7f4765e 100644 --- a/src/core/paths.c +++ b/src/core/paths.c @@ -27,12 +27,20 @@ #include <glib.h> #include <malloc.h> #include <stdio.h> +#include <string.h> #include <unistd.h> #include <config.h> +#include "../common/extstr.h" + + + +/* Eventuelle nouvelle racine de substitution */ +static const char *_new_prefix = NULL; + /* Trouve le chemin d'accès complet à un fichier donné. */ static char *find_file_in_directory(const char *, const char *); @@ -41,6 +49,65 @@ static char *find_file_in_directory(const char *, const char *); /****************************************************************************** * * +* Paramètres : new = nouvelle racine pour les répertoires. * +* * +* Description : Enregistre un répertoire comme nouvelle base de construction.* +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void register_new_prefix(const char *new) +{ + _new_prefix = new; + +} + + +/****************************************************************************** +* * +* Paramètres : template = répertoire de travail visé. * +* * +* Description : Fournit le répertoire réel correspondant à une cible. * +* * +* Retour : Répertoire de travail effectif. * +* * +* Remarques : - * +* * +******************************************************************************/ + +char *get_effective_directory(const char *template) +{ + char *result; /* Répertoire à retourner */ + size_t len; /* Taille de comparaison */ + + result = NULL; + + if (_new_prefix == NULL) + goto use_default; + + len = strlen(BUILD_PREFIX_DIR); + + if (strncmp(template, BUILD_PREFIX_DIR, len) == 0) + { + result = strdup(_new_prefix); + result = stradd(result, template + len); + } + + use_default: + + if (result == NULL) + result = strdup(template); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : dirname = répertoire de travail à fouiller. * * filename = nom de fichier seul comme indice. * * * @@ -87,6 +154,7 @@ static char *find_file_in_directory(const char *dirname, const char *filename) char *find_pixmap_file(const char *filename) { char *result; /* Trouvaille à renvoyer */ + char *edir; /* Répertoire de base effectif */ /** * On privilégie si possible les sources fraiches. @@ -103,7 +171,11 @@ char *find_pixmap_file(const char *filename) #endif if (result == NULL) - result = find_file_in_directory(PIXMAPS_DIR, filename); + { + edir = get_effective_directory(PIXMAPS_DIR); + result = find_file_in_directory(edir, filename); + free(edir); + } return result; @@ -129,6 +201,7 @@ char *find_plugin_data_file(const char *pgname, const char *filename) #ifndef DISCARD_LOCAL char *dirname; /* Répertoire à cibler */ #endif + char *edir; /* Répertoire de base effectif */ /** * On privilégie si possible les sources fraiches. @@ -150,7 +223,11 @@ char *find_plugin_data_file(const char *pgname, const char *filename) #endif if (result == NULL) - result = find_file_in_directory(PLUGINS_DATA_DIR, filename); + { + edir = get_effective_directory(PLUGINS_DATA_DIR); + result = find_file_in_directory(edir, filename); + free(edir); + } return result; diff --git a/src/core/paths.h b/src/core/paths.h index a755559..e6ce61f 100644 --- a/src/core/paths.h +++ b/src/core/paths.h @@ -26,6 +26,12 @@ +/* Enregistre un répertoire comme nouvelle base de construction. */ +void register_new_prefix(const char *); + +/* Fournit le répertoire réel correspondant à une cible. */ +char *get_effective_directory(const char *); + /* Trouve le chemin d'accès complet à un fichier d'image. */ char *find_pixmap_file(const char *); |