// Reads data from the IO, according to the Rack specifications for `#read`. static VALUE tfio_read(int argc, VALUE *argv, VALUE self) { int fd = get_tmpfile(self); size_t pos = get_pos(self); size_t end = get_end(self); VALUE buffer = Qnil; char ret_nil = 0; ssize_t len = 0; // get the buffer object if given if (argc == 2) { Check_Type(argv[1], T_STRING); buffer = argv[1]; } // get the length object, if given if (argc > 0 && argv[0] != Qnil) { Check_Type(argv[0], T_FIXNUM); len = FIX2LONG(argv[0]); if (len < 0) rb_raise(rb_eRangeError, "length should be bigger then 0."); ret_nil = 1; } // return if we're at the EOF. if (pos == end) goto no_data; // calculate length if it wasn't specified. if (len == 0) { // make sure we're not reading more then we have len = end - pos; // set position for future reads set_pos(self, end); if (len == 0) goto no_data; } else { // set position for future reads set_pos(self, pos + len); } // limit read to what we have if (len + pos > end) len = end - pos; // create the buffer if we don't have one. if (buffer == Qnil) { buffer = rb_str_buf_new(len); // make sure the buffer is binary encoded. rb_enc_associate(buffer, BinaryEncoding); } else { // make sure the buffer is binary encoded. rb_enc_associate(buffer, BinaryEncoding); if (rb_str_capacity(buffer) < len) rb_str_resize(buffer, len); } // read the data. if (pread(fd, RSTRING_PTR(buffer), len, pos) <= 0) goto no_data; rb_str_set_len(buffer, len); return buffer; no_data: if (ret_nil) return Qnil; else return rb_str_buf_new(0); }
/** Gets returns a line. this is okay for small lines, but shouldn't really be used. Limited to ~ 1Mb of a line length. */ static VALUE tfio_gets(VALUE self) { int fd = get_tmpfile(self); size_t pos = get_pos(self); size_t end = get_end(self); if (pos == end) return Qnil; size_t pos_e = pos; char c; int ret; VALUE buffer; do { ret = pread(fd, &c, 1, pos_e); } while (ret > 0 && c != '\n' && (++pos_e < end)); set_pos(self, pos_e + 1); if (pos > pos_e) { buffer = rb_str_buf_new(pos_e - pos); // make sure the buffer is binary encoded. rb_enc_associate(buffer, BinaryEncoding); if (pread(fd, RSTRING_PTR(buffer), pos_e - pos, pos) < 0) return Qnil; rb_str_set_len(buffer, pos_e - pos); return buffer; } return Qnil; }
int main(int argc, char *argv[]) { int fd; char name[64], *buf, *out = NULL, *verify; size_t len, outlen; buf = get_file_buffer(argv[1], &len); if (buf) { if (argc > 2) { if (url_unescape(buf, len, &out, &outlen) == 0) { printf("%.*s\n", (int)outlen, out); if ((verify = url_escape(out, outlen))) { fd = get_tmpfile(name, 0666, NULL, NULL); if (fd > 0) { printf("verify file:%s\n", name); write(fd, verify, strlen(verify)); close(fd); } } } } else { if ((out = url_escape(buf, len))) printf("%s\n", out); } free(buf); if (out) free(out); } }
void MetalinkEditorTest::testSaveTorrent3() { // Setup wxString savefile = get_tmpfile(wxT("tmp.metalink")); wxString test2file = get_testfile(wxT("test2.metalink")); MetalinkEditor editor = create_test2(); // Exercise editor.set_filename(savefile); editor.save(); // Verify std::string saved = read_file(savefile); std::string test2 = read_file(test2file); CPPUNIT_ASSERT(saved == test2); }
void test_fitsbin_1(CuTest* ct) { fitsbin_t* in, *out; int i; int N = 6; double outdata[6]; double* indata; char* fn; fitsbin_chunk_t chunk; fn = get_tmpfile(0); out = fitsbin_open_for_writing(fn); CuAssertPtrNotNull(ct, out); CuAssertIntEquals(ct, 0, fitsbin_write_primary_header(out)); for (i=0; i<N; i++) { outdata[i] = i*i; } fitsbin_chunk_init(&chunk); chunk.tablename = "test1"; chunk.itemsize = sizeof(double); chunk.nrows = N; chunk.data = outdata; CuAssertIntEquals(ct, 0, fitsbin_write_chunk(out, &chunk)); CuAssertIntEquals(ct, fitsbin_fix_primary_header(out), 0); CuAssertIntEquals(ct, fitsbin_close(out), 0); fitsbin_chunk_clean(&chunk); // writing shouldn't affect the data values for (i=0; i<N; i++) { CuAssertIntEquals(ct, outdata[i], i*i); } in = fitsbin_open(fn); CuAssertPtrNotNull(ct, in); fitsbin_chunk_init(&chunk); chunk.tablename = "test1"; CuAssertIntEquals(ct, 0, fitsbin_read_chunk(in, &chunk)); CuAssertIntEquals(ct, sizeof(double), chunk.itemsize); CuAssertIntEquals(ct, N, chunk.nrows); indata = chunk.data; CuAssertPtrNotNull(ct, indata); CuAssertIntEquals(ct, 0, memcmp(outdata, indata, sizeof(outdata))); CuAssertIntEquals(ct, 0, fitsbin_close(in)); }
void test_fitsbin_2(CuTest* ct) { fitsbin_t* in, *out; int i; int N = 6; double outdata[6]; double* indata; char* fn; fitsbin_chunk_t chunk; fitsbin_chunk_t* ch; fn = get_tmpfile(0); printf("Writing to %s\n", fn); out = fitsbin_open_for_writing(fn); CuAssertPtrNotNull(ct, out); CuAssertIntEquals(ct, 0, fitsbin_write_primary_header(out)); for (i=0; i<N; i++) { outdata[i] = i*i; } fitsbin_chunk_init(&chunk); chunk.tablename = "test2"; chunk.itemsize = 1; //chunk.nrows = N * sizeof(double); chunk.data = outdata; CuAssertIntEquals(ct, 0, fitsbin_write_chunk_header(out, &chunk)); for (i=0; i<N; i++) { CuAssertIntEquals(ct, 0, fitsbin_write_items(out, &chunk, &outdata[i], sizeof(double))); } CuAssertIntEquals(ct, 0, fitsbin_fix_chunk_header(out, &chunk)); fitsbin_chunk_reset(&chunk); chunk.tablename = "test2B"; chunk.itemsize = sizeof(double); //chunk.nrows = N; chunk.data = outdata; CuAssertIntEquals(ct, 0, fitsbin_write_chunk_header(out, &chunk)); for (i=0; i<N; i++) { CuAssertIntEquals(ct, 0, fitsbin_write_items(out, &chunk, outdata + (N-1) - i, 1)); } CuAssertIntEquals(ct, 0, fitsbin_fix_chunk_header(out, &chunk)); CuAssertIntEquals(ct, fitsbin_close(out), 0); fitsbin_chunk_clean(&chunk); // writing shouldn't affect the data values for (i=0; i<N; i++) { CuAssertIntEquals(ct, outdata[i], i*i); } in = fitsbin_open(fn); CuAssertPtrNotNull(ct, in); fitsbin_chunk_init(&chunk); chunk.tablename = "test2"; fitsbin_add_chunk(in, &chunk); chunk.tablename = "test2B"; fitsbin_add_chunk(in, &chunk); CuAssertIntEquals(ct, 0, fitsbin_read(in)); ch = fitsbin_get_chunk(in, 0); CuAssertIntEquals(ct, 1, ch->itemsize); CuAssertIntEquals(ct, N * sizeof(double), ch->nrows); indata = ch->data; CuAssertPtrNotNull(ct, indata); CuAssertIntEquals(ct, 0, memcmp(outdata, indata, sizeof(outdata))); ch = fitsbin_get_chunk(in, 1); CuAssertIntEquals(ct, sizeof(double), ch->itemsize); CuAssertIntEquals(ct, N, ch->nrows); indata = ch->data; CuAssertPtrNotNull(ct, indata); for (i=0; i<N; i++) { CuAssertDblEquals(ct, outdata[N-1 - i], indata[i], 1e-10); } CuAssertIntEquals(ct, 0, fitsbin_close(in)); }