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