fix library path 27/15527/2
Antoine ELIAS [Fri, 14 Nov 2014 09:56:37 +0000 (10:56 +0100)]
Change-Id: Ib254a147e4755035d1fcb7ce81972ddbcc9bb78e

scilab/modules/ast/includes/types/library.hxx
scilab/modules/ast/src/cpp/types/library.cpp
scilab/modules/io/sci_gateway/cpp/sci_load.cpp
scilab/modules/io/src/cpp/loadlib.cpp
scilab/modules/string/sci_gateway/cpp/sci_string.cpp
scilab/modules/string/tests/unit_tests/string.dia.ref

index 2c852fe..e3c782b 100644 (file)
@@ -61,7 +61,8 @@ public :
     void add(const std::wstring& _wstName, MacroFile* _macro);
     MacroFile* get(const std::wstring& _wstName);
     std::list<std::wstring>* getMacrosName();
-private :
+    std::wstring getPath();
+private:
     std::wstring m_wstPath;
     typedef std::map<std::wstring, MacroFile*> MacroMap;
     MacroMap m_macros;
index 589dad0..c3f5266 100644 (file)
@@ -120,4 +120,9 @@ std::list<std::wstring>* Library::getMacrosName()
 
     return pOut;
 }
+
+std::wstring Library::getPath()
+{
+    return m_wstPath;
+}
 }
