* bug #12415 fixed - PATH environment variable grows when using call_scilab in a... 92/10892/2
Simon Marchetto [Tue, 19 Mar 2013 18:50:16 +0000 (19:50 +0100)]
Fix:
 - new internal macro addPathToEnv.sci which adds a path to an env variable only if the env does not include it already
   use addPathToEnv() everywhere a path env is used in Scilab (mostly dynamic_link)
 - same fix in C function AddScilabBinDirectoryToPATHEnvironnementVariable()

+ remove filesep() in Windows macros

Change-Id: Ia0bf42d41a85a64148eb719e79569402c2267d7b

16 files changed:
scilab/CHANGES_5.4.X
scilab/modules/dynamic_link/macros/buildmacros.sce
scilab/modules/dynamic_link/macros/configure_msifort.sci
scilab/modules/dynamic_link/macros/configure_msvc.sci
scilab/modules/dynamic_link/macros/utils/addPathToEnv.sci [new file with mode: 0644]
scilab/modules/dynamic_link/macros/utils/buildmacros.bat [new file with mode: 0644]
scilab/modules/dynamic_link/macros/utils/buildmacros.sce [new file with mode: 0644]
scilab/modules/dynamic_link/macros/utils/cleanmacros.bat [new file with mode: 0644]
scilab/modules/dynamic_link/macros/windows/dlwSetEnvCommonVc9Vc10.sci
scilab/modules/dynamic_link/macros/windows/dlwSetEnvVc70.sci
scilab/modules/dynamic_link/macros/windows/dlwSetEnvVc71.sci
scilab/modules/dynamic_link/macros/windows/dlwSetEnvVc80.sci
scilab/modules/dynamic_link/tests/unit_tests/addPathToEnv.dia.ref [new file with mode: 0644]
scilab/modules/dynamic_link/tests/unit_tests/addPathToEnv.tst [new file with mode: 0644]
scilab/modules/scicos_blocks/macros/buildmacros.sce
scilab/modules/windows_tools/src/c/scilab_windows/SetScilabEnvironmentVariables.c

index 729162b..9947f68 100644 (file)
@@ -644,6 +644,7 @@ Xcos
                      simulation fixed.
 
 
+* bug #12415 fixed - PATH environment variable grows when using call_scilab in a loop
 
 
                     Changes between version 5.3.3 and 5.4.0
index 0ebedb9..9331b6d 100644 (file)
@@ -13,6 +13,7 @@ if (isdef('genlib') == %f) then
 end
 //=============================================================================
 genlib('dynamic_linklib','SCI/modules/dynamic_link/macros',%f,%t);
+genlib('dynamic_linkutilslib','SCI/modules/dynamic_link/macros/utils',%f,%t);
 //=============================================================================
 if getos() == 'Windows' then
   genlib('dynamic_linkwindowslib','SCI/modules/dynamic_link/macros/windows',%f,%t);
index 7033e9c..1c69b76 100644 (file)
@@ -7,9 +7,15 @@
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
+
 //=============================================================================
 function bOK = configure_msifort()
 
+// Load dynamic_link Internal lib if it's not already loaded
+if ~ exists("dynamic_linkutilslib") then
+  load("SCI/modules/dynamic_link/macros/utils/lib");
+end
+
 //=============================================================================
 //  functions defined only in configure_ifort
 //=============================================================================
@@ -33,12 +39,10 @@ endfunction
 function bOK = set_commons_ifort12(ifpath, machinepath)
   // intel fortran directories changed (AGAIN !!!) with version 12
   bOK = %F;
-  ENV_PATH = getenv("PATH", "");
-  // example set PATH=%IFORT_COMPILER12%\Bin\intel64;
+    // example set PATH=%IFORT_COMPILER12%\Bin\intel64;
   PATH_TO_ADD = ifpath + "bin" + filesep() + machinepath;
   if isdir(PATH_TO_ADD) then
-    ENV_PATH = PATH_TO_ADD + pathsep() + ENV_PATH;
-    err = setenv("PATH", ENV_PATH);
+    err = addPathToEnv("PATH", PATH_TO_ADD);
     if (err == %F) then bOK = %F,return,end
     bOK = %T;
   else
@@ -47,11 +51,9 @@ function bOK = set_commons_ifort12(ifpath, machinepath)
   end
 
   // example set INCLUDE=%IFORT_COMPILER12%\compiler\include\intel64;
-  ENV_INCLUDE = getenv("INCLUDE", "");
   PATH_TO_ADD = ifpath + "compiler" + filesep() + "include" + filesep() + machinepath;
   if isdir(PATH_TO_ADD) then
-    ENV_INCLUDE = PATH_TO_ADD + pathsep() + ENV_INCLUDE;
-    err = setenv("INCLUDE", ENV_INCLUDE);
+    err = addPathToEnv("INCLUDE", PATH_TO_ADD);
     if (err == %F) then bOK = %F,return,end
     bOK = %T;
   else
@@ -60,11 +62,9 @@ function bOK = set_commons_ifort12(ifpath, machinepath)
   end
 
   // example set LIB=%IFORT_COMPILER12%\compiler\lib\intel64;
-  ENV_LIB = getenv("LIB", "");
   PATH_TO_ADD = ifpath + "compiler" + filesep() + "lib" + filesep() + machinepath;
   if isdir(PATH_TO_ADD) then
