+ssize_t GET_generate_taglist(void *cls, uint64_t pos, char *buf, size_t max) {
+ struct tag_state *ts = cls;
+ struct blerg *b;
+ const unsigned char *ybuf;
+ unsigned int len;
+
+ if (ts->yoff > 0) {
+ yajl_gen_get_buf(ts->g, &ybuf, &len);
+ size_t bytes_remaining = len - ts->yoff;
+ if (bytes_remaining > max) {
+ memcpy(buf, ybuf + ts->yoff, max);
+ ts->yoff += max;
+ return max;
+ } else {
+ memcpy(buf, ybuf + ts->yoff, bytes_remaining);
+ ts->yoff = 0;
+ yajl_gen_clear(ts->g);
+ return bytes_remaining;
+ }
+ }
+
+ if (ts->done)
+ return -1;
+
+ if (pos == 0) { /* Start iterating */
+ yajl_gen_array_open(ts->g);
+ }
+
+ /* Snarf one record */
+ b = blerg_open(ts->results[ts->i].author);
+ if (b == NULL)
+ goto skip_bad_blerg;
+
+ json_generate_one_record(ts->g, ts->results[ts->i].author, b, ts->results[ts->i].record);
+
+ blerg_close(b);
+
+skip_bad_blerg:
+ if (ts->i == 0) {
+ yajl_gen_array_close(ts->g);
+ ts->done = 1;
+ }
+
+ ts->i--;
+
+ yajl_gen_get_buf(ts->g, &ybuf, &len);
+ if (len > max) {
+ memcpy(buf, ybuf, max);
+ ts->yoff = max;
+ return max;
+ } else {
+ memcpy(buf, ybuf, len);
+ yajl_gen_clear(ts->g);
+ return len;
+ }
+}
+
+void GET_generate_taglist_free(void *cls) {
+ struct tag_state *ts = cls;
+
+ yajl_gen_free(ts->g);
+ free(ts->results);
+ free(ts);
+}
+