int qidxfile_write_header(qidxfile* qf) { fitsbin_t* fb = qf->fb; fitsbin_chunk_t* chunk; chunk = fitsbin_get_chunk(fb, CHUNK_QIDX); chunk->nrows = 2 * qf->numstars + qf->dimquads * qf->numquads; if (fitsbin_write_primary_header(fb) || fitsbin_write_chunk_header(fb, chunk)) { ERROR("Failed to write qidxfile header"); return -1; } qf->cursor_index = 0; qf->cursor_heap = 0; return 0; }
int qidxfile_write_star(qidxfile* qf, int* quads, int nquads) { fitsbin_t* fb = qf->fb; FILE* fid; uint32_t nq; int i; fitsbin_chunk_t* chunk; fid = fitsbin_get_fid(fb); chunk = fitsbin_get_chunk(fb, CHUNK_QIDX); // Write the offset & size: if (fseeko(fid, fitsbin_get_data_start(fb, chunk) + qf->cursor_index * 2 * sizeof(uint32_t), SEEK_SET)) { ERROR("qidxfile_write_star: failed to fseek"); return -1; } nq = nquads; if (fitsbin_write_item(fb, chunk, &qf->cursor_heap) || fitsbin_write_item(fb, chunk, &nq)) { ERROR("qidxfile_write_star: failed to write a qidx offset/size"); return -1; } // Write the quads. if (fseeko(fid, fitsbin_get_data_start(fb, chunk) + qf->numstars * 2 * sizeof(uint32_t) + qf->cursor_heap * sizeof(uint32_t), SEEK_SET)) { SYSERROR("qidxfile_write_star: failed to fseek"); return -1; } for (i=0; i<nquads; i++) { // (in case uint != uint32_t) uint32_t q = quads[i]; if (fitsbin_write_item(fb, chunk, &q)) { ERROR("qidxfile_write_star: failed to write quads"); return -1; } } qf->cursor_index++; qf->cursor_heap += nquads; return 0; }
qidxfile* qidxfile_open(const char* fn) { qidxfile* qf = NULL; qf = new_qidxfile(fn, FALSE); if (!qf) goto bailout; if (fitsbin_read(qf->fb)) { ERROR("Failed to find qidx table.\n"); goto bailout; } qf->index = fitsbin_get_chunk(qf->fb, CHUNK_QIDX)->data; qf->heap = qf->index + 2 * qf->numstars; return qf; bailout: if (qf) qidxfile_close(qf); return NULL; }
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)); }
void test_inmemory_fitsbin_2(CuTest* ct) { fitsbin_t* fb; int i; int N = 6; double outdata[6]; double* indata; fitsbin_chunk_t chunk; fitsbin_chunk_t* ch; fb = fitsbin_open_in_memory(); CuAssertPtrNotNull(ct, fb); CuAssertIntEquals(ct, 0, fitsbin_write_primary_header(fb)); 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(fb, &chunk)); for (i=0; i<N; i++) { CuAssertIntEquals(ct, 0, fitsbin_write_items(fb, &chunk, &outdata[i], sizeof(double))); } CuAssertIntEquals(ct, 0, fitsbin_fix_chunk_header(fb, &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(fb, &chunk)); for (i=0; i<N; i++) { CuAssertIntEquals(ct, 0, fitsbin_write_items(fb, &chunk, outdata + (N-1) - i, 1)); } CuAssertIntEquals(ct, 0, fitsbin_fix_chunk_header(fb, &chunk)); fitsbin_chunk_clean(&chunk); // writing shouldn't affect the data values for (i=0; i<N; i++) { CuAssertIntEquals(ct, outdata[i], i*i); } CuAssertIntEquals(ct, 0, fitsbin_switch_to_reading(fb)); fitsbin_chunk_init(&chunk); chunk.tablename = "test2"; fitsbin_add_chunk(fb, &chunk); chunk.tablename = "test2B"; fitsbin_add_chunk(fb, &chunk); CuAssertIntEquals(ct, 0, fitsbin_read(fb)); ch = fitsbin_get_chunk(fb, 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(fb, 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(fb)); }
static fitsbin_chunk_t* codes_chunk(codefile_t* cf) { return fitsbin_get_chunk(cf->fb, CHUNK_CODES); }