12 #define StringSize ((int) 4096)
32 line_type_t ini_line_parse(const char *line,
37 parse_state_t state=START;
43 int type=SYNTAX_ERROR;
45 bool outer_quote=FALSE;
46 while(state!=FINISHED){
48 // printf("STATE=%d c=[%c]\n",state,c);
51 if((c==';')||(c=='#')||(c=='\r')||(c=='\n')||(c=='\0')){
68 }else if((c==';')||(c=='#')||(c=='\r')||(c=='\n')||(c=='\0')){
75 break; // we don't get here
81 }else if((c==';')||(c=='#')||(c=='\r')||(c=='\n')||(c=='\0')){
85 for(i=0;i<spaces;i++){
86 name[name_index++]=' ';
93 break; // we don't get here
99 }else if((c==';')||(c=='#')||(c=='\r')||(c=='\n')||(c=='\0')){
103 value[value_index++]=c;
107 break; // we don't get here
115 }else if((c=='\r' || c=='\n' || c==';' || c=='#'||(c=='\0'))&&
120 value[value_index++]=c;
123 break; // we don't get here
127 }else if((c=='\r' || c=='\n' || c==';' || c=='#'||(c=='\0'))&&
132 for(i=0;i<spaces;i++){
133 value[value_index++]=' ';
137 value[value_index++]=c;
144 break; // we don't get here
148 }else if(c=='\r' || c=='\n' || c==';' || c=='#'||(c=='\0')){
152 value[value_index++]='"';
153 for(i=0;i<spaces;i++){
154 value[value_index++]=' ';
158 value[value_index++]=c;
165 break; // we don't get here
171 section[section_index++]=c;
174 break; // we don't get here
180 section[section_index]='\0';
181 name[name_index]='\0';
182 value[value_index]='\0';
188 void ini_init(ini_t *ini){
189 memset(ini,0,sizeof(ini_t));
194 void ini_clear(ini_t *ini){
197 for(i=0; i< ini->index; i++){
198 entry=ini->entries+i;
199 if(entry->name!=NULL){
200 my_string_clear(&entry->name);
202 if(entry->value!=NULL){
203 my_string_clear(&entry->value);
205 if(entry->comment!=NULL){
206 my_string_clear(&entry->comment);
214 void ini_copy(ini_t *dst, ini_t *src){
216 dst->index=src->index;
218 for(i=0;i<src->index;i++){
219 my_string_set(&dst->entries[i].section,src->entries[i].section);
220 my_string_set(&dst->entries[i].name,src->entries[i].name);
221 my_string_set(&dst->entries[i].value,src->entries[i].value);
227 ini_entry_t *ini_find(ini_t *ini, const char *section, const char* name){
230 for(i=0; i< ini->index; i++){
231 entry=ini->entries+i;
232 if(my_string_case_equal(entry->name,name) &&
233 my_string_case_equal(entry->section,section)){
242 void ini_insert(ini_t *ini, ini_entry_t *entry){
243 ini_entry_t * ini_entry;
244 ini_entry=ini_find(ini,entry->section,entry->name);
246 my_string_set(&ini_entry->value,entry->value);
248 if(ini->index>=IniEntriesNb){
249 my_fatal("ini_insert(): too many options\n");
251 ini_entry=ini->entries+(ini->index++);
252 my_string_set(&ini_entry->value,entry->value);
253 my_string_set(&ini_entry->name,entry->name);
254 my_string_set(&ini_entry->section,entry->section);
260 void ini_insert_ex(ini_t *ini,
264 ini_entry_t entry[1];
265 memset(entry,0,sizeof(ini_entry_t));
266 my_string_set(&entry->section,section);
267 my_string_set(&entry->name,name);
268 my_string_set(&entry->value,value);
269 ini_insert(ini,entry);
270 my_string_clear(&entry->section);
271 my_string_clear(&entry->name);
272 my_string_clear(&entry->value);
277 int ini_parse(ini_t *ini, const char *filename){
278 char name[StringSize];
279 char value[StringSize];
280 char section[StringSize];
281 char line[StringSize];
282 ini_entry_t entry[1];
284 const char *current_section=NULL;
287 my_string_set(¤t_section,"Main");
288 memset(entry,0,sizeof(ini_entry_t));
289 f=fopen(filename,"r");
291 // my_fatal("ini_parse(): Can't open file \"%s\": %s\n",
294 // For now fail silently
298 if(!fgets(line,StringSize,f)){
302 result=ini_line_parse(line,section,name,value);
304 my_string_set(¤t_section,section);
305 }else if(result==NAME_VALUE){
306 ini_insert_ex(ini,current_section,name,value);
307 }else if(result==SYNTAX_ERROR){
308 my_fatal("ini_parse(): Syntax error in \"%s\": line %d\n",
312 }else { // empty line
323 void ini_disp(ini_t *ini){
325 for(i=0;i<ini->index;i++){
326 my_log("POLYGLOT [%s] %s=\"%s\"\n",
327 (ini->entries)[i].section,
328 (ini->entries)[i].name,
329 (ini->entries)[i].value);
335 void ini_start_iter(ini_t *ini){
341 ini_entry_t * ini_next(ini_t *ini){
342 ASSERT(ini->iter<=ini->index);
343 if(ini->iter==ini->index){
346 return &ini->entries[ini->iter++];