-    ENV_LIB = PATH_TO_ADD + pathsep() + ENV_LIB;
-    err = setenv("LIB", ENV_LIB);
+    err = addPathToEnv("LIB", PATH_TO_ADD);
     if (err == %F) then bOK = %F,return,end
     bOK = %T;
   else
@@ -77,12 +77,10 @@ endfunction
 function bOK = set_commons_ifort11(ifpath, machinepath)
   // intel fortran directories changed with version 11
   bOK = %F;
-  ENV_PATH = getenv("PATH", "");
   // example set PATH=%IFORT_COMPILER11%\Bin\intel64;
   PATH_TO_ADD = ifpath + "bin" + filesep() + machinepath;
   if isdir(PATH_TO_ADD) then
-    ENV_PATH = PATH_TO_ADD + pathsep() + ENV_PATH;
-    err = setenv("PATH", ENV_PATH);
+    err = addPathToEnv("PATH", PATH_TO_ADD);
     if (err == %F) then bOK = %F,return,end
     bOK = %T;
   else
@@ -91,11 +89,9 @@ function bOK = set_commons_ifort11(ifpath, machinepath)
   end
 
   // example set INCLUDE=%IFORT_COMPILER11%\include\intel64;
-  ENV_INCLUDE = getenv("INCLUDE", "");
   PATH_TO_ADD = ifpath + "include" + filesep() + machinepath;
   if isdir(PATH_TO_ADD) then
-    ENV_INCLUDE = PATH_TO_ADD + pathsep() + ENV_INCLUDE;
-    err = setenv("INCLUDE", ENV_INCLUDE);
+    err = addPathToEnv("INCLUDE", PATH_TO_ADD);
     if (err == %F) then bOK = %F,return,end
     bOK = %T;
   else
@@ -104,11 +100,10 @@ function bOK = set_commons_ifort11(ifpath, machinepath)
   end
 
   // example set LIB=%IFORT_COMPILER10%\lib\intel64;
-  ENV_LIB = getenv("LIB", "");
   PATH_TO_ADD = ifpath + "lib" + filesep() + machinepath;
   if isdir(PATH_TO_ADD) then
     ENV_LIB = PATH_TO_ADD + pathsep() + ENV_LIB;
-    err = setenv("LIB", ENV_LIB);
+    err = addPathToEnv("LIB", PATH_TO_ADD);
     if (err == %F) then bOK = %F,return,end
     bOK = %T;
   else
@@ -122,11 +117,9 @@ function bOK = set_commons_msi9and10(ifpath,machinepath)
   bOK = %F;
 
   // example set PATH=%IFORT_COMPILER10%\EM64T\Bin;
-  ENV_PATH = getenv("PATH", "");
   PATH_TO_ADD = ifpath + machinepath + filesep() + "bin";
   if isdir(PATH_TO_ADD) then
-    ENV_PATH = PATH_TO_ADD + pathsep() + ENV_PATH;
-    err = setenv("PATH", ENV_PATH);
+    err = addPathToEnv("PATH", PATH_TO_ADD);
     if (err == %F) then bOK = %F,return,end
     bOK = %T;
   else
@@ -135,11 +128,9 @@ function bOK = set_commons_msi9and10(ifpath,machinepath)
   end
 
   // example set INCLUDE=%IFORT_COMPILER10%\EM64T\Include;
-  ENV_INCLUDE = getenv("INCLUDE", "");
   PATH_TO_ADD = ifpath + machinepath + filesep() + "Include";
   if isdir(PATH_TO_ADD) then
-    ENV_INCLUDE = PATH_TO_ADD + pathsep() + ENV_INCLUDE;
-    err = setenv("INCLUDE", ENV_INCLUDE);
+    err = addPathToEnv("INCLUDE", PATH_TO_ADD);
     if (err == %F) then bOK = %F,return,end
     bOK = %T;
   else
@@ -148,11 +139,9 @@ function bOK = set_commons_msi9and10(ifpath,machinepath)
   end
 
   // example set LIB=%IFORT_COMPILER10%\EM64T\Lib;
-  ENV_LIB = getenv("LIB", "");
   PATH_TO_ADD = ifpath + machinepath + filesep() + "Lib";
   if isdir(PATH_TO_ADD) then
-    ENV_LIB = PATH_TO_ADD + pathsep() + ENV_LIB;
-    err = setenv("LIB", ENV_LIB);
+    err = addPathToEnv("LIB", PATH_TO_ADD);
     if (err == %F) then bOK = %F,return,end
     bOK = %T;
   else
index 6986861..4d25f38 100644 (file)
@@ -21,6 +21,11 @@ function bOK = configure_msvc()
     load("SCI/modules/dynamic_link/macros/windows/lib");
   end
 
+  // Load dynamic_link Internal lib if it's not already loaded
+  if ~ exists("dynamic_linkutilslib") then
+    load("SCI/modules/dynamic_link/macros/utils/lib");
+  end
+
   msvc = findmsvccompiler();
   if win64() & detectmsvc64tools() then
     bOK = dlwConfigureVcx64();
