@@ -222,33 +222,55 @@ void kabi_read_rules(int fd)
222222 check (elf_end (elf ));
223223}
224224
225- bool kabi_is_declonly (const char * fqn )
225+ static char * get_enumerator_target (const char * fqn , const char * field )
226+ {
227+ char * target = NULL ;
228+
229+ if (asprintf (& target , "%s %s" , fqn , field ) < 0 )
230+ error ("asprintf failed for '%s %s'" , fqn , field );
231+
232+ return target ;
233+ }
234+
235+ static struct rule * find_rule (enum kabi_rule_type type , const char * target )
226236{
227237 struct rule * rule ;
228238
229239 if (!stable )
230- return false ;
231- if (!fqn || !* fqn )
232- return false ;
240+ return NULL ;
241+ if (!target || !* target )
242+ return NULL ;
233243
234244 hash_for_each_possible (rules , rule , hash ,
235- rule_values_hash (KABI_RULE_TYPE_DECLONLY , fqn )) {
236- if (rule -> type == KABI_RULE_TYPE_DECLONLY &&
237- !strcmp (fqn , rule -> target ))
238- return true;
245+ rule_values_hash (type , target )) {
246+ if (rule -> type == type && !strcmp (target , rule -> target ))
247+ return rule ;
239248 }
240249
241- return false ;
250+ return NULL ;
242251}
243252
244- static char * get_enumerator_target (const char * fqn , const char * field )
253+ static struct rule * find_enumerator_rule (enum kabi_rule_type type ,
254+ const char * fqn , const char * field )
245255{
246- char * target = NULL ;
256+ struct rule * rule ;
257+ char * target ;
247258
248- if (asprintf (& target , "%s %s" , fqn , field ) < 0 )
249- error ("asprintf failed for '%s %s'" , fqn , field );
259+ if (!stable )
260+ return NULL ;
261+ if (!fqn || !* fqn || !field || !* field )
262+ return NULL ;
250263
251- return target ;
264+ target = get_enumerator_target (fqn , field );
265+ rule = find_rule (type , target );
266+
267+ free (target );
268+ return rule ;
269+ }
270+
271+ bool kabi_is_declonly (const char * fqn )
272+ {
273+ return !!find_rule (KABI_RULE_TYPE_DECLONLY , fqn );
252274}
253275
254276static unsigned long get_ulong_value (const char * value )
@@ -267,58 +289,23 @@ static unsigned long get_ulong_value(const char *value)
267289
268290bool kabi_is_enumerator_ignored (const char * fqn , const char * field )
269291{
270- bool match = false;
271- struct rule * rule ;
272- char * target ;
273-
274- if (!stable )
275- return false;
276- if (!fqn || !* fqn || !field || !* field )
277- return false;
278-
279- target = get_enumerator_target (fqn , field );
280-
281- hash_for_each_possible (
282- rules , rule , hash ,
283- rule_values_hash (KABI_RULE_TYPE_ENUMERATOR_IGNORE , target )) {
284- if (rule -> type == KABI_RULE_TYPE_ENUMERATOR_IGNORE &&
285- !strcmp (target , rule -> target )) {
286- match = true;
287- break ;
288- }
289- }
290-
291- free (target );
292- return match ;
292+ return !!find_enumerator_rule (KABI_RULE_TYPE_ENUMERATOR_IGNORE , fqn ,
293+ field );
293294}
294295
295296bool kabi_get_enumerator_value (const char * fqn , const char * field ,
296297 unsigned long * value )
297298{
298- bool match = false;
299299 struct rule * rule ;
300- char * target ;
301300
302- if (!stable )
303- return false;
304- if (!fqn || !* fqn || !field || !* field )
305- return false;
306-
307- target = get_enumerator_target (fqn , field );
308-
309- hash_for_each_possible (rules , rule , hash ,
310- rule_values_hash (KABI_RULE_TYPE_ENUMERATOR_VALUE ,
311- target )) {
312- if (rule -> type == KABI_RULE_TYPE_ENUMERATOR_VALUE &&
313- !strcmp (target , rule -> target )) {
314- * value = get_ulong_value (rule -> value );
315- match = true;
316- break ;
317- }
301+ rule = find_enumerator_rule (KABI_RULE_TYPE_ENUMERATOR_VALUE , fqn ,
302+ field );
303+ if (rule ) {
304+ * value = get_ulong_value (rule -> value );
305+ return true;
318306 }
319307
320- free (target );
321- return match ;
308+ return false;
322309}
323310
324311void kabi_free (void )
0 commit comments