static int xdl_init_recfile(mmfile_t *mf, int ispatch, recfile_t *rf) { long narec, nrec, bsize; recinfo_t *recs, *rrecs; char const *blk, *cur, *top, *eol; narec = xdl_guess_lines(mf); if (!(recs = (recinfo_t *) xdl_malloc(narec * sizeof(recinfo_t)))) { return -1; } nrec = 0; if ((cur = blk = (char const *)xdl_mmfile_first(mf, &bsize)) != NULL) { for (top = blk + bsize;;) { if (cur >= top) { if (!(cur = blk = (char const *)xdl_mmfile_next(mf, &bsize))) break; top = blk + bsize; } if (nrec >= narec) { narec *= 2; if (!(rrecs = (recinfo_t *) xdl_realloc(recs, narec * sizeof(recinfo_t)))) { xdl_free(recs); return -1; } recs = rrecs; } recs[nrec].ptr = cur; if (!(eol = (char*)memchr(cur, '\n', top - cur))) eol = top - 1; recs[nrec].size = (long) (eol - cur) + 1; if (ispatch && *cur == '\\' && nrec > 0 && recs[nrec - 1].size > 0 && recs[nrec - 1].ptr[recs[nrec - 1].size - 1] == '\n') recs[nrec - 1].size--; else nrec++; cur = eol + 1; } } rf->mf = mf; rf->nrec = nrec; rf->recs = recs; return 0; }
static mmoffbuffer_t *xdl_mmob_new(mmoffbuffer_t **probf, int *pnobf, int *paobf) { int aobf; mmoffbuffer_t *cobf, *rrobf; if (*pnobf >= *paobf) { aobf = 2 * (*paobf) + 1; if ((rrobf = (mmoffbuffer_t *) xdl_realloc(*probf, aobf * sizeof(mmoffbuffer_t))) == NULL) { return NULL; } *probf = rrobf; *paobf = aobf; } cobf = (*probf) + (*pnobf); (*pnobf)++; return cobf; }
static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp, xdlclassifier_t *cf, xdfile_t *xdf) { unsigned int hbits; long i, nrec, hsize, bsize; unsigned long hav; char const *blk, *cur, *top, *prev; xrecord_t *crec; xrecord_t **recs, **rrecs; xrecord_t **rhash; unsigned long *ha; char *rchg; long *rindex; if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0) { return -1; } if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *)))) { xdl_cha_free(&xdf->rcha); return -1; } hbits = xdl_hashbits((unsigned int) narec); hsize = 1 << hbits; if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *)))) { xdl_free(recs); xdl_cha_free(&xdf->rcha); return -1; } for (i = 0; i < hsize; i++) rhash[i] = NULL; nrec = 0; if ((cur = blk = xdl_mmfile_first(mf, &bsize)) != NULL) { for (top = blk + bsize;;) { if (cur >= top) { if (!(cur = blk = xdl_mmfile_next(mf, &bsize))) break; top = blk + bsize; } prev = cur; hav = xdl_hash_record(&cur, top, xpp->flags); if (nrec >= narec) { narec *= 2; if (!(rrecs = (xrecord_t **) xdl_realloc(recs, narec * sizeof(xrecord_t *)))) { xdl_free(rhash); xdl_free(recs); xdl_cha_free(&xdf->rcha); return -1; } recs = rrecs; } if (!(crec = xdl_cha_alloc(&xdf->rcha))) { xdl_free(rhash); xdl_free(recs); xdl_cha_free(&xdf->rcha); return -1; } crec->ptr = prev; crec->size = (long) (cur - prev); crec->ha = hav; recs[nrec++] = crec; if (xdl_classify_record(cf, rhash, hbits, crec) < 0) { xdl_free(rhash); xdl_free(recs); xdl_cha_free(&xdf->rcha); return -1; } } } if (!(rchg = (char *) xdl_malloc((nrec + 2) * sizeof(char)))) { xdl_free(rhash); xdl_free(recs); xdl_cha_free(&xdf->rcha); return -1; } memset(rchg, 0, (nrec + 2) * sizeof(char)); if (!(rindex = (long *) xdl_malloc((nrec + 1) * sizeof(long)))) { xdl_free(rchg); xdl_free(rhash); xdl_free(recs); xdl_cha_free(&xdf->rcha); return -1; } if (!(ha = (unsigned long *) xdl_malloc((nrec + 1) * sizeof(unsigned long)))) { xdl_free(rindex); xdl_free(rchg); xdl_free(rhash); xdl_free(recs); xdl_cha_free(&xdf->rcha); return -1; } xdf->nrec = nrec; xdf->recs = recs; xdf->hbits = hbits; xdf->rhash = rhash; xdf->rchg = rchg + 1; xdf->rindex = rindex; xdf->nreff = 0; xdf->ha = ha; xdf->dstart = 0; xdf->dend = nrec - 1; return 0; }