1 /*
2  *  Eukleides version 1.5.4
3  *  Copyright (c) Christian Obrecht 2004-2010
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, write to the Free Software
17  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 
20 #include <stdlib.h>
21 #include <stdio.h>
22 #include "error.h"
23 #include "args.h"
24 #include "symbol.h"
25 #include "core.h"
26 #include "compiler.h"
27 #include "parser.tab.h"
28 
29 	/* Box and scale */
30 
31 double min_x = -2, min_y = -2, max_x = 8, max_y = 6, scale = 1;
32 
set_scale(void)33 void set_scale(void)
34 {
35     scale = POPn;
36     if (scale <= 0) runtime_error(_("invalid scale factor"));
37 }
38 
set_box(_param p)39 void set_box(_param p)
40 {
41     set_scale();
42     max_y = POPn;
43     max_x = POPn;
44     min_y = POPn;
45     min_x = POPn;
46     if (max_x <= min_x || max_y <= min_y)
47 	runtime_error(_("invalid bounding box"));
48 }
49 
50 	/* Color */
51 
52 int global_color = BLACK;
53 int local_color = BLACK;
54 
set_global_color(_param p)55 void set_global_color(_param p)
56 {
57     global_color = local_color = p.addr;
58 }
59 
set_local_color(_param p)60 void set_local_color(_param p)
61 {
62     local_color = p.addr;
63 }
64 
65 	/* Size */
66 
67 double global_size = 1;
68 double local_size = 1;
69 
set_global_size(_param p)70 void set_global_size(_param p)
71 {
72     global_size = local_size = p.num;
73     if (global_size <= 0) runtime_error(_("invalid size"));
74 }
75 
set_local_size(_param p)76 void set_local_size(_param p)
77 {
78     local_size = p.num;
79     if (local_size <= 0) runtime_error(_("invalid size"));
80 }
81 
82 	/* Step */
83 
84 double global_step = 3;
85 double local_step = 3;
86 
set_global_step(void)87 void set_global_step(void)
88 {
89     global_step = local_step = POPn;
90     if (global_step <= 0) runtime_error(_("invalid size"));
91 }
92 
set_local_step(void)93 void set_local_step(void)
94 {
95     local_step = POPn;
96     if (local_step <= 0) runtime_error(_("invalid size"));
97 }
98 
99 	/* Line style */
100 
101 int global_style = FULL;
102 int local_style = FULL;
103 
set_global_style(_param p)104 void set_global_style(_param p)
105 {
106     global_style = local_style = p.addr;
107 }
108 
set_local_style(_param p)109 void set_local_style(_param p)
110 {
111     local_style = p.addr;
112 }
113 
114 	/* Point shape */
115 
116 int global_shape = DOT;
117 int local_shape = DOT;
118 
set_global_shape(_param p)119 void set_global_shape(_param p)
120 {
121     global_shape = local_shape = p.addr;
122 }
123 
set_local_shape(_param p)124 void set_local_shape(_param p)
125 {
126     local_shape = p.addr;
127 }
128 
129 	/* Line partition */
130 
131 int global_part = ENTIRE;
132 int local_part = ENTIRE;
133 
set_global_part(_param p)134 void set_global_part(_param p)
135 {
136     global_part = local_part = p.addr;
137 }
138 
set_local_part(_param p)139 void set_local_part(_param p)
140 {
141     local_part = p.addr;
142 }
143 	/* Direction */
144 
145 int global_dir = FORTH;
146 int local_dir = FORTH;
147 
set_global_dir(_param p)148 void set_global_dir(_param p)
149 {
150     global_dir = local_dir = p.addr;
151 }
152 
set_local_dir(_param p)153 void set_local_dir(_param p)
154 {
155     local_dir = p.addr;
156 }
157 	/* Arrows */
158 
159 int global_arrow = NONE;
160 int local_arrow = NONE;
161 
set_global_arrow(_param p)162 void set_global_arrow(_param p)
163 {
164     global_arrow = local_arrow = p.addr;
165 }
166 
set_local_arrow(_param p)167 void set_local_arrow(_param p)
168 {
169     local_arrow = p.addr;
170 }
171 
172 	/* Font */
173 
174 char *global_font_desc;
175 char *local_font_desc;
176 
177 int global_font = 0;
178 int local_font = 0;
179 
set_global_font(void)180 void set_global_font(void)
181 {
182     global_font_desc = local_font_desc = POPs;
183     global_font = 1;
184 }
185 
set_local_font(void)186 void set_local_font(void)
187 {
188     local_font_desc = POPs;
189     local_font = 1;
190 }
191 
192 	/* Segment label style */
193 
194 int global_segment = SIMPLE;
195 int local_segment = SIMPLE;
196 
set_global_segment(_param p)197 void set_global_segment(_param p)
198 {
199     global_segment = local_segment = p.addr;
200 }
201 
set_local_segment(_param p)202 void set_local_segment(_param p)
203 {
204     local_segment = p.addr;
205 }
206 
207 	/* Angle label style */
208 
209 int global_angle = SIMPLE;
210 int local_angle = SIMPLE;
211 
set_global_angle(_param p)212 void set_global_angle(_param p)
213 {
214     global_angle = local_angle = p.addr;
215 }
216 
set_local_angle(_param p)217 void set_local_angle(_param p)
218 {
219     local_angle = p.addr;
220 }
221 
222 	/* Angle label decoration */
223 
224 int global_dec = NONE;
225 int local_dec = NONE;
226 
set_global_dec(_param p)227 void set_global_dec(_param p)
228 {
229     global_dec = local_dec = p.addr;
230 }
231 
set_local_dec(_param p)232 void set_local_dec(_param p)
233 {
234     local_dec = p.addr;
235 }
236 
237 	/* Global and local settings */
238 
239 int global_settings = 0;
240 int local_settings = 0;
241 
restore_default_settings(void)242 void restore_default_settings(void)
243 {
244     global_style = local_style = FULL;
245     global_shape = local_shape = DOT;
246     global_part = local_part = ENTIRE;
247     global_dir = local_dir = FORTH;
248     global_arrow = local_arrow = NONE;
249     global_color = local_color = BLACK;
250     global_size = local_size = 1;
251     global_step = local_step = 3;
252     global_font = local_font = 0;
253     global_segment = local_segment = SIMPLE;
254     global_angle = local_angle = SIMPLE;
255     global_dec = local_dec = NONE;
256 }
257 
restore_global_settings(void)258 void restore_global_settings(void)
259 {
260     local_style = global_style;
261     local_shape = global_shape;
262     local_part = global_part;
263     local_dir = global_dir;
264     local_arrow = global_arrow;
265     local_color = global_color;
266     local_size = global_size;
267     local_step = global_step;
268     local_font = 0;
269     local_segment = global_segment;
270     local_angle = global_angle;
271     local_dec = global_dec;
272 }
273 
clear_local_settings(void)274 void clear_local_settings(void)
275 {
276     if (local_settings) {
277 	XEQ_(restore_global_settings);
278 	local_settings = 0;
279     }
280 }
281