* Bug 15599 fixed: now degree of zero polynomial is -Inf
[scilab.git] / scilab / modules / ast / includes / symbol / context.hxx
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2007-2008 - INRIA - Bruno JOFRET
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 /**
17 ** \file symbol/context.hh
18 ** \brief Define class Context.
19 */
20
21 #ifndef __CONTEXT_HXX__
22 #define __CONTEXT_HXX__
23
24 #include "function.hxx"
25 #include "variables.hxx"
26 #include "libraries.hxx"
27
28 extern "C"
29 {
30 #include "dynlib_ast.h"
31 }
32
33 namespace symbol
34 {
35
36 /** \brief Define class Context.
37 */
38 class EXTERN_AST Context
39 {
40 public:
41     typedef std::map<Symbol, Variable*> VarList;
42     typedef std::stack<VarList*> VarStack;
43
44     static Context* getInstance(void);
45
46     static void destroyInstance(void);
47
48     /** Open a context scope i.e
49     ** open the heap table one
50     ** and the env table too. */
51     void scope_begin();
52
53     /** Close a context scope i.e
54     ** close the heap table one
55     ** and the env table too. */
56     void scope_end();
57
58     /** If key was associated to some Entry_T in the open scopes, return the
59     ** most recent insertion. Otherwise return the empty pointer. */
60     types::InternalType* get(const Symbol& key);
61     types::InternalType* get(const Variable* _var);
62     Variable* getOrCreate(const Symbol& _key);
63     int getLevel(const Symbol & _key) const;
64
65     /** If key was associated to some Entry_T in the last opened scope, return it.
66     ** Otherwise return the empty pointer. */
67     types::InternalType* getCurrentLevel(const Symbol& key);
68     types::InternalType* getCurrentLevel(Variable* _var);
69
70     /** If key was associated to some Entry_T in the open scopes, return the
71     ** most recent insertion DESPITE the current/last one. Otherwise return the empty pointer. */
72     types::InternalType* getAllButCurrentLevel(const Symbol& key);
73     types::InternalType* getAtLevel(const Symbol& key, int level = SCOPE_ALL);
74
75     /** If key was associated to some Entry_T in the open scopes, return the
76     ** most recent insertion. Otherwise return the empty pointer. */
77     types::InternalType* getFunction(const Symbol& key);
78
79     /*return function list in the module _stModuleName*/
80     int getFunctionList(std::list<Symbol>& lst, const std::wstring& _stModuleName);
81     /*return function list in the module _stModuleName*/
82     int getFunctionList(std::list<types::Callable *>& lst, std::wstring _stModuleName);
83
84     int getConsoleVarsName(std::list<std::wstring>& lst);
85     int getVarsName(std::list<std::wstring>& lst);
86     int getMacrosName(std::list<std::wstring>& lst);
87     int getFunctionsName(std::list<std::wstring>& lst);
88     int getVarsNameForWho(std::list<std::wstring>& lst, bool sorted);
89     int getGlobalNameForWho(std::list<std::wstring>& lst, bool sorted);
90     int getWhereIs(std::list<std::wstring>& lst, const std::wstring& _str);
91     int getLibrariesList(std::list<std::wstring>& lst);
92     int getVarsToVariableBrowser(std::list<Variable*>& lst);
93     int getLibsToVariableBrowser(std::list<Library*>& lst);
94     /* global functions */
95
96     /*return global variable visibility status*/
97     bool isGlobalVisible(const Symbol& key);
98
99     /*return global variable existance status*/
100     bool isGlobal(const Symbol& key);
101
102     /*remove global variable and all visibility references */
103     //clearglobal("a")
104     bool removeGlobal(const Symbol& key);
105
106     /*remove all global variables and references */
107     //clearglobal
108     void removeGlobalAll();
109     void clearAll();
110
111     //predef
112     void protect();
113     void unprotect();
114     bool isprotected(const Symbol& key);
115     bool isprotected(Variable* _var);
116     int protectedVars(std::list<std::wstring>& lst);
117
118     /*set variable visible/hidden in current global scope*/
119     void setGlobalVisible(const Symbol& key, bool bVisible);
120     void setGlobal(const Symbol& key);
121
122     types::InternalType* getGlobalValue(const Symbol& _key);
123
124     /*add symbol and value in the stack*/
125     bool put(const Symbol& _key, types::InternalType* _pIT);
126     bool put(Variable* _var, types::InternalType* _pIT);
127     /*add symbol and value in the previous scope*/
128     bool putInPreviousScope(Variable* _var, types::InternalType* _pIT);
129
130     /* remove symbol/value association */
131     //clear("a")
132     bool remove(const Symbol& key);
133     //clear();
134     bool removeAll();
135
136     bool addFunction(types::Function *_info);
137     bool addMacro(types::Macro *_info);
138     bool addMacroFile(types::MacroFile *_info);
139     void print(std::wostream& ostr, bool bSorted = false) const;
140     int getScopeLevel();
141     bool isValidVariableName(const wchar_t*);
142     bool isValidVariableName(const char*);
143
144     inline bool isOriginalSymbol(const symbol::Symbol & sym) const
145     {
146         return getLevel(sym) == 0;
147     }
148
149 private:
150
151     types::InternalType* get(const Symbol& key, int _iLevel);
152     bool clearCurrentScope(bool _bClose);
153     void updateProtection(bool protect);
154
155     std::list<Symbol>* globals;
156     VarStack varStack;
157     Variables variables;
158     Libraries libraries;
159     VarList* console;
160     int m_iLevel;
161
162     Context();
163     ~Context();
164
165     static Context* me;
166 };
167
168 inline std::wostream& operator<< (std::wostream& ostr, const Context &ctx)
169 {
170     ctx.print(ostr);
171     return ostr;
172 }
173
174 }
175 #endif /* !__CONTEXT_HXX__ */