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 ini_entry_t *ini_find(ini_t *ini, const char *section, const char* name){
217 for(i=0; i< ini->index; i++){
218 entry=ini->entries+i;
219 if(my_string_case_equal(entry->name,name) &&
220 my_string_case_equal(entry->section,section)){
229 void ini_insert(ini_t *ini, ini_entry_t *entry){
230 ini_entry_t * ini_entry;
231 ini_entry=ini_find(ini,entry->section,entry->name);
233 my_string_set(&ini_entry->value,entry->value);
235 if(ini->index>=IniEntriesNb){
236 my_fatal("ini_insert(): too many options\n");
238 ini_entry=ini->entries+(ini->index++);
239 my_string_set(&ini_entry->value,entry->value);
240 my_string_set(&ini_entry->name,entry->name);
241 my_string_set(&ini_entry->section,entry->section);
247 void ini_insert_ex(ini_t *ini,
251 ini_entry_t entry[1];
252 memset(entry,0,sizeof(ini_entry_t));
253 my_string_set(&entry->section,section);
254 my_string_set(&entry->name,name);
255 my_string_set(&entry->value,value);
256 ini_insert(ini,entry);
257 my_string_clear(&entry->section);
258 my_string_clear(&entry->name);
259 my_string_clear(&entry->value);
264 int ini_parse(ini_t *ini, const char *filename){
265 char name[StringSize];
266 char value[StringSize];
267 char section[StringSize];
268 char line[StringSize];
269 ini_entry_t entry[1];
271 const char *current_section=NULL;
274 my_string_set(¤t_section,"Main");
275 memset(entry,0,sizeof(ini_entry_t));
276 f=fopen(filename,"r");
278 // my_fatal("ini_parse(): Can't open file \"%s\": %s\n",
281 // For now fail silently
285 if(!fgets(line,StringSize,f)){
289 result=ini_line_parse(line,section,name,value);
291 my_string_set(¤t_section,section);
292 }else if(result==NAME_VALUE){
293 ini_insert_ex(ini,current_section,name,value);
294 }else if(result==SYNTAX_ERROR){
295 my_fatal("ini_parse(): Syntax error in \"%s\": line %d\n",
299 }else { // empty line
310 void ini_disp(ini_t *ini){
312 my_log("POLYGLOT Current options\n");
313 for(i=0;i<ini->index;i++){
314 my_log("POLYGLOT [%s] %s=\"%s\"\n",
315 (ini->entries)[i].section,
316 (ini->entries)[i].name,
317 (ini->entries)[i].value);
323 void ini_start_iter(ini_t *ini){
329 ini_entry_t * ini_next(ini_t *ini){
330 ASSERT(ini->iter<=ini->index);
331 if(ini->iter==ini->index){
334 return &ini->entries[ini->iter++];