src/ini_type.h
changeset 9996 fceaf224b2f0
child 9999 d88ba8e0fd38
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ini_type.h	Sun Aug 24 13:50:31 2008 +0000
@@ -0,0 +1,102 @@
+/* $Id$ */
+
+/** @file ini_type.h Types related to reading/writing '*.ini' files. */
+
+#ifndef INI_TYPE_H
+#define INI_TYPE_H
+
+/** Types of groups */
+enum IniGroupType {
+	IGT_VARIABLES = 0, ///< values of the form "landscape = hilly"
+	IGT_LIST      = 1, ///< a list of values, seperated by \n and terminated by the next group block
+};
+
+/** A single "line" in an ini file. */
+struct IniItem {
+	IniItem *next; ///< The next item in this group
+	char *name;    ///< The name of this item
+	char *value;   ///< The value of this item
+	char *comment; ///< The comment associated with this item
+
+	IniItem(struct IniGroup *parent, const char *name, size_t len = 0);
+	~IniItem();
+};
+
+/** A group within an ini file. */
+struct IniGroup {
+	IniGroup *next;      ///< the next group within this file
+	IniGroupType type;   ///< type of group
+	IniItem *item;       ///< the first item in the group
+	IniItem **last_item; ///< the last item in the group
+	char *name;          ///< name of group
+	char *comment;       ///< comment for group
+
+	/**
+	 * Construct a new in-memory group of an Ini file.
+	 * @param parent the file we belong to
+	 * @param name   the name of the group
+	 * @param len    the length of the name of the group
+	 */
+	IniGroup(struct IniFile *parent, const char *name, size_t len = 0);
+
+	/** Free everything we loaded. */
+	~IniGroup();
+
+	/**
+	 * Get the item with the given name, and if it doesn't exist
+	 * and create is true it creates a new item.
+	 * @param name   name of the item to find.
+	 * @param create whether to create an item when not found or not.
+	 * @return the requested item or NULL if not found.
+	 */
+	IniItem *GetItem(const char *name, bool create);
+};
+
+/** The complete ini file. */
+struct IniFile {
+	IniGroup *group;               ///< the first group in the ini
+	IniGroup **last_group;         ///< the last group in the ini
+	char *comment;                 ///< last comment in file
+	const char **list_group_names; ///< NULL terminated list with group names that are lists
+
+	/**
+	 * Construct a new in-memory Ini file representation.
+	 * @param list_group_names A NULL terminated list with groups that should be
+	 *                         loaded as lists instead of variables.
+	 */
+	IniFile(const char **list_group_names = NULL);
+
+	/** Free everything we loaded. */
+	~IniFile();
+
+	/**
+	 * Get the group with the given name, and if it doesn't exist
+	 * create a new group.
+	 * @param name name of the group to find.
+	 * @param len  the maximum length of said name.
+	 * @return the requested group.
+	 */
+	IniGroup *GetGroup(const char *name, size_t len = 0);
+
+	/**
+	 * Remove the group with the given name.
+	 * @param name name of the group to remove.
+	 */
+	void RemoveGroup(const char *name);
+
+	/**
+	 * Load the Ini file's data from the disk.
+	 * @param filename the file to load.
+	 * @pre nothing has been loaded yet.
+	 */
+	void LoadFromDisk(const char *filename);
+
+	/**
+	 * Save the Ini file's data to the disk.
+	 * @param filename the file to save to.
+	 * @return true if saving succeeded.
+	 */
+	bool SaveToDisk(const char *filename);
+};
+
+#endif /* INI_TYPE */