lib/hashtable.c: create helper for calling env_entry::callback
authorRasmus Villemoes <rasmus.villemoes@prevas.dk>
Thu, 27 Feb 2020 13:56:11 +0000 (13:56 +0000)
committerTom Rini <trini@konsulko.com>
Fri, 24 Apr 2020 14:09:59 +0000 (10:09 -0400)
This is preparation for compiling out the "call the callback" code and
associated error handling for SPL, where ->callback is always NULL.

Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
Reviewed-by: Simon Glass <sjg@chromium.org>
lib/hashtable.c

index 907e8a642f37e4b4871a949fb32ce5dd97623e90..574ec6af8653dea2d9104367293e43979974cda0 100644 (file)
@@ -222,6 +222,15 @@ int hmatch_r(const char *match, int last_idx, struct env_entry **retval,
        return 0;
 }
 
+static int
+do_callback(const struct env_entry *e, const char *name, const char *value,
+           enum env_op op, int flags)
+{
+       if (e->callback)
+               return e->callback(name, value, op, flags);
+       return 0;
+}
+
 /*
  * Compare an existing entry with the desired key, and overwrite if the action
  * is ENV_ENTER.  This is simply a helper function for hsearch_r().
@@ -247,9 +256,8 @@ static inline int _compare_and_overwrite_entry(struct env_entry item,
                        }
 
                        /* If there is a callback, call it */
-                       if (htab->table[idx].entry.callback &&
-                           htab->table[idx].entry.callback(item.key,
-                           item.data, env_op_overwrite, flag)) {
+                       if (do_callback(&htab->table[idx].entry, item.key,
+                                       item.data, env_op_overwrite, flag)) {
                                debug("callback() rejected setting variable "
                                        "%s, skipping it!\n", item.key);
                                __set_errno(EINVAL);
@@ -402,9 +410,8 @@ int hsearch_r(struct env_entry item, enum env_action action,
                }
 
                /* If there is a callback, call it */
-               if (htab->table[idx].entry.callback &&
-                   htab->table[idx].entry.callback(item.key, item.data,
-                   env_op_create, flag)) {
+               if (do_callback(&htab->table[idx].entry, item.key, item.data,
+                               env_op_create, flag)) {
                        debug("callback() rejected setting variable "
                                "%s, skipping it!\n", item.key);
                        _hdelete(item.key, htab, &htab->table[idx].entry, idx);
@@ -473,8 +480,8 @@ int hdelete_r(const char *key, struct hsearch_data *htab, int flag)
        }
 
        /* If there is a callback, call it */
-       if (htab->table[idx].entry.callback &&
-           htab->table[idx].entry.callback(key, NULL, env_op_delete, flag)) {
+       if (do_callback(&htab->table[idx].entry, key, NULL,
+                       env_op_delete, flag)) {
                debug("callback() rejected deleting variable "
                        "%s, skipping it!\n", key);
                __set_errno(EINVAL);