diff --git a/scilab/modules/dynamic_link/macros/utils/addPathToEnv.sci b/scilab/modules/dynamic_link/macros/utils/addPathToEnv.sci
new file mode 100644 (file)
index 0000000..51e49df
--- /dev/null
@@ -0,0 +1,62 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Simon MARCHETTO
+//
+// This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+function outStrings = removeTrailingChar(inStrings, trailingChar)
+    outStrings = [];
+    for i = 1:size(inStrings, '*')
+        str = inStrings(i);
+        if str <> "" then
+            l = length(str);
+            if part(str, l:l) == trailingChar then
+                outStrings(i) = part(str, 1:l-1);
+            else
+                outStrings(i) = inStrings(i);
+            end
+        end
+    end
+endfunction
+
+function res = addPathToEnv(envName, paths)
+    if ~isempty(paths) then
+        // Retrieve path list to add
+        pathsConverted = pathconvert(paths, %t, %f);
+        pathToAddList = tokens(pathsConverted, pathsep());
+        pathToAddList = removeTrailingChar(pathToAddList, filesep());
+
+        // Retrieve env path list
+        envPaths = getenv(envName, '');
+        tmpEnvPath = pathconvert(envPaths, %t, %f);
+        envPathList = tokens(tmpEnvPath, pathsep());
+        envPathList = removeTrailingChar(envPathList, filesep());
+        envPathList(find(envPathList == '')) = [];
+
+        // For each path to add to env
+        for i = 1:size(pathToAddList, 'r')
+            pathToAdd = pathToAddList(i);
+            lcPathToAdd = convstr(pathToAdd, 'l');
+            lcEnvPathList = convstr(envPathList, 'l');
+
+            // Add path if do not exist in env path list
+            found = find(lcPathToAdd == lcEnvPathList);
+            if found == [] then
+                envPathList = [envPathList; pathToAdd];
+            end
+
+            // Get env new value by concatening env path list
+            envPathList = removeTrailingChar(envPathList, pathsep());
+            envPaths = strcat(envPathList, pathsep());
+
+            // Set the new env value
+            if ~setenv(envName, envPaths) then
+                errMsg = msprintf("error while setting" ..
+                    + " environment variable ''%s''", envName);
+                error(errMsg);
+            end
+        end
+    end
+    res = %t;
+endfunction
diff --git a/scilab/modules/dynamic_link/macros/utils/buildmacros.bat b/scilab/modules/dynamic_link/macros/utils/buildmacros.bat
new file mode 100644 (file)
index 0000000..0d77c15
--- /dev/null
@@ -0,0 +1 @@
+@..\..\..\..\bin\scilex -nwni -ns -e exec('buildmacros.sce');quit;
\ No newline at end of file
diff --git a/scilab/modules/dynamic_link/macros/utils/buildmacros.sce b/scilab/modules/dynamic_link/macros/utils/buildmacros.sce
new file mode 100644 (file)
index 0000000..aafcdfa
--- /dev/null
@@ -0,0 +1,15 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) Scilab Enterprises - 2013 - Simon MARCHETTO
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+//==============================================================================
+if (isdef('genlib') == %f) then
+  exec(SCI+'/modules/functions/scripts/buildmacros/loadgenlib.sce');
+end
+//==============================================================================
+genlib('dynamic_link_utilslib', 'SCI/modules/dynamic_link/macros/utils', %f, %t);
+//==============================================================================
diff --git a/scilab/modules/dynamic_link/macros/utils/cleanmacros.bat b/scilab/modules/dynamic_link/macros/utils/cleanmacros.bat
new file mode 100644 (file)
index 0000000..5079dfd
--- /dev/null
@@ -0,0 +1,3 @@
+@del *.bin 2>NUL
+@del lib 2>NUL
+@del names 2>NUL
\ No newline at end of file
index 9713c04..41b9c89 100644 (file)
@@ -37,42 +37,37 @@ function bOK = dlwSetEnvCommonVc9Vc10(MSVSDir, IsExpress, bWin64)
     return
   end
 
-  PATH = getenv('PATH', '');
-  INCLUDE = getenv('INCLUDE', '');
-  LIB = getenv('LIB', '');
-  LIBPATH = getenv('LIBPATH', '');
-
   if bWin64 then
-    PATH = getNewPATHx64(PATH, MSVSDir, windowsSdkPath, IsExpress);
-    INCLUDE = getNewINCLUDEx64(INCLUDE, MSVSDir, windowsSdkPath, IsExpress);
-    LIB = getNewLIBx64(LIB, MSVSDir, windowsSdkPath, IsExpress);
-    LIBPATH = getNewLIBPATHx64(LIBPATH, MSVSDir, windowsSdkPath, IsExpress);
+    VC_PATH = getVcPathx64(MSVSDir, windowsSdkPath, IsExpress);
+    VC_INCLUDE = getVcIncludex64(MSVSDir, windowsSdkPath, IsExpress);
+    VC_LIB = getVcLibx64(MSVSDir, windowsSdkPath, IsExpress);
+    VC_LIBPATH = getVcLibPathx64(MSVSDir, windowsSdkPath, IsExpress);
   else
