source: XMLF90/src/dom/m_dom_namednodemap.f90 @ 6

Last change on this file since 6 was 6, checked in by ymipsl, 15 years ago

Import des sources XMLF90

File size: 5.0 KB
Line 
1module m_dom_namednodemap
2!
3! This is basically a dictionary module, but written with the
4! DOM node structure in mind.
5!
6use m_dom_types
7use m_strings
8
9private
10  !------------------------------------------------------- 
11  ! METHODS FOR NAMEDNODEMAPS
12  !-------------------------------------------------------   
13  public :: getNamedItem
14  public :: setNamedItem
15  public :: removeNamedItem
16
17  public :: item
18  public :: getLength
19  public :: append
20
21  interface append
22     module procedure append_nnm
23  end interface
24
25  interface item
26     module procedure item_nnm
27  end interface
28
29  interface getLength
30     module procedure getLength_nnm
31  end interface
32
33CONTAINS
34
35  function item_nnm(namedNodeMap, i)
36   
37    integer, intent(in)             :: i
38    type(fnamedNodeMap), pointer    :: namedNodeMap
39    type(fnode), pointer            :: item_nnm
40   
41    type(fnamedNode), pointer :: nnp
42
43    integer :: n
44
45    item_nnm => null()            ! In case there is no such item
46    if (.not. associated(namedNodeMap)) RETURN
47
48    nnp => namedNodeMap%head
49    n = -1
50    do
51       if (.not. associated(nnp))  exit
52       n = n + 1
53       if (n == i) then
54          item_nnm => nnp%node
55          exit
56       endif
57       nnp => nnp%next
58    enddo
59
60  end function item_nnm
61
62  !-----------------------------------------------------------
63 
64  function getLength_nnm(namedNodeMap)
65 
66    type(fnamedNodeMap), pointer :: namedNodeMap
67    integer :: getLength_nnm
68
69    getLength_nnm = 0
70    if (.not. associated(namedNodeMap)) return
71
72    getLength_nnm = namedNodeMap % length   
73   
74  end function getLength_nnm
75
76  !-----------------------------------------------------------
77
78
79  subroutine append_nnm(nodeMap,node)
80    type(fnamednodeMap), pointer :: nodeMap
81    type(fnode), pointer :: node
82
83    if (.not. associated(nodeMap)) then
84       allocate(nodeMap)
85       nodeMap%length = 1
86       allocate(nodeMap%head)
87       nodeMap%head%name = node%nodeName
88       nodeMap%head%node => node
89       nodeMap%tail => nodeMap%head
90    else
91       allocate(nodeMap%tail%next)
92       nodeMap%tail%next%node => node
93       nodeMap%tail%next%name =  node%nodeName
94       nodeMap%tail => nodeMap%tail%next
95       nodeMap%length = nodeMap%length + 1
96    endif
97
98  end subroutine append_nnm
99
100  !-----------------------------------------------------------
101
102  function getNamedItem(namedNodeMap, name)
103   
104    type(fnamedNodeMap), pointer    :: namedNodeMap
105    character(len=*), intent(in)    :: name
106    type(fnode), pointer            :: getNamedItem
107
108    type(fnamedNode), pointer :: nnp
109
110    getNamedItem => null()
111    if (.not. associated(namedNodeMap)) return
112
113    nnp => namedNodeMap%head
114    do while (associated(nnp)) 
115       if (nnp%name == name) then
116          getNamedItem => nnp%node
117          exit                 ! one or zero nodes with a given name
118       endif
119       nnp => nnp%next
120    enddo
121
122  end function getNamedItem
123
124 
125  function setNamedItem(namedNodeMap, node)
126
127!!AG: Do we need to clone the node ?
128   
129    type(fnamedNodeMap), pointer    :: namedNodeMap
130    type(fnode), pointer            :: node
131    type(fnode), pointer            :: setNamedItem
132
133    type(fnamedNode), pointer :: nnp
134
135    if (.not. associated(namedNodeMap)) then
136
137       call append(namedNodeMap,node)
138       setNamedItem => node
139     
140    else
141
142       nnp => namedNodeMap%head
143       do while (associated(nnp)) 
144          if (nnp%name == node%nodeName) then
145             setNamedItem => nnp%node
146             nnp%node => node
147             setNamedItem => node
148             return
149          endif
150          nnp => nnp%next
151       enddo
152
153       !   If not found, insert it at the end of the linked list
154
155       call append(namedNodeMap,node)
156       setNamedItem => node
157    endif
158
159  end function setNamedItem
160
161!------------------------------------------------------------
162   function removeNamedItem(namedNodeMap, name)
163   
164    type(fnamedNodeMap), pointer   :: namedNodeMap
165    character(len=*), intent(in)   :: name
166    type(fnode), pointer           :: removeNamedItem
167
168    type(fnamedNode), pointer :: nnp, previous
169
170    removeNamedItem => null()
171    if (.not. associated(namedNodeMap)) return 
172
173    previous => null()
174    nnp => namedNodeMap%head
175    do while (associated(nnp)) 
176       if (nnp%name == name) then
177          removeNamedItem => nnp%node
178          if (associated(nnp,namedNodeMap%head)) then
179             ! we remove the first fnamedNode in the chain...
180             namedNodeMap%head => nnp%next
181          else if (.not. associated(nnp%next)) then
182             ! we remove the last fnamedNode in the chain
183             previous%next => null()
184             namedNodeMap%tail => previous
185          else
186             ! we remove a link in the middle of the chain
187             previous%next => nnp%next
188          endif
189          namedNodeMap%length =  namedNodeMap%length - 1
190          call unstring(nnp%name)
191          deallocate(nnp)
192          EXIT                 ! one or zero nodes with a given name
193       endif
194       previous => nnp
195       nnp => nnp%next
196    enddo
197
198  end function removeNamedItem
199
200
201
202end module m_dom_namednodemap
203
Note: See TracBrowser for help on using the repository browser.