/* V_LENS -> V_TREE -> V_STRING -> V_STRING */ static struct value *lens_put(struct info *info, struct value *l, struct value *tree, struct value *str) { assert(l->tag == V_LENS); assert(tree->tag == V_TREE); assert(str->tag == V_STRING); struct memstream ms; struct value *v; struct lns_error *err; init_memstream(&ms); lns_put(ms.stream, l->lens, tree->origin->children, str->string->str, &err); close_memstream(&ms); if (err == NULL && ! HAS_ERR(info)) { v = make_value(V_STRING, ref(info)); v->string = make_string(ms.buf); } else { v = make_exn_lns_error(info, err, str->string->str); free_lns_error(err); FREE(ms.buf); } return v; }
static void exn_print_tree(struct value *exn, struct tree *tree) { struct memstream ms; init_memstream(&ms); dump_tree(ms.stream, tree); close_memstream(&ms); exn_printf_line(exn, "%s", ms.buf); FREE(ms.buf); }
static int run_one_test(struct test *test) { int r; struct augeas *aug = NULL; struct memstream ms; int result = 0; MEMZERO(&ms, 1); aug = aug_init("/dev/null", lensdir, AUG_NO_STDINC|AUG_NO_MODL_AUTOLOAD); fail(aug == NULL, "aug_init"); fail(aug_error(aug) != AUG_NOERROR, "aug_init: errcode was %d", aug_error(aug)); printf("%-30s ... ", test->name); r = load_module(aug, test); if (r < 0) goto error; r = init_memstream(&ms); fail(r < 0, "init_memstream"); r = aug_srun(aug, ms.stream, test->cmd); fail(r != test->result, "return value: expected %d, actual %d", test->result, r); fail(aug_error(aug) != test->errcode, "errcode: expected %s, actual %s", errtokens[test->errcode], errtokens[aug_error(aug)]); r = close_memstream(&ms); fail(r < 0, "close_memstream"); fail(ms.buf == NULL, "close_memstream left buf NULL"); if (test->out != NULL) { fail(STRNEQ(ms.buf, test->out), "output: expected '%s', actual '%s'", test->out, ms.buf); } else if (test->out_present) { fail(strlen(ms.buf) == 0, "output: expected some output"); } else { fail(strlen(ms.buf) > 0, "output: expected nothing, actual '%s'", ms.buf); } printf("PASS\n"); done: free(ms.buf); aug_close(aug); return result; error: result = -1; goto done; }
int readnext_filereader(filereader_t * frd, /*out*/struct memstream_ro_t * buffer) { int err; if (frd->ioerror) { // never logged twice return frd->ioerror; } off_t unreadsize = frd->filesize - frd->fileoffset; if (0 == unreadsize) { // ENODATA is not logged return ENODATA; } if (! frd->nrfreebuffer) { err = ENOBUFS; goto ONERR; } uint8_t * bufferaddr = frd->page[frd->nextindex].addr; size_t buffersize = frd->page[frd->nextindex].size; if (castPoff_size(unreadsize) < buffersize) { buffersize = (size_t) unreadsize; } if (! frd->unreadsize) { err = readall_iochannel(frd->file, buffersize, bufferaddr, -1); if (err) { frd->ioerror = err; goto ONERR; } frd->unreadsize = buffersize; } frd->unreadsize -= buffersize; frd->nextindex = ! frd->nextindex; -- frd->nrfreebuffer; frd->fileoffset += (off_t) buffersize; // set out param init_memstream(buffer, bufferaddr, bufferaddr + buffersize); return 0; ONERR: TRACEEXIT_ERRLOG(err); return err; }