From: Ezekiel Newren <ezekielnewren@xxxxxxxxx> Simplify xdl_prepare_ctx() by using xdl_free_ctx() instead of using local variables with hand rolled memory management. Signed-off-by: Ezekiel Newren <ezekielnewren@xxxxxxxxx> --- xdiff/xprepare.c | 60 +++++++++++++++++++----------------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/xdiff/xprepare.c b/xdiff/xprepare.c index 00cdf7d8a0..55e1cc3087 100644 --- a/xdiff/xprepare.c +++ b/xdiff/xprepare.c @@ -129,86 +129,74 @@ static int xdl_classify_record(unsigned int pass, xdlclassifier_t *cf, xrecord_t } +static void xdl_free_ctx(xdfile_t *xdf) { + xdl_free(xdf->rindex); + xdl_free(xdf->rchg - 1); + xdl_free(xdf->ha); + xdl_free(xdf->recs); + xdl_cha_free(&xdf->rcha); +} + + static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_t const *xpp, xdlclassifier_t *cf, xdfile_t *xdf) { - long nrec, bsize; + long bsize; unsigned long hav; char const *blk, *cur, *top, *prev; xrecord_t *crec; - xrecord_t **recs; - unsigned long *ha; - char *rchg; - long *rindex; - ha = NULL; - rindex = NULL; - rchg = NULL; - recs = NULL; + xdf->ha = NULL; + xdf->rindex = NULL; + xdf->rchg = NULL; + xdf->recs = NULL; + xdf->nrec = 0; if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0) goto abort; - if (!XDL_ALLOC_ARRAY(recs, narec)) + if (!XDL_ALLOC_ARRAY(xdf->recs, narec)) goto abort; - nrec = 0; if ((cur = blk = xdl_mmfile_first(mf, &bsize))) { for (top = blk + bsize; cur < top; ) { prev = cur; hav = xdl_hash_record(&cur, top, xpp->flags); - if (XDL_ALLOC_GROW(recs, nrec + 1, narec)) + if (XDL_ALLOC_GROW(xdf->recs, xdf->nrec + 1, narec)) goto abort; if (!(crec = xdl_cha_alloc(&xdf->rcha))) goto abort; crec->ptr = (u8 const*) prev; crec->size = (long) (cur - prev); crec->ha = hav; - recs[nrec++] = crec; + xdf->recs[xdf->nrec++] = crec; if (xdl_classify_record(pass, cf, crec) < 0) goto abort; } } - if (!XDL_CALLOC_ARRAY(rchg, nrec + 2)) + if (!XDL_CALLOC_ARRAY(xdf->rchg, xdf->nrec + 2)) goto abort; if ((XDF_DIFF_ALG(xpp->flags) != XDF_PATIENCE_DIFF) && (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF)) { - if (!XDL_ALLOC_ARRAY(rindex, nrec + 1)) + if (!XDL_ALLOC_ARRAY(xdf->rindex, xdf->nrec + 1)) goto abort; - if (!XDL_ALLOC_ARRAY(ha, nrec + 1)) + if (!XDL_ALLOC_ARRAY(xdf->ha, xdf->nrec + 1)) goto abort; } - xdf->nrec = nrec; - xdf->recs = recs; - xdf->rchg = rchg + 1; - xdf->rindex = rindex; + xdf->rchg += 1; xdf->nreff = 0; - xdf->ha = ha; xdf->dstart = 0; - xdf->dend = nrec - 1; + xdf->dend = xdf->nrec - 1; return 0; abort: - xdl_free(ha); - xdl_free(rindex); - xdl_free(rchg); - xdl_free(recs); - xdl_cha_free(&xdf->rcha); + xdl_free_ctx(xdf); return -1; } -static void xdl_free_ctx(xdfile_t *xdf) { - xdl_free(xdf->rindex); - xdl_free(xdf->rchg - 1); - xdl_free(xdf->ha); - xdl_free(xdf->recs); - xdl_cha_free(&xdf->rcha); -} - - void xdl_free_env(xdfenv_t *xe) { xdl_free_ctx(&xe->xdf2); -- gitgitgadget