Mercurial > dovecot > core-2.2
diff src/lib-mail/message-parser.h @ 4906:0c3c948412c5 HEAD
Type safe callbacks weren't as easy as I thought. Only callback(void
*context) can be handled generically. Others can be handled specially, but
only if all the parameters are pointers, otherwise eg. int parameter can be
replaced with long without compiler giving any warnings.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 15 Dec 2006 20:10:51 +0200 |
parents | 204d7edc7cdc |
children | 6cd889c652b0 |
line wrap: on
line diff
--- a/src/lib-mail/message-parser.h Fri Dec 15 19:17:21 2006 +0200 +++ b/src/lib-mail/message-parser.h Fri Dec 15 20:10:51 2006 +0200 @@ -74,29 +74,51 @@ struct message_size *hdr_size, message_part_header_callback_t *callback, void *context); -#define message_parser_parse_header(ctx, hdr_size, callback, context) \ - CONTEXT_CALLBACK3(message_parser_parse_header, \ - message_part_header_callback_t, \ - callback, context, ctx, hdr_size) +#ifdef CONTEXT_TYPE_SAFETY +# define message_parser_parse_header(ctx, hdr_size, callback, context) \ + ({(void)(1 ? 0 : callback((struct message_part *)0, \ + (struct message_header_line *)0, context)); \ + message_parser_parse_header(ctx, hdr_size, \ + (message_part_header_callback_t *)callback, context); }) +#else +# define message_parser_parse_header(ctx, hdr_size, callback, context) \ + message_parser_parse_header(ctx, hdr_size, \ + (message_part_header_callback_t *)callback, context) +#endif + /* Read and parse body. If message is a MIME multipart or message/rfc822 message, hdr_callback is called for all headers. body_callback is called for the body content. */ void message_parser_parse_body(struct message_parser_ctx *ctx, message_part_header_callback_t *hdr_callback, void *context); -#define message_parser_parse_body(ctx, callback, context) \ - CONTEXT_CALLBACK3(message_parser_parse_body, \ - message_part_header_callback_t, \ - callback, context, ctx) +#ifdef CONTEXT_TYPE_SAFETY +# define message_parser_parse_body(ctx, callback, context) \ + ({(void)(1 ? 0 : callback((struct message_part *)0, \ + (struct message_header_line *)0, context)); \ + message_parser_parse_body(ctx, \ + (message_part_header_callback_t *)callback, context); }) +#else +# define message_parser_parse_body(ctx, callback, context) \ + message_parser_parse_body(ctx, \ + (message_part_header_callback_t *)callback, context) +#endif /* callback is called for each field in message header. */ void message_parse_from_parts(struct message_part *part, struct istream *input, message_part_header_callback_t *callback, void *context); -#define message_parse_from_parts(part, input, callback, context) \ - CONTEXT_CALLBACK3(message_parse_from_parts, \ - message_part_header_callback_t, \ - callback, context, part, input) +#ifdef CONTEXT_TYPE_SAFETY +# define message_parse_from_parts(part, input, callback, context) \ + ({(void)(1 ? 0 : callback((struct message_part *)0, \ + (struct message_header_line *)0, context)); \ + message_parse_from_parts(part, input, \ + (message_part_header_callback_t *)callback, context); }) +#else +# define message_parse_from_parts(part, input, callback, context) \ + message_parse_from_parts(part, input, \ + (message_part_header_callback_t *)callback, context) +#endif /* Update the physical_size of all parts. If use_crlf is TRUE, they're set to same as virtual_size. If use_crlf is FALSE, they're set to