]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[key-file] Add foreach function to access all stored values
authorCharlie Brej <cbrej@cs.man.ac.uk>
Tue, 20 Apr 2010 20:07:58 +0000 (21:07 +0100)
committerCharlie Brej <cbrej@cs.man.ac.uk>
Tue, 20 Apr 2010 20:07:58 +0000 (21:07 +0100)
Supplying a callback function, you can get each group/key/value triple. Allows
accessing values in the key file for which you may not know the keys.

src/libply/ply-key-file.c
src/libply/ply-key-file.h

index f36b229d68d33c16766ea40cc4d8e0e50d77dfde..3b7ee383bc506761de8cee0ebca75b97a23d941f 100644 (file)
@@ -60,6 +60,13 @@ struct _ply_key_file
   ply_hashtable_t *groups;
 };
 
+typedef struct
+{
+  ply_key_file_foreach_func_t *func;
+  void                        *user_data;
+  char                        *group_name;
+} ply_key_file_foreach_func_data_t;
+
 static bool ply_key_file_open_file (ply_key_file_t *key_file);
 static void ply_key_file_close_file (ply_key_file_t *key_file);
 
@@ -357,4 +364,52 @@ ply_key_file_get_value (ply_key_file_t *key_file,
   return strdup (entry->value);
 }
 
+static void
+ply_key_file_foreach_entry_entries (void *key,
+                                    void *data,
+                                    void *user_data)
+{
+  ply_key_file_entry_t *entry;
+  ply_key_file_foreach_func_data_t *func_data;
+
+  func_data = user_data;
+  entry = data;
+
+  func_data->func(func_data->group_name,
+                  entry->key,
+                  entry->value,
+                  func_data->user_data);
+}
+
+static void
+ply_key_file_foreach_entry_groups (void *key,
+                                   void *data,
+                                   void *user_data)
+{
+  ply_key_file_group_t *group;
+  ply_key_file_foreach_func_data_t *func_data;
+
+  func_data = user_data;
+  group = data;
+  func_data->group_name = group->name;
+
+  ply_hashtable_foreach (group->entries,
+                         ply_key_file_foreach_entry_entries,
+                         func_data);
+}
+
+void
+ply_key_file_foreach_entry (ply_key_file_t              *key_file,
+                            ply_key_file_foreach_func_t  func,
+                            void                        *user_data)
+{
+  ply_key_file_foreach_func_data_t func_data;
+
+  func_data.func = func;
+  func_data.user_data = user_data;
+  ply_hashtable_foreach (key_file->groups,
+                         ply_key_file_foreach_entry_groups,
+                         &func_data);
+}
+
 /* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */
index 3d35e1206ba82c5fbf213933e444b6a3361e99ca..8f6c89181a4a8e716d69dd8c7465495505dd2d7a 100644 (file)
 #include <unistd.h>
 
 typedef struct _ply_key_file ply_key_file_t;
+typedef void (ply_key_file_foreach_func_t) (const char *group_name,
+                                            const char *key,
+                                            const char *value,
+                                            void       *user_data);
 
 #ifndef PLY_HIDE_FUNCTION_DECLARATIONS
 ply_key_file_t *ply_key_file_new (const char *filename);
@@ -38,6 +42,9 @@ bool ply_key_file_has_key (ply_key_file_t *key_file,
 char *ply_key_file_get_value (ply_key_file_t *key_file,
                               const char     *group_name,
                               const char     *key);
+void ply_key_file_foreach_entry (ply_key_file_t              *key_file,
+                                 ply_key_file_foreach_func_t  func,
+                                 void                        *user_data);
 #endif
 
 #endif /* PLY_KEY_FILE_H */