-    PATH = getNewPATHx86(PATH, MSVSDir, windowsSdkPath, IsExpress);
-    INCLUDE = getNewINCLUDEx86(INCLUDE, MSVSDir, windowsSdkPath, IsExpress);
-    LIB = getNewLIBx86(LIB, MSVSDir, windowsSdkPath, IsExpress);
-    LIBPATH = getNewLIBPATHx86(LIBPATH, MSVSDir, windowsSdkPath, IsExpress);
+    VC_PATH = getVcPathx86(MSVSDir, windowsSdkPath, IsExpress);
+    VC_INCLUDE = getVcIncludex86(MSVSDir, windowsSdkPath, IsExpress);
+    VC_LIB = getVcLibx86(MSVSDir, windowsSdkPath, IsExpress);
+    VC_LIBPATH = getVcLibPathx86(MSVSDir, windowsSdkPath, IsExpress);
   end
 
-  err = setenv('PATH', PATH);
+  err = addPathToEnv('PATH', VC_PATH);
   if (err == %F) then
     bOK = %F;
     return
   end
 
-  err = setenv('INCLUDE', INCLUDE);
+  err = addPathToEnv('INCLUDE', VC_INCLUDE);
   if (err == %F) then
     bOK = %F;
     return
   end
 
-  err = setenv('LIB', LIB);
+  err = addPathToEnv('LIB', VC_LIB);
   if (err == %F) then
     bOK = %F;
     return
   end
 
-  err = setenv('LIBPATH', LIBPATH);
+  err = addPathToEnv('LIBPATH', VC_LIBPATH);
   if (err == %F) then
     bOK = %F;
     return
@@ -81,110 +76,91 @@ function bOK = dlwSetEnvCommonVc9Vc10(MSVSDir, IsExpress, bWin64)
   bOK = %T;
 endfunction
 //=============================================================================
-function newLIB = getNewLIBx64(LIB, msvsPath, sdkPath, bIsExpress)
-  newLIB = '';
-
+function VcLib = getVcLibx64(msvsPath, sdkPath, bIsExpress)
   if bIsExpress then
-    Vc64Path = dlwGet64BitPath();
-    newLIB = Vc64Path + '\VC\LIB\amd64' + pathsep();
+    VcLib = dlwGet64BitPath() + '\VC\lib\amd64';
   else
-    newLIB = msvsPath + '\VC\ATLMFC\LIB\amd64' + pathsep() + ..
-             msvsPath + '\VC\LIB\amd64' + pathsep();
+    VcLib = msvsPath + '\VC\atlmfc\lib\amd64' + pathsep() + ..
+             msvsPath + '\VC\lib\amd64';
   end
 
-  newLIB = newLIB + ..
-           sdkPath + '\lib\x64' + pathsep() + LIB;
-
+  VcLib = VcLib + pathsep() + sdkPath + '\lib\x64';
 endfunction
 //=============================================================================
-function newLIB = getNewLIBx86(LIB, msvsPath, sdkPath, bIsExpress)
-  newLIB = '';
+function VcLib = getVcLibx86(msvsPath, sdkPath, bIsExpress)
+  VcLib = '';
   if ~bIsExpress then
-    newLIB =  msvsPath + filesep() + 'VC\ATLMFC\LIB' + pathsep();
+    VcLib =  msvsPath + filesep() + 'VC\atlmfc\lib';
   end
-  newLIB = newLIB + ..
-           msvsPath + filesep() + 'VC\LIB' + pathsep() + ..
-           sdkPath + filesep() + 'lib' + pathsep() + ..
-           LIB;
+  VcLib = VcLib + pathsep() + ..
+           msvsPath + '\VC\lib' + pathsep() + ..
+           sdkPath + '\lib';
 endfunction
 //=============================================================================
-function newPATH = getNewPATHx64(PATH, msvsPath, sdkPath, bIsExpress)
-  newPATH = '';
-
+function VcPath = getVcPathx64(msvsPath, sdkPath, bIsExpress)
   if bIsExpress then
-    Vc64Path = dlwGet64BitPath();
-    newPATH = Vc64Path + '\VC\BIN\amd64' + pathsep();
+    VcPath = dlwGet64BitPath();
   else
-    newPATH = msvsPath + '\VC\BIN\amd64' + pathsep();
+    VcPath = msvsPath;
   end
 
-  newPATH = newPATH + ..
+  VcPath = VcPath + pathsep() + '\VC\bin\amd64' + pathsep() + ..
             msvsPath + '\VC\VCPackages' + pathsep() + ..
             msvsPath + '\Common7\IDE' + pathsep() + ..
             msvsPath + '\Common7\Tools' + pathsep() + ..
             msvsPath + '\Common7\Tools\bin' + pathsep() + ..
             sdkPath + '\bin\x64' + pathsep() + ..
             sdkPath + '\bin\win64\x64' + pathsep() + ..
-            sdkPath + '\bin' + pathsep() + PATH;
-
+            sdkPath + '\bin';
 endfunction
 //=============================================================================
-function newPATH = getNewPATHx86(PATH, msvsPath, sdkPath, bIsExpress)
-  newPATH = msvsPath + '\Common7\IDE\' + pathsep() + ..
+function VcPath = getVcPathx86(msvsPath, sdkPath, bIsExpress)
+  VcPath = msvsPath + '\Common7\IDE\' + pathsep() + ..
             msvsPath + '\VC\bin' + pathsep() + ..
-            msvsPath + '\Common7\Tools'+ pathsep() + ..
+            msvsPath + '\Common7\Tools' + pathsep() + ..
             msvsPath + '\VC\VCPackages' + pathsep() + ..
-            sdkPath + '\bin' + pathsep() + PATH + pathsep();
+            sdkPath + '\bin';
 endfunction
 //=============================================================================