index c8aa48c..9393ef3 100644 (file)
@@ -66,7 +66,7 @@ Function::ReturnValue sci_load(types::typed_list &in, int _iRetCount, types::typ
     }
     else
     {
-        Library* lib = loadlib(pwstPathLib);
+        Library* lib = loadlib(pS->get(0));
         FREE(pstPath);
 
         if (lib == NULL)
index 4401ca0..66ff108 100644 (file)
@@ -34,13 +34,19 @@ types::Library* loadlib(std::wstring _wstXML, bool _isFile, bool _bAddInContext)
 {
     types::Library* lib = NULL;
 
-    std::wstring wstFile(_wstXML);
-    std::wstring wstPath(_wstXML);
+    wchar_t* pwstPathLib = expandPathVariableW((wchar_t*)_wstXML.c_str());
+
+    std::wstring wstOriginalPath(_wstXML);
+    std::wstring wstFile(pwstPathLib);
+    std::wstring wstPath(pwstPathLib);
+    FREE(pwstPathLib);
 
     if (_isFile)
     {
         size_t pos = wstPath.find_last_of(L"/\\");
         wstPath = wstPath.substr(0, pos);
+        pos = wstOriginalPath.find_last_of(L"/\\");
+        wstOriginalPath = wstOriginalPath.substr(0, pos + 1); //with ending /
     }
     else
     {
@@ -86,7 +92,7 @@ types::Library* loadlib(std::wstring _wstXML, bool _isFile, bool _bAddInContext)
 
     FREE(pstFile);
 
-    lib = new types::Library(wstPath);
+    lib = new types::Library(wstOriginalPath);
 
     xpathCtxt = xmlXPathNewContext(doc);
     xpathObj = xmlXPathEval((const xmlChar*)"//scilablib", xpathCtxt);
index 8933148..7dbca59 100644 (file)
@@ -51,7 +51,7 @@ static void getMacroString(Macro* _pM, InternalType** _pOut, InternalType** _pIn
     const wchar_t* pwstBody = wstBody.c_str();
 
     //first loop to find number of lines
-    int iLines = 0;
+    int iLines = 2; //for first and last one-space lines
     for (int i = 0 ; i < (int)wcslen(pwstBody) ; i++)
     {
         if (pwstBody[i] == L'\n')
@@ -61,10 +61,10 @@ static void getMacroString(Macro* _pM, InternalType** _pOut, InternalType** _pIn
     }
 
     String* pBody = new String(iLines, 1);
-
+    pBody->set(0, L" ");
     //second loop to assign lines to output data
     int iOffset = 0;
-    int iIndex = 0;
+    int iIndex = 1;
     for (int i = 0 ; i < (int)wcslen(pwstBody) ; i++)
     {
         if (pwstBody[i] == L'\n')
@@ -79,6 +79,7 @@ static void getMacroString(Macro* _pM, InternalType** _pOut, InternalType** _pIn
         }
     }
 
+    pBody->set(iIndex, L" ");
     *_pBody = pBody;
 
     //get inputs
@@ -443,11 +444,27 @@ Function::ReturnValue sci_string(typed_list &in, int _iRetCount, typed_list &out
             std::wstring wstFuncName = L"%"  + in[0]->getShortTypeStr() + L"_string";
             return Overload::call(wstFuncName, in, _iRetCount, out, new ast::ExecVisitor());
         }
-        case GenericType::ScilabBool :
+        case GenericType::ScilabBool:
         {
             return booleanString(in[0]->getAs<Bool>(), out);
         }
-        default :
+        case GenericType::ScilabLibrary:
+        {
+            Library* pL = in[0]->getAs<Library>();
+            std::wstring path = pL->getPath();
+            std::list<std::wstring>* macros = pL->getMacrosName();
+            String* pS = new String(macros->size() + 1, 1);
+            pS->set(0, path.c_str());
+            int i = 1;
+            for (auto it = macros->begin(), itEnd = macros->end(); it != itEnd; ++it, ++i)
+            {
+                pS->set(i, (*it).c_str());
+            }
+
+            out.push_back(pS);
+            break;
+        }
+        default:
         {
             std::wostringstream ostr;
             in[0]->toString(ostr);
index 89f222f..ea6992e 100644 (file)
@@ -8,9 +8,9 @@
 //===============================
 // unit tests string
 //===============================
-assert_checkequal(string(1), '1');
+assert_checkequal(string(1), "1");
 //===============================
-assert_checkequal(string(1.5), '1.5');
+assert_checkequal(string(1.5), "1.5");
 //===============================
 // Special display cases :
 assert_checkequal(string(0+%i), "%i");
@@ -30,29 +30,29 @@ assert_checkequal(string(-2-2*%i), "-2-%i*2");
 //===============================
 assert_checkequal(string([]), []);
 //===============================
-assert_checkequal(string(''), '');
+assert_checkequal(string(""), "");
 //===============================
-assert_checkequal(string(1:3), ['1','2','3']);
+assert_checkequal(string(1:3), ["1","2","3"]);
 //===============================
-assert_checkequal(string([1;2;3]), ['1';'2';'3']);
+assert_checkequal(string([1;2;3]), ["1";"2";"3"]);
 //===============================
-assert_checkequal(string('foo'), 'foo');
+assert_checkequal(string("foo"), "foo");
 //===============================
-deff('y = mymacro(x)', 'y = x + 1');
+deff("y = mymacro(x)", "y = x + 1");
 [out, in, text] = string(mymacro);
-assert_checkequal(out, 'y');
-assert_checkequal(in, 'x');
-assert_checkequal(text, [' '; 'y = x + 1'; ' ']);
+assert_checkequal(out, "y");
+assert_checkequal(in, "x");
+assert_checkequal(text, [" "; "y = x + 1"; " "]);
 //===============================
 mymacro = null();
-deff('y = mymacro(x)', 'y = x + 1', 'n');
+deff("y = mymacro(x)", "y = x + 1", "n");
 [out, in, text]=string(mymacro);
-assert_checkequal(out, 'y');
-assert_checkequal(in, 'x');
-assert_checkequal(text, [' '; 'y = x + 1'; ' ']);
+assert_checkequal(out, "y");
+assert_checkequal(in, "x");
+assert_checkequal(text, [" "; "y = x + 1"; " "]);
 //===============================
 R = string(corelib);
-assert_checkequal(strsubst(R(1),'\','/'), 'SCI/modules/core/macros/');
+assert_checkequal(strsubst(R(1),"\","/"), "SCI/modules/core/macros/");
 //===============================
 A = floor(abs(2^8  * rand(10,10)));
 B = floor(abs(2^16 * rand(10,10)));