@@ -222,33 +222,55 @@ void kabi_read_rules(int fd)
222
222
check (elf_end (elf ));
223
223
}
224
224
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 )
226
236
{
227
237
struct rule * rule ;
228
238
229
239
if (!stable )
230
- return false ;
231
- if (!fqn || !* fqn )
232
- return false ;
240
+ return NULL ;
241
+ if (!target || !* target )
242
+ return NULL ;
233
243
234
244
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 ;
239
248
}
240
249
241
- return false ;
250
+ return NULL ;
242
251
}
243
252
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 )
245
255
{
246
- char * target = NULL ;
256
+ struct rule * rule ;
257
+ char * target ;
247
258
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 ;
250
263
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 );
252
274
}
253
275
254
276
static unsigned long get_ulong_value (const char * value )
@@ -267,58 +289,23 @@ static unsigned long get_ulong_value(const char *value)
267
289
268
290
bool kabi_is_enumerator_ignored (const char * fqn , const char * field )
269
291
{
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 );
293
294
}
294
295
295
296
bool kabi_get_enumerator_value (const char * fqn , const char * field ,
296
297
unsigned long * value )
297
298
{
298
- bool match = false;
299
299
struct rule * rule ;
300
- char * target ;
301
300
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;
318
306
}
319
307
320
- free (target );
321
- return match ;
308
+ return false;
322
309
}
323
310
324
311
void kabi_free (void )
0 commit comments