-function newLIBPATH = getNewLIBPATHx64(LIBPATH, msvsPath, sdkPath, bIsExpress)
-  newLIBPATH = '';
-
+function VcLibPath = getVcLibPathx64(msvsPath, sdkPath, bIsExpress)
   if bIsExpress then
-    Vc64Path = dlwGet64BitPath();
-    newLIBPATH = Vc64Path +  '\VC\LIB\amd64' + pathsep() + LIBPATH;
+    VcLibPath = dlwGet64BitPath() +  '\VC\lib\amd64';
   else
-    newLIBPATH = msvsPath + '\VC\ATLMFC\LIB\amd64' + pathsep() + ..
-                 msvsPath + '\VC\LIB\amd64' + pathsep() + LIBPATH;
+    VcLibPath = msvsPath + '\VC\atlmfc\lib\amd64' + pathsep() + ..
+                 msvsPath + '\VC\lib\amd64';
   end
-
 endfunction
 //=============================================================================
-function newLIBPATH = getNewLIBPATHx86(LIBPATH, msvsPath, sdkPath, bIsExpress)
-  newLIBPATH = '';
-
+function VcLibPath = getVcLibPathx86(msvsPath, sdkPath, bIsExpress)
+  VcLibPath = '';
   if ~bIsExpress then
-    newLIBPATH = msvsPath + '\VC\ATLMFC\LIB' + pathsep();
+    VcLibPath = msvsPath + '\VC\atlmfc\lib';
   end
 
-  newLIBPATH = newLIBPATH + ..
-               msvsPath + '\VC\LIB';
+  VcLibPath = VcLibPath + pathsep() + ..
+               msvsPath + '\VC\lib';
 endfunction
 //=============================================================================
-function newINCLUDE = getNewINCLUDEx64(INCLUDE, msvsPath, sdkPath, bIsExpress)
-  newINCLUDE = '';
+function VcInclude = getVcIncludex64(msvsPath, sdkPath, bIsExpress)
   if bIsExpress then
-    Vc64Path = dlwGet64BitPath();
-    newINCLUDE = Vc64Path + '\VC\INCLUDE' + pathsep();
+    VcInclude = dlwGet64BitPath() + '\VC\include';
   else
-    newINCLUDE = msvsPath + '\VC\INCLUDE' + pathsep() + ..
-                 msvsPath + '\VC\ATLMFC\INCLUDE' + pathsep();
+    VcInclude = msvsPath + '\VC\include' + pathsep() + ..
+                 msvsPath + '\VC\atlmfc\include';
   end
 
-  newINCLUDE = newINCLUDE + ..
-               sdkPath + '\include' + pathsep() + INCLUDE;
-
+  VcInclude = VcInclude + pathsep() + ..
+               sdkPath + '\include';
 endfunction
 //=============================================================================
-function newINCLUDE = getNewINCLUDEx86(INCLUDE, msvsPath, sdkPath, bIsExpress)
-  newINCLUDE = '';
-
+function VcInclude = getVcIncludex86(msvsPath, sdkPath, bIsExpress)
+  VcInclude = '';
   if ~bIsExpress then
-    newINCLUDE = msvsPath + '\VC\ATLMFC\INCLUDE'  + pathsep();
+    VcInclude = msvsPath + '\VC\atlmfc\include';
   end
 
-  newINCLUDE = newINCLUDE + ..
-               msvsPath + '\VC\INCLUDE'  + pathsep() + ..
-               sdkPath + '\include' + pathsep() + INCLUDE;
+  VcInclude = VcInclude + pathsep() + ..
+               msvsPath + '\VC\include'  + pathsep() + ..
+               sdkPath + '\include';
 endfunction
 //=============================================================================
index cb7d8fe..363fbf3 100644 (file)
@@ -40,33 +40,26 @@ function bOK = dlwSetEnvVc70()
     return
   end
 
-  err = setenv('PATH', MSVCDir + filesep() + 'BIN;' + ..
+  err = addPathToEnv('PATH', MSVCDir + '\bin' + pathsep() + ..
                DevEnvDir + pathsep() + ..
-               DevEnvDir + filesep() + 'bin' + pathsep() + ..
-               MSVCDir + filesep() + '..\Common7\IDE' + pathsep() + ..
-               PATH + pathsep() );
+               DevEnvDir + '\bin' + pathsep() + ..
+               MSVCDir + '\..\Common7\IDE');
   if (err == %F) then
     bOK = %F;
     return
   end
 
-  INCLUDE = getenv('INCLUDE', '');
-
-  err = setenv('INCLUDE', MSVCDir + filesep() + 'ATLMFC\INCLUDE' + pathsep() + ..
-               MSVCDir + filesep() + 'INCLUDE' + pathsep() +..
-               MSVCDir + filesep() + 'PlatformSDK\include' + pathsep() + ..
-               INCLUDE);
+  err = addPathToEnv('include', MSVCDir + '\atlmfc\include' + pathsep() + ..
+               MSVCDir + '\include' + pathsep() +..
+               MSVCDir + '\PlatformSDK\include');
   if (err == %F) then
     bOK = %F;
     return
   end
 
