4e8047ddab117f133e8c5b8ef28eb5db0d4eaf06
[scilab.git] / scilab / modules / graphics / sci_gateway / cpp / sci_xset.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2006 - INRIA - Fabrice Leray
4 * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
5 * Copyright (C) 2012 - Scilab Enterprises - Bruno JOFRET
6 * Copyright (C) 2013 - Scilab Enterprises - Cedric Delamarre
7 *
8 * This file must be used under the terms of the CeCILL.
9 * This source file is licensed as described in the file COPYING, which
10 * you should have received as part of this distribution.  The terms
11 * are also available at
12 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
13 *
14 */
15
16 /*------------------------------------------------------------------------*/
17 /* file: sci_xset.cpp                                                      */
18 /* desc : interface for xset routine                                      */
19 /*------------------------------------------------------------------------*/
20 #include "graphics_gw.hxx"
21 #include "function.hxx"
22 #include "double.hxx"
23 #include "configvariable.hxx"
24 #include "configgraphicvariable.hxx"
25 #include "overload.hxx"
26 #include "execvisitor.hxx"
27 #include "internal.hxx"
28
29 extern "C"
30 {
31 #include "GetProperty.h"
32 #include "SetProperty.h"
33 #include "DrawObjects.h"
34 #include "localization.h"
35 #include "Scierror.h"
36 #include "HandleManagement.h"
37
38 #include "createGraphicObject.h"
39 #include "BuildObjects.h"
40 #include "graphicObjectProperties.h"
41 #include "setGraphicObjectProperty.h"
42 #include "FigureList.h"
43 #include "CurrentFigure.h"
44 #include "CurrentSubwin.h"
45 #include "AxesModel.h"
46 #include "getGraphicObjectProperty.h"
47 #include "deleteGraphicObject.h"
48 #include "warningmode.h"
49 #include "sciprint.h"
50 }
51 /*--------------------------------------------------------------------------*/
52 types::Function::ReturnValue sci_xset(types::typed_list &in, int _iRetCount, types::typed_list &out)
53 {
54     wchar_t* pwcsWhat = NULL;
55     std::list<types::Double*> lpDblInputs;
56     int iSubwinUID = 0;
57
58     if (in.size() == 0)
59     {
60         return Overload::call(L"%_xset", in, _iRetCount, out, new ast::ExecVisitor());
61     }
62
63     if (in.size() > 6)
64     {
65         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), "xset", 1, 6);
66         return types::Function::Error;
67     }
68
69     if (_iRetCount > 1)
70     {
71         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "xset", 1);
72         return types::Function::Error;
73     }
74
75     if (in[0]->isString() == false)
76     {
77         Scierror(999, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "xset", 1);
78         return types::Function::Error;
79     }
80
81     types::String* pStr = in[0]->getAs<types::String>();
82
83     if (pStr->isScalar() == false)
84     {
85         Scierror(999, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "xset", 1);
86         return types::Function::Error;
87     }
88
89     pwcsWhat = pStr->get(0);
90
91     if (ConfigGraphicVariable::bPropertyFound(pwcsWhat) == false)
92     {
93         char* pstWhat = wide_string_to_UTF8(pwcsWhat);
94         Scierror(999, _("%s: Unrecognized input argument: '%s'.\n"), "xset", pstWhat);
95         FREE(pstWhat);
96         return types::Function::Error;
97     }
98
99     // Only in case of "fpf" and "auto clear", the second argument is a string
100     // Only "default" case have one input argument
101     if (ConfigGraphicVariable::getPropertyValue(pwcsWhat) != 15 && // fpf
102             ConfigGraphicVariable::getPropertyValue(pwcsWhat) != 2  && // auto clear
103             ConfigGraphicVariable::getPropertyValue(pwcsWhat) != 10)   // default
104     {
105         for (unsigned int i = 1 ; i < in.size() ; i++)
106         {
107             if (in[i]->isDouble() == false)
108             {
109                 Scierror(202, _("%s: Wrong type for argument #%d: A real expected.\n"), "xset", i + 1);
110             }
111         }
112     }
113
114     switch (ConfigGraphicVariable::getPropertyValue(pwcsWhat))
115     {
116         case 15 : // fpf
117         {
118             if (in.size() != 2)
119             {
120                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
121                 return types::Function::Error;
122             }
123
124             if (in[1]->isString() == false)
125             {
126                 Scierror(999, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "xset", 2);
127                 return types::Function::Error;
128             }
129
130             types::String* pStrValue = in[1]->getAs<types::String>();
131             if (pStrValue->isScalar() == false)
132             {
133                 Scierror(999, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "xset", 2);
134                 return types::Function::Error;
135             }
136
137             ConfigGraphicVariable::setFPF(pStrValue->get(0));
138         }
139         break;
140         case 2 : // auto clear
141         {
142             if (in.size() != 2)
143             {
144                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
145                 return types::Function::Error;
146             }
147
148             if (in[1]->isString() == false)
149             {
150                 Scierror(999, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "xset", 2);
151                 return types::Function::Error;
152             }
153
154             types::String* pStrValue = in[1]->getAs<types::String>();
155             if (pStrValue->isScalar() == false)
156             {
157                 Scierror(999, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "xset", 2);
158                 return types::Function::Error;
159             }
160
161             int bAutoClear = 0;
162             if (wcscmp(pStrValue->get(0), L"on") == 0)
163             {
164                 bAutoClear = 1;
165             }
166
167             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_AUTO_CLEAR__, &bAutoClear, jni_bool, 1);
168         }
169         break;
170         case 5 : // clipping
171         {
172             int clipState = 2;
173             double dvalues[4];
174             if (in.size() == 2)
175             {
176                 types::Double* pDblArg = in[1]->getAs<types::Double>();
177                 if (pDblArg->getSize() != 4)
178                 {
179                     Scierror(999, _("%s: Wrong size for input argument #%d: A %d-element vector expected.\n"), "xset", 2, 4);
180                     return types::Function::Error;
181                 }
182
183                 memcpy(dvalues, pDblArg->get(), 4 * sizeof(double));
184             }
185             else if (in.size() != 5)
186             {
187                 Scierror(77, _("%s: Wrong number of input arguments: %d or %d expected.\n"), "xset", 2, 5);
188                 return types::Function::Error;
189             }
190             else
191             {
192                 for (int i = 0; i < 4 ; i++)
193                 {
194                     dvalues[i] = in[i + 1]->getAs<types::Double>()->get(0);
195                 }
196             }
197
198             iSubwinUID = getOrCreateDefaultSubwin();
199             setGraphicObjectProperty(iSubwinUID, __GO_CLIP_BOX__, dvalues, jni_double_vector, 4);
200             setGraphicObjectProperty(iSubwinUID, __GO_CLIP_STATE__, &clipState, jni_int, 1);
201         }
202         break;
203         case 8 : // colormap
204         {
205             if (in.size() != 2)
206             {
207                 Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "xset", 2);
208                 return types::Function::Error;
209             }
210
211             types::Double* pDblArg = in[1]->getAs<types::Double>();
212             getOrCreateDefaultSubwin();
213             setGraphicObjectProperty(getCurrentFigure(), __GO_COLORMAP__, pDblArg->get(), jni_double_vector, pDblArg->getSize());
214         }
215         break;
216         case 21 : // mark size
217         {
218             if (in.size() != 2)
219             {
220                 Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "xset", 2);
221                 return types::Function::Error;
222             }
223
224             int markSize = (int)in[1]->getAs<types::Double>()->get(0);
225             int markSizeUnit = 1; /* force switch to tabulated mode : old syntax / 0 : point, 1 : tabulated */
226
227             iSubwinUID = getOrCreateDefaultSubwin();
228             setGraphicObjectProperty(iSubwinUID, __GO_MARK_SIZE_UNIT__, &markSizeUnit, jni_int, 1);
229             setGraphicObjectProperty(iSubwinUID, __GO_MARK_SIZE__, &markSize, jni_int, 1);
230         }
231         break;
232         case 20 : // mark
233         {
234             if (in.size() != 3)
235             {
236                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 3);
237                 return types::Function::Error;
238             }
239
240             int markStyle = (int) in[1]->getAs<types::Double>()->get(0);
241             int markSize = (int) in[2]->getAs<types::Double>()->get(0);
242             int markSizeUnit = 1; /* force switch to tabulated mode : old syntax / 0 : point, 1 : tabulated */
243             int markMode = 1;
244
245             iSubwinUID = getOrCreateDefaultSubwin();
246             setGraphicObjectProperty(iSubwinUID, __GO_MARK_MODE__, &markMode, jni_bool, 1);
247             setGraphicObjectProperty(iSubwinUID, __GO_MARK_SIZE_UNIT__, &markSizeUnit, jni_int, 1); /* force switch to tabulated mode : old syntax */
248             setGraphicObjectProperty(iSubwinUID, __GO_MARK_STYLE__, &markStyle, jni_int, 1);
249             setGraphicObjectProperty(iSubwinUID, __GO_MARK_SIZE__, &markSize, jni_int, 1);
250         }
251         break;
252         case 13 : // font size
253         {
254             if (in.size() != 2)
255             {
256                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
257                 return types::Function::Error;
258             }
259             double fontSize = in[1]->getAs<types::Double>()->get(0);
260             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_FONT_SIZE__, &fontSize, jni_double, 1);
261         }
262         break;
263         case 10 : // default
264         {
265             if (in.size() != 1)
266             {
267                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 1);
268                 return types::Function::Error;
269             }
270
271             unsigned short* defcolors = ConfigGraphicVariable::getDefaultColormap();
272
273             int piFigurePosition[2] = {200, 200};
274             int piFigureSize[2]     = {500, 500};
275             int piAxesSize[2]       = {498, 366};
276             int piViewPort[2]       = {0, 0};
277             int piEmptyMatrix[4]    = {1, 0, 0, 0};
278
279             // init variables
280             int iZero   = 0;
281             BOOL bTrue  = TRUE;
282             BOOL bFalse = FALSE;
283             int m       = NUMCOLORS_SCI;
284             int i       = 0;
285             int iCopy   = 3;
286             int defaultBackground = -2;
287
288             // reset format
289             ConfigGraphicVariable::setFPF(L"");
290
291             double* pdblColorMap = (double*)malloc(m * 3 * sizeof(double));
292             if (pdblColorMap == NULL)
293             {
294                 Scierror(999, _("%s: No more memory.\n"), "xset");
295                 return types::Function::Error;
296             }
297
298             // Create figure if it not exist.
299             int iFigureUID = getCurrentFigure();
300             if (iFigureUID == 0)
301             {
302                 iFigureUID = createNewFigureWithAxes();
303                 setCurrentFigure(iFigureUID);
304                 return types::Function::OK;
305             }
306
307             // Create new axes and set it in current figure
308             int iSubWinUID = getCurrentSubWin();
309             if (iSubWinUID != 0)
310             {
311                 int iChildrenCount  = 0;
312                 int* childrencount  = &iChildrenCount;
313                 int* childrenUID    = 0;
314                 int iHidden         = 0;
315                 int *piHidden       = &iHidden;
316
317                 getGraphicObjectProperty(iFigureUID, __GO_CHILDREN_COUNT__, jni_int, (void **)&childrencount);
318                 getGraphicObjectProperty(iFigureUID, __GO_CHILDREN__, jni_string_vector, (void **)&childrenUID);
319
320                 for (i = 0; i < childrencount[0]; ++i)
321                 {
322                     getGraphicObjectProperty(childrenUID[i], __GO_HIDDEN__, jni_bool, (void **)&piHidden);
323                     if (iHidden == 0)
324                     {
325                         deleteGraphicObject(childrenUID[i]);
326                     }
327                 }
328             }
329
330             cloneAxesModel(iFigureUID);
331
332             // Set default figure properties
333             setGraphicObjectProperty(iFigureUID, __GO_POSITION__, piFigurePosition, jni_int_vector, 2);
334             setGraphicObjectProperty(iFigureUID, __GO_SIZE__, piFigureSize, jni_int_vector, 2);
335             setGraphicObjectProperty(iFigureUID, __GO_AXES_SIZE__, piAxesSize, jni_int_vector, 2);
336             setGraphicObjectProperty(iFigureUID, __GO_AUTORESIZE__, &bTrue, jni_bool, 1);
337             setGraphicObjectProperty(iFigureUID, __GO_VIEWPORT__, piViewPort, jni_int_vector, 2);
338             setGraphicObjectProperty(iFigureUID, __GO_NAME__, _("Figure n°%d"), jni_string, 1);
339             setGraphicObjectProperty(iFigureUID, __GO_INFO_MESSAGE__, "", jni_string, 1);
340             setGraphicObjectProperty(iFigureUID, __GO_PIXEL_DRAWING_MODE__, &iCopy, jni_int, 1);
341             setGraphicObjectProperty(iFigureUID, __GO_ANTIALIASING__, &iZero, jni_int, 1);
342             setGraphicObjectProperty(iFigureUID, __GO_IMMEDIATE_DRAWING__, &bTrue, jni_bool, 1);
343             setGraphicObjectProperty(iFigureUID, __GO_BACKGROUND__, &defaultBackground, jni_int, 1);
344             setGraphicObjectProperty(iFigureUID, __GO_VISIBLE__, &bTrue, jni_bool, 1);
345             setGraphicObjectProperty(iFigureUID, __GO_ROTATION_TYPE__, &iZero, jni_int, 1);
346             setGraphicObjectProperty(iFigureUID, __GO_EVENTHANDLER__, "", jni_string, 1);
347             setGraphicObjectProperty(iFigureUID, __GO_EVENTHANDLER_ENABLE__, &bFalse, jni_bool, 1);
348             setGraphicObjectProperty(iFigureUID, __GO_USER_DATA__, piEmptyMatrix, jni_int_vector, 4);
349             setGraphicObjectProperty(iFigureUID, __GO_RESIZEFCN__, "", jni_string, 1);
350             setGraphicObjectProperty(iFigureUID, __GO_TAG__, "", jni_string, 1);
351
352             for (i = 0; i < m; i++)
353             {
354                 pdblColorMap[i]         = (double)(defcolors[3 * i] / 255.0);
355                 pdblColorMap[i + m]     = (double)(defcolors[3 * i + 1] / 255.0);
356                 pdblColorMap[i + 2 * m] = (double)(defcolors[3 * i + 2] / 255.0);
357             }
358
359             setGraphicObjectProperty(iFigureUID, __GO_COLORMAP__, pdblColorMap, jni_double_vector, 3 * m);
360             setGraphicObjectProperty(iFigureUID, __GO_PARENT__, "", jni_string, 1);
361         }
362         break;
363         case 6 : // clipgrf
364         {
365             int clipState = 1;
366             /* special treatement for xset("cligrf") */
367             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_CLIP_STATE__, &clipState, jni_int, 1);
368         }
369         break;
370         case 4 : // clipoff
371         {
372             int clipState = 0;
373             /* special treatement for xset("clipoff") */
374             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_CLIP_STATE__, &clipState, jni_int, 1);
375         }
376         break;
377         case 16 : // hidden3d
378         {
379             if (in.size() != 2)
380             {
381                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
382                 return types::Function::Error;
383             }
384
385             int hiddenColor = (int) in[1]->getAs<types::Double>()->get(0);
386             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_HIDDEN_COLOR__, &hiddenColor, jni_int, 1);
387         }
388         break;
389         case 12 : // font
390         {
391             if (in.size() != 3)
392             {
393                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 3);
394                 return types::Function::Error;
395             }
396
397             int fontStyle = (int) in[1]->getAs<types::Double>()->get(0);
398             double fontSize = in[2]->getAs<types::Double>()->get(0);
399
400             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_FONT_SIZE__, &fontSize, jni_double, 1);
401             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_FONT_STYLE__, &fontStyle, jni_int, 1);
402         }
403         break;
404         case 11 : // window
405         case 30 : // figure
406         {
407             if (in.size() != 2)
408             {
409                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
410                 return types::Function::Error;
411             }
412
413             // Find if window already exists, if not create a new one
414             int iID = (int)in[1]->getAs<types::Double>()->get(0);
415             int iFigureUID = getFigureFromIndex(iID);
416             int iAxesUID = 0;
417
418             if (iFigureUID == 0)
419             {
420                 iFigureUID = createNewFigureWithAxes();
421                 setGraphicObjectProperty(iFigureUID, __GO_ID__, &iID, jni_int, 1);
422             }
423
424             setCurrentFigure(iFigureUID);
425             getGraphicObjectProperty(iFigureUID, __GO_SELECTED_CHILD__, jni_string,  (void**)&iAxesUID);
426             setCurrentSubWin(iAxesUID);
427         }
428         break;
429         case 14 : // foreground
430         case 7 : // color
431         case 23 : // pattern
432         {
433             if (in.size() != 2)
434             {
435                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
436                 return types::Function::Error;
437             }
438
439             int iColor = (int) in[1]->getAs<types::Double>()->get(0);
440             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_LINE_COLOR__, &iColor, jni_int, 1);
441         }
442         break;
443         case 3 : // background
444         {
445             if (in.size() != 2)
446             {
447                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
448                 return types::Function::Error;
449             }
450
451             int iColor = (int) in[1]->getAs<types::Double>()->get(0);
452             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_BACKGROUND__, &iColor, jni_int, 1);
453         }
454         break;
455         case 25 : // thickness
456         {
457             if (in.size() != 2)
458             {
459                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
460                 return types::Function::Error;
461             }
462
463             sciSetLineWidth(getOrCreateDefaultSubwin(), (int)in[1]->getAs<types::Double>()->get(0));
464         }
465         break;
466         case 19 : // line style
467         {
468             if (in.size() != 2)
469             {
470                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
471                 return types::Function::Error;
472             }
473
474             int lineStyle = (int) in[1]->getAs<types::Double>()->get(0);
475             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_LINE_STYLE__, &lineStyle, jni_int, 1);
476         }
477         break;
478         case 9 : // dashes
479         {
480             if (in.size() != 2)
481             {
482                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
483                 return types::Function::Error;
484             }
485
486             int lineStyle = (int) in[1]->getAs<types::Double>()->get(0);
487             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_LINE_STYLE__, &lineStyle, jni_int, 1);
488         }
489         break;
490         case 33 : // wresize
491         {
492             if (in.size() != 2)
493             {
494                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
495                 return types::Function::Error;
496             }
497
498             int iAutoResizeMode = (int)in[1]->getAs<types::Double>()->get(0);
499             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_AUTORESIZE__, &iAutoResizeMode, jni_bool, 1);
500         }
501         break;
502         case 32 : // wpos
503         {
504             int figurePosition[2];
505             if (in.size() != 2)
506             {
507                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
508                 return types::Function::Error;
509             }
510
511             getOrCreateDefaultSubwin();
512
513             figurePosition[0] = (int)in[1]->getAs<types::Double>()->get(0);
514             figurePosition[1] = (int)in[2]->getAs<types::Double>()->get(0);
515             setGraphicObjectProperty(getCurrentFigure(), __GO_POSITION__, figurePosition, jni_int_vector, 2);
516         }
517         break;
518         case 31 : // wpdim
519         case 28 : // wdim
520         {
521             int figureSize[2] = {0, 0};
522             if (in.size() != 2 && in.size() != 3)
523             {
524                 Scierror(77, _("%s: Wrong number of input arguments: %d or %d expected.\n"), "xset", 2, 3);
525                 return types::Function::Error;
526             }
527
528             figureSize[0] = (int)in[1]->getAs<types::Double>()->get(0);
529             if (in.size() == 3)
530             {
531                 figureSize[1] = (int)in[2]->getAs<types::Double>()->get(0);
532             }
533
534             /* Xwindows limits dimensions to 2^16 */
535             if ((figureSize[0] > 65535) || (figureSize[1] > 65535))
536             {
537                 figureSize[0] = Min(figureSize[0], 65535);
538                 figureSize[1] = Min(figureSize[1], 65535);
539                 if (ConfigVariable::getWarningMode())
540                 {
541                     sciprint(_("%s: window dimensions have been set less than 2^16.\n"), "xset");
542                 }
543             }
544
545             getOrCreateDefaultSubwin();
546             setGraphicObjectProperty(getCurrentFigure(), __GO_SIZE__, figureSize, jni_int_vector, 2);
547         }
548         break;
549         case 27 : // viewport
550         {
551             if (in.size() != 3)
552             {
553                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 3);
554                 return types::Function::Error;
555             }
556
557             int viewport[4] = {0, 0, 0, 0};
558             viewport[0] = in[1]->getAs<types::Double>()->get(0);
559             viewport[1] = in[2]->getAs<types::Double>()->get(0);
560
561             getOrCreateDefaultSubwin();
562             setGraphicObjectProperty(getCurrentFigure(), __GO_VIEWPORT__, viewport, jni_int_vector, 2);
563         }
564         break;
565         case 18 : // line mode
566         {
567             if (in.size() != 2)
568             {
569                 Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "xset", 2);
570                 return types::Function::Error;
571             }
572
573             int iSubwinUID = getOrCreateDefaultSubwin();
574             int iZero = 0;
575             int iOne = 1;
576
577             if (in[1]->getAs<types::Double>()->get(0) == 0)
578             {
579                 setGraphicObjectProperty(iSubwinUID, __GO_LINE_MODE__, &iZero, jni_bool, 1);
580             }
581             else
582             {
583                 setGraphicObjectProperty(iSubwinUID, __GO_LINE_MODE__, &iOne, jni_bool, 1);
584             }
585         }
586         break;
587         default :
588         {
589             char* pstWhat = wide_string_to_UTF8(pwcsWhat);
590             Scierror(999, _("%s: Unrecognized input argument: '%s'.\n"), "xset", pstWhat);
591             FREE(pstWhat);
592             return types::Function::Error;
593         }
594     }
595
596     return types::Function::OK;
597 }
598 /*--------------------------------------------------------------------------*/