forked from sparklemotion/nokogiri
/
xml_node_set.rb
53 lines (40 loc) · 1.11 KB
/
xml_node_set.rb
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
module Nokogiri
module LibXML # :nodoc:
module XmlNodeSetMixin # :nodoc:
def self.included(base)
base.class_eval do
layout(
:nodeNr, :int,
:nodeMax, :int,
:nodeTab, :pointer
)
end
end
def document
p = self[:doc]
p.null? ? nil : LibXML::XmlDocumentCast.new(p)
end
def nodeAt(index)
self[:nodeTab].get_pointer(LibXML.pointer_offset(index))
end
def nodeTab
self[:nodeTab].null? ? [] : self[:nodeTab].read_array_of_pointer(self[:nodeNr])
end
def nodeTab=(array)
# TODO: do we need to check nodeMax and allocate more memory? probably.
self[:nodeTab].write_array_of_pointer(array)
end
end
class XmlNodeSet < FFI::ManagedStruct # :nodoc:
include XmlNodeSetMixin
def self.release ptr
ns = XmlNodeSetCast.new(ptr)
LibXML.xmlFree ns[:nodeTab] if ns[:nodeTab]
LibXML.xmlFree ptr
end
end
class XmlNodeSetCast < FFI::Struct # :nodoc:
include XmlNodeSetMixin
end
end
end