struct unitaryc* parse_unitary_conf_file(const char *fname, char *err, size_t err_len) { char err2[512] = { 0 }; size_t err2_len = sizeof(err2); struct unitaryc *conf; struct json_object* jo; jo = parse_json_file(fname, err2, err2_len); if (err2[0]) { snprintf(err, err_len, "error parsing json file %s: %s", fname, err2); return NULL; } conf = JORM_FROMJSON_unitaryc(jo); json_object_put(jo); if (!conf) { snprintf(err, err_len, "ran out of memory reading " "config file.\n"); return NULL; } if (conf->osd == JORM_INVAL_ARRAY) { snprintf(err, err_len, "No OSDs found!"); goto error; } if (conf->mds == JORM_INVAL_ARRAY) { snprintf(err, err_len, "No MDSes found!"); goto error; } return conf; error: JORM_FREE_unitaryc(conf); return NULL; }
int parse_json_file(FILE *fptr, JSON_T *json_obj) { int ret; char *key; char first_meet; char *tmpstr; long long tmpnum; double floatnum, decimal; JSON_T *value; if (!json_obj) return -ENOMEM; key = NULL; tmpstr = NULL; value = NULL; memset(json_obj, 0, sizeof(JSON_T)); json_obj->type = JSON; json_obj->keys = NULL; _PARSE_SYMBOL(fptr, "{", NULL); while (!feof(fptr)) { _PARSE_SYMBOL(fptr, "\"}", &first_meet); if (first_meet == '}') break; ret = _parse_string(fptr, &key); if (ret < 0) goto error_handle; //printf("string = %s : ", key); _PARSE_SYMBOL(fptr, ":", NULL); _PARSE_SYMBOL(fptr, "\"{-0123456789.", &first_meet); value = malloc(sizeof(JSON_T)); if (!value) { ret = -ENOMEM; goto error_handle; } memset(value, 0, sizeof(JSON_T)); switch (first_meet) { case '\"': ret = _parse_string(fptr, &tmpstr); if (ret < 0) goto error_handle; value->type = STRING; value->str = tmpstr; //printf("value = %s\n", tmpstr); break; case '{': fseek(fptr, -1, SEEK_CUR); ret = parse_json_file(fptr, value); if (ret < 0) goto error_handle; break; case '-': ret = _parse_integer(fptr, &tmpnum); if (ret < 0) { goto error_handle; } else if (ret == 1) { ret = _parse_decimal(fptr, &decimal); if (ret < 0) goto error_handle; floatnum = tmpnum + decimal; value->type = FLOAT; value->floating = -floatnum; } else { value->type = INTEGER; value->integer = -tmpnum; } //printf("value = %lld\n", -tmpnum); break; default: fseek(fptr, -1, SEEK_CUR); ret = _parse_integer(fptr, &tmpnum); if (ret < 0) { goto error_handle; } else if (ret == 1) { ret = _parse_decimal(fptr, &decimal); if (ret < 0) goto error_handle; floatnum = tmpnum + decimal; value->type = FLOAT; value->floating = floatnum; } else { value->type = INTEGER; value->integer = tmpnum; } //printf("value = %lld\n", tmpnum); break; } /* Insert */ ret = insert_json_obj(json_obj, key, value); if (ret < 0) goto error_handle; key = NULL; tmpstr = NULL; value = NULL; _PARSE_SYMBOL(fptr, "},", &first_meet); if (first_meet == '}') break; } return 0; error_handle: /* Do not free self because it perhaps results in double free error when recursing */ free_json_obj_field(json_obj); if (key) free(key); if (tmpstr) free(tmpstr); if (value) free(value); return ret; }