X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/c9b62cf375f393de076d0fc7a3c2748d581c54a2..fd2598022cc10ce4f28019f5c0cb1816cd9311a4:/hlink.c diff --git a/hlink.c b/hlink.c index 536b571f..812c55f7 100644 --- a/hlink.c +++ b/hlink.c @@ -249,17 +249,13 @@ static char *check_prior(struct file_struct *file, int gnum, int *prev_ndx_p, struct file_list **flist_p) { struct file_struct *fp; - struct file_list *flist; struct ht_int32_node *node; int prev_ndx = F_HL_PREV(file); while (1) { - if (prev_ndx < 0) { - *prev_ndx_p = prev_ndx; - *flist_p = NULL; - return NULL; - } - if ((flist = flist_for_ndx(prev_ndx)) == NULL) + struct file_list *flist; + if (prev_ndx < 0 + || (flist = flist_for_ndx(prev_ndx)) == NULL) break; fp = flist->files[prev_ndx - flist->ndx_start]; if (!(fp->flags & FLAG_SKIP_HLINK)) { @@ -270,20 +266,20 @@ static char *check_prior(struct file_struct *file, int gnum, F_HL_PREV(file) = prev_ndx = F_HL_PREV(fp); } - node = hashtable_find(prior_hlinks, gnum, 0); - assert(node != NULL && node->data); - - if (CVAL(node->data, 0) == 0) { + if ((node = hashtable_find(prior_hlinks, gnum, 0)) != NULL) { + assert(node->data != NULL); + if (CVAL(node->data, 0) != 0) { + *prev_ndx_p = -1; + *flist_p = NULL; + return node->data; + } /* The prior file must have been skipped. */ - F_HL_PREV(file) = prev_ndx = -1; - *prev_ndx_p = prev_ndx; - *flist_p = NULL; - return NULL; + F_HL_PREV(file) = -1; } - *prev_ndx_p = prev_ndx; - *flist_p = flist; - return node->data; + *prev_ndx_p = -1; + *flist_p = NULL; + return NULL; } /* Only called if FLAG_HLINKED is set and FLAG_HLINK_FIRST is not. Returns: