Skip to content

Commit 6c25257

Browse files
committed
ext/imap: Refactor common conditional property assignment
By introducing new functions and doing some preprocessor black magic
1 parent cc9ab53 commit 6c25257

File tree

1 file changed

+62
-183
lines changed

1 file changed

+62
-183
lines changed

ext/imap/php_imap.c

+62-183
Original file line numberDiff line numberDiff line change
@@ -3032,6 +3032,25 @@ PHP_FUNCTION(imap_bodystruct)
30323032

30333033
/* }}} */
30343034

3035+
static void php_imap_update_property_with_full_address_str(
3036+
zval *z_object, const char *property, size_t property_len, ADDRESS *address)
3037+
{
3038+
ADDRESS *current = address;
3039+
current->next = NULL;
3040+
3041+
zend_string *full_address = _php_rfc822_write_address(current);
3042+
if (full_address) {
3043+
zend_update_property_str(
3044+
Z_OBJCE_P(z_object), Z_OBJ_P(z_object),
3045+
property, property_len,
3046+
full_address
3047+
);
3048+
zend_string_release_ex(full_address, false);
3049+
}
3050+
}
3051+
3052+
#define UPDATE_PROPERTY_FULL_STR_ADDRESS(z_object, name, envelope) if ((envelope)->name) { php_imap_update_property_with_full_address_str((z_object), #name, strlen(#name), (envelope)->name); }
3053+
30353054
/* {{{ Read an overview of the information in the headers of the given message sequence */
30363055
PHP_FUNCTION(imap_fetch_overview)
30373056
{
@@ -3084,34 +3103,8 @@ PHP_FUNCTION(imap_fetch_overview)
30843103
env->subject
30853104
);
30863105
}
3087-
if (env->from) {
3088-
zend_string *from_address;
3089-
3090-
env->from->next=NULL;
3091-
from_address =_php_rfc822_write_address(env->from);
3092-
if (from_address) {
3093-
zend_update_property_str(
3094-
Z_OBJCE_P(&myoverview), Z_OBJ_P(&myoverview),
3095-
"from", strlen("from"),
3096-
from_address
3097-
);
3098-
zend_string_release(from_address);
3099-
}
3100-
}
3101-
if (env->to) {
3102-
zend_string *to_address;
3103-
3104-
env->to->next = NULL;
3105-
to_address = _php_rfc822_write_address(env->to);
3106-
if (to_address) {
3107-
zend_update_property_str(
3108-
Z_OBJCE_P(&myoverview), Z_OBJ_P(&myoverview),
3109-
"to", strlen("to"),
3110-
to_address
3111-
);
3112-
zend_string_release(to_address);
3113-
}
3114-
}
3106+
UPDATE_PROPERTY_FULL_STR_ADDRESS(&myoverview, from, env);
3107+
UPDATE_PROPERTY_FULL_STR_ADDRESS(&myoverview, to, env);
31153108
if (env->date) {
31163109
zend_update_property_string(
31173110
Z_OBJCE_P(&myoverview), Z_OBJ_P(&myoverview),
@@ -4242,6 +4235,40 @@ static zend_string* _php_imap_parse_address (ADDRESS *address_list, zval *paddre
42424235
}
42434236
/* }}} */
42444237

4238+
static void php_imap_update_property_with_parsed_full_address(
4239+
zval *z_object, ADDRESS *address,
4240+
const char *str_address_property, size_t str_address_property_len,
4241+
const char *parts_address_property, size_t parts_address_property_len
4242+
)
4243+
{
4244+
zval address_parts;
4245+
zend_string *full_address = NULL;
4246+
4247+
array_init(&address_parts);
4248+
full_address = _php_imap_parse_address(address, &address_parts);
4249+
if (full_address) {
4250+
zend_update_property_str(
4251+
Z_OBJCE_P(z_object), Z_OBJ_P(z_object),
4252+
str_address_property, str_address_property_len,
4253+
full_address
4254+
);
4255+
zend_string_release_ex(full_address, false);
4256+
}
4257+
zend_update_property(
4258+
Z_OBJCE_P(z_object), Z_OBJ_P(z_object),
4259+
parts_address_property, parts_address_property_len,
4260+
&address_parts
4261+
);
4262+
zval_ptr_dtor(&address_parts);
4263+
}
4264+
4265+
#define UPDATE_PROPERTY_PARSED_ADDRESS(z_object, name, envelope) if ((envelope)->name) { \
4266+
php_imap_update_property_with_parsed_full_address( \
4267+
(z_object), (envelope)->name, \
4268+
#name "address", strlen(#name "address"), \
4269+
#name, strlen(#name) \
4270+
); }
4271+
42454272
/* {{{ _php_make_header_object */
42464273
static void _php_make_header_object(zval *myzvalue, ENVELOPE *en)
42474274
{
@@ -4314,161 +4341,13 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en)
43144341
);
43154342
}
43164343

