xdiff/xprepare: refactor abort cleanups

Group free()'s that are called when a malloc() fails in xdl_prepare_ctx(), making for more readable code. Also add a free() on ha, in case future git hackers add allocs after the ha malloc. Signed-off-by: Tay Ray Chuan <rctay89@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Tay Ray Chuan committed Jul 7, 2011 at 12:23 UTC 159607a8f1ad16c0a04e0f17d5f8a35299696bc6
1 file changed +32 -59
xdiff/xprepare.c
+32 -59
@@ -143,24 +143,21 @@ static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp,
143 char *rchg;
144 long *rindex;
145
146 - if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0) {
146 + ha = NULL;
147 + rindex = NULL;
148 + rchg = NULL;
149 + rhash = NULL;
150 + recs = NULL;
151
148 - return -1;
149 - }
150 - if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *)))) {
151 -
152 - xdl_cha_free(&xdf->rcha);
153 - return -1;
154 - }
152 + if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0)
153 + goto abort;
154 + if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *))))
155 + goto abort;
156
157 hbits = xdl_hashbits((unsigned int) narec);
158 hsize = 1 << hbits;
158 - if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *)))) {
159 -
160 - xdl_free(recs);
161 - xdl_cha_free(&xdf->rcha);
162 - return -1;
163 - }
159 + if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
160 + goto abort;
161 memset(rhash, 0, hsize * sizeof(xrecord_t *));
162
163 nrec = 0;
@@ -175,63 +172,30 @@ static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp,
172 hav = xdl_hash_record(&cur, top, xpp->flags);
173 if (nrec >= narec) {
174 narec *= 2;
178 - if (!(rrecs = (xrecord_t **) xdl_realloc(recs, narec * sizeof(xrecord_t *)))) {
179 -
180 - xdl_free(rhash);
181 - xdl_free(recs);
182 - xdl_cha_free(&xdf->rcha);
183 - return -1;
184 - }
175 + if (!(rrecs = (xrecord_t **) xdl_realloc(recs, narec * sizeof(xrecord_t *))))
176 + goto abort;
177 recs = rrecs;
178 }
187 - if (!(crec = xdl_cha_alloc(&xdf->rcha))) {
188 -
189 - xdl_free(rhash);
190 - xdl_free(recs);
191 - xdl_cha_free(&xdf->rcha);
192 - return -1;
193 - }
179 + if (!(crec = xdl_cha_alloc(&xdf->rcha)))
180 + goto abort;
181 crec->ptr = prev;
182 crec->size = (long) (cur - prev);
183 crec->ha = hav;
184 recs[nrec++] = crec;
185
199 - if (xdl_classify_record(cf, rhash, hbits, crec) < 0) {
200 -
201 - xdl_free(rhash);
202 - xdl_free(recs);
203 - xdl_cha_free(&xdf->rcha);
204 - return -1;
205 - }
186 + if (xdl_classify_record(cf, rhash, hbits, crec) < 0)
187 + goto abort;
188 }
189 }
190
209 - if (!(rchg = (char *) xdl_malloc((nrec + 2) * sizeof(char)))) {
210 -
211 - xdl_free(rhash);
212 - xdl_free(recs);
213 - xdl_cha_free(&xdf->rcha);
214 - return -1;
215 - }
191 + if (!(rchg = (char *) xdl_malloc((nrec + 2) * sizeof(char))))
192 + goto abort;
193 memset(rchg, 0, (nrec + 2) * sizeof(char));
194
218 - if (!(rindex = (long *) xdl_malloc((nrec + 1) * sizeof(long)))) {
219 -
220 - xdl_free(rchg);
221 - xdl_free(rhash);
222 - xdl_free(recs);
223 - xdl_cha_free(&xdf->rcha);
224 - return -1;
225 - }
226 - if (!(ha = (unsigned long *) xdl_malloc((nrec + 1) * sizeof(unsigned long)))) {
227 -
228 - xdl_free(rindex);
229 - xdl_free(rchg);
230 - xdl_free(rhash);
231 - xdl_free(recs);
232 - xdl_cha_free(&xdf->rcha);
233 - return -1;
234 - }
195 + if (!(rindex = (long *) xdl_malloc((nrec + 1) * sizeof(long))))
196 + goto abort;
197 + if (!(ha = (unsigned long *) xdl_malloc((nrec + 1) * sizeof(unsigned long))))
198 + goto abort;
199
200 xdf->nrec = nrec;
201 xdf->recs = recs;
@@ -245,6 +209,15 @@ static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp,
209 xdf->dend = nrec - 1;
210
211 return 0;
212 +
213 +abort:
214 + xdl_free(ha);
215 + xdl_free(rindex);
216 + xdl_free(rchg);
217 + xdl_free(rhash);
218 + xdl_free(recs);
219 + xdl_cha_free(&xdf->rcha);
220 + return -1;
221 }
222
223