00001
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;
00017 static int n=0;
00018
00019
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
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
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
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
00078
00079
00080
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
00095 return(1);
00096 }
00097 i++;
00098 }
00099 return(0);
00100 }
00101