// JSON Stuff
+struct json_object* pakfire_json_parse(struct pakfire_ctx* ctx,
+ const char* buffer, const size_t length);
struct json_object* pakfire_json_parse_from_file(struct pakfire_ctx* ctx, const char* path);
int pakfire_json_add_string(struct pakfire* pakfire,
struct json_object* json, const char* name, const char* value);
// JSON Stuff
-static struct json_object* pakfire_json_parse(struct pakfire_ctx* ctx, FILE* f) {
+struct json_object* pakfire_json_parse(struct pakfire_ctx* ctx,
+ const char* buffer, const size_t length) {
struct json_tokener* tokener = NULL;
struct json_object* json = NULL;
- char* buffer = NULL;
- size_t length;
-
- // Read everything into memory
- int r = pakfire_read_file_into_buffer(f, &buffer, &length);
- if (r)
- goto ERROR;
// Create tokener
tokener = json_tokener_new();
goto ERROR;
}
- // Parse JSON from path
+ // Parse JSON from buffer
json = json_tokener_parse_ex(tokener, buffer, length);
if (!json) {
enum json_tokener_error error = json_tokener_get_error(tokener);
);
ERROR:
- if (buffer)
- free(buffer);
-
if (tokener)
json_tokener_free(tokener);
return json;
}
+static struct json_object* pakfire_json_parse_file(struct pakfire_ctx* ctx, FILE* f) {
+ struct json_object* json = NULL;
+ char* buffer = NULL;
+ size_t length = 0;
+
+ // Read everything into memory
+ int r = pakfire_read_file_into_buffer(f, &buffer, &length);
+ if (r)
+ goto ERROR;
+
+ // Parse
+ json = pakfire_json_parse(ctx, buffer, length);
+
+ERROR:
+ if (buffer)
+ free(buffer);
+
+ return json;
+}
+
struct json_object* pakfire_json_parse_from_file(struct pakfire_ctx* ctx, const char* path) {
FILE* f = fopen(path, "r");
if (!f)
return NULL;
- struct json_object* json = pakfire_json_parse(ctx, f);
+ struct json_object* json = pakfire_json_parse_file(ctx, f);
fclose(f);
return json;