diff options
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 *);  | 
