int main(int argc, char *argv[]) { ini_data_st *data; char *sec = "section6"; char *prop = "p1"; ini_pair pair; if (argc != 2) { fprintf(stderr, "usage: ini_test <INI filename>\n"); exit(1); } data = ini_init(argv[1]); if (data) { ini_print(data); printf("\n\nSearching for section %s, property %s: %s\n", sec, prop, ini_get_data(data, sec, prop)); printf("\nSearching for global property %s: %s\n\n", prop, ini_get_data(data, NULL, prop)); printf("testing iterator, printing list of all properties in \"section2\":\n"); pair = ini_iter_init(data, "section2"); printf("%s = %s\n", pair.n, pair.v); pair = ini_iter_next(data); while (pair.n) { printf("%s = %s\n", pair.n, pair.v); pair = ini_iter_next(data); } ini_free(data); } return (0); }
cfg_st *cfg_load(char *path) { FILE *fp = fopen(path, "r"); if (NULL == fp) { return NULL; } struct cfg_section *sec_head = NULL; struct cfg_section *sec_prev = NULL; struct cfg_section *sec_curr = NULL; struct cfg_obj *obj_curr = NULL; struct cfg_obj *obj_prev = NULL; char *line = NULL; size_t n = 0; ssize_t len = 0; while ((len = _readline(&line, &n, fp)) != -1) { char *s = line; #ifdef __DEBUG__ printf("1_readline:%s\n",s); #endif if (is_comment(&s)) continue; len = strlen(s); if (len>2 && s[0]=='[' && s[len-1]==']') { char *name = s + 1; *(name+len-1-1) = '\0'; trim(name); if ((sec_curr = find_section(sec_head, name)) == NULL) { if ((sec_curr = create_section(sec_head, name)) == NULL) { free(line); return NULL; } if (sec_head == NULL) sec_head = sec_curr; if (sec_prev != NULL) sec_prev->next = sec_curr; sec_prev = sec_curr; obj_prev = NULL; } else { obj_prev = sec_curr->obj; while (obj_prev->next != NULL) obj_prev = obj_prev->next; } continue; } char *delimiter = strchr(s, '='); if (delimiter == NULL) continue; *delimiter = '\0'; char *name = s; trim(name); char *value = delimiter + 1; delimiter = strchr(value, '#'); if (NULL != delimiter) { *delimiter = '\0'; } trim(value); if (sec_curr == NULL) { if ((sec_curr = create_section(sec_head, "global")) == NULL) { free(line); return NULL; } if (sec_head == NULL) sec_head = sec_curr; sec_prev = sec_curr; obj_prev = NULL; } if ((obj_curr = find_obj(sec_curr, name)) == NULL) { obj_curr = create_obj(sec_head, name, value); if (obj_curr == NULL) { free(line); return NULL; } if (obj_prev) obj_prev->next = obj_curr; if (sec_curr->obj == NULL) sec_curr->obj = obj_curr; obj_prev = obj_curr; } else { char *old_value = obj_curr->value; if ((obj_curr->value = strdup(value)) == NULL) { cfg_free(sec_head); free(line); return NULL; } free(old_value); } } free(line); fclose(fp); if (sec_head == NULL) { if ((sec_head = calloc(1, sizeof(struct cfg_section))) == NULL) return NULL; } #ifdef __DEBUG__ ini_print(sec_head); #endif return sec_head; }
ini_t *ini_load(const char *path) { FILE *fp = fopen(path, "r"); if (fp == NULL) return NULL; struct ini_section *head = NULL; struct ini_section *prev = NULL; struct ini_section *curr = NULL; struct ini_arg *arg_curr = NULL; struct ini_arg *arg_prev = NULL; char *line = NULL; size_t n = 0; ssize_t len = 0; while ((len = _getline(&line, &n, fp)) != -1) { char *s = line; if (is_comment(&s)) continue; len = strlen(s); if (len >= 3 && s[0] == '[' && s[len - 1] == ']') { char *name = s + 1; while (isspace(*name)) ++name; char *name_end = s + len - 1; *name_end-- = '\0'; while (isspace(*name_end)) *name_end-- = '\0'; if ((curr = find_section(head, name)) == NULL) { if ((curr = create_section(head, name)) == NULL) { free(line); return NULL; } if (head == NULL) head = curr; if (prev != NULL) prev->next = curr; prev = curr; arg_prev = NULL; } else { arg_prev = curr->args; while (arg_prev->next != NULL) arg_prev = arg_prev->next; } continue; } char *delimiter = strchr(s, '='); if (delimiter == NULL) continue; *delimiter = '\0'; char *name = s; char *name_end = delimiter - 1; while (isspace(*name_end)) *name_end-- = '\0'; char *value = delimiter + 1; while (isspace(*value)) value++; if (curr == NULL) { if ((curr = create_section(head, "global")) == NULL) { free(line); return NULL; } if (head == NULL) head = curr; prev = curr; arg_prev = NULL; } if ((arg_curr = find_arg(curr, name)) == NULL) { arg_curr = create_arg(head, name, value); if (arg_curr == NULL) { free(line); return NULL; } if (arg_prev) arg_prev->next = arg_curr; if (curr->args == NULL) curr->args = arg_curr; arg_prev = arg_curr; } else { char *old_value = arg_curr->value; if ((arg_curr->value = strdup(value)) == NULL) { ini_free(head); free(line); return NULL; } free(old_value); } } free(line); fclose(fp); if (head == NULL) { if ((head = calloc(1, sizeof(struct ini_section))) == NULL) return NULL; } ini_print(head); return head; }