-  LIB = getenv('LIB', '');
-
-  err = setenv('LIB',MSVCDir + filesep() + 'ATLMFC\LIB' + pathsep() + ..
-               MSVCDir + filesep() + 'LIB'+ pathsep() +..
-               MSVCDir + filesep() + 'PlatformSDK\lib' + pathsep() + ..
-               LIB);
+  err = setenv('lib', MSVCDir + '\atlmfc\lib' + pathsep() + ..
+               MSVCDir + '\lib'+ pathsep() +..
+               MSVCDir + '\PlatformSDK\lib');
   if (err == %F) then
     bOK = %F;
     return
index 8e72469..5af6a39 100644 (file)
@@ -39,33 +39,26 @@ function bOK = dlwSetEnvVc71()
     return
   end
 
-  err = setenv('PATH',MSVCDir + filesep() + 'BIN' + pathsep() + ..
+  err = addPathToEnv('PATH', MSVCDir + '\bin' + pathsep() + ..
                DevEnvDir + pathsep() + ..
-               DevEnvDir + filesep() + 'bin' + pathsep() + ..
-               MSVCDir + filesep() + '..\Common7\IDE' + pathsep() + ..
-               PATH + pathsep() );
+               DevEnvDir + '\bin' + pathsep() + ..
+               MSVCDir + '\..\Common7\IDE');
   if (err == %F) then
     bOK = %F;
     return
   end
 
-  INCLUDE = getenv('INCLUDE', '');
-
-  err = setenv('INCLUDE', MSVCDir + filesep() + 'ATLMFC\INCLUDE' + pathsep() + ..
-               MSVCDir + filesep() + 'INCLUDE' + pathsep() + ..
-               MSVCDir + filesep() + 'PlatformSDK\include' + pathsep() + ..
-               INCLUDE);
+  err = addPathToEnv('include', MSVCDir + '\atlmfc\include' + pathsep() + ..
+               MSVCDir + '\include' + pathsep() + ..
+               MSVCDir + '\PlatformSDK\include');
   if (err == %F) then
     bOK = %F;
     return
   end
 
-  LIB = getenv('LIB', 'ndef');
-
-  err = setenv('LIB', MSVCDir + filesep() + 'ATLMFC\LIB' + pathsep() + ..
-               MSVCDir + filesep() + 'LIB' + pathsep() + ..
-               MSVCDir + filesep() + 'PlatformSDK\lib' + pathsep() + ..
-               LIB);
+  err = addPathToEnv('lib', MSVCDir + '\atlmfc\lib' + pathsep() + ..
+               MSVCDir + '\lib' + pathsep() + ..
+               MSVCDir + '\PlatformSDK\lib');
   if (err == %F) then
     bOK = %F;
     return
index ac47ec8..f137fc7 100644 (file)
@@ -38,59 +38,52 @@ function bOK = dlwSetEnvVc80(msCompiler)
     return
   end
 
-  MSVCDir = MSVSDir + filesep() + 'VC';
+  MSVCDir = MSVSDir + '\VC';
   if ~setenv('VCINSTALLDIR', MSVCDir) then
     bOK = %F;
     return
   end
 
-  DevEnvDir = MSVSDir + filesep() +'Common7\IDE';
+  DevEnvDir = MSVSDir + '\Common7\IDE';
   if ~setenv('DevEnvDir', DevEnvDir) then
     bOK = %F;
     return
   end
 
-  err = setenv('PATH', DevEnvDir + pathsep() + ..
-               MSVCDir + filesep() + 'bin' + pathsep() + ..
-               MSVSDir + filesep() + 'Common7\Tools' + pathsep() + ..
-               MSVSDir + filesep() + 'SDK\v2.0\bin' + pathsep() + ..
-               MSVCDir + filesep() + 'VCPackages' + pathsep() + ..
-               PATH + pathsep() );
+  err = addPathToEnv('PATH', DevEnvDir + pathsep() + ..
+               MSVCDir + '\bin' + pathsep() + ..
+               MSVSDir + '\Common7\Tools' + pathsep() + ..
+               MSVSDir + '\SDK\v2.0\bin' + pathsep() + ..
+               MSVCDir + '\VCPackages');
   if (err == %F) then
     bOK = %F;
     return
   end
 
-  LIB = getenv('LIB', '');
-  INCLUDE = getenv('INCLUDE', '');
-
   if (msCompiler == 'msvc80express') then
     windowsSdkPath = dlwGetSdkPath();
-    LIB = MSVCDir + filesep() + 'LIB' + pathsep() + ..
-        MSVSDir + filesep() + 'SDK\v2.0\lib' + pathsep() + ..
-        windowsSdkPath + filesep() + 'Lib' + pathsep() + ..
-        LIB;
+    LIB = MSVCDir + '\lib' + pathsep() + ..
+        MSVSDir + '\SDK\v2.0\lib' + pathsep() + ..
+        windowsSdkPath + '\lib';
 
-    INCLUDE = MSVCDir + filesep() + 'INCLUDE' + pathsep() + ..
-              windowsSdkPath + 'INCLUDE' + pathsep();
+    include = MSVCDir + '\include' + pathsep() + ..
+              windowsSdkPath + '\include';
   else
-    LIB = MSVCDir + filesep() + 'LIB' + pathsep() + ..
-        MSVSDir + filesep() + 'SDK\v2.0\lib' + pathsep() + ..
-        MSVSDir + filesep() + 'VC\PlatformSDK\lib' + pathsep() + ..
-        LIB;
+    LIB = MSVCDir + '\lib' + pathsep() + ..
+        MSVSDir + '\SDK\v2.0\lib' + pathsep() + ..
+        MSVSDir + '\VC\PlatformSDK\lib';
 
