1 /***************************************************************************
2  * exec_set.cpp is part of Math Graphic Library
3  * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU Lesser General Public License  as       *
7  *   published by the Free Software Foundation; either version 3 of the    *
8  *   License, or (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 Lesser General Public     *
16  *   License along with this program; if not, write to the                 *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20 #ifdef WIN32
21 #include <io.h>
22 #include <direct.h>
23 #else
24 #include <unistd.h>
25 #endif
26 
27 #include "mgl2/base.h"
28 #include "mgl2/parser.h"
29 //#pragma GCC diagnostic ignored "-Wmisleading-indentation"
30 wchar_t *mgl_str_copy(const char *s);
31 //-----------------------------------------------------------------------------
mgls_addlegend(mglGraph * gr,long,mglArg * a,const char * k,const char *)32 int static mgls_addlegend(mglGraph *gr, long , mglArg *a, const char *k, const char *)
33 {
34 	int res=0;
35 	if(!strcmp(k,"ss"))	gr->AddLegend(a[0].s.w,a[1].s.s);
36 	else	res = 1;
37 	return res;
38 }
39 //-----------------------------------------------------------------------------
mgls_addsymbol(mglGraph * gr,long,mglArg * a,const char * k,const char *)40 int static mgls_addsymbol(mglGraph *gr, long , mglArg *a, const char *k, const char *)
41 {
42 	int res=0;
43 	if(!strcmp(k,"sdd"))	gr->DefineSymbol(a[0].s[0],*(a[1].d),*(a[2].d));
44 	else	res = 1;
45 	return res;
46 }
47 //-----------------------------------------------------------------------------
mgls_adjust(mglGraph * gr,long,mglArg * a,const char * k,const char *)48 int static mgls_adjust(mglGraph *gr, long , mglArg *a, const char *k, const char *)
49 {
50 	int res=0;
51 	if(k[0]==0)	gr->Adjust();
52 	else if(!strcmp(k,"s"))	gr->Adjust(a[0].s.s);
53 	else res = 1;
54 	return res;
55 }
56 //-----------------------------------------------------------------------------
mgls_alpha(mglGraph * gr,long,mglArg * a,const char * k,const char *)57 int static mgls_alpha(mglGraph *gr, long , mglArg *a, const char *k, const char *)
58 {
59 	int res=0;
60 	if(k[0]==0)	gr->Alpha(true);
61 	else if(!strcmp(k,"n"))	gr->Alpha(a[0].v!=0);
62 	else res = 1;
63 	return res;
64 }
65 //-----------------------------------------------------------------------------
mgls_alphadef(mglGraph * gr,long,mglArg * a,const char * k,const char *)66 int static mgls_alphadef(mglGraph *gr, long , mglArg *a, const char *k, const char *)
67 {
68 	int res=0;
69 	if(!strcmp(k,"n"))	gr->SetAlphaDef(a[0].v);
70 	else res = 1;
71 	return res;
72 }
73 //-----------------------------------------------------------------------------
mgls_ambient(mglGraph * gr,long,mglArg * a,const char * k,const char *)74 int static mgls_ambient(mglGraph *gr, long , mglArg *a, const char *k, const char *)
75 {
76 	int res=0;
77 	if(!strcmp(k,"n"))	gr->SetAmbient(a[0].v);
78 	else res = 1;
79 	return res;
80 }
81 //-----------------------------------------------------------------------------
mgls_arrowsize(mglGraph * gr,long,mglArg * a,const char * k,const char *)82 int static mgls_arrowsize(mglGraph *gr, long , mglArg *a, const char *k, const char *)
83 {
84 	int res=0;
85 	if(!strcmp(k,"n"))	gr->SetArrowSize(a[0].v);
86 	else res = 1;
87 	return res;
88 }
89 //-----------------------------------------------------------------------------
mgls_aspect(mglGraph * gr,long,mglArg * a,const char * k,const char *)90 int static mgls_aspect(mglGraph *gr, long , mglArg *a, const char *k, const char *)
91 {
92 	int res=0;
93 	if(!strcmp(k,"nn"))	gr->Aspect(a[0].v, a[1].v, 1);
94 	else if(!strcmp(k,"nnn"))	gr->Aspect(a[0].v, a[1].v, a[2].v);
95 	else res = 1;
96 	return res;
97 }
98 //-----------------------------------------------------------------------------
mgls_attachlight(mglGraph * gr,long,mglArg * a,const char * k,const char *)99 int static mgls_attachlight(mglGraph *gr, long , mglArg *a, const char *k, const char *)
100 {
101 	int res=0;
102 	if(!strcmp(k,"n"))	gr->AttachLight(a[0].v!=0);
103 	else res = 1;
104 	return res;
105 }
106 //-----------------------------------------------------------------------------
mgls_axisstl(mglGraph * gr,long,mglArg * a,const char * k,const char *)107 int static mgls_axisstl(mglGraph *gr, long , mglArg *a, const char *k, const char *)
108 {
109 	int res=0;
110 	if(k[0]==0)	gr->SetAxisStl();
111 	else if(!strcmp(k,"s"))	gr->SetAxisStl(a[0].s.s);
112 	else if(!strcmp(k,"ss"))	gr->SetAxisStl(a[0].s.s, a[1].s.s);
113 	else if(!strcmp(k,"sss"))	gr->SetAxisStl(a[0].s.s, a[1].s.s, a[2].s.s);
114 	else res = 1;
115 	return res;
116 }
117 //-----------------------------------------------------------------------------
mgls_barwidth(mglGraph * gr,long,mglArg * a,const char * k,const char *)118 int static mgls_barwidth(mglGraph *gr, long , mglArg *a, const char *k, const char *)
119 {
120 	int res=0;
121 	if(!strcmp(k,"n"))	gr->SetBarWidth(a[0].v);
122 	else res = 1;
123 	return res;
124 }
125 //-----------------------------------------------------------------------------
mgls_bbox(mglGraph * gr,long,mglArg * a,const char * k,const char *)126 int static mgls_bbox(mglGraph *gr, long , mglArg *a, const char *k, const char *)
127 {
128 	int res=0;
129 	if(!strcmp(k,"nn") && a[1].v>=0 && a[0].v>=0)
130 		gr->SetBBox(mgl_int(a[0].v), mgl_int(a[1].v));
131 	else if(!strcmp(k,"nnnn"))
132 		gr->SetBBox(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v));
133 	else res = 1;
134 	return res;
135 }
136 //-----------------------------------------------------------------------------
mgls_chdir(mglGraph * gr,long,mglArg * a,const char * k,const char *)137 int static mgls_chdir(mglGraph *gr, long , mglArg *a, const char *k, const char *)
138 {
139 	int res=0;
140 	if(!strcmp(k,"s"))
141 	{	if(chdir(a[0].s.s))	gr->SetWarn(mglWarnFile,"chdir");	}
142 	else res = 1;
143 	return res;
144 }
145 //-----------------------------------------------------------------------------
mgls_clearlegend(mglGraph * gr,long,mglArg *,const char * k,const char *)146 int static mgls_clearlegend(mglGraph *gr, long , mglArg *, const char *k, const char *)
147 {
148 	int res=0;
149 	if(k[0]==0)	gr->ClearLegend();
150 	else res = 1;
151 	return res;
152 }
153 //-----------------------------------------------------------------------------
mgls_clf(mglGraph * gr,long,mglArg * a,const char * k,const char *)154 int static mgls_clf(mglGraph *gr, long , mglArg *a, const char *k, const char *)
155 {
156 	int res=0;
157 	if(k[0]==0)	gr->Clf();
158 	else if(!strcmp(k,"s"))	gr->Clf(a[0].s.s);
159 	else if(!strcmp(k,"nnn"))	gr->Clf(a[0].v,a[1].v,a[2].v);
160 	else res = 1;
161 	return res;
162 }
163 //-----------------------------------------------------------------------------
mgls_columnplot(mglGraph * gr,long,mglArg * a,const char * k,const char *)164 int static mgls_columnplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
165 {
166 	int res=0;
167 	if(!strcmp(k,"nn"))	gr->ColumnPlot(mgl_int(a[0].v), mgl_int(a[1].v));
168 	else if(!strcmp(k,"nnn"))	gr->ColumnPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v);
169 	else res = 1;
170 	return res;
171 }
172 //-----------------------------------------------------------------------------
mgls_crange(mglGraph * gr,long,mglArg * a,const char * k,const char *)173 int static mgls_crange(mglGraph *gr, long , mglArg *a, const char *k, const char *)
174 {
175 	int res=0;
176 	if(!strcmp(k,"d"))	gr->SetRange('c',*(a[0].d));
177 	else if(!strcmp(k,"dn"))	gr->SetRange('c',*(a[0].d),a[1].v);
178 	else if(!strcmp(k,"nn"))	gr->SetRange('c', a[0].v, a[1].v);
179 	else if(!strcmp(k,"nnn"))
180 	{
181 		if(a[2].v)	gr->AddRange('c', a[0].v, a[1].v);
182 		else	gr->SetRange('c', a[0].v, a[1].v);
183 	}
184 	else res = 1;
185 	return res;
186 }
187 //-----------------------------------------------------------------------------
mgls_ctick(mglGraph * gr,long n,mglArg * a,const char * k,const char *)188 int static mgls_ctick(mglGraph *gr, long n, mglArg *a, const char *k, const char *)
189 {
190 	int res=0;
191 	if(!strcmp(k,"s"))	gr->SetTickTempl('c',a[0].s.w);
192 	else if(!strcmp(k,"n"))	gr->SetTicks('c',a[0].v,0,0);
193 	else if(!strcmp(k,"ns"))	gr->SetTicks('c',a[0].v,0,0,a[1].s.w);
194 	else if(!strcmp(k,"ds"))	gr->SetTicksVal('c', *(a[0].d), a[1].s.w);
195 	else if(!strcmp(k,"dsn"))	gr->SetTicksVal('c', *(a[0].d), a[1].s.w, a[2].v);
196 	else if(!strncmp(k,"ns",2))
197 	{
198 		std::wstring s;
199 		std::vector<mreal> v;
200 		for(long i=0;i<n/2;i++)
201 		{
202 			if(a[2*i].type==2 && a[2*i+1].type==1)
203 			{	v.push_back(a[2*i].v);	s += std::wstring(a[2*i+1].s.w)+L"\n";	}
204 			else	break;
205 		}
206 		gr->SetTicksVal('c',mglDataS(v),s.c_str(),v.size()==1?true:false);
207 	}	else res = 1;
208 	return res;
209 }
210 //-----------------------------------------------------------------------------
mgls_cut(mglGraph * gr,long,mglArg * a,const char * k,const char *)211 int static mgls_cut(mglGraph *gr, long , mglArg *a, const char *k, const char *)
212 {
213 	int res=0;
214 	if(!strcmp(k,"n"))	gr->SetCut(a[0].v != 0);
215 	else if(!strcmp(k,"nnnnnn"))
216 		gr->SetCutBox(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v));
217 	else if(!strcmp(k,"s"))	gr->CutOff(a[0].s.s);
218 	else res = 1;
219 	return res;
220 }
221 //-----------------------------------------------------------------------------
mgls_diffuse(mglGraph * gr,long,mglArg * a,const char * k,const char *)222 int static mgls_diffuse(mglGraph *gr, long , mglArg *a, const char *k, const char *)
223 {
224 	int res=0;
225 	if(!strcmp(k,"n"))	gr->SetDiffuse(a[0].v);
226 	else res = 1;
227 	return res;
228 }
229 //-----------------------------------------------------------------------------
mgls_drawreg(mglGraph * gr,long,mglArg * a,const char * k,const char *)230 int static mgls_drawreg(mglGraph *gr, long , mglArg *a, const char *k, const char *)
231 {
232 	int res=0;
233 	if(k[0]==0)	gr->SetDrawReg();
234 	else if(!strcmp(k,"nnn"))	gr->SetDrawReg(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v));
235 	else res = 1;
236 	return res;
237 }
238 //-----------------------------------------------------------------------------
mgls_facenum(mglGraph * gr,long,mglArg * a,const char * k,const char *)239 int static mgls_facenum(mglGraph *gr, long , mglArg *a, const char *k, const char *)
240 {
241 	int res=0;
242 	if(!strcmp(k,"n"))	gr->SetFaceNum(a[0].v);
243 	else res = 1;
244 	return res;
245 }
246 //-----------------------------------------------------------------------------
mgls_fog(mglGraph * gr,long,mglArg * a,const char * k,const char *)247 int static mgls_fog(mglGraph *gr, long , mglArg *a, const char *k, const char *)
248 {
249 	int res=0;
250 	if(!strcmp(k,"n"))	gr->Fog(a[0].v);
251 	else if(!strcmp(k,"nn"))	gr->Fog(a[0].v,a[1].v);
252 	else res = 1;
253 	return res;
254 }
255 //-----------------------------------------------------------------------------
mgls_font(mglGraph * gr,long,mglArg * a,const char * k,const char *)256 int static mgls_font(mglGraph *gr, long , mglArg *a, const char *k, const char *)
257 {
258 	int res=0;
259 	if(!strcmp(k,"s"))	gr->SetFontDef(a[0].s.s);
260 	else if(!strcmp(k,"sn"))
261 	{	gr->SetFontDef(a[0].s.s);	gr->SetFontSize(a[1].v);	}
262 	else res = 1;
263 	return res;
264 }
265 //-----------------------------------------------------------------------------
mgls_gray(mglGraph * gr,long,mglArg * a,const char * k,const char *)266 int static mgls_gray(mglGraph *gr, long , mglArg *a, const char *k, const char *)
267 {
268 	int res=0;
269 	if(k[0]==0)	gr->Gray(true);
270 	else if(!strcmp(k,"n"))	gr->Gray(a[0].v!=0);
271 	else res = 1;
272 	return res;
273 }
274 //-----------------------------------------------------------------------------
mgls_gridplot(mglGraph * gr,long,mglArg * a,const char * k,const char *)275 int static mgls_gridplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
276 {
277 	int res=0;
278 	if(!strcmp(k,"nnn"))	gr->GridPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v));
279 	else if(!strcmp(k,"nnnn"))	gr->GridPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].v);
280 	else res = 1;
281 	return res;
282 }
283 //-----------------------------------------------------------------------------
mgls_inplot(mglGraph * gr,long,mglArg * a,const char * k,const char *)284 int static mgls_inplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
285 {
286 	int res=0;
287 	if(!strcmp(k,"nnnn"))	gr->InPlot(a[0].v, a[1].v, a[2].v, a[3].v);
288 	else if(!strcmp(k,"nnnnn"))	gr->InPlot(a[0].v, a[1].v, a[2].v, a[3].v, a[4].v!=0);
289 	else res = 1;
290 	return res;
291 }
292 //-----------------------------------------------------------------------------
mgls_legendmarks(mglGraph * gr,long,mglArg * a,const char * k,const char *)293 int static mgls_legendmarks(mglGraph *gr, long , mglArg *a, const char *k, const char *)
294 {
295 	int res=0;
296 	if(!strcmp(k,"n"))	gr->SetLegendMarks(mgl_int(a[0].v));
297 	else res = 1;
298 	return res;
299 }
300 //-----------------------------------------------------------------------------
mgls_light(mglGraph * gr,long,mglArg * a,const char * k,const char *)301 int static mgls_light(mglGraph *gr, long , mglArg *a, const char *k, const char *)
302 {
303 	int res=0;
304 	if(k[0]==0)	gr->Light(true);
305 	else if(!strcmp(k,"n"))	gr->Light(a[0].v!=0);
306 	else if(!strcmp(k,"nn"))	gr->Light(mgl_int(a[0].v),a[1].v!=0);
307 	else if(!strcmp(k,"nnnn"))	gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v));
308 	else if(!strcmp(k,"nnnns"))	gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.s[0]);
309 	else if(!strcmp(k,"nnnnsn"))gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.s[0],a[5].v);
310 	else if(!strcmp(k,"nnnnsnn"))
311 		gr->AddLight(mgl_int(a[0].v), mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.s[0],a[5].v,a[6].v);
312 	else if(!strcmp(k,"nnnnnnn"))
313 		gr->AddLight(mgl_int(a[0].v), mglPoint(a[1].v,a[2].v,a[3].v), mglPoint(a[4].v,a[5].v,a[6].v));
314 	else if(!strcmp(k,"nnnnnnns"))
315 		gr->AddLight(mgl_int(a[0].v), mglPoint(a[1].v,a[2].v,a[3].v), mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.s[0]);
316 	else if(!strcmp(k,"nnnnnnnsn"))
317 		gr->AddLight(mgl_int(a[0].v), mglPoint(a[1].v,a[2].v,a[3].v), mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.s[0],a[8].v);
318 	else if(!strcmp(k,"nnnnnnnsnn"))
319 		gr->AddLight(mgl_int(a[0].v), mglPoint(a[1].v,a[2].v,a[3].v), mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.s[0],a[8].v,a[9].v);
320 	return res;
321 }
322 //-----------------------------------------------------------------------------
mgls_load(mglGraph * gr,long,mglArg * a,const char * k,const char *)323 int static mgls_load(mglGraph *gr, long , mglArg *a, const char *k, const char *)
324 {
325 	int res=0;
326 	if(!strcmp(k,"s") && gr->pr)	mgl_parser_load(gr->pr, a[0].s.s);
327 	else res = 1;
328 	return res;
329 }
330 //-----------------------------------------------------------------------------
mgls_loadfont(mglGraph * gr,long,mglArg * a,const char * k,const char *)331 int static mgls_loadfont(mglGraph *gr, long , mglArg *a, const char *k, const char *)
332 {
333 	int res=0;
334 	if(k[0]==0 || (!strcmp(k,"s") && a[0].s[0]==0))	gr->RestoreFont();
335 	else if(!strcmp(k,"s"))	gr->LoadFont(a[0].s.s);
336 	else res = 1;
337 	return res;
338 }
339 //-----------------------------------------------------------------------------
mgls_marksize(mglGraph * gr,long,mglArg * a,const char * k,const char *)340 int static mgls_marksize(mglGraph *gr, long , mglArg *a, const char *k, const char *)
341 {
342 	int res=0;
343 	if(!strcmp(k,"n"))	gr->SetMarkSize(a[0].v);
344 	else res = 1;
345 	return res;
346 }
347 //-----------------------------------------------------------------------------
mgls_mask(mglGraph * gr,long,mglArg * a,const char * k,const char *)348 int static mgls_mask(mglGraph *gr, long , mglArg *a, const char *k, const char *)
349 {
350 	int res=0;
351 	if(!strcmp(k,"sn"))	gr->SetMask(a[0].s[0],a[1].v);
352 	else if(!strcmp(k,"ss"))	gr->SetMask(a[0].s[0],a[1].s.s);
353 	else if(!strcmp(k,"snn"))
354 	{	gr->SetMask(a[0].s[0],a[1].v);	gr->SetMaskAngle(mgl_int(a[2].v));	}
355 	else if(!strcmp(k,"ssn"))
356 	{	gr->SetMask(a[0].s[0],a[1].s.s);gr->SetMaskAngle(mgl_int(a[2].v));	}
357 	else if(!strcmp(k,"n"))		gr->SetMaskAngle(mgl_int(a[0].v));
358 	else res = 1;
359 	return res;
360 }
361 //-----------------------------------------------------------------------------
mgls_meshnum(mglGraph * gr,long,mglArg * a,const char * k,const char *)362 int static mgls_meshnum(mglGraph *gr, long , mglArg *a, const char *k, const char *)
363 {
364 	int res=0;
365 	if(!strcmp(k,"n"))	gr->SetMeshNum(a[0].v);
366 	else res = 1;
367 	return res;
368 }
369 //-----------------------------------------------------------------------------
mgls_multiplot(mglGraph * gr,long,mglArg * a,const char * k,const char *)370 int static mgls_multiplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
371 {
372 	int res=0;
373 	if(!strcmp(k,"nnnnn"))
374 		gr->MultiPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v));
375 	else if(!strcmp(k,"nnnnns"))
376 		gr->MultiPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v), a[5].s.s);
377 	else if(!strcmp(k,"nnnnnsnn"))
378 		gr->MultiPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v), a[5].s.s, a[6].v,a[7].v);
379 	else res = 1;
380 	return res;
381 }
382 //-----------------------------------------------------------------------------
mgls_origin(mglGraph * gr,long,mglArg * a,const char * k,const char *)383 int static mgls_origin(mglGraph *gr, long , mglArg *a, const char *k, const char *)
384 {
385 	int res=0;
386 	if(!strcmp(k,"nn"))	gr->SetOrigin(a[0].v,a[1].v,NAN);
387 	else if(!strcmp(k,"nnn"))	gr->SetOrigin(a[0].v,a[1].v,a[2].v);
388 	else res = 1;
389 	return res;
390 }
391 //-----------------------------------------------------------------------------
mgls_origintick(mglGraph * gr,long,mglArg * a,const char * k,const char *)392 int static mgls_origintick(mglGraph *gr, long , mglArg *a, const char *k, const char *)
393 {
394 	int res=0;
395 	if(!strcmp(k,"n"))	gr->SetOriginTick(a[0].v);
396 	else res = 1;
397 	return res;
398 }
399 //-----------------------------------------------------------------------------
mgls_palette(mglGraph * gr,long,mglArg * a,const char * k,const char *)400 int static mgls_palette(mglGraph *gr, long , mglArg *a, const char *k, const char *)
401 {
402 	int res=0;
403 	if(!strcmp(k,"s"))	gr->SetPalette(a[0].s.s);
404 	else res = 1;
405 	return res;
406 }
407 //-----------------------------------------------------------------------------
mgls_pendelta(mglGraph * gr,long,mglArg * a,const char * k,const char *)408 int static mgls_pendelta(mglGraph *gr, long , mglArg *a, const char *k, const char *)
409 {
410 	int res=0;
411 	if(!strcmp(k,"n"))	gr->SetPenDelta(a[0].v);
412 	else res = 1;
413 	return res;
414 }
415 //-----------------------------------------------------------------------------
mgls_perspective(mglGraph * gr,long,mglArg * a,const char * k,const char *)416 int static mgls_perspective(mglGraph *gr, long , mglArg *a, const char *k, const char *)
417 {
418 	int res=0;
419 	if(!strcmp(k,"n"))	gr->Perspective(a[0].v);
420 	else res = 1;
421 	return res;
422 }
423 //-----------------------------------------------------------------------------
mgls_plotid(mglGraph * gr,long,mglArg * a,const char * k,const char *)424 int static mgls_plotid(mglGraph *gr, long , mglArg *a, const char *k, const char *)
425 {
426 	int res=0;
427 	if(!strcmp(k,"s"))	gr->SetPlotId(a[1].s.s);
428 	else  res = 1;
429 	return res;
430 }
431 //-----------------------------------------------------------------------------
mgls_quality(mglGraph * gr,long,mglArg * a,const char * k,const char *)432 int static mgls_quality(mglGraph *gr, long , mglArg *a, const char *k, const char *)
433 {
434 	int res=0;
435 	if(k[0]==0)	gr->SetQuality();
436 	else if(!strcmp(k,"n"))	gr->SetQuality(mgl_int(a[0].v));
437 	else res = 1;
438 	return res;
439 }
440 //-----------------------------------------------------------------------------
mgls_ranges(mglGraph * gr,long,mglArg * a,const char * k,const char *)441 int static mgls_ranges(mglGraph *gr, long , mglArg *a, const char *k, const char *)
442 {
443 	int res=0;
444 	if(!strcmp(k,"nnnn"))	gr->SetRanges(a[0].v,a[1].v, a[2].v,a[3].v);
445 	else if(!strcmp(k,"nnnnnn"))gr->SetRanges(a[0].v,a[1].v,a[2].v, a[3].v,a[4].v,a[5].v);
446 	else if(!strcmp(k,"dd"))	gr->SetRanges(*(a[0].d),*(a[1].d));
447 	else if(!strcmp(k,"ddd"))	gr->SetRanges(*(a[0].d),*(a[1].d), *(a[2].d));
448 	else if(!strcmp(k,"dddd"))	gr->SetRanges(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d));
449 	else res = 1;
450 	return res;
451 }
452 //-----------------------------------------------------------------------------
mgls_rasterize(mglGraph * gr,long,mglArg *,const char *,const char *)453 int static mgls_rasterize(mglGraph *gr, long , mglArg *, const char *, const char *)
454 {
455 	gr->Rasterize();	return 0;
456 }
457 //-----------------------------------------------------------------------------
mgls_reset(mglGraph * gr,long,mglArg *,const char * k,const char *)458 int static mgls_reset(mglGraph *gr, long , mglArg *, const char *k, const char *)
459 {
460 	int res=0;
461 	if(k[0]==0)	gr->DefaultPlotParam();
462 	else res = 1;
463 	return res;
464 }
465 //-----------------------------------------------------------------------------
mgls_rotate(mglGraph * gr,long,mglArg * a,const char * k,const char *)466 int static mgls_rotate(mglGraph *gr, long , mglArg *a, const char *k, const char *)
467 {
468 	int res=0;
469 	if(!strcmp(k,"nn"))	gr->Rotate(a[0].v, a[1].v, 0);
470 	else if(!strcmp(k,"nnn"))	gr->Rotate(a[0].v, a[1].v, a[2].v);
471 	else if(!strcmp(k,"nnnn"))	gr->RotateN(a[0].v, a[1].v, a[2].v, a[3].v);
472 	else res = 1;
473 	return res;
474 }
475 //-----------------------------------------------------------------------------
mgls_rotatetext(mglGraph * gr,long,mglArg * a,const char * k,const char *)476 int static mgls_rotatetext(mglGraph *gr, long , mglArg *a, const char *k, const char *)
477 {
478 	int res=0;
479 	if(!strcmp(k,"n"))	gr->SetRotatedText(a[0].v!=0);
480 	else res = 1;
481 	return res;
482 }
483 //-----------------------------------------------------------------------------
mgls_scaletext(mglGraph * gr,long,mglArg * a,const char * k,const char *)484 int static mgls_scaletext(mglGraph *gr, long , mglArg *a, const char *k, const char *)
485 {
486 	int res=0;
487 	if(!strcmp(k,"n"))	gr->SetScaleText(a[0].v!=0);
488 	else res = 1;
489 	return res;
490 }
491 //-----------------------------------------------------------------------------
mgls_setsize(mglGraph * gr,long,mglArg * a,const char * k,const char *)492 int static mgls_setsize(mglGraph *gr, long , mglArg *a, const char *k, const char *)
493 {
494 	int res=0;
495 	if(!strcmp(k,"nn") && a[1].v>1 && a[0].v>1)
496 		gr->SetSize(mgl_int(a[0].v), mgl_int(a[1].v));
497 	else res = 1;
498 	return res;
499 }
500 //-----------------------------------------------------------------------------
mgls_setsizescl(mglGraph * gr,long,mglArg * a,const char * k,const char *)501 int static mgls_setsizescl(mglGraph *gr, long , mglArg *a, const char *k, const char *)
502 {
503 	int res=0;
504 	if(!strcmp(k,"n"))	gr->SetSizeScl(a[0].v);
505 	else res = 1;
506 	return res;
507 }
508 //-----------------------------------------------------------------------------
mgls_texparse(mglGraph * gr,long,mglArg * a,const char * k,const char *)509 int static mgls_texparse(mglGraph *gr, long , mglArg *a, const char *k, const char *)
510 {
511 	int res=0;
512 	if(!strcmp(k,"n"))	gr->SetTeXparse(a[0].v);
513 	else res = 1;
514 	return res;
515 }
516 //-----------------------------------------------------------------------------
mgls_setup(mglGraph * gr,long,mglArg * a,const char * k,const char *)517 int static mgls_setup(mglGraph *gr, long , mglArg *a, const char *k, const char *)
518 {
519 	int res=0;
520 	if(!strcmp(k,"nn"))	gr->SetFlagAdv(mgl_int(a[0].v), mgl_int(a[1].v));
521 	else res = 1;
522 	return res;
523 }
524 //-----------------------------------------------------------------------------
mgls_shear(mglGraph * gr,long,mglArg * a,const char * k,const char *)525 int static mgls_shear(mglGraph *gr, long , mglArg *a, const char *k, const char *)
526 {
527 	int res=0;
528 	if(!strcmp(k,"nn"))	gr->Shear(a[0].v, a[1].v);
529 	else res = 1;
530 	return res;
531 }
532 //-----------------------------------------------------------------------------
mgls_shearplot(mglGraph * gr,long,mglArg * a,const char * k,const char *)533 int static mgls_shearplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
534 {
535 	int res=0;
536 	if(!strcmp(k,"nnnn"))	gr->ShearPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v);
537 	else if(!strcmp(k,"nnnnnn"))	gr->ShearPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v, a[4].v, a[5].v);
538 	else res = 1;
539 	return res;
540 }
541 //-----------------------------------------------------------------------------
mgls_stickplot(mglGraph * gr,long,mglArg * a,const char * k,const char *)542 int static mgls_stickplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
543 {
544 	int res=0;
545 	if(!strcmp(k,"nnnn"))	gr->StickPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v);
546 	else res = 1;
547 	return res;
548 }
549 //-----------------------------------------------------------------------------
mgls_subplot(mglGraph * gr,long,mglArg * a,const char * k,const char *)550 int static mgls_subplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
551 {
552 	int res=0;
553 	if(!strcmp(k,"nnn"))	gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v));
554 	else if(!strcmp(k,"nnns"))	gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].s.s);
555 	else if(!strcmp(k,"nnnsnn"))	gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].s.s, a[4].v,a[5].v);
556 	else res = 1;
557 	return res;
558 }
559 //-----------------------------------------------------------------------------
mgls_ternary(mglGraph * gr,long,mglArg * a,const char * k,const char *)560 int static mgls_ternary(mglGraph *gr, long , mglArg *a, const char *k, const char *)
561 {
562 	int res=0;
563 	if(!strcmp(k,"n"))	gr->Ternary(int(a[0].v));
564 	else res = 1;
565 	return res;
566 }
567 //-----------------------------------------------------------------------------
mgls_ticklen(mglGraph * gr,long,mglArg * a,const char * k,const char *)568 int static mgls_ticklen(mglGraph *gr, long , mglArg *a, const char *k, const char *)
569 {
570 	int res=0;
571 	if(!strcmp(k,"n"))	gr->SetTickLen(a[0].v);
572 	else if(!strcmp(k,"nn"))	gr->SetTickLen(a[0].v, a[1].v);
573 	else res = 1;
574 	return res;
575 }
576 //-----------------------------------------------------------------------------
mgls_tickshift(mglGraph * gr,long,mglArg * a,const char * k,const char *)577 int static mgls_tickshift(mglGraph *gr, long , mglArg *a, const char *k, const char *)
578 {
579 	int res=0;
580 	if(!strcmp(k,"n"))	gr->SetTickShift(mglPoint(a[0].v));
581 	else if(!strcmp(k,"nn"))	gr->SetTickShift(mglPoint(a[0].v, a[1].v));
582 	else if(!strcmp(k,"nnn"))	gr->SetTickShift(mglPoint(a[0].v, a[1].v, a[2].v));
583 	else if(!strcmp(k,"nnnn"))	gr->SetTickShift(mglPoint(a[0].v, a[1].v, a[2].v, a[3].v));
584 	else res = 1;
585 	return res;
586 }
587 //-----------------------------------------------------------------------------
mgls_ticktime(mglGraph * gr,long,mglArg * a,const char * k,const char *)588 int static mgls_ticktime(mglGraph *gr, long , mglArg *a, const char *k, const char *)
589 {
590 	int res=0;
591 	if(!strcmp(k,"s"))	gr->SetTicksTime(a[0].s[0]);
592 	else if(!strcmp(k,"sn"))	gr->SetTicksTime(a[0].s[0],a[1].v);
593 	else if(!strcmp(k,"sns"))	gr->SetTicksTime(a[0].s[0],a[1].v,a[2].s.s);
594 	else res = 1;
595 	return res;
596 }
597 //-----------------------------------------------------------------------------
mgls_transptype(mglGraph * gr,long,mglArg * a,const char * k,const char *)598 int static mgls_transptype(mglGraph *gr, long , mglArg *a, const char *k, const char *)
599 {
600 	int res=0;
601 	if(!strcmp(k,"n"))	gr->SetTranspType(a[0].v);
602 	else res = 1;
603 	return res;
604 }
605 //-----------------------------------------------------------------------------
mgls_tuneticks(mglGraph * gr,long,mglArg * a,const char * k,const char *)606 int static mgls_tuneticks(mglGraph *gr, long , mglArg *a, const char *k, const char *)
607 {
608 	int res=0;
609 	if(!strcmp(k,"n"))	gr->SetTuneTicks(mgl_int(a[0].v));
610 	else if(!strcmp(k,"nn"))	gr->SetTuneTicks(mgl_int(a[0].v),a[1].v);
611 	else res = 1;
612 	return res;
613 }
614 //-----------------------------------------------------------------------------
mgls_variant(mglGraph * gr,long,mglArg * a,const char * k,const char *)615 int static mgls_variant(mglGraph *gr, long , mglArg *a, const char *k, const char *)
616 {
617 	int res=0;
618 	if(!strcmp(k,"n") && gr->pr)	mgl_parser_variant(gr->pr, a[0].v);
619 	else res = 1;
620 	return res;
621 }
622 //-----------------------------------------------------------------------------
mgls_version(mglGraph * gr,long,mglArg * a,const char * k,const char *)623 int static mgls_version(mglGraph *gr, long , mglArg *a, const char *k, const char *)
624 {
625 	int res=0;
626 	char buf[32];	sprintf(buf,"MathGL version is 2.%g",MGL_VER2);
627 	if(k[0]==0)	gr->SetWarn(-1,buf);
628 	else if(!strcmp(k,"s"))	res = mgl_check_version(a[0].s.s)?1:0;
629 	else res = 1;
630 	return res;
631 }
632 //-----------------------------------------------------------------------------
mgls_view(mglGraph * gr,long,mglArg * a,const char * k,const char *)633 int static mgls_view(mglGraph *gr, long , mglArg *a, const char *k, const char *)
634 {
635 	int res=0;
636 	if(!strcmp(k,"nn"))		gr->View(a[0].v, a[1].v);
637 	else if(!strcmp(k,"nnn"))	gr->View(a[0].v, a[1].v, a[2].v);
638 	else res = 1;
639 	return res;
640 }
641 //-----------------------------------------------------------------------------
mgls_write(mglGraph * gr,long,mglArg * a,const char * k,const char *)642 int static mgls_write(mglGraph *gr, long , mglArg *a, const char *k, const char *)
643 {
644 	int res=0;
645 	if(k[0]==0)	gr->WriteFrame("", "MathGL");
646 	else if(!strcmp(k,"s"))	gr->WriteFrame(a[0].s.s, "MathGL");
647 	else res = 1;
648 	return res;
649 }
650 //-----------------------------------------------------------------------------
mgls_xrange(mglGraph * gr,long,mglArg * a,const char * k,const char *)651 int static mgls_xrange(mglGraph *gr, long , mglArg *a, const char *k, const char *)
652 {
653 	int res=0;
654 	if(!strcmp(k,"d"))	gr->SetRange('x',*(a[0].d));
655 	else if(!strcmp(k,"dn"))	gr->SetRange('x',*(a[0].d),a[1].v);
656 	else if(!strcmp(k,"nn"))	gr->SetRange('x', a[0].v, a[1].v);
657 	else if(!strcmp(k,"nnn"))
658 	{
659 		if(a[2].v)	gr->AddRange('x', a[0].v, a[1].v);
660 		else	gr->SetRange('x', a[0].v, a[1].v);
661 	}
662 	else res = 1;
663 	return res;
664 }
665 //-----------------------------------------------------------------------------
mgls_xtick(mglGraph * gr,long n,mglArg * a,const char * k,const char *)666 int static mgls_xtick(mglGraph *gr, long n, mglArg *a, const char *k, const char *)
667 {
668 	int res=0;
669 	if(!strcmp(k,"n"))	gr->SetTicks('x', a[0].v);
670 //	else if(!strcmp(k,"ns"))	gr->SetTicks('x', a[0].v, 0, NAN, a[1].s.w);
671 	else if(!strcmp(k,"nn"))	gr->SetTicks('x', a[0].v, mgl_int(a[1].v));
672 	else if(!strcmp(k,"nns"))	gr->SetTicks('x', a[0].v, mgl_int(a[1].v), NAN, a[2].s.w);
673 	else if(!strcmp(k,"nnn"))	gr->SetTicks('x', a[0].v, mgl_int(a[1].v), a[2].v);
674 	else if(!strcmp(k,"nnns"))	gr->SetTicks('x', a[0].v, mgl_int(a[1].v), a[2].v, a[3].s.w);
675 	else if(!strcmp(k,"s"))		gr->SetTickTempl('x',a[0].s.w);
676 	else if(!strcmp(k,"ds"))	gr->SetTicksVal('x', *(a[0].d), a[1].s.w);
677 	else if(!strcmp(k,"dsn"))	gr->SetTicksVal('x', *(a[0].d), a[1].s.w, a[2].v);
678 	else if(!strncmp(k,"ns",2))
679 	{
680 		std::wstring s;
681 		std::vector<mreal> v;
682 		for(long i=0;i<n/2;i++)
683 		{
684 			if(a[2*i].type==2 && a[2*i+1].type==1)
685 			{	v.push_back(a[2*i].v);	s += std::wstring(a[2*i+1].s.w)+L"\n";	}
686 			else	break;
687 		}
688 		gr->SetTicksVal('x',mglDataS(v),s.c_str(),v.size()==1?true:false);
689 	}
690 	else res = 1;
691 	return res;
692 }
693 //-----------------------------------------------------------------------------
mgls_yrange(mglGraph * gr,long,mglArg * a,const char * k,const char *)694 int static mgls_yrange(mglGraph *gr, long , mglArg *a, const char *k, const char *)
695 {
696 	int res=0;
697 	if(!strcmp(k,"d"))	gr->SetRange('y',*(a[0].d));
698 	else if(!strcmp(k,"dn"))	gr->SetRange('y',*(a[0].d),a[1].v);
699 	else if(!strcmp(k,"nn"))	gr->SetRange('y', a[0].v, a[1].v);
700 	else if(!strcmp(k,"nnn"))
701 	{
702 		if(a[2].v)	gr->AddRange('y', a[0].v, a[1].v);
703 		else	gr->SetRange('y', a[0].v, a[1].v);
704 	}
705 	else res = 1;
706 	return res;
707 }
708 //-----------------------------------------------------------------------------
mgls_ytick(mglGraph * gr,long n,mglArg * a,const char * k,const char *)709 int static mgls_ytick(mglGraph *gr, long n, mglArg *a, const char *k, const char *)
710 {
711 	int res=0;
712 	if(!strcmp(k,"n"))	gr->SetTicks('y', a[0].v);
713 //	else if(!strcmp(k,"ns"))	gr->SetTicks('y', a[0].v, 0, NAN, a[1].s.w);
714 	else if(!strcmp(k,"nn"))	gr->SetTicks('y', a[0].v, mgl_int(a[1].v));
715 	else if(!strcmp(k,"nns"))	gr->SetTicks('y', a[0].v, mgl_int(a[1].v), NAN, a[2].s.w);
716 	else if(!strcmp(k,"nnn"))	gr->SetTicks('y', a[0].v, mgl_int(a[1].v), a[2].v);
717 	else if(!strcmp(k,"nnns"))	gr->SetTicks('y', a[0].v, mgl_int(a[1].v), a[2].v, a[3].s.w);
718 	else if(!strcmp(k,"s"))		gr->SetTickTempl('y',a[0].s.w);
719 	else if(!strcmp(k,"ds"))	gr->SetTicksVal('y', *(a[0].d), a[1].s.w);
720 	else if(!strcmp(k,"dsn"))	gr->SetTicksVal('y', *(a[0].d), a[1].s.w, a[2].v);
721 	else if(!strncmp(k,"ns",2))
722 	{
723 		std::wstring s;
724 		std::vector<mreal> v;
725 		for(long i=0;i<n/2;i++)
726 		{
727 			if(a[2*i].type==2 && a[2*i+1].type==1)
728 			{	v.push_back(a[2*i].v);	s += std::wstring(a[2*i+1].s.w)+L"\n";	}
729 			else	break;
730 		}
731 		gr->SetTicksVal('y',mglDataS(v),s.c_str(),v.size()==1?true:false);
732 	}
733 	else res = 1;
734 	return res;
735 }
736 //-----------------------------------------------------------------------------
mgls_zoom(mglGraph * gr,long,mglArg * a,const char * k,const char *)737 int static mgls_zoom(mglGraph *gr, long , mglArg *a, const char *k, const char *)
738 {
739 	int res=0;
740 	if(!strcmp(k,"nnnn"))	gr->Zoom(a[0].v, a[1].v, a[2].v, a[3].v);
741 	else res = 1;
742 	return res;
743 }
744 //-----------------------------------------------------------------------------
mgls_zoomaxis(mglGraph * gr,long,mglArg * a,const char * k,const char *)745 int static mgls_zoomaxis(mglGraph *gr, long , mglArg *a, const char *k, const char *)
746 {
747 	int res=0;
748 	if(!strcmp(k,"nn"))	gr->ZoomAxis(mglPoint(a[0].v), mglPoint(a[1].v));
749 	else if(!strcmp(k,"nnnn"))	gr->ZoomAxis(mglPoint(a[0].v, a[1].v), mglPoint(a[2].v, a[3].v));
750 	else if(!strcmp(k,"nnnnnn"))	gr->ZoomAxis(mglPoint(a[0].v, a[1].v, a[2].v), mglPoint(a[3].v, a[4].v, a[5].v));
751 	else if(!strcmp(k,"nnnnnnnn"))	gr->ZoomAxis(mglPoint(a[0].v, a[1].v, a[2].v, a[3].v), mglPoint(a[4].v, a[5].v, a[6].v, a[7].v));
752 	else res = 1;
753 	return res;
754 }
755 //-----------------------------------------------------------------------------
mgls_zrange(mglGraph * gr,long,mglArg * a,const char * k,const char *)756 int static mgls_zrange(mglGraph *gr, long , mglArg *a, const char *k, const char *)
757 {
758 	int res=0;
759 	if(!strcmp(k,"d"))	gr->SetRange('z',*(a[0].d));
760 	else if(!strcmp(k,"dn"))	gr->SetRange('z',*(a[0].d),a[1].v);
761 	else if(!strcmp(k,"nn"))	gr->SetRange('z', a[0].v, a[1].v);
762 	else if(!strcmp(k,"nnn"))
763 	{
764 		if(a[2].v)	gr->AddRange('z', a[0].v, a[1].v);
765 		else	gr->SetRange('z', a[0].v, a[1].v);
766 	}
767 	else res = 1;
768 	return res;
769 }
770 //-----------------------------------------------------------------------------
mgls_ztick(mglGraph * gr,long n,mglArg * a,const char * k,const char *)771 int static mgls_ztick(mglGraph *gr, long n, mglArg *a, const char *k, const char *)
772 {
773 	int res=0;
774 	if(!strcmp(k,"n"))	gr->SetTicks('z', a[0].v);
775 //	else if(!strcmp(k,"ns"))	gr->SetTicks('z', a[0].v, 0, NAN, a[1].s.w);
776 	else if(!strcmp(k,"nn"))	gr->SetTicks('z', a[0].v, mgl_int(a[1].v));
777 	else if(!strcmp(k,"nns"))	gr->SetTicks('z', a[0].v, mgl_int(a[1].v), NAN, a[2].s.w);
778 	else if(!strcmp(k,"nnn"))	gr->SetTicks('z', a[0].v, mgl_int(a[1].v), a[2].v);
779 	else if(!strcmp(k,"nnns"))	gr->SetTicks('z', a[0].v, mgl_int(a[1].v), a[2].v, a[3].s.w);
780 	else if(!strcmp(k,"s"))		gr->SetTickTempl('z',a[0].s.w);
781 	else if(!strcmp(k,"ds"))	gr->SetTicksVal('z', *(a[0].d), a[1].s.w);
782 	else if(!strcmp(k,"dsn"))	gr->SetTicksVal('z', *(a[0].d), a[1].s.w, a[2].v);
783 	else if(!strncmp(k,"ns",2))
784 	{
785 		std::wstring s;
786 		std::vector<mreal> v;
787 		for(long i=0;i<n/2;i++)
788 		{
789 			if(a[2*i].type==2 && a[2*i+1].type==1)
790 			{	v.push_back(a[2*i].v);	s += std::wstring(a[2*i+1].s.w)+L"\n";	}
791 			else	break;
792 		}
793 		gr->SetTicksVal('z',mglDataS(v),s.c_str(),v.size()==1?true:false);
794 	}
795 	else res = 1;
796 	return res;
797 }
798 //-----------------------------------------------------------------------------
799 mglCommand mgls_set_cmd[] = {
800 	{"addlegend",_("Add legend entry"),"addlegend 'txt' 'fmt'", mgls_addlegend,15},
801 	{"addsymbol",_("Add user-defined symbol"),"addsymbol 'id' Xdat Ydat", mgls_addsymbol,15},
802 	{"adjust",_("Adjust ticks for best view"),"adjust ['dir']", mgls_adjust ,14},
803 	{"alpha",_("Switch on/off transparency"),"alpha [val]", mgls_alpha ,2},
804 	{"alphadef",_("Set default transparency"),"alphadef val", mgls_alphadef ,2},
805 	{"ambient",_("Set ambient light brightness"),"ambient val", mgls_ambient ,2},
806 	{"arrowsize",_("Set size of arrows"),"arrowsize val", mgls_arrowsize ,2},
807 	{"aspect",_("Set aspect ration"),"aspect valx valy [valz]", mgls_aspect ,5},
808 	{"attachlight",_("Attach light settings to inplot"),"attachlight val", mgls_attachlight ,2},
809 	{"axisstl",_("Set axis and tick style"),"axisstl 'stl' ['tick' 'sub']", mgls_axisstl ,14},
810 	{"barwidth",_("Set default bars width"),"barwidth val", mgls_barwidth ,2},
811 	{"bbox",_("Set bounding box for 2d export"),"bbox x1 y1 [x2 y2]", mgls_bbox ,2},
812 	{"chdir",_("Change current directory"),"chdir 'path'", mgls_chdir ,2},
813 	{"clearlegend",_("Clear legend entries"),"clearlegend", mgls_clearlegend ,15},
814 	{"clf",_("Clear picture"),"clf|'col'|r g b", mgls_clf ,12},
815 	{"columnplot",_("Set position of plot inside cell of column"), "columnplot num ind [d]", mgls_columnplot ,5},
816 	{"crange",_("Set color range"),"crange Dat [add]|c1 c2 [add]", mgls_crange ,14},
817 	{"ctick",_("Set ticks for colorbar"),"ctick 'tmpl'|dc ['factor']", mgls_ctick ,14},
818 	{"cut",_("Setup plot points cutting"),"cut val|x1 y1 z1 x2 y2 z2|'cond'", mgls_cut ,2},
819 	{"diffuse",_("Set diffusive light brightness"),"diffuse val", mgls_diffuse ,2},
820 	{"drawreg",_("Set draw region for quality&4"),"drawreg|nx ny m", mgls_drawreg ,2},
821 	{"facenum",_("Set number of visible faces"),"facenum val", mgls_facenum ,2},
822 	{"fog",_("Switch on/off fog"),"fog val [dz]", mgls_fog ,2},
823 	{"font",_("Setup font"),"font 'fmt' [size]", mgls_font ,15},
824 	{"gray",_("Switch on/off gray-scale mode"),"gray [val]", mgls_gray ,2},
825 	{"gridplot",_("Set position of plot inside cell of matrix"), "gridplot nx ny ind [d]", mgls_gridplot ,5},
826 	{"inplot",_("Set arbitrary position of plot in picture"),"x1 x2 y1 y2 [rel]", mgls_inplot ,5},
827 	{"legendmarks",_("Set number of marks in the legend"),"legendmarks val", mgls_legendmarks ,15},
828 	{"light",_("Setup light"),"light [val]|num val|num xpos ypos zpos ['fmt' br ap]|num xpos ypos zpos px py pz ['fmt' br ap]", mgls_light ,2},
829 	{"load",_("Load commands from external DLL"),"load 'fname'", mgls_load, 6},
830 	{"loadfont",_("Load fontfaces"),"loadfont ['face']", mgls_loadfont ,15},
831 	{"marksize",_("Set size of markers"),"marksize val", mgls_marksize ,2},
832 	{"mask",_("Set brush for given mask id"),"mask 'id' 'val'|'id' val|angle", mgls_mask ,2},
833 	{"meshnum",_("Set number of lines in mesh/fall/vect and so on"),"meshnum val", mgls_meshnum ,2},
834 	{"multiplot",_("Set position of plot block in matrix"),"multiplot m n pos dx dy 'style' [sx sy]", mgls_multiplot ,5},
835 	{"origin",_("Set axis origin"),"origin x0 y0 [z0]", mgls_origin ,14},
836 	{"origintick",_("Set tick labels drawing at origin"),"origintick val", mgls_origintick ,14},
837 	{"palette",_("Set palette for 1D plots"),"palette 'colors'", mgls_palette ,2},
838 	{"pendelta",_("Set size of semi-transparent area around line"),"pendelta val", mgls_pendelta ,2},
839 	{"perspective",_("Set perspective"),"perspective val", mgls_perspective ,2},
840 	{"plotid",_("Set default filename"),"plotid 'name'", mgls_plotid ,2},
841 	{"quality",_("Set plot quality"),"quality [val]", mgls_quality ,2},
842 	{"ranges",_("Set axis ranges"),"ranges x1 x2 y1 y2 [z1 z2]|Xdat Ydat [Zdat Cdat]", mgls_ranges ,14},
843 	{"rasterize",_("Rasterize plot and save to background"),"rasterize", mgls_rasterize ,12},
844 	{"reset",_("Reset settings and clear picture"),"reset", mgls_reset ,12},
845 	{"rotate",_("Rotate plot"),"rotate tetz tetx [tety]|tet x y z", mgls_rotate ,5},
846 	{"rotatetext",_("Set to auto rotate text or not"),"rotatetext val", mgls_rotatetext ,15},
847 	{"scaletext",_("Set scale text in relative subplots too"),"scaletext val", mgls_scaletext ,15},
848 	{"setsize",_("Set picture size"),"setsize width height", mgls_setsize ,2},
849 	{"setsizescl",_("Set scaling factor for further setsize"),"setsizescl val", mgls_setsizescl ,2},
850 	{"setup",_("Set bit-flags (for advanced users only)"),"setup val flag", mgls_setup ,2},
851 	{"shear",_("Shear plot"),"shear valx valy", mgls_shear ,5},
852 	{"shearplot",_("Set position of plot inside cell of sheared stick"), "shearplot num ind sx sy [xd yd]", mgls_shearplot ,5},
853 	{"stickplot",_("Set position of plot inside cell of rotated stick"), "stickplot num ind tet phi", mgls_stickplot ,5},
854 	{"subplot",_("Set position of plot as cell of matrix"),"subplot m n pos ['style' dx dy]", mgls_subplot ,5},
855 	{"ternary",_("Switch on/off to use ternary axis"),"ternary val", mgls_ternary ,14},
856 	{"texparse",_("Switch on/off TeX parsing at text output"), "texparse val", mgls_texparse, 2},
857 	{"ticklen",_("Set tick length"),"ticklen val [stt]", mgls_ticklen ,14},
858 	{"tickshift",_("Set additional tick and axis labels shift"),"tickshift dx [dy dz dc]", mgls_tickshift ,14},
859 	{"ticktime",_("Set ticks in time format"),"ticktime 'dir' [dv 'tmpl']", mgls_ticktime ,14},
860 	{"transptype",_("Set type transparency"),"transptype val", mgls_transptype ,2},
861 	{"tuneticks",_("Set ticks tuning"),"tuneticks val [pos]", mgls_tuneticks ,14},
862 	{"variant",_("Select variant of plot style(s)"),"variant var", mgls_variant, 6},
863 	{"version",_("Print MathGL version or check if it is valid"),"version ['ver']", mgls_version, 2},
864 	{"view",_("Change view angles - use 'rotate' for plot rotation"),"view tetz tetx [tety]", mgls_view ,5},
865 	{"write",_("Write current image to graphical file"),"write ['fname']", mgls_write ,2},
866 	{"xrange",_("Set range for x-axis"),"xrange Dat [add]|x1 x2 [add]", mgls_xrange ,14},
867 	{"xtick",_("Set ticks for x-axis"),"xtick dx sx ['factor']|dx sx tx ['factor']|'tmpl'|Xdat 'lbl' [add]|v1 'lbl1' ...", mgls_xtick,14},
868 	{"yrange",_("Set range for y-axis"),"yrange Dat [add]|y1 y2 [add]", mgls_yrange,14},
869 	{"ytick",_("Set ticks for y-axis"),"ytick dy sy ['factor']|dy sy ty ['factor']|'tmpl'|Ydat 'lbl' [add]|v1 'lbl1' ...", mgls_ytick,14},
870 	{"zoom",_("Zoom plot region"),"zoom x1 x2 y1 y2", mgls_zoom,5},
871 	{"zoomaxis",_("Zoom axis range"),"zoomaxis x1 x2|x1 y1 x2 y2|x1 y1 z1 x2 y2 z2|x1 y1 z1 c1 x2 y2 z2 c2", mgls_zoomaxis,14},
872 	{"zrange",_("Set range for z-axis"),"yrange Dat [add]|z1 z2 [add]", mgls_zrange ,14},
873 	{"ztick",_("Set ticks for z-axis"),"ztick dz sz ['factor']|dz sz tz ['factor']|'tmpl'|Zdat 'lbl' [add]|v1 'lbl1' ...", mgls_ztick,14},
874 {"","","",NULL,0}};
875 //-----------------------------------------------------------------------------
876