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