Implemented appmessage_new_call_variables() (untested)

This commit is contained in:
Pierre Pronchery 2013-01-08 20:38:14 +01:00
parent 4291bae1f9
commit 01e5eaa1e7

View File

@ -62,27 +62,77 @@ AppMessage * appmessage_new_call(char const * method, ...)
message->t.call.method = string_new(method); message->t.call.method = string_new(method);
message->t.call.args = NULL; message->t.call.args = NULL;
message->t.call.args_cnt = 0; message->t.call.args_cnt = 0;
/* check for errors */
if(message->t.call.method == NULL)
{
appmessage_delete(message);
return NULL;
}
/* copy the arguments */ /* copy the arguments */
va_start(ap, method); va_start(ap, method);
for(i = 0; (type = va_arg(ap, int)) >= 0; i++) for(i = 0; (type = va_arg(ap, int)) >= 0; i++)
{ {
if((p = realloc(message->t.call.args, sizeof(*p) * (i + 1))) if((p = realloc(message->t.call.args, sizeof(*p) * (i + 1)))
== NULL) == NULL)
{
appmessage_delete(message);
message = NULL;
break; break;
}
message->t.call.args = p; message->t.call.args = p;
if((v = variable_new(type, va_arg(ap, void *))) == NULL) if((v = variable_new(type, va_arg(ap, void *))) == NULL)
{
appmessage_delete(message);
message = NULL;
break; break;
message->t.call.args = p; }
message->t.call.args[i] = v; message->t.call.args[i] = v;
message->t.call.args_cnt = i + 1; message->t.call.args_cnt = i + 1;
} }
va_end(ap); va_end(ap);
return message;
}
/* appmessage_new_call_variables */
AppMessage * appmessage_new_call_variables(char const * method, ...)
{
AppMessage * message;
va_list ap;
size_t i;
Variable * v;
Variable ** p;
if((message = object_new(sizeof(*message))) == NULL)
return NULL;
message->type = AMT_CALL;
message->t.call.method = string_new(method);
message->t.call.args = NULL;
message->t.call.args_cnt = 0;
/* check for errors */ /* check for errors */
if(message->t.call.method == NULL || type >= 0) if(message->t.call.method == NULL)
{ {
appmessage_delete(message); appmessage_delete(message);
return NULL; return NULL;
} }
/* copy the arguments */
va_start(ap, method);
for(i = 0; (v = va_arg(ap, Variable *)) != NULL; i++)
{
if((p = realloc(message->t.call.args, sizeof(*p) * (i + 1)))
== NULL)
break;
message->t.call.args = p;
if((v = variable_new_copy(v)) == NULL)
{
appmessage_delete(message);
message = NULL;
break;
}
message->t.call.args[i] = v;
message->t.call.args_cnt = i + 1;
}
va_end(ap);
return message; return message;
} }