00001 /* 00002 * dcfp - definition and configuration file parser 00003 * Copyright (c) 2002 Mark Smulders <Mark@PIRnet.nl> 00004 * 00005 * This program is free software; you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License as published by 00007 * the Free Software Foundation; either version 2, or (at your option) 00008 * any later version. 00009 * 00010 * This program is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 * GNU General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU General Public License 00016 * along with this program; if not, write to the 00017 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018 * Boston, MA 02111-1307, USA. 00019 */ 00020 00021 #ifndef _DCFP_H 00022 #define _DCFP_H 00023 00024 #include <stdio.h> 00025 00026 #ifdef __cplusplus 00027 extern "C" { 00028 #endif 00029 00030 /* DCFP data struct explanation 00031 * 00032 * data (dcfp_data_struct *) 00033 * | 00034 * |-- globalvars (dcfp_var_struct *) 00035 * | |-- type (string, either "str" or "int") 00036 * | |-- key (string) 00037 * | |-- value (void pointer; either string or int) 00038 * | |-- next (dcfp_var_struct *) 00039 * | | 00040 * | |-- type [ETCETERA] 00041 * | 00042 * |-- sections (dcfp_section_struct *) 00043 * | 00044 * |-- name (string) 00045 * |-- globalvars (dcfp_var_struct *) 00046 * | |-- type 00047 * | |-- key 00048 * | |-- value 00049 * | |-- next [ETCETERA] 00050 * | 00051 * |-- subsections (dcfp_section_struct *) 00052 * | |-- name 00053 * | |-- globalvars (dcfp_var_struct *) 00054 * | |-- subsections (dcfp_section_struct *) 00055 * | |-- next [ETCETERA] 00056 * | 00057 * |-- next (dcfp_section_struct *) [ETCETERA] 00058 * 00059 */ 00060 00061 /* Example conf file 00062 * --------------------------------- 00063 * 00064 * globalvar = "string value" 00065 * global_integer_var = 1234 00066 * 00067 * [SOMESECTION] 00068 * sectionvar = " value" 00069 * 00070 * [ASUBSECTION] 00071 * subsectvar = "another value" 00072 * [END ASUBSECTION] 00073 * 00074 * another_sectionvar = 5678 00075 * [END SOMESECTION] 00076 * 00077 * yet_another_global = "var" 00078 * 00079 * --------------------------------- 00080 */ 00081 00082 /* // *** Typical Use *** // 00083 * 00084 * #define FILENAME "test.conf" 00085 * int main (void) { 00086 * dcfp_data_struct *data = NULL; 00087 * data = dcfp_parse_file(FILENAME); 00088 * //-> do something with the data ;-) 00089 * dcfp_destroy_data_struct(data); 00090 * return 0; 00091 * } 00092 * 00093 */ 00094 00095 00096 /* dcfp data structures - data from file goes into these, dynamically */ 00097 typedef struct dcfp_var_stype { 00098 char type[4]; 00099 char *key; 00100 void *value; 00101 struct dcfp_var_stype *next; 00102 } dcfp_var_struct; 00103 00104 typedef struct dcfp_section_stype { 00105 char *name; 00106 dcfp_var_struct *globalvars; 00107 struct dcfp_section_stype *sections; 00108 struct dcfp_section_stype *next; 00109 } dcfp_section_struct; 00110 00111 typedef struct dcfp_data_stype { 00112 dcfp_var_struct *globalvars; 00113 dcfp_section_struct *sections; 00114 } dcfp_data_struct; 00115 00116 /* public interface */ 00117 const dcfp_data_struct *dcfp_parse_file(const char *filename); 00118 void dcfp_destroy_data_struct(dcfp_data_struct *data); 00119 int dcfp_global_section_exist(const dcfp_data_struct *data, const char *sectionname); 00120 const dcfp_section_struct *dcfp_get_global_section_by_name(const dcfp_data_struct *data, const char *name); 00121 const dcfp_section_struct *dcfp_get_subsection_by_name(const dcfp_section_struct *parentsection, const char *name); 00122 const void *dcfp_get_global_var(const dcfp_data_struct *data, const char *varname); 00123 const void *dcfp_get_var_from_section(const dcfp_section_struct *section, const char *varname); 00124 00125 #ifdef __cplusplus 00126 } 00127 #endif 00128 00129 #endif