#include #include #include #include "projetx.m" #include "projet.h" /* D‚termine la valeur d'une paramŠtre de configuration … partir de getenv(). Si pas dans l'environnement, utilise defval. Retourne une copie de la s‚lection via strdup_err(). */ char *userinfo_chkenv( const char *varname, // Nom de la variable const char *defval) // Valeur par d‚faut { defval = macrodir_getval (varname,defval); const char *pt = getenv (varname); if (pt != NULL) defval = pt; return strdup_err (defval); } /* S‚lectionne une version de projet … partir du path courant. Si ne peut pas s‚lectionner, demande interactivement. Retourne la structure de controle. Ou NULL si abandon. Valide aussi l'environnement usager. Si trouve quelques chose de pas catholique, g‚nŠre un message d'erreur et retourne NULL. */ USERINFO *userinfo_findenv (const char *prog) { USERINFO *user = NULL; const char *home = getenv("HOME"); home = macrodir_getval ("HOME",home); if (home == NULL){ xconf_error (MSG_U(E_NOHOME,"Variable HOME non définie")); }else{ /* #Sp‚cification: Archivage / R‚pertoires / Path par d‚faut. Par d‚faut, les r‚pertoires d'archive ont un emplacement absolu. On peut control‚ chacun via une variable d'environnement. R‚pertoire DOS UNIX Variable /kit/ombre n:\kit\ombre /kit/ombre KITOMBRE /kit/build n:\kit\build /kit/build KITBUILD /kit/groupe n:\kit\groupe /kit/groupe KITGROUPE /kitobj n:\kitobj /home/obj/build/gnu /kit/livre n:\kit\livre /kit/livre KITLIVRE /kit/sync n:\kit\sync /kit/sync KITSYNC */ const char *groupe = userinfo_chkenv("KITGROUPE",KITGROUPE); const char *ombre = userinfo_chkenv("KITOMBRE",KITOMBRE); #ifdef MISSING const char *build = userinfo_chkenv("KITBUILD",KITBUILD); #endif const char *livre = userinfo_chkenv("KITLIVRE",KITLIVRE); const char *sync = userinfo_chkenv("KITSYNC",KITSYNC); if (file_type(groupe)!=1){ xconf_error (MSG_U(E_NOKITGROUPE ,"Ne peut localiser le répertoire d'archive\n%s") ,groupe); }else if (file_type(ombre)!=1){ xconf_error (MSG_U(E_NOKITOMBRE ,"Ne peut localiser le répertoire\n" "d'extraction %s") ,ombre); #ifdef MISSING }else if (file_type(build)!=1){ xconf_error (MSG_U(E_NOKITBUILD ,"Ne peut localiser le répertoire d'intégration\n%s") ,build); #endif }else if (file_type(livre)!=1){ xconf_error (MSG_U(E_NOKITLIVRE ,"Ne peut localiser le répertoire\n" "de livraison\n%s") ,livre); }else if (file_type(sync)!=1){ xconf_error (MSG_U(E_NOKITSYNC ,"Ne peut localiser le répertoire\n" "de synchronisation\n%s") ,sync); }else{ // Tente de d‚terminer la version … partir du r‚pertoire user = new USERINFO (prog,"",home,groupe,ombre,livre,sync); int ok = 0; char cwd[MAXSIZ_PATH]; if (path_getcwd(cwd,sizeof(cwd)) != -1){ int len = strlen(home); ok = 1; if (strncasecmp(home,cwd,len)==0 && path_issep(cwd[len])){ // On est dans le r‚pertoire usager. // il faut être dans le projet char *verprj = cwd + len + 1; // La version c'est le premier r‚pertoire sous home char *pt = verprj; while (*pt != '\0' && !path_issep(*pt)) pt++; *pt = '\0'; VERSION_DAT version(user); VERSION_ONE *one = version.select(verprj,prog); if (one != NULL){ user->setversion (one); ok = 2; } } } if (!ok){ if (version_setmain (user,NULL) == 0){ delete user; user = NULL; } } } } return user; }