Leak memory in elementary_functions tests
[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  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include <sstream>
14 #include "macrofile.hxx"
15 #include "library.hxx"
16 #include "localization.hxx"
17 #include "configvariable.hxx"
18 #include "scilabWrite.hxx"
19
20 extern "C"
21 {
22 #include <wchar.h>
23 #include "os_string.h"
24 }
25
26 namespace types
27 {
28 Library::Library(const std::wstring& _wstPath) :
29     m_wstPath(_wstPath)
30 {
31 }
32
33 Library::~Library()
34 {
35     //delete all macrofile*
36     for (auto macro : m_macros)
37     {
38         MacroFile* pMacro = macro.second;
39         pMacro->DecreaseRef();
40         if (pMacro->isDeletable())
41         {
42             delete pMacro;
43         }
44     }
45
46     m_macros.clear();
47 }
48
49 bool Library::toString(std::wostringstream& ostr)
50 {
51     wchar_t output[1024] = {0};
52     os_swprintf(output, 1024, _W("Functions files location : %s.\n").c_str(), m_wstPath.c_str());
53
54     ostr << output << std::endl;
55
56     size_t iLineLen = (size_t)ConfigVariable::getConsoleWidth();
57
58     size_t iCurrentLen = 0;
59     for (auto macro : m_macros)
60     {
61         if (iCurrentLen + macro.first.length() + 2 > iLineLen)
62         {
63             ostr << std::endl;
64             iCurrentLen = 0;
65         }
66         ostr << macro.first << "  ";
67         iCurrentLen += macro.first.length() + 2;
68     }
69
70     ostr << std::endl;
71
72     return true;
73 }
74
75 InternalType* Library::clone()
76 {
77     IncreaseRef();
78     return this;
79 }
80
81 bool Library::extract(const std::wstring & name, InternalType *& out)
82 {
83     out = get(name);
84     if (out == NULL)
85     {
86         wchar_t szError[bsiz];
87         os_swprintf(szError, bsiz, _W("Unknown field : %ls.\n").c_str(), name.c_str());
88
89         throw std::wstring(szError);
90     }
91
92     return true;
93 }
94
95 void Library::add(const std::wstring& _wstName, MacroFile* _macro)
96 {
97     _macro->IncreaseRef();
98     m_macros[_wstName] = _macro;
99 }
100
101 MacroFile* Library::get(const std::wstring& _wstName)
102 {
103     MacroMap::iterator it = m_macros.find(_wstName);
104     if (it != m_macros.end())
105     {
106         return it->second;
107     }
108     return NULL;
109 }
110
111 std::list<std::wstring>* Library::getMacrosName()
112 {
113     std::list<std::wstring>* pOut = new std::list<std::wstring>;
114     for (auto macro : m_macros)
115     {
116         pOut->push_back(macro.first);
117     }
118
119     return pOut;
120 }
121
122 std::wstring Library::getPath()
123 {
124     return m_wstPath;
125 }
126 }