Fix load/save after https://codereview.scilab.org/#/c/15681/.
[scilab.git] / scilab / modules / fileio / macros / %_listvarinfile.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2001  - INRIA - Serge Steer
3 // Copyright (C) Enrico Segre
4 //
5 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10
11 // set of functions for getting information about variables saved in a Scilab
12 //  data file
13
14 function varargout=%_listvarinfile(fil)
15     lhs=argn(1)
16     u=mopen(fil,"rb")
17     typenames=[  // in vector form, in order to cover the first 17
18     "constant";
19     "polynomial";
20     "???"
21     "boolean";
22     "sparse";
23     "boolean sparse";
24     "Matlab sparse";
25     "integer"
26     "graphic handle"; //not yet done
27     "string";
28     "function";
29     "???"
30     "function";
31     "library";
32     "list"
33     "tlist"
34     "mlist"]
35
36
37     nams=[]
38     dims=list()
39     typs=[];vols=[]
40
41     if lhs==1 then
42         //write the display header
43         write(%io(2),part("Name",1:25)+ part("Type",1:15)+part("Size",1:16)+..
44         part("Bytes",1:10))
45         write(%io(2),"---------------------------------------------------------------")
46     end
47
48     while %t
49         w=mget(6,"il",u)
50         if size(w,"*")<6|meof(u)<>0 then break,end
51         nam=code2var(w);
52
53         [typ,dim,vol]=listnextvar(u)
54         if typ<=17 then
55             typn=typenames(typ)
56         elseif typ==128 then
57             typn="pointer";
58         elseif typ==129 then
59             typn="size implicit";
60         elseif typ==130 then
61             typn="primitive";
62         else
63             error(msprintf(gettext("%s: Wrong variable type (%s) found in ''%s''. File may be wrong or corrupted.\n"), "listvarinfile", string(typ), fil))
64         end
65
66         if lhs==1 then
67             if typ <>128 & typ <> 130 then
68                 write(%io(2),part(nam,1:25)+part(typn,1:15)+..
69                 part(strcat(string(dim)," by "),1:16)+part(string(vol),1:10))
70             else //types 9, 128 and 130 are known in scilab, but their API is unpublished
71                 write(%io(2),part(nam,1:25)+part(typn,1:15)+"unknown         unknown")
72                 warning(".... unknown structure, I''m forced to stop here (bug 2387)")
73             end
74         end
75         typs=[typs;typ]
76         dims($+1)=dim
77         nams=[nams;nam]
78         vols=[vols;vol]
79         if dim==-1 | vol==-1 then break; end // this for types with unknown API
80     end
81     mclose(u)
82
83     varargout=list(nams,typs,dims,vols)
84 endfunction
85
86 /////////////////////////////////////////////////
87
88 function [typ,dim,vol]=listnextvar(u)
89     typ=mget(1,"il",u) //The variable type
90     dim=-1;vol=-1; //flags to break the caller loop in unknown cases
91     select typ
92     case 1 then //matrix of numbers
93         w=mget(3,"il",u) //header of the variable
94         m=w(1);n=w(2);it=w(3);dim=[m,n]
95         N=m*n*(it+1)
96         mseek(8*N,u,"cur") //skip the values
97         //A=mget(N,"dl",u)
98         vol=4*4+8*N
99     case 2 then //polynomial
100         w=mget(3,"il",u) //header of the variable
101         m=w(1);n=w(2);it=w(3);dim=[m,n]
102         mseek(4*4,u,"cur") //skeep the formal variable name
103         w=mget(m*n+1,"il",u) //get the pointer table
104         //I=mget(m*n+1,"il",u)
105         N=(w(m*n+1)-1)*(it+1)
106         mseek(8*N,u,"cur") //skip the values
107         //A=mget(N,"dl",u)
108         vol=(4+4+(m*n+1))*4+8*N
109     case 4 then //boolean
110         w=mget(2,"il",u) //header of the variable
111         m=w(1);n=w(2);dim=[m,n]
112         N=m*n
113         mseek(4*N,u,"cur") // skip the values
114         //A=mget(N,"il",u)
115         vol=(4+N)*4
116     case 5 then //sparse
117         w=mget(4,"il",u) //header of the variable
118         m=w(1);n=w(2);it=w(3);nel=w(4);dim=[m,n]
119         mseek(4*(m+nel),u,"cur")// skip the index
120         mseek(8*nel*(it+1),u,"cur") // skip the non zero values
121         //I=mget(((m+nel),"il",u)
122         //A=mget((nel*(it+1)),"dl",u)
123         vol=(5+m+nel)*4+8*nel*(it+1)
124     case 6 then //boolean sparse
125         w=mget(4,"il",u) //header of the variable
126         m=w(1);n=w(2);it=w(3);nel=w(4);dim=[m,n]
127         mseek(4*(m+nel),u,"cur")// skip the index
128         //I=mget((m+nel),"il",u)
129         vol=(5+m+nel)*4
130     case 8 then //integer
131         w=mget(3,"il",u) //header of the variable
132         m=w(1);n=w(2);it=w(3);dim=[m,n]
133         select it
134         case 4 then
135             mseek(m*n*4,u,"cur")
136             //A=mget((m*n,"il",u)
137             vol=4*4+m*n*4
138         case 2 then
139             mseek(m*n*2,u,"cur")
140             //A=mget((m*n,"sl",u)
141             vol=4*4+m*n*2
142         case 1 then
143             mseek(m*n*1,u,"cur")
144             //A=mget((m*n,"c",u)
145             vol=4*4+m*n
146         case 14 then
147             mseek(m*n*4,u,"cur")
148             //A=mget((m*n,"uil",u)
149             vol=4*4+m*n*4
150         case 12 then
151             mseek(m*n*2,u,"cur")
152             //A=mget((m*n,"usl",u)
153             vol=4*4+m*n*2
154         case 11 then
155             mseek(m*n*1,u,"cur")
156             //A=mget((m*n,"uc",u)
157             vol=4*4+m*n
158         end
159     case 9 then //graphic handle: API??
160         [dim, vol] = getMatrixHandleInfo(u);
161     case 10 then //string
162         w=mget(3,"il",u)
163         m=w(1);n=w(2);it=w(3);dim=[m,n]
164         w=mget(m*n+1,"il",u) //get the pointer table
165         N=w($)-1 //total number of chars
166         mseek(4*N,u,"cur") //skip the values, N characters coded in N integers
167         vol=(4*m*n+1)*4+4*N
168     case 11 then // function (not compiled)
169         dim=[]
170         nout=mget(1,"il",u)
171         mseek(nout*6*4,u,"cur") //skip lhs names, nout names coded over 6 integers
172         nin=mget(1,"il",u)
173         mseek(nin*6*4,u,"cur") //skip rhs names, nin names coded over 6 integers
174         N=mget(1,"il",u) //code length
175         mseek(N*4,u,"cur") //skip code (N characters coded in N integers)
176         vol=(3+(nin+nout)*6+N)*4
177     case 13 then // compiled function
178         dim=[]
179         nout=mget(1,"il",u)
180         mseek(nout*6*4,u,"cur") //skip lhs names, nout names coded over 6 integers
181         nin=mget(1,"il",u)
182         mseek(nin*6*4,u,"cur") //skip rhs names, nin names coded over 6 integers
183         N=mget(1,"il",u) //code length
184         mseek(N*4,u,"cur") //skip pseudo-code N integers
185         vol=(3+(nin+nout)*6+N)*4
186     case 14 then //library
187         np=mget(1,"il",u) //path length
188         mseek(np*4,u,"cur") //skeep the path
189         nclas=29
190         nn=mget(1,"il",u) //number of names
191         dim=nn
192         mseek((nclas+1)*4,u,"cur") //skeep the class pointers
193         mseek(nn*6*4,u,"cur") //skip the names
194         vol=(2+np+1+nclas+1+nn*6)*4
195     case 15 then //list
196         [dim, vol] = getListInfo(u);
197     case 16 then //tlist
198         [dim, vol] = getListInfo(u);
199     case 17 then //mlist
200         [dim, vol] = getListInfo(u);
201     case 128 then //pointer: API??
202
203     case 129 then //size implicit index (same as polynomial)
204         w=mget(3,"il",u) //header of the variable
205         m=w(1);n=w(2);it=w(3);dim=[m,n]
206         mseek(4*4,u,"cur") //skeep the formal variable name
207         w=mget(m*n+1,"il",u) //get the pointer table
208         //I=mget(m*n+1,"il",u)
209         N=(w(m*n+1)-1)*(it+1)
210         mseek(8*N,u,"cur") //skip the values
211         //A=mget(N,"dl",u)
212         vol=(4+4+(m*n+1))*4+8*N
213     case 130 then //scilab primitive: API??
214
215     else  //unknown type, or file content plainly wrong
216
217     end
218 endfunction
219
220 //////////////////////////////////////////////////////////
221 function [items, totalSize] = getListInfo(file_descriptor)
222     items = mget(1, "il", file_descriptor);//read item count
223     offset = mget(1 + items, "il", file_descriptor);//read offset between vars
224     totalSize = (2 + (items + 1)) * 4;
225     for i = 1:items
226         //bypass Undefined item
227         if offset(i) <> offset(i + 1) then
228             [t, d, v] = listnextvar(file_descriptor);
229             totalSize = totalSize + v;
230         end
231     end
232 endfunction
233
234 //////////////////////////////////////////////////////////
235 function [hsize, totalSize] = getMatrixHandleInfo(fd)
236     totalSize = 4 + 4;
237     version=mget(4, "uc", fd);
238     if is_higher_than([3 1 0 1]) then // case 3 1 0 2 and after
239         hsize = mget(2, "uc", fd)
240         totalSize = totalSize + 2;
241         for i=1:hsize(1)
242             for j=1:hsize(2)
243                 totalSize = getSingleHandleInfo(fd, totalSize)
244             end
245         end
246     else
247         // a single handle only can be loaded before 3 1 0 2
248         hsize = [1,1];
249         totalSize = getSingleHandleInfo(fd, totalSize);
250     end
251
252 endfunction
253
254 //////////////////////////////////////////////////////////
255 function totalSize = getSingleHandleInfo(fd, totalSize)
256     [totalSize, handleType] = readString(fd, totalSize); // Type
257
258     select handleType
259     case "Figure"
260         totalSize = seekBool(fd, totalSize); // Visible
261         totalSize = seekShortCount(fd, 2, totalSize); //figure_position
262         totalSize = seekShortCount(fd, 2, totalSize); //figure_size
263         totalSize = seekShortCount(fd, 2, totalSize); //axes_size
264         if is_higher_than( [4 1 2 0] ) then
265             totalSize = seekShortCount(fd, 2, totalSize); //viewport
266             if is_higher_than([5 4 0 0]) then
267                 totalSize = seekStringInt(fd, totalSize); // info_message
268             else
269                 totalSize = seekString(fd, totalSize); // info_message
270             end
271             totalSize = seekString(fd, totalSize); // tag
272         end
273
274         totalSize = seekBool(fd, totalSize); // auto_resize
275         if is_higher_than([5 4 0 0]) then
276             totalSize = seekStringInt(fd, totalSize); // figure_name
277         else
278             totalSize = seekString(fd, totalSize); // figure_name
279         end
280         totalSize = seekShort(fd, totalSize); //figure_id
281         totalSize = seekMatrix(fd, totalSize); // color_map
282         if ~is_higher_than([5 4 0 1]) then
283             totalSize = seekBool(fd, totalSize); // pixmap
284         end
285         totalSize = seekString(fd, totalSize); // pixel_drawing_mode
286         if (is_higher_than([5 1 0 0])) then
287             totalSize = seekString(fd, totalSize); // anti_aliasing
288         end
289         totalSize = seekBool(fd, totalSize); // immediate_drawing
290         totalSize = seekInt(fd, totalSize); // background
291         totalSize = seekString(fd, totalSize); // rotation_style
292         if ( is_higher_than([4 1 2 0]) ) then
293             totalSize = seekString(fd, totalSize); // event_handler
294             totalSize = seekString(fd, totalSize); // event_handler_enable
295         end
296         if ( is_higher_than([5 2 0 0]) ) then // Added in 5.4.0 version
297             totalSize = seekString(fd, totalSize); // resizefcn
298             totalSize = seekString(fd, totalSize); // closerequestfcn
299         end
300
301         [totalSize, axesCount] = readInt(fd, totalSize); // children
302         for i = 1 : axesCount
303             totalSize = getSingleHandleInfo(fd, totalSize);
304         end
305
306         totalSize = seekUserdata(fd, totalSize); // Userdata
307
308     case "Axes"
309         totalSize = seekBool(fd, totalSize); // visible
310         if and(version==[3 0 0 0]) then
311             totalSize = seekBool(fd, totalSize); // axes_visible
312         else
313             totalSize = seekBoolMatrix(fd, totalSize); // axes_visible
314         end
315
316         if is_higher_than( [3 1 0 1] ) then
317             totalSize = seekBoolMatrix(fd, totalSize); // axes_reverse
318         end
319
320         totalSize = seekIntMatrix(fd, totalSize); // grid
321         if (is_higher_than([5 0 3 0])) then
322             totalSize = seekString(fd, totalSize); // grid_position
323         end
324         totalSize = seekString(fd, totalSize); // x_location
325         totalSize = seekString(fd, totalSize); // y_location
326         [totalSize, view] = readStringCount(fd, 2, totalSize); // view
327
328         //title
329         totalSize = seekBool(fd, totalSize); // visible
330         if is_higher_than( [4 1 2 0] ) then
331             totalSize = seekStringMatrix(fd, totalSize); // text
332         else
333             totalSize = seekString(fd, totalSize); // text
334         end
335
336         if is_higher_than([4 1 2 0]) then
337             totalSize = seekInt(fd, totalSize); // font_foreground
338             totalSize = seekBool(fd, totalSize); // fractional_font
339         end
340
341         totalSize = seekInt(fd, totalSize); // foreground
342         if is_higher_than([3 1 0 0]) then
343             totalSize = seekInt(fd, totalSize); // background
344             totalSize = seekBool(fd, totalSize); // fill_mode
345         end
346
347         totalSize = seekBool(fd, totalSize); // font_style
348         totalSize = seekBool(fd, totalSize); // font_size
349
350         if is_higher_than([3 1 0 0]) then
351             totalSize = seekBool(fd, totalSize); // auto_rotation
352             totalSize = seekDouble(fd, totalSize); // font_angle
353             totalSize = seekBool(fd, totalSize); // auto_position
354             totalSize = seekDouble(fd, totalSize); // position 1
355             totalSize = seekDouble(fd, totalSize); // position 2
356         end
357
358         //x_label
359         totalSize = seekBool(fd, totalSize); // visible
360         if is_higher_than( [4 1 2 0] ) then
361             totalSize = seekStringMatrix(fd, totalSize); // text
362         else
363             totalSize = seekString(fd, totalSize); // text
364         end
365
366         if is_higher_than([4 1 2 0]) then
367             totalSize = seekInt(fd, totalSize); // font_foreground
368             totalSize = seekBool(fd, totalSize); // fractional_font
369         end
370
371         totalSize = seekInt(fd, totalSize); // foreground
372         if is_higher_than([3 0 0 0]) then
373             totalSize = seekInt(fd, totalSize); // background
374             totalSize = seekBool(fd, totalSize); // fill_mode
375         end
376
377         totalSize = seekBool(fd, totalSize); // font_style
378         totalSize = seekBool(fd, totalSize); // font_size
379
380         if is_higher_than([3 0 0 0]) then
381             totalSize = seekBool(fd, totalSize); // auto_rotation
382             totalSize = seekDouble(fd, totalSize); // font_angle
383             totalSize = seekBool(fd, totalSize); // auto_position
384             totalSize = seekDouble(fd, totalSize); // position 1
385             totalSize = seekDouble(fd, totalSize); // position 2
386         end
387
388         //y_label
389         totalSize = seekBool(fd, totalSize); // visible
390         if is_higher_than( [4 1 2 0] ) then
391             totalSize = seekStringMatrix(fd, totalSize); // text
392         else
393             totalSize = seekString(fd, totalSize); // text
394         end
395
396         if is_higher_than([4 1 2 0]) then
397             totalSize = seekInt(fd, totalSize); // font_foreground
398             totalSize = seekBool(fd, totalSize); // fractional_font
399         end
400
401         totalSize = seekInt(fd, totalSize); // foreground
402         if is_higher_than([3 0 0 0]) then
403             totalSize = seekInt(fd, totalSize); // background
404             totalSize = seekBool(fd, totalSize); // fill_mode
405         end
406
407         totalSize = seekBool(fd, totalSize); // font_style
408         totalSize = seekBool(fd, totalSize); // font_size
409
410         if is_higher_than([3 0 0 0]) then
411             totalSize = seekBool(fd, totalSize); // auto_rotation
412             totalSize = seekDouble(fd, totalSize); // font_angle
413             totalSize = seekBool(fd, totalSize); // auto_position
414             totalSize = seekDouble(fd, totalSize); // position 1
415             totalSize = seekDouble(fd, totalSize); // position 2
416         end
417
418         if view == "3d" then
419             //z_label
420             totalSize = seekBool(fd, totalSize); // visible
421             if is_higher_than( [4 1 2 0] ) then
422                 totalSize = seekStringMatrix(fd, totalSize); // text
423             else
424                 totalSize = seekString(fd, totalSize); // text
425             end
426
427             if is_higher_than([4 1 2 0]) then
428                 totalSize = seekInt(fd, totalSize); // font_foreground
429                 totalSize = seekBool(fd, totalSize); // fractional_font
430             end
431
432             totalSize = seekInt(fd, totalSize); // foreground
433             if is_higher_than([3 0 0 0]) then
434                 totalSize = seekInt(fd, totalSize); // background
435                 totalSize = seekBool(fd, totalSize); // fill_mode
436             end
437
438             totalSize = seekBool(fd, totalSize); // font_style
439             totalSize = seekBool(fd, totalSize); // font_size
440
441             if is_higher_than([3 0 0 0]) then
442                 totalSize = seekBool(fd, totalSize); // auto_rotation
443                 totalSize = seekDouble(fd, totalSize); // font_angle
444                 totalSize = seekBool(fd, totalSize); // auto_position
445                 totalSize = seekDouble(fd, totalSize); // position 1
446                 totalSize = seekDouble(fd, totalSize); // position 2
447             end
448         end
449
450         if is_higher_than([5 4 0 1]) then
451             totalSize = seekBoolMatrix(fd, totalSize); // auto_ticks
452         end
453
454         if is_higher_than([3 0 0 0]) then
455
456             //x_ticks
457             [totalSize, ticksX] = readShort(fd, totalSize); // ticks count
458             if ticksX > 0 then
459                 totalSize = seekMatrixCount(fd, ticksX,  totalSize); // locations
460                 [totalSize, labels] = readBoolCount(fd, ticksX, totalSize); // label
461                 for i = 1:ticksX
462                     totalSize = seekStringCount(fd, labels(i), totalSize);
463                 end
464             end
465
466             //y_ticks
467             [totalSize, ticksY] = readShort(fd, totalSize); // ticks count
468             if ticksY > 0 then
469                 totalSize = seekMatrixCount(fd, ticksY,  totalSize); // locations
470                 [totalSize, labels] = readBoolCount(fd, ticksY, totalSize); // label
471                 for i = 1:ticksY
472                     totalSize = seekStringCount(fd, labels(i), totalSize);
473                 end
474             end
475
476             //z_ticks
477             [totalSize, ticksZ] = readShort(fd, totalSize); // ticks count
478             if ticksZ > 0 then
479                 totalSize = seekMatrixCount(fd, ticksZ,  totalSize); // locations
480                 [totalSize, labels] = readBoolCount(fd, ticksZ, totalSize); // label
481                 for i = 1:ticksZ
482                     totalSize = seekStringCount(fd, labels(i), totalSize);
483                 end
484             end
485         end
486
487         if is_higher_than([4 1 2 0]) then
488             totalSize = seekString(fd, totalSize); // box
489             totalSize = seekBool(fd, totalSize); // filled
490         else
491             totalSize = seekBool(fd, totalSize); // box
492         end
493
494         totalSize = seekString(fd, totalSize); // sub_ticks
495
496         if ~(is_higher_than([3 1 0 1]) ) then
497             totalSize = seekDouble(fd, totalSize); // ticks_color
498         end
499
500         totalSize = seekBool(fd, totalSize); // font_style
501         totalSize = seekBool(fd, totalSize); // font_size
502         totalSize = seekInt(fd, totalSize); // font_color
503
504         if is_higher_than([4 1 2 0]) then
505             totalSize = seekBool(fd, totalSize); // fractional_font
506         end
507
508         totalSize = seekBool(fd, totalSize); // isoview
509         totalSize = seekBool(fd, totalSize); // cube_scaling
510         totalSize = seekDouble(fd, totalSize); // rotation_angles 1
511         totalSize = seekDouble(fd, totalSize); // rotation_angles 2
512
513         if is_higher_than([3 0 0 0]) then
514             totalSize = seekStringCount(fd, 3, totalSize); // log_flags
515         else
516             totalSize = seekStringCount(fd, 2, totalSize); // log_flags
517         end
518
519         if is_higher_than([5 5 0 0]) then // tight_limits
520             totalSize = seekBoolMatrix(fd, totalSize);
521         else
522             totalSize = seekBool(fd, totalSize);
523         end
524         [totalSize, bounds] = readBool(fd, totalSize); // data_bounds count
525         totalSize = seekDoubleCount(fd, bounds, totalSize); // data_bounds
526
527         if is_higher_than([3 0 0 0]) then
528             [totalSize, zooms] = readBool(fd, totalSize); // zoom_box_size
529             if zooms <> 0 then
530                 totalSize = seekDoubleCount(fd, zooms, totalSize); // zoom_box
531             end
532         end
533
534         if is_higher_than([3 1 0 1]) then
535             totalSize = seekDoubleCount(fd, 4, totalSize); // margins
536         end
537
538         totalSize = seekDoubleCount(fd, 4, totalSize); // axes_bounds
539         totalSize = seekBool(fd, totalSize); // auto_clear
540         totalSize = seekBool(fd, totalSize); // auto_scale
541
542         if is_higher_than([4 1 2 0] ) then
543             totalSize = seekInt(fd, totalSize); // hidden_axis_color
544             totalSize = seekString(fd, totalSize); // arc_drawing_method
545         end
546
547         totalSize = seekInt(fd, totalSize); // hidden_color
548         totalSize = seekBool(fd, totalSize); // line_mode
549         totalSize = seekBool(fd, totalSize); // line_style
550         totalSize = seekShort(fd, totalSize); // thickness
551         totalSize = seekBool(fd, totalSize); // mark_mode
552         totalSize = seekBool(fd, totalSize); // mark_style
553         totalSize = seekBool(fd, totalSize); // mark_size
554
555         if is_higher_than([3 0 0 0]) then
556             totalSize = seekBool(fd, totalSize); // mark_size_unit
557             totalSize = seekInt(fd, totalSize); // mark_foreground
558             totalSize = seekInt(fd, totalSize); // mark_background
559         end
560
561         totalSize = seekInt(fd, totalSize); // foreground
562         totalSize = seekInt(fd, totalSize); // background
563         [totalSize, clip] = readString(fd, totalSize); // clip_state
564         if clip == "on" then
565             totalSize = seekDoubleCount(fd, 4, totalSize); // clip_box
566         end
567
568         global parentAxesView;
569         parentAxesView = view;
570         [totalSize, axesCount] = readInt(fd, totalSize); // children
571         for i = 1 : axesCount
572             totalSize = getSingleHandleInfo(fd, totalSize);
573         end
574         clearglobal parentAxesView;
575         totalSize = seekUserdata(fd, totalSize); // Userdata
576
577     case "Polyline"
578         totalSize = seekBool(fd, totalSize); // visible
579         [totalSize, dataCount] = readIntCount(fd, 2, totalSize); // data count
580         totalSize = seekDoubleCount(fd, prod(dataCount), totalSize); // data
581         if is_higher_than([3 1 0 0]) then
582             totalSize = seekBool(fd, totalSize); // closed
583         end
584
585         totalSize = seekBool(fd, totalSize); // line_mode
586         if is_higher_than([3 1 0 0]) then
587             totalSize = seekBool(fd, totalSize); // fill_mode
588         end
589
590         totalSize = seekBool(fd, totalSize); // line_style
591         totalSize = seekShort(fd, totalSize); // thickness
592         if is_higher_than([3 1 0 1]) then
593             totalSize = seekShort(fd, totalSize); // arrow_size_factor
594         end
595
596         totalSize = seekBool(fd, totalSize); // polyline_style
597
598         if is_higher_than([3 1 0 1] ) then
599             [totalSize, count] = readShort(fd, totalSize); // interp_color_vector size
600             totalSize = seekDoubleCount(fd, count, totalSize); // interp_color_vector
601             totalSize = seekBool(fd, totalSize); // interp_color_mode
602         end
603
604         totalSize = seekBool(fd, totalSize); // mark_mode
605         totalSize = seekBool(fd, totalSize); // mark_style
606         totalSize = seekBool(fd, totalSize); // mark_size
607
608         if is_higher_than([3 0 0 0]) then
609             totalSize = seekBool(fd, totalSize); // mark_size_unit
610         end
611
612         totalSize = seekInt(fd, totalSize); // foreground
613         if is_higher_than([3 1 0 0]) then
614             totalSize = seekInt(fd, totalSize); // background
615         end
616
617         if is_higher_than([3 0 0 0]) then
618             totalSize = seekInt(fd, totalSize); // mark_foreground
619             totalSize = seekInt(fd, totalSize); // mark_background
620         end
621
622         if is_higher_than([3 1 0 0]) then
623             [totalSize, count] = readShort(fd, totalSize); // x_shift count
624             totalSize = seekDoubleCount(fd, count, totalSize); // x_shift
625             [totalSize, count] = readShort(fd, totalSize); // y_shift count
626             totalSize = seekDoubleCount(fd, count, totalSize); // y_shift
627             [totalSize, count] = readShort(fd, totalSize); // z_shift count
628             totalSize = seekDoubleCount(fd, count, totalSize); // z_shift
629         end
630
631         if is_higher_than([3 1 0 1]) then
632             totalSize = seekDouble(fd, totalSize); // bar_width
633         end
634
635         //totalSize = seekMatrix(fd, totalSize); // datatips
636
637         [totalSize, state] = readString(fd, totalSize); // clip_state
638         if state == "on" then
639             totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
640         end
641
642         totalSize = seekUserdata(fd, totalSize); // Userdata
643
644     case "Plot3d"
645         totalSize = seekBool(fd, totalSize); // visible
646         totalSize = seekBool(fd, totalSize); // surface_mode
647         totalSize = seekInt(fd, totalSize); // foreground
648         totalSize = seekShort(fd, totalSize); // thickness
649         totalSize = seekBool(fd, totalSize); // mark_mode
650         totalSize = seekBool(fd, totalSize); // mark_style
651         totalSize = seekBool(fd, totalSize); // mark_size
652
653         if is_higher_than([3 0 0 0]) then
654             totalSize = seekBool(fd, totalSize); // mark_size_unit
655             totalSize = seekInt(fd, totalSize); // mark_foreground
656             totalSize = seekInt(fd, totalSize); // mark_background
657         end
658
659         if is_higher_than([5 1 1 0]) then
660             totalSize = seekInt(fd, totalSize); // color_mode
661             [totalSize, flag] = readInt(fd, totalSize); // color_flag
662         else
663             totalSize = seekBool(fd, totalSize); // color_mode
664             [totalSize, flag] = readBool(fd, totalSize); // color_flag
665         end
666
667         //data
668         totalSize = seekDoubleMatrix(fd, totalSize); // x
669         totalSize = seekDoubleMatrix(fd, totalSize); // y
670         totalSize = seekDoubleMatrix(fd, totalSize); // z
671
672         if or(flag == [2,5]) then
673             [totalSize, count] = readIntCount(fd, 2, totalSize); // color size
674             totalSize = seekIntCount(fd, prod(count), totalSize); // color
675         end
676
677         totalSize = seekInt(fd, totalSize); // hidden_color
678
679         if is_higher_than([4 1 2 0])
680             [totalSize, state] = readString(fd, totalSize); // clip_state
681             if state == "on" then
682                 totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
683             end
684         end
685
686         totalSize = seekUserdata(fd, totalSize); // Userdata
687
688     case "Fac3d"
689         totalSize = seekBool(fd, totalSize); // visible
690         totalSize = seekBool(fd, totalSize); // surface_mode
691         totalSize = seekInt(fd, totalSize); // foreground
692         totalSize = seekShort(fd, totalSize); // thickness
693         totalSize = seekBool(fd, totalSize); // mark_mode
694         totalSize = seekBool(fd, totalSize); // mark_style
695         totalSize = seekBool(fd, totalSize); // mark_size
696         if is_higher_than([3 0 0 0]) then
697             totalSize = seekBool(fd, totalSize); // mark_size_unit
698             totalSize = seekInt(fd, totalSize); // mark_foreground
699             totalSize = seekInt(fd, totalSize); // mark_background
700         end
701
702         if is_higher_than([5 1 1 0]) then
703             totalSize = seekInt(fd, totalSize); // color_mode
704             [totalSize, flag] = readInt(fd, totalSize); // color_flag
705         else
706             totalSize = seekBool(fd, totalSize); // color_mode
707             [totalSize, flag] = readBool(fd, totalSize); // color_flag
708         end
709
710         //data
711         totalSize = seekDoubleMatrix(fd, totalSize); // x
712         totalSize = seekDoubleMatrix(fd, totalSize); // y
713         totalSize = seekDoubleMatrix(fd, totalSize); // z
714
715         if is_higher_than([3 1 0 1]) & flag >= 2 then
716             [totalSize, count] = readIntCount(fd, 2, totalSize); // color size
717             totalSize = seekIntCount(fd, prod(count), totalSize); // color
718             totalSize = seekBool(fd, totalSize); // cdata_mapping
719         elseif or(flag==[2 5]) then
720             [totalSize, count] = readIntCount(fd, 2, totalSize); // color size
721             totalSize = seekIntCount(fd, prod(count), totalSize); // color
722         end
723
724         totalSize = seekInt(fd, totalSize); // color_mode
725
726         if is_higher_than([4 1 2 0])
727             [totalSize, state] = readString(fd, totalSize); // clip_state
728             if state == "on" then
729                 totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
730             end
731         end
732
733         totalSize = seekUserdata(fd, totalSize); // Userdata
734
735     case "Compound"
736         [totalSize, count] = readInt(fd, totalSize); // children count
737         for i = 1 : count
738             totalSize = getSingleHandleInfo(fd, totalSize); // children
739         end
740
741         if is_higher_than([3 1 0 1]) then
742             totalSize = readBool(fd, totalSize); // visible
743         end
744
745         totalSize = seekUserdata(fd, totalSize); // Userdata
746
747     case "Agregation"
748         [totalSize, count] = readInt(fd, totalSize); // children count
749         for i = 1 : count
750             totalSize = getSingleHandleInfo(fd, totalSize); // children
751         end
752
753         if is_higher_than([3 1 0 1]) then
754             totalSize = readBool(fd, totalSize); // visible
755         end
756
757         totalSize = seekUserdata(fd, totalSize); // Userdata
758
759     case "Rectangle"
760         totalSize = seekBool(fd, totalSize); // visible
761         totalSize = seekShort(fd, totalSize); // thickness
762         totalSize = seekBool(fd, totalSize); // mark_mode
763         totalSize = seekBool(fd, totalSize); // mark_style
764         totalSize = seekBool(fd, totalSize); // mark_size
765
766         if is_higher_than([3 0 0 0]) then
767             totalSize = seekBool(fd, totalSize); // mark_size_unit
768         end
769
770         totalSize = seekInt(fd, totalSize); // mark_foreground
771         totalSize = seekInt(fd, totalSize); // mark_background
772         totalSize = seekBool(fd, totalSize); // line_mode
773         totalSize = seekBool(fd, totalSize); // line_style
774         totalSize = seekBool(fd, totalSize); // fill_mode
775         totalSize = seekInt(fd, totalSize); // foreground
776
777         if is_higher_than([3 1 0 1]) then
778             totalSize = seekInt(fd, totalSize); // background
779         end
780
781         if (is_higher_than([5 0 3 0])) then
782             totalSize = seekMatrix(fd, totalSize); // data
783         else
784             global parentAxesView;
785             if parentAxesView == [] | parentAxesView == "2d" then
786                 totalSize = seekDoubleCount(fd, 4, totalSize); //data
787             else
788                 totalSize = seekDoubleCount(fd, 5, totalSize); //data
789             end
790         end
791
792         [totalSize, state] = readString(fd, totalSize); // clip_state
793         if state == "on" then
794             totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
795         end
796
797         totalSize = seekUserdata(fd, totalSize); // Userdata
798
799     case "Arc"
800         totalSize = seekBool(fd, totalSize); // visible
801         totalSize = seekShort(fd, totalSize); // thickness
802         totalSize = seekBool(fd, totalSize); // line_style
803
804         if is_higher_than([3 1 0 1])
805             totalSize = seekBool(fd, totalSize); // line_mode
806         end
807
808         totalSize = seekBool(fd, totalSize); // fill_mode
809         totalSize = seekInt(fd, totalSize); // foreground
810
811         if is_higher_than([3 1 0 1]) then
812             totalSize = seekInt(fd, totalSize); // background
813         end
814
815         if is_higher_than([5 0 3 0]) then
816             totalSize = seekMatrix(fd, totalSize); // data
817         else
818             global parentAxesView;
819             if parentAxesView == [] | parentAxesView == "2d" then
820                 totalSize = seekDoubleCount(fd, 6, totalSize); //data
821             else
822                 totalSize = seekDoubleCount(fd, 7, totalSize); //data
823             end
824         end
825
826         if is_higher_than([4 1 2 0]) then
827             totalSize = seekString(fd, totalSize); // data_mapping
828         end
829
830         [totalSize, state] = readString(fd, totalSize); // clip_state
831         if state == "on" then
832             totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
833         end
834
835         totalSize = seekUserdata(fd, totalSize); // Userdata
836
837     case "Champ"
838         totalSize = seekBool(fd, totalSize); // visible
839         totalSize = seekDoubleMatrix(fd, totalSize); // x
840         totalSize = seekDoubleMatrix(fd, totalSize); // y
841         totalSize = seekDoubleMatrix(fd, totalSize); // fx
842         totalSize = seekDoubleMatrix(fd, totalSize); // fy
843         totalSize = seekBool(fd, totalSize); // line_style
844         totalSize = seekShort(fd, totalSize); // thickness
845         totalSize = seekBool(fd, totalSize); // colored
846         totalSize = seekDouble(fd, totalSize); // arrow_size
847
848         [totalSize, state] = readString(fd, totalSize); // clip_state
849         if state == "on" then
850             totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
851         end
852
853         totalSize = seekUserdata(fd, totalSize); // Userdata
854
855     case "Segs"
856         totalSize = seekBool(fd, totalSize); // visible
857         totalSize = seekDoubleMatrix(fd, totalSize); // data
858         totalSize = seekBool(fd, totalSize); // line_mode
859         totalSize = seekBool(fd, totalSize); // line_style
860         totalSize = seekShort(fd, totalSize); // thickness
861         totalSize = seekDouble(fd, totalSize); // arrow_size
862         totalSize = seekIntInt(fd, totalSize); // segs_color
863         totalSize = seekBool(fd, totalSize); // mark_mode
864         totalSize = seekBool(fd, totalSize); // mark_style
865         totalSize = seekBool(fd, totalSize); // mark_size
866
867         if is_higher_than([3 0 0 0]) then
868             totalSize = seekBool(fd, totalSize); // mark_size_unit
869         end
870
871         totalSize = seekInt(fd, totalSize); // mark_foreground
872         totalSize = seekInt(fd, totalSize); // mark_background
873
874         [totalSize, state] = readString(fd, totalSize); // clip_state
875         if state == "on" then
876             totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
877         end
878
879         totalSize = seekUserdata(fd, totalSize); // Userdata
880
881     case "Grayplot"
882         totalSize = seekBool(fd, totalSize); // visible
883         if is_higher_than([3 0 0 0]) then
884             totalSize = seekDoubleMatrix(fd, totalSize); // x
885             totalSize = seekDoubleMatrix(fd, totalSize); // y
886             totalSize = seekDoubleMatrix(fd, totalSize); // z
887         else
888             totalSize = seekDoubleMatrix(fd, totalSize); // x,y,z
889         end
890
891         totalSize = seekString(fd, totalSize); // data_mapping
892         [totalSize, state] = readString(fd, totalSize); // clip_state
893         if state == "on" then
894             totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
895         end
896
897         totalSize = seekUserdata(fd, totalSize); // Userdata
898
899     case "Matplot"
900         totalSize = seekBool(fd, totalSize); // visible
901         totalSize = seekDoubleMatrix(fd, totalSize); // data
902
903         [totalSize, state] = readString(fd, totalSize); // clip_state
904         if state == "on" then
905             totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
906         end
907
908         totalSize = seekUserdata(fd, totalSize); // Userdata
909
910     case "Fec"
911         totalSize = seekBool(fd, totalSize); // visible
912         totalSize = seekDoubleMatrix(fd, totalSize); // data
913         totalSize = seekDoubleMatrix(fd, totalSize); // triangles
914         totalSize = seekDoubleCount(fd, 2, totalSize); // z_bounds
915         if is_higher_than( [5 0 3 0] ) then
916             totalSize = seekDoubleCount(fd, 2, totalSize); // color_range
917             totalSize = seekDoubleCount(fd, 2, totalSize); // outside_colors
918             totalSize = seekBool(fd, totalSize); // line_mode
919             totalSize = seekInt(fd, totalSize); // foreground
920         end
921
922         [totalSize, state] = readString(fd, totalSize); // clip_state
923         if state == "on" then
924             totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
925         end
926
927         totalSize = seekUserdata(fd, totalSize); // Userdata
928
929     case "Legend"
930         if is_higher_than( [5 0 0 0] ) then
931             totalSize = seekBool(fd, totalSize); // visible
932             totalSize = seekStringInt(fd, totalSize); // text
933             totalSize = seekBool(fd, totalSize); // font_style
934             totalSize = seekBool(fd, totalSize); // font_size
935             totalSize = seekInt(fd, totalSize); // font_color
936             totalSize = seekBool(fd, totalSize); // fractional_font
937             [totalSize, count] = readBool(fd, totalSize); // legends size
938             for i = 1 : count
939                 totalSize = seekIntInt(fd, totalSize); // legends
940             end
941
942             totalSize = seekString(fd, totalSize); // legend_location
943             totalSize = seekDoubleCount(fd, 2, totalSize); // position
944             totalSize = seekBool(fd, totalSize); // line_mode
945             totalSize = seekShort(fd, totalSize); // thickness
946             totalSize = seekInt(fd, totalSize); // foreground
947             totalSize = seekBool(fd, totalSize); // fill_mode
948             totalSize = seekInt(fd, totalSize); // background
949
950             [totalSize, state] = readString(fd, totalSize); // clip_state
951             if state == "on" then
952                 totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
953             end
954
955             totalSize = seekUserdata(fd, totalSize); // Userdata
956         else
957             totalSize = seekBool(fd, totalSize); // visible
958             totalSize = seekBool(fd, totalSize); // line_mode
959             totalSize = seekBool(fd, totalSize); // mark_mode
960             totalSize = seekInt(fd, totalSize); // mark_foreground
961             totalSize = seekInt(fd, totalSize); // mark_background
962             totalSize = seekStringInt(fd, totalSize); // text
963             totalSize = seekInt(fd, totalSize); // foreground
964             totalSize = seekBool(fd, totalSize); // font_style
965             totalSize = seekBool(fd, totalSize); // font_size
966             if is_higher_than( [4 1 2 0] ) then
967                 totalSize = seekBool(fd, totalSize); // font_size
968             end
969
970             [totalSize, state] = readString(fd, totalSize); // clip_state
971             if state == "on" then
972                 totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
973             end
974         end
975
976     case "Text"
977         totalSize = seekBool(fd, totalSize); // visible
978         if is_higher_than([4 1 2 0]) then
979             totalSize = seekStringMatrix(fd, totalSize);
980         else
981             totalSize = seekStringInt(fd, totalSize);
982         end
983
984         [totalSize, count] = readBoolCount(fd, 2, totalSize); // data size
985         totalSize = seekDoubleCount(fd, prod(count), totalSize); // data
986         totalSize = seekDoubleCount(fd, 2, totalSize); // text_box
987         totalSize = seekString(fd, totalSize); // text_box_mode
988         totalSize = seekInt(fd, totalSize); // foreground
989         totalSize = seekBool(fd, totalSize); // font_style
990         totalSize = seekBool(fd, totalSize); // font_size
991         totalSize = seekDouble(fd, totalSize); // font_angle
992
993         if is_higher_than([3 1 0 1]) then
994             totalSize = seekBool(fd, totalSize); // box
995             totalSize = seekBool(fd, totalSize); // line_mode
996             totalSize = seekBool(fd, totalSize); // fill_mode
997             totalSize = seekInt(fd, totalSize); // font_foreground
998             totalSize = seekInt(fd, totalSize); // background
999         end
1000
1001         if is_higher_than( [4 1 2 0] ) then
1002             totalSize = seekString(fd, totalSize); // alignment
1003             totalSize = seekBool(fd, totalSize); // fractional_font
1004         end
1005
1006         [totalSize, state] = readString(fd, totalSize); // clip_state
1007         if state == "on" then
1008             totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
1009         end
1010
1011         totalSize = seekUserdata(fd, totalSize); // Userdata
1012
1013     case "Axis"
1014         if is_higher_than([3 1 0 0]) then
1015             totalSize = seekBool(fd, totalSize); // visible
1016             totalSize = seekBoolInt(fd, totalSize); // tics_direction
1017             totalSize = seekMatrix(fd, totalSize); // xtics_coord
1018             totalSize = seekMatrix(fd, totalSize); // ytics_coord
1019             totalSize = seekInt(fd, totalSize); // tics_color
1020             totalSize = seekBool(fd, totalSize); // tics_segment
1021             totalSize = seekBool(fd, totalSize); // tics_style
1022             totalSize = seekInt(fd, totalSize); // sub_tics
1023             totalSize = seekStringInt(fd, totalSize); // tics_label
1024             totalSize = seekInt(fd, totalSize); // label_font_size
1025             totalSize = seekInt(fd, totalSize); // labels_font_color
1026             if is_higher_than([5 4 0 1]) then
1027                 totalSize = seekInt(fd, totalSize); // labels_font_style
1028             end
1029
1030             if is_higher_than( [4 1 2 0] ) then
1031                 totalSize = seekBool(fd, totalSize); // fractional_font
1032             end
1033
1034             [totalSize, state] = readString(fd, totalSize); // clip_state
1035             if state == "on" then
1036                 totalSize = seekDoubleCount(fd, 4, totalSize); //clip_box
1037             end
1038
1039             totalSize = seekUserdata(fd, totalSize); // Userdata
1040         end
1041
1042     case "uimenu"
1043         if is_higher_than( [4 1 2 0] ) then
1044             totalSize = seekBool(fd, totalSize); // Enable
1045             totalSize = seekMatrix(fd, totalSize); // Foregroundcolor
1046             totalSize = seekString(fd, totalSize); // Label
1047             totalSize = seekBool(fd, totalSize); // Visible
1048             if is_higher_than([5 4 0 0]) then
1049                 totalSize = seekStringInt(fd, totalSize); // Callback
1050             else
1051                 totalSize = seekString(fd, totalSize); // Callback
1052             end
1053             totalSize = seekInt(fd, totalSize); // Callback Type
1054             totalSize = seekString(fd, totalSize); // Tag
1055         end
1056
1057         if is_higher_than( [5 1 2 0] ) then
1058             totalSize = seekBool(fd, totalSize); // Checked
1059         end
1060
1061         if is_higher_than( [5 1 1 0] ) then
1062             [totalSize, axesCount] = readInt(fd, totalSize); // children
1063             for i = 1 : axesCount
1064                 totalSize = getSingleHandleInfo(fd, totalSize);
1065             end
1066         end
1067
1068     case "uicontextmenu"
1069         [totalSize, axesCount] = readInt(fd, totalSize); // children
1070         for i = 1 : axesCount
1071             totalSize = getSingleHandleInfo(fd, totalSize);
1072         end
1073     case "uicontrol"
1074         if is_higher_than( [4 1 2 0] ) then
1075             totalSize = seekString(fd, totalSize); // Style
1076             totalSize = seekMatrix(fd, totalSize); // BackgroundColor
1077             totalSize = seekBool(fd, totalSize); // Enable
1078             totalSize = seekString(fd, totalSize); // FontAngle
1079             totalSize = seekString(fd, totalSize); // FontName
1080             totalSize = seekDouble(fd, totalSize); // FontSize
1081             totalSize = seekString(fd, totalSize); // FontUnits
1082             totalSize = seekString(fd, totalSize); // FontWeight
1083             totalSize = seekMatrix(fd, totalSize); // ForegroundColor
1084             totalSize = seekString(fd, totalSize); // HorizontalAlignment
1085             totalSize = seekMatrix(fd, totalSize); // ListboxTop
1086             totalSize = seekDouble(fd, totalSize); // Max
1087             totalSize = seekDouble(fd, totalSize); // Min
1088             totalSize = seekMatrix(fd, totalSize); // Position
1089             totalSize = seekString(fd, totalSize); // Relief
1090             totalSize = seekMatrix(fd, totalSize); // SliderStep
1091             totalSize = seekStringMatrix(fd, totalSize); // String
1092             if is_higher_than( [5 2 0 0] ) then  // Added in 5.4.0 version
1093                 totalSize = seekStringMatrix(fd, totalSize); // TooltipString
1094             end
1095             totalSize = seekString(fd, totalSize); // Units
1096             totalSize = seekMatrix(fd, totalSize); // Value
1097             totalSize = seekString(fd, totalSize); // VerticalAlignment
1098             totalSize = seekBool(fd, totalSize); // Visible
1099             if is_higher_than([5 4 0 0]) then
1100                 totalSize = seekStringInt(fd, totalSize); // Callback
1101             else
1102                 totalSize = seekString(fd, totalSize); // Callback
1103             end
1104             totalSize = seekInt(fd, totalSize); // Callback Type
1105             totalSize = seekUserdata(fd, totalSize); // Userdata
1106             totalSize = seekString(fd, totalSize); // Tag
1107         end
1108     else
1109         warning("type " +typ+" unhandled");
1110     end
1111 endfunction
1112 //////////////////////////////////////////////////////////
1113 //read 1 "il" value
1114 function newSize = seekInt(fd, currentSize)
1115     data = mget(1, "il", fd);
1116     //disp("int : " + string(data));
1117     newSize = currentSize + 4;
1118 endfunction
1119
1120 //////////////////////////////////////////////////////////
1121 //read 1 "il" value
1122 function newSize = seekIntCount(fd, len, currentSize)
1123     data = mget(len, "il", fd);
1124     //disp("int : " + string(data));
1125     newSize = currentSize + 4 * len;
1126 endfunction
1127
1128 //////////////////////////////////////////////////////////
1129 //read 1 "il" value
1130 function newSize = seekIntMatrix(fd, currentSize)
1131     offset = mget(1, "c", fd);
1132     data = mget(offset, "il", fd);
1133     //disp("int[] : " + string(data));
1134     newSize = currentSize + 4 * offset + 1;
1135 endfunction
1136
1137 //////////////////////////////////////////////////////////
1138 //read 1 "il" value
1139 function newSize = seekIntInt(fd, currentSize)
1140     offset = mget(1, "il", fd);
1141     data = mget(offset, "il", fd);
1142     //disp("int[] : " + string(data));
1143     newSize = currentSize + 4 * offset + 4;
1144 endfunction
1145
1146 //////////////////////////////////////////////////////////
1147 //read 1 "il" value
1148 function [newSize, data] = readInt(fd, currentSize)
1149     data = mget(1, "il", fd);
1150     //disp("int : " + string(data));
1151     newSize = currentSize + 4;
1152 endfunction
1153
1154 //////////////////////////////////////////////////////////
1155 //read 1 "il" value
1156 function [newSize, data] = readIntCount(fd, len, currentSize)
1157     data = mget(len, "il", fd);
1158     //disp("int : " + string(data));
1159     newSize = currentSize + 4 * len;
1160 endfunction
1161
1162 //////////////////////////////////////////////////////////
1163 //read 1 "c" value
1164 function newSize = seekBool(fd, currentSize)
1165     data = mget(1, "c", fd);
1166     //disp("bool : " + string(data));
1167     newSize = currentSize + 1;
1168 endfunction
1169
1170 //////////////////////////////////////////////////////////
1171 //read 1 "c" value
1172 function [newSize, data] = readBool(fd, currentSize)
1173     data = mget(1, "c", fd);
1174     //disp("bool : " + string(data));
1175     newSize = currentSize + 1;
1176 endfunction
1177
1178 //////////////////////////////////////////////////////////
1179 //read 1 "c" value
1180 function newSize = seekBoolMatrix(fd, currentSize)
1181     offset = mget(1, "c", fd);
1182     data = mget(offset, "c", fd);
1183     //disp("bool : " + string(data));
1184     newSize = currentSize + offset + 1;
1185 endfunction
1186
1187 function newSize = seekBoolInt(fd, currentSize)
1188     offset = mget(1, "il", fd);
1189     data = mget(offset, "c", fd);
1190     //disp("bool : " + string(data));
1191     newSize = currentSize + offset + 4;
1192 endfunction
1193
1194 //////////////////////////////////////////////////////////
1195 //read 1 "c" value
1196 function [newSize, data] = readBoolCount(fd, len, currentSize)
1197     data = mget(len, "c", fd);
1198     //disp("bool : " + string(data));
1199     newSize = currentSize + len;
1200 endfunction
1201
1202 //////////////////////////////////////////////////////////
1203 //read 1 "c" value
1204 function newSize = seekDouble(fd, currentSize)
1205     data = mget(1, "dl", fd);
1206     //disp("double : " + string(data));
1207     newSize = currentSize + 8;
1208 endfunction
1209
1210 //////////////////////////////////////////////////////////
1211 //read 1 "c" value
1212 function newSize = seekDoubleCount(fd, len ,currentSize)
1213     data = mget(len, "dl", fd);
1214     //disp("bool : " + string(data));
1215     newSize = currentSize + len * 8;
1216 endfunction
1217
1218 //////////////////////////////////////////////////////////
1219 //read 1 "c" value
1220 function newSize = seekShort(fd, currentSize)
1221     data = mget(1, "sl", fd);
1222     //disp("short : " + string(data));
1223     newSize = currentSize + 2;
1224 endfunction
1225
1226 //////////////////////////////////////////////////////////
1227 //read 1 "c" value
1228 function [newSize, data] = readShort(fd, currentSize)
1229     data = mget(1, "sl", fd);
1230     //disp("short : " + string(data));
1231     newSize = currentSize + 2;
1232 endfunction
1233
1234 //////////////////////////////////////////////////////////
1235 //read 2 "c" value
1236 function newSize = seekShortCount(fd, len, currentSize)
1237     data = mget(len, "sl", fd);
1238     //disp("short : " + string(data));
1239     newSize = currentSize + len * 2;
1240 endfunction
1241
1242 //////////////////////////////////////////////////////////
1243 //read 1 "c" size + size * "c" value
1244 function newSize = seekString(fd, currentSize)
1245     offset = mget(1, "c", fd);
1246     data = mget(offset, "c", fd);
1247     //disp("string : " + ascii(data));
1248     newSize = currentSize + offset + 1;
1249 endfunction
1250
1251 //////////////////////////////////////////////////////////
1252 //read 1 "c" size + size * "c" value
1253 function newSize = seekStringInt(fd, currentSize)
1254     offset = mget(1, "il", fd);
1255     data = mget(offset, "c", fd);
1256     //disp("string : " + ascii(data));
1257     newSize = currentSize + offset + 4;
1258 endfunction
1259
1260 //////////////////////////////////////////////////////////
1261 //read 1 "c" size + size * "c" value
1262 function newSize = seekStringCount(fd, len, currentSize)
1263     data = mget(len, "c", fd);
1264     //disp("string : " + ascii(data));
1265     newSize = currentSize + len;
1266 endfunction
1267
1268 //////////////////////////////////////////////////////////
1269 //read 1 "c" size + size * "c" value
1270 function newSize = seekStringMatrix(fd, currentSize)
1271     row = mget(1, "il", fd);
1272     col = mget(1, "il", fd);
1273     for i = 1 : row * col
1274         if is_higher_than([5 4 0 0])
1275             currentSize = seekStringInt(fd, currentSize); // String
1276         else
1277             currentSize = seekString(fd, currentSize); // String
1278         end
1279     end
1280     newSize = currentSize + 4 * 2;
1281 endfunction
1282
1283 //////////////////////////////////////////////////////////
1284 //read 1 "il" size + size * "dl" value
1285 function newSize = seekMatrix(fd, currentSize)
1286     offset = mget(1, "il", fd);
1287     data = mget(offset, "dl", fd);
1288     //disp("double : " + string(data));
1289     newSize = currentSize + offset * 8 + 4;
1290 endfunction
1291
1292 //////////////////////////////////////////////////////////
1293 //read 1 "il" size + size * "dl" value
1294 function newSize = seekMatrixCount(fd, len, currentSize)
1295     data = mget(len, "dl", fd);
1296     //disp("double : " + string(data));
1297     newSize = currentSize + len * 8;
1298 endfunction
1299
1300 //////////////////////////////////////////////////////////
1301 //read 1 "c" size + size * "c" value
1302 function newSize = seekDoubleMatrix(fd, currentSize)
1303     row = mget(1, "il", fd);
1304     col = mget(1, "il", fd);
1305     currentSize = seekDoubleCount(fd, row * col, currentSize);
1306     newSize = currentSize + 4 * 2;
1307 endfunction
1308
1309 //////////////////////////////////////////////////////////
1310 //read user_data
1311 function newSize = seekUserdata(fd, currentSize)
1312     mget(24, "c", fd);
1313     newSize = currentSize + 24;
1314     [typ,dim,vol] = listnextvar(fd); // Userdata
1315     newSize = newSize + vol;
1316 endfunction
1317
1318 //////////////////////////////////////////////////////////
1319 //read 1 "il" value
1320 function [newSize, data] = readString(fd, currentSize)
1321     offset = mget(1, "c", fd);
1322     data = ascii(mget(offset, "c", fd));
1323     //disp("string : " + data);
1324     newSize = currentSize + offset + 1;
1325 endfunction
1326
1327 //////////////////////////////////////////////////////////
1328 //read 1 "il" value
1329 function [newSize, data] = readStringCount(fd, len, currentSize)
1330     data = ascii(mget(len, "c", fd));
1331     //disp("string : " + data);
1332     newSize = currentSize + len;
1333 endfunction
1334 //////////////////////////////////////////////////////////
1335 function v=code2var(id)
1336     nsiz=6
1337     i1=1
1338     for l=1:nsiz
1339         idl=id(l)
1340         for i=i1:i1+3
1341             k=int((idl+128)/256)
1342             if k<0 then k=k-1,end
1343             ch=idl-256*k
1344             if ch==40 then
1345                 n=i-1
1346                 v=_code2str(str)
1347                 return
1348             end
1349             idl=k
1350             str(i)=ch
1351         end
1352         i1=i1+4
1353         v=_code2str(str)
1354     end
1355 endfunction
1356
1357 function r=is_higher_than(v)
1358     //check if current version is strictly higher than the given one
1359     r=%f
1360     for k=1:4
1361         if version(k)>v(k) then r=%t,break,end
1362         if version(k)<v(k) then r=%f,break,end
1363     end
1364 endfunction