+
+#define BUFFER_SIZE 4096
+
+json_t *json_loadf(FILE *input, json_error_t *error)
+{
+ strbuffer_t strbuff;
+ char buffer[BUFFER_SIZE];
+ size_t length;
+ json_t *result = NULL;
+
+ strbuffer_init(&strbuff);
+
+ while(1)
+ {
+ length = fread(buffer, 1, BUFFER_SIZE, input);
+ if(length == 0)
+ {
+ if(ferror(input))
+ {
+ json_set_error(error, NULL, "read error");
+ goto out;
+ }
+ break;
+ }
+ if(strbuffer_append_bytes(&strbuff, buffer, length))
+ goto out;
+ }
+
+ result = json_loads(strbuffer_value(&strbuff), error);
+
+out:
+ strbuffer_close(&strbuff);
+ return result;
+}
+
+json_t *json_loadfd(int fd, json_error_t *error)
+{
+ strbuffer_t strbuff;
+ char buffer[BUFFER_SIZE];
+ ssize_t length;
+ json_t *result = NULL;
+
+ strbuffer_init(&strbuff);
+
+ while(1)
+ {
+ length = read(fd, buffer, BUFFER_SIZE);
+ if(length == -1)
+ {
+ json_set_error(error, NULL, "read error: %s", strerror(errno));
+ goto out;
+ }
+ else if(length == 0)
+ break;
+
+ if(strbuffer_append_bytes(&strbuff, buffer, length))
+ {
+ json_set_error(error, NULL, "error allocating memory");
+ goto out;
+ }
+ }
+
+ result = json_loads(strbuffer_value(&strbuff), error);
+
+out:
+ strbuffer_close(&strbuff);
+ return result;
+}