1 
2 /******************************************************************************
3 * MODULE     : env.hpp
4 * DESCRIPTION: edit environment for typesetting
5 * COPYRIGHT  : (C) 1999  Joris van der Hoeven
6 *******************************************************************************
7 * This software falls under the GNU general public license version 3 or later.
8 * It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
9 * in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
10 ******************************************************************************/
11 
12 #ifndef ENV_H
13 #define ENV_H
14 #include "vars.hpp"
15 #include "drd_info.hpp"
16 #include "gui.hpp"
17 #include "font.hpp"
18 #include "language.hpp"
19 #include "path.hpp"
20 #include "hashmap.hpp"
21 #include "boxes.hpp"
22 #include "url.hpp"
23 #include "frame.hpp"
24 #include "link.hpp"
25 
26 #define DECORATION (-1)
27 
28 /******************************************************************************
29 * The different types of system environment variables
30 ******************************************************************************/
31 
32 #define Env_User               0
33 #define Env_Fixed              1
34 #define Env_Zoom               2
35 #define Env_Magnification      3
36 #define Env_Magnify            4
37 #define Env_Language           5
38 #define Env_Mode               6
39 #define Env_Info_Level         7
40 #define Env_Font               8
41 #define Env_Font_Size          9
42 #define Env_Index_Level       10
43 #define Env_Display_Style     11
44 #define Env_Math_Condensed    12
45 #define Env_Vertical_Pos      13
46 #define Env_Color             14
47 #define Env_Pattern_Mode      15
48 #define Env_Paragraph         16
49 #define Env_Page              17
50 #define Env_Page_Extents      18
51 #define Env_Preamble          19
52 #define Env_Geometry          20
53 #define Env_Frame             21
54 #define Env_Line_Width        22
55 #define Env_Grid              23
56 #define Env_Grid_Aspect       24
57 #define Env_Src_Style         25
58 #define Env_Src_Special       26
59 #define Env_Src_Compact       27
60 #define Env_Src_Close         28
61 #define Env_Point_Style       29
62 #define Env_Dash_Style        30
63 #define Env_Dash_Style_Unit   31
64 #define Env_Fill_Color        32
65 #define Env_Line_Arrows       33
66 #define Env_Text_At_Halign    34
67 #define Env_Text_At_Valign    35
68 
69 /******************************************************************************
70 * For style file editing
71 ******************************************************************************/
72 
73 #define STYLE_ANGULAR         0
74 #define STYLE_SCHEME          1
75 #define STYLE_LATEX           2
76 #define STYLE_FUNCTIONAL      3
77 
78 #define SPECIAL_RAW           0
79 #define SPECIAL_FORMAT        1
80 #define SPECIAL_NORMAL        2
81 #define SPECIAL_MAXIMAL       3
82 
83 #define COMPACT_ALL           0
84 #define COMPACT_INLINE_ARGS   1
85 #define COMPACT_INLINE_START  2
86 #define COMPACT_INLINE        3
87 #define COMPACT_NONE          4
88 
89 #define CLOSE_MINIMAL         0
90 #define CLOSE_COMPACT         1
91 #define CLOSE_LONG            2
92 #define CLOSE_REPEAT          3
93 
94 #define INACTIVE_INLINE_RECURSE  0
95 #define INACTIVE_INLINE_ONCE     1
96 #define INACTIVE_INLINE_ERROR    2
97 #define INACTIVE_BLOCK_RECURSE   3
98 #define INACTIVE_BLOCK_ONCE      4
99 #define INACTIVE_BLOCK_ERROR     5
100 
101 /******************************************************************************
102 * Other enumerated values
103 ******************************************************************************/
104 
105 #define INFO_NONE          0
106 #define INFO_MINIMAL       1
107 #define INFO_SHORT         2
108 #define INFO_DETAILED      3
109 #define INFO_PAPER         4
110 #define INFO_SHORT_PAPER   5
111 
112 /******************************************************************************
113 * The edit environment
114 ******************************************************************************/
115 
116 class edit_env;
117 class ornament_parameters;
118 class edit_env_rep: public concrete_struct {
119 public:
120   drd_info&                    drd;
121 private:
122   hashmap<string,tree>         env;
123   hashmap<string,tree>         back;
124 public:
125   hashmap<string,path>         src;
126   list<hashmap<string,tree> >  macro_arg;
127   list<hashmap<string,path> >  macro_src;
128   array<box>                   decorated_boxes;
129 
130   hashmap<string,int>&         var_type;
131   url                          base_file_name;
132   url                          cur_file_name;
133   bool                         secure;
134   hashmap<string,tree>&        local_ref;
135   hashmap<string,tree>&        global_ref;
136   hashmap<string,tree>&        local_aux;
137   hashmap<string,tree>&        global_aux;
138   hashmap<string,tree>&        local_att;
139   hashmap<string,tree>&        global_att;
140   bool                         complete;    // typeset complete document ?
141   bool                         read_only;   // write-protected ?
142   hashmap<string,tree>         missing;     // missing refs
143   array<tree>                  redefined;   // redefined labels
144   link_repository              link_env;
145 
146   int          dpi;
147   double       inch;
148   double       zoomf;
149   SI           pixel;
150   double       magn;
151   double       mgfy;
152   double       flexibility;
153   int          first_page;
154   int          mode;
155   int          mode_op;
156   language     lan;
157   int          hl_lan;
158   font         fn;
159   int          fn_size;
160   int          index_level;
161   bool         display_style;
162   bool         math_condensed;
163   int          vert_pos;
164   int          alpha;
165   pencil       pen;
166   bool         no_patterns;
167   string       point_style;
168   bool         preamble;
169   int          info_level;
170   SI           gw;
171   SI           gh;
172   string       gvalign;
173   frame        fr;
174   point        clip_lim1;
175   point        clip_lim2;
176   int          src_style;
177   int          src_special;
178   int          src_compact;
179   int          src_close;
180   array<bool>  dash_style;
181   SI           dash_style_unit;
182   brush        fill_brush;
183   array<tree>  line_arrows;
184   string       text_at_halign;
185   string       text_at_valign;
186 
187   int          inactive_mode;
188   tree         recover_env;
189 
190   string       page_type;
191   bool         page_landscape;
192   bool         page_automatic;
193   int          page_margin_mode;
194   SI           page_width;
195   SI           page_height;
196   SI           page_user_width;
197   SI           page_user_height;
198   SI           page_odd_margin;
199   SI           page_even_margin;
200   SI           page_right_margin;
201   SI           page_top_margin;
202   SI           page_bottom_margin;
203 
204 private:
205   tree exec_formatting (tree t, string v);
206   void exec_until_formatting (tree t, path p, string v);
207   bool exec_until_formatting (tree t, path p, string var, int l, string v);
208   tree exec_table (tree t);
209   void exec_until_table (tree t, path p);
210   bool exec_until_table (tree t, path p, string var, int level);
211   tree exec_assign (tree t);
212   tree exec_with (tree t);
213   void exec_until_with (tree t, path p);
214   bool exec_until_with (tree t, path p, string var, int level);
215   tree exec_drd_props (tree t);
216   tree exec_compound (tree t);
217   void exec_until_compound (tree t, path p);
218   bool exec_until_compound (tree t, path p, string var, int level);
219   tree exec_provides (tree t);
220   tree exec_value (tree t);
221   tree exec_quote_value (tree t);
222   tree exec_arg (tree t);
223   bool exec_until_arg (tree t, path p, string var, int level);
224   tree exec_quote_arg (tree t);
225   tree exec_get_label (tree t);
226   tree exec_get_arity (tree t);
227   tree exec_eval_args (tree t);
228   bool exec_until_mark (tree t, path p, string var, int level);
229   bool exec_until_quasi (tree t, path p, string var, int level);
230   tree exec_quasiquoted (tree t);
231   tree exec_copy (tree t);
232   tree exec_if (tree t);
233   bool exec_until_if (tree t, path p, string var, int level);
234   tree exec_case (tree t);
235   bool exec_until_case (tree t, path p, string var, int level);
236   tree exec_while (tree t);
237   bool exec_until_while (tree t, path p, string var, int level);
238   tree exec_for_each (tree t);
239   tree exec_use_package (tree t);
240   tree exec_use_module (tree t);
241 
242   tree exec_or (tree t);
243   tree exec_xor (tree t);
244   tree exec_and (tree t);
245   tree exec_not (tree t);
246   tree exec_plus_minus (tree t);
247   tree exec_min_max (tree t);
248   tree exec_times_over (tree t);
249   tree exec_divide (tree t);
250   tree exec_modulo (tree t);
251   tree exec_math_sqrt (tree t);
252   tree exec_exp (tree t);
253   tree exec_log (tree t);
254   tree exec_pow (tree t);
255   tree exec_cos (tree t);
256   tree exec_sin (tree t);
257   tree exec_tan (tree t);
258   tree exec_merge (tree t);
259   tree exec_length (tree t);
260   tree exec_range (tree t);
261   tree exec_number (tree t);
262   tree exec_date (tree t);
263   tree exec_translate (tree t);
264   tree exec_change_case (tree t, tree nc, bool exec_flag, bool first);
265   tree exec_change_case (tree t);
266   tree exec_find_file (tree t);
267   tree exec_find_file_upwards (tree t);
268   tree exec_is_tuple (tree t);
269   tree exec_lookup (tree t);
270   tree exec_equal (tree t);
271   tree exec_unequal (tree t);
272   tree exec_less (tree t);
273   tree exec_lesseq (tree t);
274   tree exec_greater (tree t);
275   tree exec_greatereq (tree t);
276   tree exec_blend (tree t);
277 
278   tree exec_cm_length ();
279   tree exec_mm_length ();
280   tree exec_in_length ();
281   tree exec_pt_length ();
282   tree exec_bp_length ();
283   tree exec_dd_length ();
284   tree exec_pc_length ();
285   tree exec_cc_length ();
286   tree exec_fs_length ();
287   tree exec_fbs_length ();
288   tree exec_em_length ();
289   tree exec_ln_length ();
290   tree exec_sep_length ();
291   tree exec_yfrac_length ();
292   tree exec_ex_length ();
293   tree exec_fn_length ();
294   tree exec_fns_length ();
295   tree exec_bls_length ();
296   tree exec_fnbot_length ();
297   tree exec_fntop_length ();
298   tree exec_spc_length ();
299   tree exec_xspc_length ();
300   tree exec_par_length ();
301   tree exec_pag_length ();
302   tree exec_tmpt_length ();
303   tree exec_px_length ();
304   tree exec_gw_length ();
305   tree exec_gh_length ();
306   tree exec_gu_length ();
307   tree exec_msec_length ();
308   tree exec_sec_length ();
309   tree exec_min_length ();
310   tree exec_hr_length ();
311 
312   tree exec_hard_id (tree t);
313   tree exec_script (tree t);
314   tree exec_find_accessible (tree t);
315   tree exec_set_binding (tree t);
316   tree exec_get_binding (tree t);
317   tree exec_get_attachment (tree t);
318 
319   tree exec_pattern (tree t);
320 
321   tree exec_point (tree t);
322 
323   tree exec_eff_move (tree t);
324   tree exec_eff_bubble (tree t);
325   tree exec_eff_gaussian (tree t);
326   tree exec_eff_oval (tree t);
327   tree exec_eff_rectangular (tree t);
328   tree exec_eff_motion (tree t);
329 
330   tree exec_box_info (tree t);
331   tree exec_frame_direct (tree t);
332   tree exec_frame_inverse (tree t);
333 
334   tree exec_rewrite (tree t);
335   bool exec_until_rewrite (tree t, path p, string var, int level);
336   tree rewrite_inactive_arg (tree t, tree var, int i, bool bl, bool fl);
337   tree rewrite_inactive_raw_data (tree t, tree var, bool block, bool flush);
338   tree rewrite_inactive_document (tree t, tree var, bool block, bool flush);
339   tree rewrite_inactive_concat (tree t, tree var, bool block, bool flush);
340   tree rewrite_inactive_value (tree t, tree var, bool block, bool flush);
341   tree rewrite_inactive_arg (tree t, tree var, bool block, bool flush);
342   tree rewrite_inactive_style_with (tree t, tree var, bool b, bool f, bool o);
343   tree rewrite_inactive_active (tree t, tree var, bool block, bool flush);
344   tree rewrite_inactive_var_active (tree t, tree var, bool block, bool flush);
345   tree rewrite_inactive_symbol (tree t, tree var, bool block, bool flush);
346   tree rewrite_inactive_hybrid (tree t, tree var, bool block, bool flush);
347   tree rewrite_inactive_default (tree t, tree var, bool block, bool flush);
348   tree rewrite_inactive (tree t, tree var, bool block, bool flush);
349   tree rewrite_inactive (tree t, tree var);
350 
351 public:
352   edit_env_rep (drd_info& drd,
353 		url base_file_name,
354 		hashmap<string,tree>& local_ref,
355 		hashmap<string,tree>& global_ref,
356 		hashmap<string,tree>& local_aux,
357 		hashmap<string,tree>& global_aux,
358 		hashmap<string,tree>& local_att,
359 		hashmap<string,tree>& global_att);
360   void   style_init_env ();
361 
362   /* execution of trees and setting environment variables */
363   tree   exec (tree t);
364   void   exec_until (tree t, path p);
365   bool   exec_until (tree t, path p, string var, int level);
366   string exec_string (tree t);        /* should be inline */
367   tree   expand (tree t, bool search_accessible= false);
368   bool   depends (tree t, string s, int level);
369   tree   rewrite (tree t);
370 
monitored_write(string s,tree t)371   inline void monitored_write (string s, tree t) {
372     back->write_back (s, env); env (s)= t; }
monitored_write_update(string s,tree t)373   inline void monitored_write_update (string s, tree t) {
374     back->write_back (s, env); env (s)= t; update (s); }
write(string s,tree t)375   inline void write (string s, tree t) { env (s)= t; }
write_update(string s,tree t)376   inline void write_update (string s, tree t) { env (s)= t; update (s); }
local_begin(string s,tree t)377   inline tree local_begin (string s, tree t) {
378     // tree r (env [s]); monitored_write_update (s, t); return r;
379     tree& val= env (s); tree r (val); val= t; update (s); return r; }
local_end(string s,tree t)380   inline void local_end (string s, tree t) {
381      env (s)= t; update (s); }
local_begin_script()382   inline tree local_begin_script () {
383     return local_begin (MATH_LEVEL, as_string (index_level+1)); }
local_end_script(tree t)384   inline void local_end_script (tree t) {
385     local_end (MATH_LEVEL, t); }
assign(string s,tree t)386   inline void assign (string s, tree t) {
387     tree& val= env (s); t= exec(t); if (val != t) {
388       back->write_back (s, env); val= t; update (s); } }
provides(string s)389   inline bool provides (string s) { return env->contains (s); }
read(string s)390   inline tree read (string s) { return env [s]; }
391   tree local_begin_extents (box b);
392   void local_end_extents (tree t);
393 
394   void write_default_env ();
395   void write_env (hashmap<string,tree> user_env);
396   void monitored_patch_env (hashmap<string,tree> patch);
397   void patch_env (hashmap<string,tree> patch);
398   void read_env (hashmap<string,tree>& ret);
399   void local_start (hashmap<string,tree>& prev_back);
400   void local_update (hashmap<string,tree>& oldpat, hashmap<string,tree>& chg);
401   void local_end (hashmap<string,tree>& prev_back);
402 
403   /* updating environment variables */
404   ornament_parameters get_ornament_parameters ();
405   void   update_page_pars ();
406   void   get_page_pars (SI& w, SI& h, SI& ww, SI& hh,
407 			SI& odd, SI& even, SI& top, SI& bottom);
408   tree   decode_arrow (tree t, string l, string h);
409   void   update_font ();
410   void   update_color ();
411   void   update_pattern_mode ();
412   void   update_mode ();
413   void   update_info_level ();
414   void   update_language ();
415   void   update_geometry ();
416   void   update_frame ();
417   void   update_src_style ();
418   void   update_src_special ();
419   void   update_src_compact ();
420   void   update_src_close ();
421   void   update_dash_style ();
422   void   update_line_arrows ();
423   void   update ();
424   void   update (string env_var);
425 
426   /* lengths */
427   bool      is_length (string s);
428   bool      is_anylen (tree t);
429   tree      tmlen_plus (tree t1, tree t2);
430   tree      tmlen_min (tree t1, tree t2);
431   tree      tmlen_max (tree t1, tree t2);
432   tree      tmlen_times (double sc, tree t);
433   tree      tmlen_over (tree t1, tree t2);
434   double    tmlen_div (tree t1, tree t2);
435   tree      tmlen_mod (tree t1, tree t2);
436 
437   void      get_length_unit (string l, SI& un, string& un_str);
438   string    add_lengths (string l1, string l2);
439   string    multiply_length (double x, string l);
440   double    divide_lengths (string l1, string l2);
441 
442   tree      as_tmlen (tree t);
443   SI        as_length (tree t);
444   SI        as_length (tree t, string perc);
445   space     as_hspace (tree t);
446   space     as_vspace (tree t);
447   point     as_point (tree t);
448 
449   /* retrieving environment variables */
get_bool(string var)450   inline bool get_bool (string var) {
451     tree t= env [var];
452     if (is_compound (t)) return false;
453     return as_bool (t->label); }
get_int(string var)454   inline int get_int (string var) {
455     tree t= env [var];
456     if (is_compound (t)) return 0;
457     return as_int (t->label); }
get_double(string var)458   inline double get_double (string var) {
459     tree t= env [var];
460     if (is_compound (t)) return 0.0;
461     return as_double (t->label); }
get_string(string var)462   inline string get_string (string var) {
463     tree t= env [var];
464     if (is_compound (t)) return "";
465     return t->label; }
get_length(string var)466   inline SI get_length (string var) {
467     tree t= env [var];
468     return as_length (t); }
get_vspace(string var)469   inline space get_vspace (string var) {
470     tree t= env [var];
471     return as_vspace (t); }
get_color(string var)472   inline color get_color (string var) {
473     tree t= env [var];
474     return named_color (as_string (t), alpha); }
475 
476   friend class edit_env;
477   friend tm_ostream& operator << (tm_ostream& out, edit_env env);
478 };
479 
480 class edit_env {
481   CONCRETE_NULL(edit_env);
edit_env(edit_env_rep * rep2)482   inline edit_env (edit_env_rep* rep2):
483     rep(rep2) { INC_COUNT_NULL (this->rep); }
484   edit_env (drd_info& drd,
485 	    url base_file_name,
486 	    hashmap<string,tree>& local_ref,
487 	    hashmap<string,tree>& global_ref,
488 	    hashmap<string,tree>& local_aux,
489 	    hashmap<string,tree>& global_aux,
490 	    hashmap<string,tree>& local_att,
491 	    hashmap<string,tree>& global_att);
492 };
493 CONCRETE_NULL_CODE(edit_env);
494 
495 tm_ostream& operator << (tm_ostream& out, edit_env env);
496 tree texmacs_exec (edit_env env, tree cmd);
497 void extract_format (tree fm, tree* r, int n);
498 tree load_inclusion (url u); // implemented in tm_file.cpp
499 tree tree_extents (tree t);
500 bool is_percentage (tree t, string s);
501 bool is_percentage (tree t);
502 double as_percentage (tree t);
503 bool is_magnification (string s);
504 double get_magnification (string s);
505 int decode_alpha (string s);
506 
507 void set_graphical_value (tree var, tree val);
508 bool has_graphical_value (tree var);
509 tree get_graphical_value (tree var);
510 bool graphics_needs_update ();
511 void graphics_require_update (tree var);
512 void graphics_notify_update (tree var);
513 
514 #endif // defined ENV_H
515