176127c9e128992d82e77d94df77116f858d4d07
[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
19 extern "C"
20 {
21 #include <wchar.h>
22 #include "os_swprintf.h"
23 }
24
25 namespace types
26 {
27 Library::Library(const std::wstring& _wstPath) :
28     m_wstPath(_wstPath)
29 {
30 }
31
32 Library::~Library()
33 {
34     //delete all macrofile*
35     for (MacroMap::iterator it = m_macros.begin(); it != m_macros.end() ; ++it)
36     {
37         MacroFile* pMacro = it->second;
38         pMacro->DecreaseRef();
39         if (pMacro->isDeletable())
40         {
41             delete pMacro;
42         }
43     }
44
45     m_macros.clear();
46 }
47
48 bool Library::toString(std::wostringstream& ostr)
49 {
50     wchar_t output[1024] = {0};
51     os_swprintf(output, 1024, _W("Functions files location : %s.\n").c_str(), m_wstPath.c_str());
52
53     ostr << output << std::endl;
54
55     size_t iLineLen = (size_t)ConfigVariable::getConsoleWidth();
56
57     size_t iCurrentLen = 0;
58     MacroMap::iterator it = m_macros.begin();
59     for (int i = 0; it != m_macros.end() ; ++it, ++i)
60     {
61         if (iCurrentLen + it->first.length() + 2 > iLineLen)
62         {
63             ostr << std::endl;
64             iCurrentLen = 0;
65         }
66         ostr << it->first << "  ";
67         iCurrentLen += it->first.length() + 2;
68     }
69
70     ostr << std::endl;
71     return true;
72 }
73
74 InternalType* Library::clone()
75 {
76     IncreaseRef();
77     return this;
78 }
79
80 bool Library::extract(const std::wstring & name, InternalType *& out)
81 {
82     out = get(name);
83     if (out == NULL)
84     {
85         wchar_t szError[bsiz];
86         os_swprintf(szError, bsiz, _W("Unknown field : %ls.\n").c_str(), name.c_str());
87
88         throw std::wstring(szError);
89     }
90
91     return true;
92 }
93
94 void Library::add(const std::wstring& _wstName, MacroFile* _macro)
95 {
96     _macro->IncreaseRef();
97     m_macros[_wstName] = _macro;
98 }
99
100 MacroFile* Library::get(const std::wstring& _wstName)
101 {
102     MacroMap::iterator it = m_macros.find(_wstName);
103     if (it != m_macros.end())
104     {
105         return it->second;
106     }
107     return NULL;
108 }
109
110 std::list<std::wstring>* Library::getMacrosName()
111 {
112     std::list<std::wstring>* pOut = new std::list<std::wstring>;
113     MacroMap::iterator it = m_macros.begin();
114     for (; it != m_macros.end() ; ++it)
115     {
116         pOut->push_back(it->first);
117     }
118
119     return pOut;
120 }
121 }