cluni0.c

Go to the documentation of this file.
00001 /* Copyright INRIA/ENPC */
00002 #include <stdio.h>
00003 #include <string.h>
00004 
00005 #include "core_math.h"
00006 #include "Os_specific.h"
00007 
00008 #define MAX_ENV 256 
00009 
00010 static char *SCI_a[] = {  "SCI/", "sci/", "$SCI", "SCI\\", "sci\\", (char *) 0 };
00011 static char *HOME_a[] = {  "HOME/", "home/", "~/" , "HOME\\", "home\\", "~\\" ,"$HOME", (char *) 0};
00012 static char *TMP_a[] = {  "TMPDIR/", "tmpdir/","TMPDIR\\", "tmpdir\\", "$TMPDIR", (char *) 0};
00013 void GetenvB __PARAMS(( char *name,char *env, int len));
00014 static int Cluni0 __PARAMS((char *env,char **alias,char* in_name,char *out_name, long int lin));
00015 
00016 extern int UpdateEnvVar; /* see setenvc.c */
00017 static int n=0;
00018 /************************************************
00019  * expand  in_name to produce out_name 
00020  *       
00021  ************************************************/
00022 
00023 int C2F(cluni0)(char *in_name, char *out_name, int *out_n, long int lin, long int lout)
00024 {
00025   int  nc= MAX_ENV;
00026   static char SCI[MAX_ENV],HOME[MAX_ENV],TMP[MAX_ENV];
00027   static int k;
00028   
00029   if ( ( n==0 ) || (UpdateEnvVar == 1) )
00030   {
00031           GetenvB("SCI",SCI,nc);
00032           GetenvB("HOME",HOME,nc);
00033       GetenvB("TMPDIR",TMP,nc);
00034           n=n+1;
00035           UpdateEnvVar=0;
00036   }
00037   /* in_name[lin]='\0';*/
00038   if ( Cluni0(SCI,SCI_a,in_name,out_name,lin) == 0 )
00039     if ( Cluni0(HOME,HOME_a,in_name,out_name,lin) == 0 )
00040       if ( Cluni0(TMP,TMP_a,in_name,out_name,lin) == 0 ){
00041         strncpy(out_name,in_name,(size_t)lin);
00042         out_name[lin]='\0';
00043       }
00044   /*strncpy(out_name,in_name,lout); */
00045   *out_n = strlen(out_name);
00046 #if defined(_MSC_VER)
00047   for (k=0 ; k < *out_n ;k++) if ( out_name[k]=='/') out_name[k]='\\';
00048 #else
00049   for (k=0 ; k < *out_n ;k++) if ( out_name[k]=='\\') out_name[k]='/';
00050 #endif
00051 
00052 
00054   return(0);
00055 }
00056 
00057 /************************************************
00058  * getenv + squash trailing white spaces 
00059  ************************************************/
00060 
00061 void GetenvB(char *name, char *env, int len)
00062 {
00063   int ierr,un=1;
00064   C2F(getenvc)(&ierr,name,env,&len,&un);
00065   if( ierr == 0) 
00066     {
00067       char *last = &env[len-1];
00068       while ( *last == ' ' ) { last = '\0' ; } last--;
00069     }
00070   else 
00071     {
00072       env[0] = '\0' ;
00073     }  
00074 }
00075 
00076 /************************************************
00077  * expand in_name to produce out_name 
00078  *     try to find alias[i] at the begining of in_name 
00079  *     and replaces it by env in out_name 
00080  *     out_name must be large enough to get the result 
00081  ************************************************/
00082 
00083 static int Cluni0(char *env, char **alias, char *in_name, char *out_name, long int lin)
00084 {
00085   int i=0;
00086   if ( env[0] == '\0' ) return(0);
00087   while ( alias[i] != (char *) 0) 
00088     {
00089       if ( strncmp(alias[i],in_name,strlen(alias[i])) == 0)
00090         {
00091           strcpy(out_name,env);
00092           strncat(out_name,in_name+strlen(alias[i])-1,
00093                   (size_t)(lin-strlen(alias[i]+1)));
00094           /*sprintf(out_name,"%s/%s",env,in_name+strlen(alias[i]));*/
00095           return(1);
00096         }
00097       i++;
00098     }
00099   return(0);
00100 }
00101 

Generated on Sun Mar 4 15:03:46 2007 for Scilab [trunk] by  doxygen 1.5.1