error(number): converting occurrences remaining in all .sce .sci files
[scilab.git] / scilab / modules / gui / macros / getvalue.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) 2010 - DIGITEO - Allan CORNET
4 // Copyright (C) 2010 - DIGITEO - Clément DAVID <clement.david@scilab.org>
5 // Copyright (C) 2011 - DIGITEO - Bruno JOFRET
6 //
7 // Copyright (C) 2012 - 2016 - Scilab Enterprises
8 //
9 // This file is hereby licensed under the terms of the GNU GPL v2.0,
10 // pursuant to article 5.3.4 of the CeCILL v.2.1.
11 // This file was originally licensed under the terms of the CeCILL v2.1,
12 // and continues to be available under such terms.
13 // For more information, see the COPYING file which you should have received
14 // along with this program.
15
16 function [%ok,%1,%2,%3,%4,%5,...
17     %6,%7,%8,%9,%10,...
18     %11,%12,%13,%14,%15,...
19     %16,%17,%18,%19,%20,...
20     %21,%22,%23,%24,%25,...
21     %26,%27,%28,%29,%30]=getvalue(%desc,%labels,%typ,%ini)
22     //  getvalues - %window dialog for data acquisition
23     //%Synta%
24     //  [%ok,%1,..,%30]=getvalue(desc,labels,typ,ini)
25     //%Parameters
26     //  desc    : column vector of strings, dialog general comment
27     //  labels  : n column vector of strings, labels(i) is the label of
28     //            the ith required value
29     //  typ     : list(typ1,dim1,..,typn,dimn)
30     //            typi : defines the type of the ith required value
31     //                   if may have the following values:
32     //                   'mat'    : stands for matrix of scalars
33     //                   'col'    : stands for column vector of scalars
34     //                   'row'    : stands for row vector of scalars
35     //                   'vec'    : stands for  vector of scalars
36     //                   'intvec' : stands for  vector of integers i.e int(x) == x
37     //                   'str'    : stands for vector of strings
38     //                   'lis'    : stands for list
39     //                   'pol'    : stands for polynomials
40     //                   'r'      : stands for rational
41     //            dimi : defines the size of the ith required value
42     //                   it must be
43     //                    - an integer or a 2-vector of integers (-1 stands for
44     //                      arbitrary dimension)
45     //                    - an evaluatable character string
46     //  ini     : n column vector of strings, ini(i) gives the suggested
47     //            response for the ith required value
48     //  %ok      : boolean ,%t if %ok button pressed, %f if cancel button pressed
49     //  xi      : contains the ith required value if %ok==%t
50     //%Description
51     // getvalues macro encapsulate x_mdialog function with error checking,
52     // evaluation of numerical response, ...
53     //%Remarks
54     // All correct scilab syntax may be used as responses, for matrices
55     // and vectors getvalues automatically adds [ ] around the given response
56     // before numerical evaluation
57     //%Example
58     // labels=['magnitude';'frequency';'phase    '];
59     // [ampl,Freq,ph]=getvalue('define sine signal',labels,..
60     //            list('vec',1,'vec',1,'vec',1),['0.85';'10^2';'%pi/3'])
61     //
62     //%See also
63     // x_mdialog, x_dialog
64
65     //!
66     // 01/09/10 Clément DAVID: update to %30 rhs parameters
67     // 17/01/07 -Alan- This version of getvalue is different of scilab 4.1 :
68     //         - %scicos_context behavior reviewed in accordance to context_evstr macro
69     //         - (u)int(8/16/32) allowed in field of type vec/mat/row/col (F. Nassif's Work)
70     //
71     // 05/02/07 -Alan- : update to %20 rhs parameters
72     //
73     // 12/02/07 -Alan- : fix (variable evaluation of %scicos_context)
74     //
75     // Copyright INRIA
76     [%lhs, %rhs] = argn(0)
77     if %rhs < 3 then
78         msg = _("%s: Wrong number of input argument(s): %d to %d expected.\n")
79         error(msprintf(msg, "getvalue", 3, 4));
80     end
81
82     %nn=prod(size(%labels))
83     if %lhs<>%nn+2 & %lhs<>%nn+1 then
84         msg = _("%s: Wrong number of output arguments: %d to %d expected.\n")
85         error(msprintf(msg, "getvalue", %nn+1, %nn+2))
86     end
87     if size(%typ)<>2*%nn then
88         error("%typ : list(''type'',[sizes],...)")
89     end
90     %1=[];%2=[];%3=[];%4=[];%5=[];
91     %6=[];%7=[];%8=[];%9=[];%10=[];
92     %11=[];%12=[];%13=[];%14=[];%15=[];
93     %16=[];%17=[];%18=[];%19=[];%20=[];
94     %21=[];%22=[];%23=[];%24=[];%25=[];
95     %26=[];%27=[];%28=[];%29=[];%30=[];
96
97     if exists("%scicos_context") then
98         %mm=getfield(1,%scicos_context)
99         for %mi=%mm(3:$)
100             if execstr(%mi+"=%scicos_context(%mi)","errcatch")<>0 then
101                 disp(lasterror())
102                 %ok=%f
103                 return
104             end
105         end
106     end
107
108     if %rhs==3 then  %ini=emptystr(%nn,1),end
109     %ok=%t
110     while %t do
111         %str=x_mdialog(%desc,%labels,%ini)
112         if %str==[] then %ok=%f,%str=[];break,end
113         for %kk=1:%nn
114             %cod=ascii(%str(%kk))
115             %spe=find(%cod==10)
116             if %spe<>[] then
117                 %semi=ascii(";")
118                 %cod(%spe)=%semi*ones(%spe')
119                 %str(%kk)=ascii(%cod)
120             end
121         end
122         %nok=0
123         for %kk=1:%nn
124             select part(%typ(2*%kk-1),1:6)
125             case "mat   "
126                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch");
127                 if %ierr<>0 then %nok=-%kk;break,end
128                 //29/12/06
129                 //the type of %vv is accepted if it is constant or integer
130                 if and(type(%vv)<>[1 8]) then %nok=-%kk,break,end
131                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
132                 [%mv,%nv]=size(%vv)
133                 %ssz=string(%sz(1))+" x "+string(%sz(2))
134                 if %mv*%nv==0 then
135                     if  %sz(1)>=0&%sz(2)>=0&%sz(1)*%sz(2)<>0 then %nok=%kk,break,end
136                 else
137                     if %sz(1)>=0 then if %mv<>%sz(1) then %nok=%kk,break,end,end
138                     if %sz(2)>=0 then if %nv<>%sz(2) then %nok=%kk,break,end,end
139                 end
140             case "vec   "
141                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch")
142                 if %ierr<>0 then %nok=-%kk;break,end
143                 //17/01/07
144                 //the type of %vv is accepted if it is constant or integer
145                 if and(type(%vv)<>[1 8]) then %nok=-%kk,break,end
146                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
147                 %ssz=string(%sz(1))
148                 %nv=prod(size(%vv))
149                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
150             case "intvec"
151                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch")
152                 if %ierr<>0 then %nok=-%kk;break,end
153                 //17/01/07
154                 //the type of %vv is accepted if it is constant or integer
155                 if and(type(%vv)<>[1 8]) then %nok=-%kk,break,end
156                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
157                 if and(int(%vv) == %vv) == %f then
158                     %nok=-%kk;
159                     break;
160                 end
161                 %ssz=string(%sz(1))
162                 %nv=prod(size(%vv))
163                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
164             case "pol   "
165                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch");
166                 if %ierr<>0 then %nok=-%kk;break,end
167                 if type(%vv)>2 then %nok=-%kk,break,end
168                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
169                 %ssz=string(%sz(1))
170                 %nv=prod(size(%vv))
171                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
172             case "row   "
173                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch");
174                 if %ierr<>0 then %nok=-%kk;break,end
175                 //17/01/07
176                 //the type of %vv is accepted if it is constant or integer
177                 if and(type(%vv)<>[1 8]) then %nok=-%kk,break,end
178                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
179                 if %sz(1)<0 then
180                     %ssz="1 x *"
181                 else
182                     %ssz="1 x "+string(%sz(1))
183                 end
184                 [%mv,%nv]=size(%vv)
185                 if %mv<>1 then %nok=%kk,break,end,
186                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
187             case "col   "
188                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch");
189                 if %ierr<>0 then %nok=-%kk;break,end
190                 //17/01/07
191                 //the type of %vv is accepted if it is constant or integer
192                 if and(type(%vv)<>[1 8]) then %nok=-%kk,break,end
193                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
194                 if %sz(1)<0 then
195                     %ssz="* x 1"
196                 else
197                     %ssz=string(%sz(1))+" x 1"
198                 end
199                 [%mv,%nv]=size(%vv)
200                 if %nv<>1 then %nok=%kk,break,end,
201                 if %sz(1)>=0 then if %mv<>%sz(1) then %nok=%kk,break,end,end
202             case "str   "
203                 %sde=%str(%kk)
204                 %spe=find(ascii(%str(%kk))==10)
205                 %spe($+1)=length(%sde)+1
206                 %vv=[];%kk1=1
207                 for %kkk=1:size(%spe,"*")
208                     %vv(%kkk,1)=part(%sde,%kk1:%spe(%kkk)-1)
209                     %kk1=%spe(%kkk)+1
210                 end
211                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
212                 %ssz=string(%sz(1))
213                 %nv=prod(size(%vv))
214                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
215             case "lis   "
216                 %ierr=execstr("%vv="+%str(%kk),"errcatch");
217                 if %ierr<>0 then %nok=-%kk;break,end
218                 if type(%vv)<>15& type(%vv)<>16 then %nok=-%kk,break,end
219                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
220                 %ssz=string(%sz(1))
221                 %nv=size(%vv)
222                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
223             case "r     "
224                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch");
225                 if %ierr<>0 then %nok=-%kk;break,end
226                 if type(%vv)<>16 then %nok=-%kk,break,end
227                 if typeof(%vv)<>"rational" then %nok=-%kk,break,end
228                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
229                 [%mv,%nv]=size(%vv(2))
230                 %ssz=string(%sz(1))+" x "+string(%sz(2))
231                 if %mv*%nv==0 then
232                     if  %sz(1)>=0&%sz(2)>=0&%sz(1)*%sz(2)<>0 then %nok=%kk,break,end
233                 else
234                     if %sz(1)>=0 then if %mv<>%sz(1) then %nok=%kk,break,end,end
235                     if %sz(2)>=0 then if %nv<>%sz(2) then %nok=%kk,break,end,end
236                 end
237             else
238                 msg = _("%s: Type %s is not implemented.\n")
239                 error(msprintf(msg, "getvalue", %typ(2*%kk-1)))
240             end
241             execstr("%"+string(%kk)+"=%vv")
242         end
243         if %nok>0 then
244             msg = _("Answer given for %s \n has invalid dimension: \n waiting for dimension %s.\n")
245             messagebox(msprintf(msg, %labels(%nok), %ssz), "modal");
246             %ini=%str
247         elseif %nok<0 then
248             if %ierr==0 then
249                 msg = _("Answer given for %s \n has incorrect type %s.\n")
250                 messagebox(msprintf(msg, %labels(-%nok), %typ(-2*%nok-1)), "modal");
251             else
252                 msg = _("Answer given for %s \n is incorrect: %s.\n")
253                 messagebox(msprintf(msg, %labels(-%nok), lasterror()), "modal");
254             end
255             %ini=%str
256         else
257             break
258         end
259     end
260     if %lhs==%nn+2 then
261         execstr("%"+string(%lhs-1)+"=%str")
262     end
263 endfunction