Turn the increasingly complex *_CHAIN() macros into functions

This commit is contained in:
Nick Mathewson 2010-03-30 12:48:56 -04:00
parent b7442f8e83
commit 96865c4783

View File

@ -626,53 +626,61 @@ done:
return result; return result;
} }
#define ZERO_CHAIN(dst) do { \ static inline void
ASSERT_EVBUFFER_LOCKED(dst); \ ZERO_CHAIN(struct evbuffer *dst)
(dst)->first = NULL; \ {
(dst)->last = NULL; \ ASSERT_EVBUFFER_LOCKED(dst);
(dst)->last_with_datap = &(dst)->first; \ dst->first = NULL;
(dst)->total_len = 0; \ dst->last = NULL;
} while (0) dst->last_with_datap = &(dst)->first;
dst->total_len = 0;
}
#define COPY_CHAIN(dst, src) do { \ static inline void
ASSERT_EVBUFFER_LOCKED(dst); \ COPY_CHAIN(struct evbuffer *dst, struct evbuffer *src)
ASSERT_EVBUFFER_LOCKED(src); \ {
(dst)->first = (src)->first; \ ASSERT_EVBUFFER_LOCKED(dst);
if ((src)->last_with_datap == &(src)->first) \ ASSERT_EVBUFFER_LOCKED(src);
(dst)->last_with_datap = &(dst)->first; \ dst->first = src->first;
else \ if (src->last_with_datap == &src->first)
(dst)->last_with_datap = (src)->last_with_datap; \ dst->last_with_datap = &dst->first;
(dst)->last = (src)->last; \ else
(dst)->total_len = (src)->total_len; \ dst->last_with_datap = src->last_with_datap;
} while (0) dst->last = src->last;
dst->total_len = src->total_len;
}
#define APPEND_CHAIN(dst, src) do { \ static void
ASSERT_EVBUFFER_LOCKED(dst); \ APPEND_CHAIN(struct evbuffer *dst, struct evbuffer *src)
ASSERT_EVBUFFER_LOCKED(src); \ {
(dst)->last->next = (src)->first; \ ASSERT_EVBUFFER_LOCKED(dst);
if ((src)->last_with_datap == &(src)->first) \ ASSERT_EVBUFFER_LOCKED(src);
(dst)->last_with_datap = &(dst)->last->next; \ dst->last->next = src->first;
else \ if (src->last_with_datap == &src->first)
(dst)->last_with_datap = (src)->last_with_datap; \ dst->last_with_datap = &dst->last->next;
(dst)->last = (src)->last; \ else
(dst)->total_len += (src)->total_len; \ dst->last_with_datap = src->last_with_datap;
} while (0) dst->last = src->last;
dst->total_len += src->total_len;
}
#define PREPEND_CHAIN(dst, src) do { \ static void
ASSERT_EVBUFFER_LOCKED(dst); \ PREPEND_CHAIN(struct evbuffer *dst, struct evbuffer *src)
ASSERT_EVBUFFER_LOCKED(src); \ {
(src)->last->next = (dst)->first; \ ASSERT_EVBUFFER_LOCKED(dst);
(dst)->first = (src)->first; \ ASSERT_EVBUFFER_LOCKED(src);
(dst)->total_len += (src)->total_len; \ src->last->next = dst->first;
if (*(dst)->last_with_datap == NULL) { \ dst->first = src->first;
if ((src)->last_with_datap == &(src)->first) \ dst->total_len += src->total_len;
(dst)->last_with_datap = &(dst)->first; \ if (*dst->last_with_datap == NULL) {
else \ if (src->last_with_datap == &(src)->first)
(dst)->last_with_datap = (src)->last_with_datap; \ dst->last_with_datap = &dst->first;
} else if ((dst)->last_with_datap == &(dst)->first) { \ else
(dst)->last_with_datap = &(src)->last->next; \ dst->last_with_datap = src->last_with_datap;
} \ } else if (dst->last_with_datap == &dst->first) {
} while (0) dst->last_with_datap = &src->last->next;
}
}
int int
evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf) evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf)