File: generic_i_h.sci

package info (click to toggle)
scilab 5.2.2-9
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 334,832 kB
  • ctags: 52,586
  • sloc: xml: 526,945; ansic: 223,590; fortran: 163,080; java: 56,934; cpp: 33,840; tcl: 27,936; sh: 20,397; makefile: 9,908; ml: 9,451; perl: 1,323; cs: 614; lisp: 30
file content (69 lines) | stat: -rw-r--r-- 1,648 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) INRIA
// 
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at    
// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt

function h=generic_i_h(i,v,h)
  hsave=h
//  if v==[] then error('Field property cannot be []'),end
  if type(i)==10 then set(h,i,v),return,end
  if type(i)<>15 then  error('Invalid path'),end

  if and(type(i($))<>[1 2 4 8 129 15]) then
    i($+1)=: 
  end
  n=lstsize(i)
  hdl=h;hind=[]
  for k=1:lstsize(i)// walk down in the handle tree
    p=i(k)
    lasthandle=hdl,
    if type(p)==10 then
      hdl=get(hdl,p),
    elseif or(type(p)==[1 2 4 8 129]) then
      hdl=hdl(p)
    elseif type(p)==15 then
      hdl=hdl(p(:))
    else
      error('Invalid path')
    end
    
    if type(hdl)<>9 then //a leaf found
      property=hdl
      hdl=lasthandle
      hind=p
      if (k+1)==size(i) then
	index=i($)
      else
	index=list(i(k+1:$))
      end
      break
    end
  end
  if hind<>[] then // a property found
    if type(index)==15 & and(type(property)<>[15 16 17]) then
      property(index(:))=v
    else
      if or(size(index)<>[-1 -1]) then
	property(index)=v
      else
	property=v
      end
    end
    if size(hdl,'*')==1 then //a single handle
      hdl(hind)=property
    else //mutiple handle 
      np=size(hdl,'*')
      for k=1:np
	h=hdl(k);h(hind)=property
      end
      
    end
  else
    error('Invalid path')
  end
 h= hsave
endfunction