4317-
if (en->to) {
4318-
zval to_address_parts;
4319-
zend_string *to_full_address = NULL;
4320-
4321-
array_init(&to_address_parts);
4322-
to_full_address = _php_imap_parse_address(en->to, &to_address_parts);
4323-
if (to_full_address) {
4324-
zend_update_property_str(
4325-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4326-
"toaddress", strlen("toaddress"),
4327-
to_full_address
4328-
);
4329-
zend_string_release(to_full_address);
4330-
}
4331-
zend_update_property(
4332-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4333-
"to", strlen("to"),
4334-
&to_address_parts
4335-
);
4336-
zval_ptr_dtor(&to_address_parts);
4337-
}
4338-
4339-
if (en->from) {
4340-
zval from_address_parts;
4341-
zend_string *from_full_address = NULL;
4342-
4343-
array_init(&from_address_parts);
4344-
from_full_address = _php_imap_parse_address(en->from, &from_address_parts);
4345-
if (from_full_address) {
4346-
zend_update_property_str(
4347-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4348-
"fromaddress", strlen("fromaddress"),
4349-
from_full_address
4350-
);
4351-
zend_string_release(from_full_address);
4352-
}
4353-
zend_update_property(
4354-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4355-
"from", strlen("from"),
4356-
&from_address_parts
4357-
);
4358-
zval_ptr_dtor(&from_address_parts);
4359-
}
4360-
4361-
if (en->cc) {
4362-
zval cc_address_parts;
4363-
zend_string *cc_full_address = NULL;
4364-
4365-
array_init(&cc_address_parts);
4366-
cc_full_address = _php_imap_parse_address(en->cc, &cc_address_parts);
4367-
if (cc_full_address) {
4368-
zend_update_property_str(
4369-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4370-
"ccaddress", strlen("ccaddress"),
4371-
cc_full_address
4372-
);
4373-
zend_string_release(cc_full_address);
4374-
}
4375-
zend_update_property(
4376-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4377-
"cc", strlen("cc"),
4378-
&cc_address_parts
4379-
);
4380-
zval_ptr_dtor(&cc_address_parts);
4381-
}
4382-
4383-
if (en->bcc) {
4384-
zval bcc_address_parts;
4385-
zend_string *bcc_full_address = NULL;
4386-
4387-
array_init(&bcc_address_parts);
4388-
bcc_full_address = _php_imap_parse_address(en->bcc, &bcc_address_parts);
4389-
if (bcc_full_address) {
4390-
zend_update_property_str(
4391-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4392-
"bccaddress", strlen("bccaddress"),
4393-
bcc_full_address
4394-
);
4395-
zend_string_release(bcc_full_address);
4396-
}
4397-
zend_update_property(
4398-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4399-
"bcc", strlen("bcc"),
4400-
&bcc_address_parts
4401-
);
4402-
zval_ptr_dtor(&bcc_address_parts);
4403-
}
4404-
4405-
if (en->reply_to) {
4406-
zval reply_to_address_parts;
4407-
zend_string *reply_to_full_address = NULL;
4408-
4409-
array_init(&reply_to_address_parts);
4410-
reply_to_full_address = _php_imap_parse_address(en->reply_to, &reply_to_address_parts);
4411-
if (reply_to_full_address) {
4412-
zend_update_property_str(
4413-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4414-
"reply_toaddress", strlen("reply_toaddress"),
4415-
reply_to_full_address
4416-
);
4417-
zend_string_release(reply_to_full_address);
4418-
}
4419-
zend_update_property(
4420-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4421-
"reply_to", strlen("reply_to"),
4422-
&reply_to_address_parts
4423-
);
4424-
zval_ptr_dtor(&reply_to_address_parts);
4425-
}
4426-
4427-
if (en->sender) {
4428-
zval sender_address_parts;
4429-
zend_string *sender_full_address = NULL;
4430-
4431-
array_init(&sender_address_parts);
4432-
sender_full_address = _php_imap_parse_address(en->sender, &sender_address_parts);
4433-
if (sender_full_address) {
4434-
zend_update_property_str(
4435-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4436-
"senderaddress", strlen("senderaddress"),
4437-
sender_full_address
4438-
);
4439-
zend_string_release(sender_full_address);
4440-
}
4441-
zend_update_property(
4442-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4443-
"sender", strlen("sender"),
4444-
&sender_address_parts
4445-
);
4446-
zval_ptr_dtor(&sender_address_parts);
4447-
}
4448-
4449-
if (en->return_path) {
4450-
zval return_path_address_parts;
4451-
zend_string *return_path_full_address = NULL;
4452-
4453-
array_init(&return_path_address_parts);
4454-
return_path_full_address = _php_imap_parse_address(en->return_path, &return_path_address_parts);
4455-
if (return_path_full_address) {
4456-
zend_update_property_str(
4457-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4458-
"return_pathaddress", strlen("return_pathaddress"),
4459-
return_path_full_address
4460-
);
4461-
zend_string_release(return_path_full_address);
4462-
}
4463-
zend_update_property(
4464-
Z_OBJCE_P(myzvalue), Z_OBJ_P(myzvalue),
4465-
"return_path", strlen("return_path"),
4466-
&return_path_address_parts
4467-
);
4468-
zval_ptr_dtor(&return_path_address_parts);
4469-
// From rebase might need?
4470-
//add_assoc_object(myzvalue, "return_path", &paddress);
4471-
}
4344+
UPDATE_PROPERTY_PARSED_ADDRESS(myzvalue, to, en);
4345+
UPDATE_PROPERTY_PARSED_ADDRESS(myzvalue, from, en);
4346+
UPDATE_PROPERTY_PARSED_ADDRESS(myzvalue, cc, en);
4347+
UPDATE_PROPERTY_PARSED_ADDRESS(myzvalue, bcc, en);
4348+
UPDATE_PROPERTY_PARSED_ADDRESS(myzvalue, reply_to, en);
4349+
UPDATE_PROPERTY_PARSED_ADDRESS(myzvalue, sender, en);
4350+
UPDATE_PROPERTY_PARSED_ADDRESS(myzvalue, return_path, en);
44724351
}
44734352
/* }}} */
44744353

0 commit comments

Comments
 (0)