[bug_6550] getPath of Library type fixed
[scilab.git] / scilab / modules / ast / src / cpp / types / library.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #include <sstream>
17 #include "macrofile.hxx"
18 #include "library.hxx"
19 #include "localization.hxx"
20 #include "configvariable.hxx"
21 #include "scilabWrite.hxx"
22
23 extern "C"
24 {
25 #include <PATH_MAX.h>
26 #include <wchar.h>
27 #include "os_string.h"
28 #include "fullpath.h"
29 }
30
31 namespace types
32 {
33 Library::Library(const std::wstring& _wstPath) :
34     m_wstPath(_wstPath)
35 {
36 #ifndef NDEBUG
37     Inspector::addItem(this);
38 #endif
39 }
40
41 Library::~Library()
42 {
43     //delete all macrofile*
44     for (auto macro : m_macros)
45     {
46         MacroFile* pMacro = macro.second;
47         pMacro->DecreaseRef();
48         if (pMacro->isDeletable())
49         {
50             delete pMacro;
51         }
52     }
53
54     m_macros.clear();
55 #ifndef NDEBUG
56     Inspector::removeItem(this);
57 #endif
58 }
59
60 bool Library::toString(std::wostringstream& ostr)
61 {
62     wchar_t output[1024] = {0};
63     os_swprintf(output, 1024, _W("Functions files location : %s.\n").c_str(), m_wstPath.c_str());
64
65     ostr << output << std::endl;
66
67     size_t iLineLen = (size_t)ConfigVariable::getConsoleWidth();
68
69     size_t iCurrentLen = 0;
70     for (auto macro : m_macros)
71     {
72         if (iCurrentLen + macro.first.length() + 2 > iLineLen)
73         {
74             ostr << std::endl;
75             iCurrentLen = 0;
76         }
77         ostr << macro.first << "  ";
78         iCurrentLen += macro.first.length() + 2;
79     }
80
81     ostr << std::endl;
82
83     return true;
84 }
85
86 Library* Library::clone()
87 {
88     IncreaseRef();
89     return this;
90 }
91
92 bool Library::extract(const std::wstring & name, InternalType *& out)
93 {
94     out = get(name);
95     if (out == NULL)
96     {
97         wchar_t szError[bsiz];
98         os_swprintf(szError, bsiz, _W("Unknown field : %ls.\n").c_str(), name.c_str());
99
100         throw std::wstring(szError);
101     }
102
103     return true;
104 }
105
106 void Library::add(const std::wstring& _wstName, MacroFile* _macro)
107 {
108     _macro->IncreaseRef();
109     m_macros[_wstName] = _macro;
110 }
111
112 MacroFile* Library::get(const std::wstring& _wstName)
113 {
114     MacroMap::iterator it = m_macros.find(_wstName);
115     if (it != m_macros.end())
116     {
117         return it->second;
118     }
119     return NULL;
120 }
121
122 int Library::getMacrosName(std::list<std::wstring>& lst)
123 {
124     for (auto macro : m_macros)
125     {
126         lst.push_back(macro.first);
127     }
128
129     return static_cast<int>(lst.size());
130 }
131
132 std::wstring Library::getPath()
133 {
134     wchar_t* pwstFullPath = (wchar_t*)MALLOC(sizeof(wchar_t) * (PATH_MAX * 2));
135     get_full_pathW(pwstFullPath, m_wstPath.c_str(), PATH_MAX * 2);
136     std::wstring wstrOut(pwstFullPath);
137     FREE(pwstFullPath);
138     return wstrOut;
139 }
140 }