diff --git a/src/xpdev/ini_file.c b/src/xpdev/ini_file.c index 9569ca8cc905336def3d3ccdf01d5783e74a3bcb..d0019e667246002db8fb6665ab07f557c98140c2 100644 --- a/src/xpdev/ini_file.c +++ b/src/xpdev/ini_file.c @@ -178,17 +178,29 @@ static size_t find_section_index(str_list_t list, const char* section) return(i); } +static size_t section_start(str_list_t list, size_t index) +{ + char* p = list[index]; + if(p != NULL) { + SKIP_WHITESPACE(p); + if(*p == INI_OPEN_SECTION_CHAR) // A new section starts immediately? + return strListCount(list); + } + return index; +} + static size_t find_section(str_list_t list, const char* section) { size_t i; + char* p; if(section==ROOT_SECTION) - return(0); + return section_start(list, 0); i=find_section_index(list,section); if(list[i]!=NULL) i++; - return(i); + return section_start(list, i); } static char* key_name(char* p, char** vp, BOOL literals_supported) @@ -430,6 +442,43 @@ BOOL iniRemoveSections(str_list_t* list, const char* prefix) return(TRUE); } +// This sorts comments too, so should not be used on human created/edited files +BOOL iniSortSections(str_list_t* list, BOOL sort_keys) +{ + size_t i; + str_list_t root_keys; + str_list_t new_list; + str_list_t keys; + str_list_t section_list = iniGetSectionList(*list, /* prefix */NULL); + + root_keys = iniGetSection(*list, ROOT_SECTION); + if(section_list == NULL && root_keys == NULL) + return TRUE; + + if(sort_keys) + strListSortAlphaCase(root_keys); + + if(section_list != NULL) + strListSortAlphaCase(section_list); + new_list = strListInit(); + if(new_list == NULL) { + strListFree(§ion_list); + return FALSE; + } + strListAppendList(&new_list, root_keys); + strListFree(&root_keys); + for(i = 0; section_list != NULL && section_list[i] != NULL; i++) { + keys = iniGetSection(*list, section_list[i]); + if(sort_keys) + strListSortAlphaCase(keys); + iniAppendSectionWithKeys(&new_list, section_list[i], keys, /* ini_style_t */NULL); + strListFree(&keys); + } + strListFree(list); + *list = new_list; + return TRUE; +} + BOOL iniRenameSection(str_list_t* list, const char* section, const char* newname) { char str[INI_MAX_LINE_LEN]; @@ -2410,10 +2459,14 @@ void main(int argc, char** argv) str_list_t list; for(i=1;i<argc;i++) { - if((fp=iniOpenFile(argv[i],FALSE)) == NULL) + if((fp=iniOpenFile(argv[i],FALSE)) == NULL) { + perror(argv[i]); continue; + } if((list=iniReadFile(fp)) != NULL) { - printf("%s\n",iniGetString(list," test | bogus ","key","default",str)); + iniSortSections(&list, TRUE); + for(size_t j = 0; list[j] != NULL; j++) + printf("%s\n", list[j]); strListFree(&list); } fclose(fp); diff --git a/src/xpdev/ini_file.h b/src/xpdev/ini_file.h index 92dfb878f2a8fbf4707e264f57b36a635cd2137d..3d5a86fe16b4fb47ae4972ff02980e2df05b4e59 100644 --- a/src/xpdev/ini_file.h +++ b/src/xpdev/ini_file.h @@ -276,6 +276,7 @@ DLLEXPORT BOOL iniRemoveValue(str_list_t*, const char* section, const char* k DLLEXPORT BOOL iniRemoveSection(str_list_t*, const char* section); DLLEXPORT BOOL iniRemoveSections(str_list_t*, const char* prefix); DLLEXPORT BOOL iniRenameSection(str_list_t*, const char* section, const char* newname); +DLLEXPORT BOOL iniSortSections(str_list_t*, BOOL sort_keys); DLLEXPORT BOOL iniHasInclude(const str_list_t);