I did it this way
Code:
typedef struct
{
void *value;
int type;
}VAR;
void MyPrintf(int argc, ...)
{
int i;
int val;
char *strp;
VAR var;
va_list valist;
va_start(valist, argc);
//first argument is a resulting string
char *string = va_arg(valist, char *);
for (i = 1; i < argc; i++)
{
var = va_arg(valist, VAR);
switch (var.type)
{
case VTYPE_BYTE: val = *(uint8_t *)var.value; break;
case VTYPE_SHORT: val = *(uint16_t *)var.value; break;
case VTYPE_INT: val = *(uint32_t *)var.value; break;
case VTYPE_STR: strp = (char *)var.value; break;
}
if (var.type < VTYPE_STR)
{
strp = loc_itoa(val);
strcat(string, strp);
}
else
strcat(string, strp);
}
strcat(string, "\0");
va_end(valist);
}
Then I check
Code:
uint32_t COM_Printf()
{
char str[128] = { '\0' };
VAR vars[4];
vars[0].type = 1;
vars[0].value = (uint8_t*)1;
vars[1].type = 4;
vars[1].value = (char *)"aa";
vars[2].type = 3;
vars[2].value = (uint32_t*)1234;
vars[1].type = 4;
vars[1].value = (char *)"bb\r";
//I wish it would work like this but it doesn't
//MyPrintf(5, str, vars);
MyPrintf(5, str, vars[0], vars[1], vars[2], vars[3]);
USART_SendString(SYS_USART, str);
return MSG_OK;
}
I should see 1aa1234bb
but I see
87bb
29491202949120