@@ -99,6 +99,17 @@ impl<'a> Tags<'a> {
9999 self . file_index ( ) ,
100100 ) )
101101 }
102+ // caller must ensure in FDT_PROP context. returns (val, prop_name).
103+ #[ inline]
104+ fn read_tag_prop ( & mut self ) -> Result < ( & ' a [ u8 ] , & ' a [ u8 ] ) > {
105+ let val_size = self . read_cur_u32 ( ) ?;
106+ let name_offset = self . read_cur_u32 ( ) ?;
107+ // get value slice
108+ let val = self . read_slice_align ( val_size) ?;
109+ // lookup name in strings table
110+ let prop_name = self . read_table_string ( name_offset) ?;
111+ Ok ( ( val, prop_name) )
112+ }
102113}
103114
104115impl < ' a > Iterator for Tags < ' a > {
@@ -114,40 +125,18 @@ impl<'a> Iterator for Tags<'a> {
114125 let ans = loop {
115126 match self . read_cur_u32 ( ) {
116127 // begin of structure tag
117- Ok ( FDT_BEGIN_NODE ) => break Some ( self . read_string0_align ( ) . map ( Tag :: Begin ) ) ,
118- Ok ( FDT_PROP ) => {
119- let val_size = match self . read_cur_u32 ( ) {
120- Ok ( v) => v,
121- Err ( e) => break Some ( Err ( e) ) ,
122- } ;
123- let name_offset = match self . read_cur_u32 ( ) {
124- Ok ( v) => v,
125- Err ( e) => break Some ( Err ( e) ) ,
126- } ;
127- // get value slice
128- let val = match self . read_slice_align ( val_size) {
129- Ok ( slice) => slice,
130- Err ( e) => break Some ( Err ( e) ) ,
131- } ;
132-
133- // lookup name in strings table
134- let prop_name = match self . read_table_string ( name_offset) {
135- Ok ( slice) => slice,
136- Err ( e) => break Some ( Err ( e) ) ,
137- } ;
138- break Some ( Ok ( Tag :: Prop ( val, prop_name) ) ) ;
139- }
140- Ok ( FDT_END_NODE ) => break Some ( Ok ( Tag :: End ) ) ,
128+ Ok ( FDT_BEGIN_NODE ) => break self . read_string0_align ( ) . map ( Tag :: Begin ) ,
129+ Ok ( FDT_PROP ) => break self . read_tag_prop ( ) . map ( |( a, b) | Tag :: Prop ( a, b) ) ,
130+ Ok ( FDT_END_NODE ) => break Ok ( Tag :: End ) ,
141131 Ok ( FDT_NOP ) => self . cur += 4 ,
142- Ok ( FDT_END ) => break None ,
143- Ok ( invalid) => break Some ( Err ( Error :: invalid_tag_id ( invalid, self . file_index ( ) ) ) ) ,
144- Err ( e) => break Some ( Err ( e) ) ,
132+ Ok ( FDT_END ) => return None ,
133+ Ok ( invalid) => break Err ( Error :: invalid_tag_id ( invalid, self . file_index ( ) ) ) ,
134+ Err ( e) => break Err ( e) ,
145135 }
146136 } ;
147137 match ans {
148- Some ( Ok ( tag) ) => Some ( Ok ( ( tag, self . file_index ( ) ) ) ) ,
149- Some ( Err ( e) ) => Some ( Err ( e) ) ,
150- None => None ,
138+ Ok ( tag) => Some ( Ok ( ( tag, self . file_index ( ) ) ) ) ,
139+ Err ( e) => Some ( Err ( e) ) ,
151140 }
152141 }
153142}
0 commit comments