Muchas gracias MAFUS segui mas o menos tu consejo y quedo asi el codigo:
void server_print(struct peticion *session,char *format,...) {
int len = 0,count = 0,i,X;
char *buffer = NULL;
struct m_args *arreglo = NULL;
va_list args;
X = len;
i = 0;
while(i < len) {
if(format[i] == '%') {
i++;
printf("Evaluando %c\n",format
[i
]); switch(format[i]) {
case 's':
arreglo
= realloc(arreglo
,sizeof(struct m_args
)*(count
+1)); arreglo
[count
].
valor = va_arg(args
, void *); X
+= strlen((char*)arreglo
[count
].
valor); count++;
break;
case 'i':
arreglo
= realloc(arreglo
,sizeof(struct m_args
)*(count
+1)); arreglo
[count
].
valor = va_arg(args
, void *); X+=11;
count++;
break;
case 'u':
arreglo
= realloc(arreglo
,sizeof(struct m_args
)*(count
+1)); arreglo
[count
].
valor = va_arg(args
, void *); X+=11;
count++;
break;
case 'd':
arreglo
= realloc(arreglo
,sizeof(struct m_args
)*(count
+1)); arreglo
[count
].
valor = va_arg(args
, void *); X+=11;
count++;
break;
case 'f':
arreglo
= realloc(arreglo
,sizeof(struct m_args
)*(count
+1)); arreglo
[count
].
valor = va_arg(args
, void *); X+=11;
count++;
break;
case 'x':
arreglo
= realloc(arreglo
,sizeof(struct m_args
)*(count
+1)); arreglo
[count
].
valor = va_arg(args
, void *); X+=11;
count++;
break;
case 'l':
arreglo
= realloc(arreglo
,sizeof(struct m_args
)*(count
+1)); arreglo
[count
].
valor = va_arg(args
, void *); X+=20;
count++;
break;
case 'c':
arreglo
= realloc(arreglo
,sizeof(struct m_args
)*(count
+1)); arreglo
[count
].
valor = va_arg(args
, void *); X+=1;
count++;
break;
case '%':
X+=1;
break;
default:
arreglo
= realloc(arreglo
,sizeof(struct m_args
)*(count
+1)); arreglo
[count
].
valor = va_arg(args
, void *); X+=20;
count++;
break;
}
}
i++;
}
vsnprintf(buffer,X,format, args);
buffer[X] = 0;
printf("Longitud reservada %i vs Real %i\n",X
,len
); X = session->reply_length + len;
session
->reply
= realloc(session
->reply
,X
+1); memcpy(session
->reply
+ session
->reply_length
,buffer
,len
); session->reply[X] = 0;
session->reply_length = X;
}
Resulta que podria llamar varias veces a va_start(args, format); y va_end...
Y asi solo itere sobre los argumentos viendo su tipo (Segun el formato de Cadena) reserve la memoria mas o menos necesitada por el tipo y volvi a llamar a va_start para posteriormente hacer un vsnprintf
vsnprintf(buffer,X,format, args);
Aun asi me faltan los formatos mas especializados pero eso con tiempo lo voy hacer, puse un default de +20 bytes por parametro "desconocido"
Saldos!