1 // -*- mode:C++ ; compile-command: "g++ -I.. -g -c identificateur.cc" -*-
2 /*
3  *  Copyright (C) 2000,2014 B. Parisse, Institut Fourier, 38402 St Martin d'Heres
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program. If not, see <http://www.gnu.org/licenses/>.
17  */
18 #ifndef _GIAC_IDENTIFICATEUR_H
19 #define _GIAC_IDENTIFICATEUR_H
20 #include "first.h"
21 #include <string>
22 #include <iostream>
23 #include "global.h"
24 #include "gen.h"
25 
26 #ifndef NO_NAMESPACE_GIAC
27 namespace giac {
28 #endif // ndef NO_NAMESPACE_GIAC
29 
30   extern int protection_level; // for local vars
31 
32   const int MAXLENSIZE = 1000000; // max size of a line in files
33 
34   struct alias_identificateur {
35     int * ref_count;
36     gen * value;
37     const char * id_name;
38     vecteur * localvalue;
39     short int * quoted;
40   };
41 
42   // make g identificateurs evaluated as global in null context
43   gen global_eval(const gen & g,int level);
44   gen global_evalf(const gen & g,int level);
45   gen globalize(const gen & g);
46   // return the local value of i, if globalize is true, replace idnt with
47   // global idnt in returned value
48   gen do_local_eval(const identificateur & i,int level,bool globalize);
49 
50   std::ostream & operator << (std::ostream & os,const identificateur & s);
51 
52 #ifdef DOUBLEVAL // #ifdef GIAC_GENERIC_CONSTANTS_ID
53   extern const char string_euler_gamma[];
54   extern identificateur _IDNT_euler_gamma;
55   extern gen cst_euler_gamma;
56   extern const char string_pi[];
57   identificateur & _IDNT_pi();
58   extern alias_ref_identificateur ref_pi;
59   extern gen cst_pi;
60   extern const char string_infinity[];
61   identificateur & _IDNT_infinity();
62   extern alias_ref_identificateur ref_infinity;
63   extern gen unsigned_inf;
64   extern alias_gen & alias_unsigned_inf;
65   extern const char string_undef[];
66   identificateur & _IDNT_undef();
67   extern gen undef;
68 #else
69   extern const char string_euler_gamma[];
70   extern const gen & cst_euler_gamma;
71 
72   extern const char string_pi[];
73   const identificateur & _IDNT_pi();
74   extern const alias_ref_identificateur ref_pi;
75   extern const alias_gen alias_cst_pi;
76   extern const gen & cst_pi;
77 
78   extern const char string_infinity[];
79   const identificateur & _IDNT_infinity();
80   extern const alias_gen alias_unsigned_inf;
81   extern const gen & unsigned_inf;
82 
83   extern const char string_undef[];
84   const identificateur & _IDNT_undef();
85   extern const alias_ref_identificateur ref_infinity;
86   extern const alias_gen alias_undef;
87   extern const gen & undef;
88 #endif
89 
90 #if defined GIAC_HAS_STO_38 || defined NSPIRE || defined NSPIRE_NEWLIB || defined KHICAS
91   extern const identificateur & a__IDNT;
92   extern const alias_gen alias_a38;
93 #define a__IDNT_e (*(gen const *)&alias_a38)
94   extern const identificateur & b__IDNT;
95   extern const alias_gen alias_b38;
96 #define b__IDNT_e (*(gen const *)&alias_b38)
97   extern const identificateur & c__IDNT;
98   extern const alias_gen alias_c38;
99 #define c__IDNT_e (*(gen const *)&alias_c38)
100   extern const identificateur & d__IDNT;
101   extern const alias_gen alias_d38;
102 #define d__IDNT_e (*(gen const *)&alias_d38)
103   extern const identificateur & e__IDNT;
104   extern const alias_gen alias_e38;
105 #define e__IDNT_e (*(gen const *)&alias_e38)
106   extern const identificateur & f__IDNT;
107   extern const alias_gen alias_f38;
108 #define f__IDNT_e (*(gen const *)&alias_f38)
109   extern const identificateur & g__IDNT;
110   extern const alias_gen alias_g38;
111 #define g__IDNT_e (*(gen const *)&alias_g38)
112   extern const identificateur & h__IDNT;
113   extern const alias_gen alias_h38;
114 #define h__IDNT_e (*(gen const *)&alias_h38)
115   extern const identificateur & i__IDNT;
116   extern const alias_gen alias_i38;
117 #define i__IDNT_e (*(gen const *)&alias_i38)
118   extern const identificateur & I__IDNT;
119   extern const alias_gen alias_j38;
120 #define j__IDNT_e (*(gen const *)&alias_j38)
121   extern const identificateur & k__IDNT;
122   extern const alias_gen alias_k38;
123 #define k__IDNT_e (*(gen const *)&alias_k38)
124   extern const identificateur & l__IDNT;
125   extern const alias_gen alias_l38;
126 #define l__IDNT_e (*(gen const *)&alias_l38)
127   extern const identificateur & m__IDNT;
128   extern const alias_gen alias_m38;
129 #define m__IDNT_e (*(gen const *)&alias_m38)
130   extern const identificateur & n__IDNT;
131   extern const alias_gen alias_n38;
132 #define n__IDNT_e (*(gen const *)&alias_n38)
133   extern const identificateur & o__IDNT;
134   extern const alias_gen alias_o38;
135 #define o__IDNT_e (*(gen const *)&alias_o38)
136   extern const identificateur & p__IDNT;
137   extern const alias_gen alias_p38;
138 #define p__IDNT_e (*(gen const *)&alias_p38)
139   extern const identificateur & q__IDNT;
140   extern const alias_gen alias_q38;
141 #define q__IDNT_e (*(gen const *)&alias_q38)
142   extern const identificateur & r__IDNT;
143   extern const alias_gen alias_r38;
144 #define r__IDNT_e (*(gen const *)&alias_r38)
145   extern const identificateur & s__IDNT;
146   extern const alias_gen alias_s38;
147 #define s__IDNT_e (*(gen const *)&alias_s38)
148   extern const identificateur & t__IDNT;
149   extern const alias_gen alias_t38;
150 #define t__IDNT_e (*(gen const *)&alias_t38)
151   extern const identificateur & u__IDNT;
152   extern const alias_gen alias_u38;
153 #define u__IDNT_e (*(gen const *)&alias_u38)
154   extern const identificateur & v__IDNT;
155   extern const alias_gen alias_v38;
156 #define v__IDNT_e (*(gen const *)&alias_v38)
157   extern const identificateur & w__IDNT;
158   extern const alias_gen alias_w38;
159 #define w__IDNT_e (*(gen const *)&alias_w38)
160   extern const identificateur & x__IDNT;
161   extern const alias_gen alias_x38;
162 #define x__IDNT_e (*(gen const *)&alias_x38)
163   extern const identificateur & y__IDNT;
164   extern const alias_gen alias_y38;
165 #define y__IDNT_e (*(gen const *)&alias_y38)
166   extern const identificateur & z__IDNT;
167   extern const alias_gen alias_z38;
168 #define z__IDNT_e (*(gen const *)&alias_z38)
169   extern const identificateur & theta__IDNT;
170   extern const gen & theta__IDNT_e;
171   extern const identificateur & _IDNT_id_at;
172   extern const identificateur & CST__IDNT;
173   extern const identificateur & laplace_var;
174 
175   extern const gen & CST__IDNT_e;
176   // extern gen & vx_var;
177   // commented otherwise can not make assign/assumptions on vx_var
178   // if must uncomment, check extern gen vx_var declaration after endif
179 #else
180   extern identificateur a__IDNT;
181   extern gen a__IDNT_e;
182   extern identificateur b__IDNT;
183   extern gen b__IDNT_e;
184   extern identificateur c__IDNT;
185   extern gen c__IDNT_e;
186   extern identificateur d__IDNT;
187   extern gen d__IDNT_e;
188   extern identificateur e__IDNT;
189   extern gen e__IDNT_e;
190   extern identificateur f__IDNT;
191   extern gen f__IDNT_e;
192   extern identificateur g__IDNT;
193   extern gen g__IDNT_e;
194   extern identificateur h__IDNT;
195   extern gen h__IDNT_e;
196   extern identificateur i__IDNT;
197   extern gen i__IDNT_e;
198   extern identificateur I__IDNT;
199   extern gen j__IDNT_e;
200   extern identificateur k__IDNT;
201   extern gen k__IDNT_e;
202   extern identificateur l__IDNT;
203   extern gen l__IDNT_e;
204   extern identificateur m__IDNT;
205   extern gen m__IDNT_e;
206   extern identificateur n__IDNT;
207   extern gen n__IDNT_e;
208   extern identificateur o__IDNT;
209   extern gen o__IDNT_e;
210   extern identificateur p__IDNT;
211   extern gen p__IDNT_e;
212   extern identificateur q__IDNT;
213   extern gen q__IDNT_e;
214   extern identificateur r__IDNT;
215   extern gen r__IDNT_e;
216   extern identificateur s__IDNT;
217   extern gen s__IDNT_e;
218   extern identificateur t__IDNT;
219   extern gen t__IDNT_e;
220   extern identificateur u__IDNT;
221   extern gen u__IDNT_e;
222   extern identificateur v__IDNT;
223   extern gen v__IDNT_e;
224   extern identificateur w__IDNT;
225   extern gen w__IDNT_e;
226   extern identificateur x__IDNT;
227   extern gen x__IDNT_e;
228   extern identificateur y__IDNT;
229   extern gen y__IDNT_e;
230   extern identificateur z__IDNT;
231   extern gen z__IDNT_e;
232   extern identificateur laplace_var;
233   extern identificateur theta__IDNT;
234   extern gen theta__IDNT_e;
235   extern identificateur _IDNT_id_at;
236   extern identificateur CST__IDNT;
237   extern gen CST__IDNT_e;
238 #endif
239   extern gen vx_var;
240   extern const gen * const tab_one_letter_idnt[];
241   // small utility to remove #...
242   int removecomments(const char * ss,char * ss2);
243 
244 
245 #ifndef NO_NAMESPACE_GIAC
246 }
247 #endif // ndef NO_NAMESPACE_GIAC
248 
249 #endif // _GIAC_IDENTIFICATEUR_H
250