1// =============================================================================
2// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3// Copyright (C) ????-2008 - INRIA
4// Copyright (C) ????-2008 - ENPC
5//
6//  This file is distributed under the same license as the Scilab package.
7// =============================================================================
8// <-- CLI SHELL MODE -->
9//--------------test format %i
10[n,a]=msscanf('123','%i');
11if n<>1|a<>123 then bugmes();quit;end
12[n,a]=msscanf('     123','%i');
13if n<>1|a<>123 then bugmes();quit;end
14[n,a]=msscanf('123','%2i');
15if n<>1|a<>12 then bugmes();quit;end
16[n,a]=msscanf('123','%5i');
17//--------------test format %li
18[n,a]=msscanf('123','%li');
19if n<>1|a<>123 then bugmes();quit;end
20[n,a]=msscanf('     123','%li');
21if n<>1|a<>123 then bugmes();quit;end
22[n,a]=msscanf('123','%2li');
23if n<>1|a<>12 then bugmes();quit;end
24[n,a]=msscanf('123','%5li');
25//--------------test format %hi
26[n,a]=msscanf('123','%hi');
27if n<>1|a<>123 then bugmes();quit;end
28[n,a]=msscanf('     123','%hi');
29if n<>1|a<>123 then bugmes();quit;end
30[n,a]=msscanf('123','%2hi');
31if n<>1|a<>12 then bugmes();quit;end
32[n,a]=msscanf('123','%5hi');
33//--------------test format %d
34[n,a]=msscanf('123','%d');
35if n<>1|a<>123 then bugmes();quit;end
36[n,a]=msscanf('     123','%d');
37if n<>1|a<>123 then bugmes();quit;end
38[n,a]=msscanf('123','%2d');
39if n<>1|a<>12 then bugmes();quit;end
40[n,a]=msscanf('123','%5d');
41//--------------test format %ld
42[n,a]=msscanf('123','%ld');
43if n<>1|a<>123 then bugmes();quit;end
44[n,a]=msscanf('     123','%ld');
45if n<>1|a<>123 then bugmes();quit;end
46[n,a]=msscanf('123','%2ld');
47if n<>1|a<>12 then bugmes();quit;end
48[n,a]=msscanf('123','%5ld');
49//--------------test format %hd
50[n,a]=msscanf('123','%hd');
51if n<>1|a<>123 then bugmes();quit;end
52[n,a]=msscanf('     123','%hd');
53if n<>1|a<>123 then bugmes();quit;end
54[n,a]=msscanf('123','%2hd');
55if n<>1|a<>12 then bugmes();quit;end
56[n,a]=msscanf('123','%5hd');
57//------------- test format %n
58// Note that %n returned values are not counted in n
59s1='123 45.67 pipo';s2=' foo';
60[n,a,b,c,d,e]=msscanf(s1+s2,'%d%lf%s%n%s');
61if n<>4|a<>123|b<>45.67|c<>'pipo'|d<>length(s1)|e<>'foo' then bugmes();quit;end
62//------------- test format %u
63[n,a]=msscanf('+123','%u');
64if n<>1|a<>123 then bugmes();quit;end
65[n,a]=msscanf(' 123','%2u');
66if n<>1|a<>12 then bugmes();quit;end
67[n,a]=msscanf('+123','%5u');
68if n<>1|a<>123 then bugmes();quit;end
69//------------- test format %lu
70[n,a]=msscanf('+123','%lu');
71if n<>1|a<>123 then bugmes();quit;end
72[n,a]=msscanf(' 123','%2lu');
73if n<>1|a<>12 then bugmes();quit;end
74[n,a]=msscanf('+123','%5lu');
75if n<>1|a<>123 then bugmes();quit;end
76//------------- test format %hu
77[n,a]=msscanf('+123','%hu');
78if n<>1|a<>123 then bugmes();quit;end
79[n,a]=msscanf(' 123','%2hu');
80if n<>1|a<>12 then bugmes();quit;end
81[n,a]=msscanf('+123','%5hu');
82if n<>1|a<>123 then bugmes();quit;end
83//------------- test format %o
84[n,a]=msscanf('123','%o');
85if n<>1|a<>83 then bugmes();quit;end
86[n,a]=msscanf('     123','%o');
87if n<>1|a<>83 then bugmes();quit;end
88[n,a]=msscanf('123','%2o');
89if n<>1|a<>10 then bugmes();quit;end
90[n,a]=msscanf('123','%5o');
91if n<>1|a<>83 then bugmes();quit;end
92//------------- test format %x
93rep=10*16^2+11*16+12;
94[n,a]=msscanf('0xabc','%x');
95if n<>1|a<>rep then bugmes();quit;end
96[n,a]=msscanf('     0xabc','%x');
97if n<>1|a<>rep then bugmes();quit;end
98[n,a]=msscanf('abc','%2x');
99if n<>1|a<>10*16+11 then bugmes();quit;end
100[n,a]=msscanf('0xabc','%5x');
101if n<>1|a<>rep then bugmes();quit;end
102//------------- test format %e
103[n,a]=msscanf('123.45','%e');
104if n<>1|norm(a-123.45)>1.e-2 then bugmes();quit;end
105[n,a]=msscanf('     123.45','%e');
106if n<>1|norm(a-123.45)>1.e-2 then bugmes();quit;end
107[n,a]=msscanf('123.45','%2e');
108if n<>1| norm(a-12)>0.1 then bugmes();quit;end
109[n,a]=msscanf('123.45','%5e');
110if n<>1|norm(a-123.4)>1.e-1 then bugmes();quit;end
111//------------- test format %le
112[n,a]=msscanf('123.45','%le');
113if n<>1|a<>123.45 then bugmes();quit;end
114[n,a]=msscanf('     123.45','%le');
115if n<>1|a<>123.45 then bugmes();quit;end
116[n,a]=msscanf('123.45','%2le');
117if n<>1|a<>12 then bugmes();quit;end
118[n,a]=msscanf('123.45','%5le');
119if n<>1|a<>123.4 then bugmes();quit;end
120//------------- test format %f
121[n,a]=msscanf('123.45','%f');
122if n<>1|norm(a-123.45)>1.e-2 then bugmes();quit;end
123[n,a]=msscanf('     123.45','%f');
124if n<>1|norm(a-123.45)>1.e-2 then bugmes();quit;end
125[n,a]=msscanf('123.45','%2f');
126if n<>1| norm(a-12)>0.1 then bugmes();quit;end
127[n,a]=msscanf('123.45','%5f');
128if n<>1|norm(a-123.4)>1.e-1 then bugmes();quit;end
129//------------- test format %lf
130[n,a]=msscanf('123.45','%lf');
131if n<>1|a<>123.45 then bugmes();quit;end
132[n,a]=msscanf('     123.45','%lf');
133if n<>1|a<>123.45 then bugmes();quit;end
134[n,a]=msscanf('123.45','%2lf');
135if n<>1|a<>12 then bugmes();quit;end
136[n,a]=msscanf('123.45','%5lf');
137if n<>1|a<>123.4 then bugmes();quit;end
138//------------- test format %s
139[n,a]=msscanf('123','%s');
140if n<>1|a<>'123' then bugmes();quit;end
141[n,a]=msscanf('     123','%s');
142if n<>1|a<>'123' then bugmes();quit;end
143[n,a]=msscanf('123','%2s');
144if n<>1|a<>'12' then bugmes();quit;end
145[n,a]=msscanf('123','%5s');
146if n<>1|a<>'123' then bugmes();quit;end
147//------------- test format %c
148//note that  \n is scaned into \ and n
149[n,a,b,c,d]=msscanf(' 12\n','%c%c%c%c');
150if n<>4|a<>' '|b<>'1'|c<>'2'|d<>'\' then bugmes();quit;end
151//------------- test format [
152[n,a,b]=msscanf('012345abczoo','%[0-9abc]%s');
153if n<>2|a<>'012345abc'|b<>'zoo' then bugmes();quit;end
154//------------- test format [
155[n,a,b]=msscanf('012345abczoo','%[^c]c%s');
156if n<>2|a<>'012345ab'|b<>'zoo' then bugmes();quit;end
157//------------- test ignoring arguments
158[n,a,b]=msscanf('123 4 pipo poo','%*s%s%*s%s');
159if n<>2|a<>'4'|b<>'poo' then bugmes();quit;end
160//------------- test [ * ^
161[n,a]=msscanf('123 4 pipo Xpoo','%*[^X]X%s');
162if n<>1|a<>'poo' then bugmes();quit;end
163//------------- test ignoring arguments
164[n,a,b]=msscanf('123 4 pipo poo','%*s%s%*s%s');
165if n<>2|a<>'4'|b<>'poo' then bugmes();quit;end
166//------------- test composed directives
167[n,a]=msscanf('123 4','123%le');
168if n<>1|a<>4 then bugmes();quit;end
169[n,a,b,c]=msscanf('xxxxx 4 test 23.45','xxxxx%d%s%le');
170if n<>3|a<>4|b<>'test'|c<>23.45 then bugmes();quit;end
171[n,a,b]=msscanf('123 456','%le%le');
172if n<>2|a<>123|b<>456 then bugmes();quit;end
173//------------- test mismatch
174[n,a]=msscanf('123 poo','123%le');
175if n<>0 then bugmes();quit;end
176//------------- test end-of-line
177[n,a]=msscanf('123','123%le');
178if n<>-1 then bugmes();quit;end
179//------------- test with matrix scan
180n=5;
181A=int(10*rand(n,n));
182A1=strcat(string(A),' ','c');
183F='%d';F=strcat(F(ones(1,n)),' ');
184// all lines read as int we scan a 5x5 matrix
185A2=msscanf(-1,A1,F);
186if norm(A2-A) > %eps then bugmes();quit;end
187// read just 2 lines
188A2=msscanf(2,A1,F);
189if norm(A2-A(1:2,:)) > %eps then bugmes();quit;end
190// explicit columns we scan five columns
191[n,a,b,c,d,e]=msscanf(-1,A1,F);
192if n<>5 then bugmes();quit;end
193if norm([a,b,c,d,e]-A) > %eps then bugmes();quit;end
194// all lines read as int but we scan only 2 columns
195A2=msscanf(-1,A1,'%d%d');
196if norm(A2-A(:,1:2)) > %eps then bugmes();quit;end
197// all lines read as string
198F='%s';F=strcat(F(ones(1,n)),' ');
199A2=msscanf(-1,A1,F);
200if A2<>string(A) then bugmes();quit;end
201// read just 2 lines
202A2=msscanf(2,A1,F);
203if A2<>string(A(1:2,:))  then bugmes();quit;end
204// mixed types read column 1 and 2 as string and others as int
205Fs='%s';Fs=strcat(Fs(ones(1,2)),' ');
206Fd='%d';Fd=strcat(Fd(ones(1,n-2)),' ');
207[n,a,b,c,d,e]=msscanf(-1,A1,Fs+' '+Fd);
208if n<>5 then bugmes();quit;end
209if norm([evstr(a),evstr(b),c,d,e]-A) > %eps then bugmes();quit;end
210// same example but returned values are compacted in L
211L=msscanf(-1,A1,Fs+' '+Fd);
212if length(L)<>3 then bugmes();quit;end
213if norm(getfield(3,L)-A(:,3:n)) > %eps then bugmes();quit;end
214if getfield(2,L)<>string(A(:,1:2)) then bugmes();quit;end
215