static int get_next_file_chunk_for_huffman(GtBitsequence **bits, GtUword *length, GtUword *offset, GtUword *pad_length, void *meminfo) { const int empty = 0, success = 1; HcrHuffDataIterator *data_iter; gt_assert(meminfo); gt_assert(bits && length && offset && pad_length); data_iter = (HcrHuffDataIterator*) meminfo; gt_log_log("pos in iter: "GT_WU"", (GtUword) data_iter->pos); if (data_iter->pos < data_iter->end) { gt_fa_xmunmap(data_iter->data); data_iter->data = NULL; data_iter->data = gt_fa_xmmap_read_range(data_iter->path, (size_t) data_iter->blocksize, data_iter->pos); data_iter->pos += data_iter->blocksize; if (data_iter->pos > data_iter->end) { gt_safe_assign(*length, (data_iter->blocksize - (data_iter->pos - data_iter->end))); *length /= sizeof (GtBitsequence); } else *length = data_iter->bitseq_per_chunk; *offset = 0; *pad_length = 0; *bits = data_iter->data; return success; } gt_fa_xmunmap(data_iter->data); data_iter->data = NULL; *bits = NULL; *length = 0; *offset = 0; *pad_length = 0; return empty; }
void *gt_Sfxmappedrange_map(GtSfxmappedrange *sfxmappedrange, GtUword minindex, GtUword maxindex) { gt_assert(sfxmappedrange != NULL); if (sfxmappedrange->ptr != NULL) { gt_fa_xmunmap(sfxmappedrange->ptr); } if (sfxmappedrange->transformfunc != NULL) { sfxmappedrange->transformfunc(&minindex,&maxindex, sfxmappedrange->transformfunc_data); } if (minindex <= maxindex) { GtMappedrange lbrange; GtUword unitoffset; size_t sizeoftable; gt_Sfxmapped_offset_end(&lbrange, sfxmappedrange->sizeofunit, sfxmappedrange->pagesize, minindex, maxindex); sizeoftable = gt_Sfxmappedrange_size_entire(sfxmappedrange); gt_log_log("mapped %s["GT_WU".."GT_WU"] for %s (%.1f%% of all)", gt_str_get(sfxmappedrange->tablename), lbrange.mapoffset, lbrange.mapend, sfxmappedrange->writable ? "writing" : "reading", (lbrange.mapend - lbrange.mapoffset + 1 >= (GtUword) sizeoftable) ? 100.0 : 100.0 * (lbrange.mapend - lbrange.mapoffset + 1)/ sizeoftable); gt_assert(lbrange.mapoffset <= lbrange.mapend); gt_assert(lbrange.mapoffset <= minindex * sfxmappedrange->sizeofunit); gt_assert(maxindex * sfxmappedrange->sizeofunit <= lbrange.mapend); gt_assert(lbrange.mapoffset % sfxmappedrange->pagesize == 0); if (sfxmappedrange->writable) { sfxmappedrange->ptr = gt_fa_xmmap_write_range(gt_str_get(sfxmappedrange->filename), (size_t) (lbrange.mapend-lbrange.mapoffset+1), (size_t) lbrange.mapoffset); } else { sfxmappedrange->ptr = gt_fa_xmmap_read_range (gt_str_get(sfxmappedrange->filename), (size_t) (lbrange.mapend-lbrange.mapoffset+1), (size_t) lbrange.mapoffset); } sfxmappedrange->indexrange_defined = true; sfxmappedrange->currentmaxindex = maxindex; sfxmappedrange->currentminindex = minindex; unitoffset = lbrange.mapoffset / sfxmappedrange->sizeofunit; switch (sfxmappedrange->type) { case GtSfxGtBitsequence: return ((GtBitsequence *) sfxmappedrange->ptr) - unitoffset; case GtSfxuint32_t: return ((uint32_t *) sfxmappedrange->ptr) - unitoffset; case GtSfxunsignedlong: return ((GtUword *) sfxmappedrange->ptr) - unitoffset; default: gt_assert(false); break; } gt_assert(false); } sfxmappedrange->ptr = NULL; sfxmappedrange->indexrange_defined = true; sfxmappedrange->currentmaxindex = maxindex; sfxmappedrange->currentminindex = minindex; return NULL; }