-    INCLUDE = MSVCDir + filesep() + 'INCLUDE' + pathsep() + ..
-              MSVCDir + filesep() + 'PlatformSDK\include' + pathsep() + ..
-              MSVSDir + filesep() + 'SDK\v2.0\include' + pathsep() + ..
-              INCLUDE;
+    include = MSVCDir + '\include' + pathsep() + ..
+              MSVCDir + '\PlatformSDK\include' + pathsep() + ..
+              MSVSDir + '\SDK\v2.0\include';
   end
 
-  if ~setenv('LIB', LIB) then
+  if ~addPathToEnv('LIB', LIB) then
     bOK = %F;
     return
   end
 
-  if ~setenv('INCLUDE', INCLUDE) then
+  if ~addPathToEnv('include', include) then
     bOK = %F;
     return
   end
diff --git a/scilab/modules/dynamic_link/tests/unit_tests/addPathToEnv.dia.ref b/scilab/modules/dynamic_link/tests/unit_tests/addPathToEnv.dia.ref
new file mode 100644 (file)
index 0000000..4c638d3
--- /dev/null
@@ -0,0 +1,44 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Simon MARCHETTO
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- JAVA NOT MANDATORY -->
+// Load dynamic_link Internal lib if it's not already loaded
+if ~ exists("dynamic_linkutilslib") then
+  load("SCI/modules/dynamic_link/macros/utils/lib");
+end
+function checkAddPathToEnv(initialEnv, addedPaths, expectedEnv)
+    setenv('myEnv', initialEnv);
+    addPathToEnv('myEnv', addedPaths);
+    myEnv = getenv('myEnv', '');
+    assert_checkequal(myEnv, expectedEnv)
+endfunction
+if getos() == 'Windows' then
+    checkAddPathToEnv('', 'C:\dummy', 'C:\dummy');
+    checkAddPathToEnv('', 'C:\dummy;c:\dummy;c:/dummy;C:/dummy', 'C:\dummy');
+    checkAddPathToEnv('', 'C:\dummy;D:\folder', 'C:\dummy;D:\folder');
+    checkAddPathToEnv('', 'C:\dummy\;D:\folder\', 'C:\dummy;D:\folder');
+    checkAddPathToEnv('C:\dummy', '', 'C:\dummy');
+    checkAddPathToEnv('C:\dummy;', 'D:\folder', 'C:\dummy;D:\folder');
+    checkAddPathToEnv('C:\dummy', 'D:\folder;D:\folder2', ..
+        'C:\dummy;D:\folder;D:\folder2');
+    checkAddPathToEnv('C:\dummy;D:\folder', 'D:\folder;D:\folder2', ..
+        'C:\dummy;D:\folder;D:\folder2');
+    checkAddPathToEnv('D:\folder;C:\dummy', 'C:\dummy;D:\folder;D:\folder2', ..
+        'D:\folder;C:\dummy;D:\folder2');
+else
+    checkAddPathToEnv('', '/dummy', '/dummy');
+    checkAddPathToEnv('', '/dummy:/folder', '/dummy:/folder');
+    checkAddPathToEnv('', '/dummy/:/folder/', '/dummy:/folder');
+    checkAddPathToEnv('/dummy', '', '/dummy');
+    checkAddPathToEnv('/dummy:', '/folder', '/dummy:/folder');
+    checkAddPathToEnv('/dummy', '/folder:/folder2', ..
+        '/dummy:/folder:/folder2');
+    checkAddPathToEnv('/dummy:/folder', '/folder:/folder2', ..
+        '/dummy:/folder:/folder2');
+    checkAddPathToEnv('/folder:/dummy', '/dummy:/folder:/folder2', ..
+        '/folder:/dummy:/folder2');
+end
diff --git a/scilab/modules/dynamic_link/tests/unit_tests/addPathToEnv.tst b/scilab/modules/dynamic_link/tests/unit_tests/addPathToEnv.tst
new file mode 100644 (file)
index 0000000..06d7db7
--- /dev/null
@@ -0,0 +1,51 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Simon MARCHETTO
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- JAVA NOT MANDATORY -->
+
+// Load dynamic_link Internal lib if it's not already loaded
+if ~ exists("dynamic_linkutilslib") then
+  load("SCI/modules/dynamic_link/macros/utils/lib");
+end
+
+function checkAddPathToEnv(initialEnv, addedPaths, expectedEnv)
+    setenv('myEnv', initialEnv);
+    addPathToEnv('myEnv', addedPaths);
+    myEnv = getenv('myEnv', '');
+    assert_checkequal(myEnv, expectedEnv)
+endfunction
+
+if getos() == 'Windows' then
+
+    checkAddPathToEnv('', 'C:\dummy', 'C:\dummy');
+    checkAddPathToEnv('', 'C:\dummy;c:\dummy;c:/dummy;C:/dummy', 'C:\dummy');
+    checkAddPathToEnv('', 'C:\dummy;D:\folder', 'C:\dummy;D:\folder');
+    checkAddPathToEnv('', 'C:\dummy\;D:\folder\', 'C:\dummy;D:\folder');
+    checkAddPathToEnv('C:\dummy', '', 'C:\dummy');
+    checkAddPathToEnv('C:\dummy;', 'D:\folder', 'C:\dummy;D:\folder');
+    checkAddPathToEnv('C:\dummy', 'D:\folder;D:\folder2', ..
+        'C:\dummy;D:\folder;D:\folder2');
+    checkAddPathToEnv('C:\dummy;D:\folder', 'D:\folder;D:\folder2', ..
+        'C:\dummy;D:\folder;D:\folder2');
+    checkAddPathToEnv('D:\folder;C:\dummy', 'C:\dummy;D:\folder;D:\folder2', ..
+        'D:\folder;C:\dummy;D:\folder2');
+
+else
+
+    checkAddPathToEnv('', '/dummy', '/dummy');
+    checkAddPathToEnv('', '/dummy:/folder', '/dummy:/folder');
+    checkAddPathToEnv('', '/dummy/:/folder/', '/dummy:/folder');
+    checkAddPathToEnv('/dummy', '', '/dummy');
+    checkAddPathToEnv('/dummy:', '/folder', '/dummy:/folder');
+    checkAddPathToEnv('/dummy', '/folder:/folder2', ..
+        '/dummy:/folder:/folder2');
+    checkAddPathToEnv('/dummy:/folder', '/folder:/folder2', ..
+        '/dummy:/folder:/folder2');
+    checkAddPathToEnv('/folder:/dummy', '/dummy:/folder:/folder2', ..
+        '/folder:/dummy:/folder2');
+
+end
\ No newline at end of file
index 135be75..8025362 100644 (file)
 // See the file ../license.txt
 //
 
+// Load dynamic_link Internal lib if it's not already loaded
+if ~ exists("dynamic_linkutilslib") then
+    load("SCI/modules/dynamic_link/macros/utils/lib");
+end
+
 lines(0);
 
 if getos() == 'Windows' then
   // Add SCI/bin to current PATH env
-  // not defined by default used to find modelicac
-  PATH_env = getenv('PATH');
-  setenv('PATH',strsubst(getshortpathname(SCI+'/bin'),'/','\') + pathsep() + PATH_env);
+  // not defined by default used to find modelica
+  addPathToEnv('PATH', SCI + '/bin');
 end
 
 CurrentDirScicosBlocks=pwd();
@@ -42,11 +46,11 @@ CurrentDirScicosBlocks=pwd();
                    "Electrical",
                    "PDE",
                    "IntegerOp"];
+
 Dim=size(SubDirsScicosBlocks);
-for i=1:Dim(1) do 
+for i=1:Dim(1) do
   chdir(SubDirsScicosBlocks(i));
   exec('buildmacros.sce');
   chdir(CurrentDirScicosBlocks);
 end
-clear Dim CurrentDirScicosBlocks SubDirsScicosBlocks
+clear Dim CurrentDirScicosBlocks SubDirsScicosBlocks addPathToEnv
index 0fbb51a..28846bc 100644 (file)
@@ -23,6 +23,8 @@
 #include "ConvertSlash.h"
 #include "charEncoding.h"
 #include "getshortpathname.h"
+#include "stristr.h"
+#include "strsubst.h"
 /*--------------------------------------------------------------------------*/
 static BOOL IsTheGoodShell(void);
 static BOOL Set_Shell(void);
@@ -219,29 +221,45 @@ BOOL Set_Shell(void)
 /*--------------------------------------------------------------------------*/
 static BOOL AddScilabBinDirectoryToPATHEnvironnementVariable(char *DefaultPath)
 {
-#define PATH_FORMAT "PATH=%s/bin;%s"
+#define SCILAB_BIN_PATH "%s/bin"
+#define NEW_PATH "PATH=%s;%s"
 
     BOOL bOK = FALSE;
     char *PATH = NULL;
     char *env = NULL;
+    char scilabBinPath[MAX_PATH];
+    char *scilabBinPathConverted;
 
     PATH = getenv("PATH");
 
-    env = (char*) MALLOC(sizeof(char) * (strlen(PATH_FORMAT) + strlen(PATH) +
+    env = (char*) MALLOC(sizeof(char) * (strlen(NEW_PATH) + strlen(PATH) +
                                          strlen(DefaultPath) + 1));
     if (env)
     {
-        sprintf(env, PATH_FORMAT, DefaultPath, PATH);
-        if (_putenv (env))
-        {
-            bOK = FALSE;
-        }
-        else
+        sprintf(scilabBinPath, SCILAB_BIN_PATH, DefaultPath);
+
+        scilabBinPathConverted = (char*) MALLOC(MAX_PATH * sizeof(char));
+#ifdef _MSC_VER
+        scilabBinPathConverted = strsub(scilabBinPath, "/", "\\");
+#else
+        scilabBinPathConverted = strdup(scilabBinPath);
+#endif
+        if (stristr(PATH, scilabBinPathConverted) == 0)
         {
-            bOK = TRUE;
+            sprintf(env, NEW_PATH, scilabBinPathConverted, PATH);
+            if (_putenv (env))
+            {
+                bOK = FALSE;
+            }
+            else
+            {
+                bOK = TRUE;
+            }
+            FREE(env);
+            env = NULL;
         }
-        FREE(env);
-        env = NULL;
+
+        FREE(scilabBinPathConverted);
     }
     return bOK;
 }