bug #14097: genlib does not add end separator
[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 #ifndef NDEBUG
32     Inspector::addItem(this);
33 #endif
34 }
35
36 Library::~Library()
37 {
38     //delete all macrofile*
39     for (auto macro : m_macros)
40     {
41         MacroFile* pMacro = macro.second;
42         pMacro->DecreaseRef();
43         if (pMacro->isDeletable())
44         {
45             delete pMacro;
46         }
47     }
48
49     m_macros.clear();
50 #ifndef NDEBUG
51     Inspector::removeItem(this);
52 #endif
53 }
54
55 bool Library::toString(std::wostringstream& ostr)
56 {
57     wchar_t output[1024] = {0};
58     os_swprintf(output, 1024, _W("Functions files location : %s.\n").c_str(), m_wstPath.c_str());
59
60     ostr << output << std::endl;
61
62     size_t iLineLen = (size_t)ConfigVariable::getConsoleWidth();
63
64     size_t iCurrentLen = 0;
65     for (auto macro : m_macros)
66     {
67         if (iCurrentLen + macro.first.length() + 2 > iLineLen)
68         {
69             ostr << std::endl;
70             iCurrentLen = 0;
71         }
72         ostr << macro.first << "  ";
73         iCurrentLen += macro.first.length() + 2;
74     }
75
76     ostr << std::endl;
77
78     return true;
79 }
80
81 InternalType* Library::clone()
82 {
83     IncreaseRef();
84     return this;
85 }
86
87 bool Library::extract(const std::wstring & name, InternalType *& out)
88 {
89     out = get(name);
90     if (out == NULL)
91     {
92         wchar_t szError[bsiz];
93         os_swprintf(szError, bsiz, _W("Unknown field : %ls.\n").c_str(), name.c_str());
94
95         throw std::wstring(szError);
96     }
97
98     return true;
99 }
100
101 void Library::add(const std::wstring& _wstName, MacroFile* _macro)
102 {
103     _macro->IncreaseRef();
104     m_macros[_wstName] = _macro;
105 }
106
107 MacroFile* Library::get(const std::wstring& _wstName)
108 {
109     MacroMap::iterator it = m_macros.find(_wstName);
110     if (it != m_macros.end())
111     {
112         return it->second;
113     }
114     return NULL;
115 }
116
117 int Library::getMacrosName(std::list<std::wstring>& lst)
118 {
119     for (auto macro : m_macros)
120     {
121         lst.push_back(macro.first);
122     }
123
124     return static_cast<int>(lst.size());
125 }
126
127 std::wstring Library::getPath()
128 {
129     return m_wstPath;
130 }
131 }