#include #include #include "etc.h" /* Remplace les variables d'environnement par leur valeur dans une chaine. Retourne le nombre de remplacement fait. */ export int str_replenv ( const char *src, /* Chaine a modifié */ char *dest, /* Résultat */ /* Peut être la même que src */ char carcle) /* Caractère clé identifiant une variable */ /* d'environnement */ { int ret = 0; char *pt = dest; if (dest != src) strcpy (dest,src); while (1){ if ((pt = strchr(pt,carcle)) != NULL){ pt++; if (pt[0] == '('){ char *mot = ++pt; while (*pt != '\0' && *pt != ')') pt++; if (*pt == ')'){ char *repl; *pt = '\0'; repl = getenv(mot); *pt = ')'; if (repl != NULL){ char tmp[500]; int lenavant = (int)(mot-dest)-2; if (lenavant > 0) strncpy (tmp,dest,lenavant); tmp[lenavant] = '\0'; strcat (tmp+lenavant,repl); strcat (tmp+lenavant,pt+1); strcpy (dest,tmp); pt = dest+lenavant; ret ++; } } } }else{ break; } } return ret; } /* Traduit une chaine en remplacant les macros et variable d'environnement. Les symboles sont des sous-chaines. tb[][0] contient des sous-chaine à remplacer. tb[][1] contient la chaine de remplacement. Aucune chaine tb[i][0] ne doit etre une sous-chaine de tb[j][0] où j > i Applique str_expand en premier et ensuite vérifie pour les variables d'environnement. Les variables sont présenté comme suit: carcle(variable) */ export void str_expandenv ( const char *str, /* chaine a expandre */ char *dest, /* resultat */ char *tb[][2], /* const C++ ??? macro,texte correspondant */ int nbtb, /* nombre d'item dans tb */ char carcle) /* Caractère clé identifiant une variable */ /* d'environnement */ { str_expand (str,dest,tb,nbtb); str_replenv (dest,dest,carcle); } #ifdef TEST static void near tst(const char *src) { static char *tb[][2]={ "$.", "Courant", "$$", "$", }; char dest[200]; str_expandenv (src,dest,tb,2,'$'); printf ("src -> :%s:\n",src); printf (" :%s:\n",dest); } int main (int, char *[]) { tst ("allo"); tst ("$(KITGROUPE)/allo"); tst ("toto/$(VCSID)/allo"); return 0; } #endif