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