#include <stdio.h>
#include <time.h>
#include <stdarg.h>
#include <string.h>
void vlog(const char *fmt, va_list args) {
char msg[16];
time_t now = { time(NULL) };
strftime(msg, sizeof msg, "%T", localtime(&now));
printf("[%s] ", msg);
vprintf(fmt, args); /* vprintf(const char *fmt, va_list args) */
}
void log(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
vlog(fmt, args);
va_end(args);
}
int vsum(int n, va_list args) {
int ret = 0;
while (n--)
ret += va_arg(args, int);
return ret;
}
int sum(int n, ...) {
va_list args;
va_start(args, n);
int ret = vsum(n, args);
va_end(args);
return ret;
}
char *append_str(char *str, char *app) {
str = realloc(str, strlen(str) + strlen(app) + 1);
strncpy(str + strlen(str), app, strlen(app) + 1);
return str;
}
char *make_exp_str(int n, va_list args, int ret) {
char *str = (char *)malloc(3);
strcpy(str, "%d");
char fmt[] = " + %d";
log("n = %d, str = %s\n", n, str);
while (--n) {
str = append_str(str, fmt);
log("n = %d, str = %s\n", n, str);
}
char *result = (char *)malloc(15);
sprintf(result, " = %d", ret);
str = append_str(str, result);
free(result);
return str;
}
void task_sum(int n, ...) {
va_list args1, args2;
va_start(args1, n);
va_copy(args2, args1); /* args2 = args1.copy() */
int ret = vsum(n, args2);
log("ret = %d\n", ret);
va_end(args2);
char *fmt = make_exp_str(n, args1, ret);
vlog(fmt, args1);
free(fmt);
va_end(args1);
}
int main(void) {
task_sum(5, 1, 2, 3, 4, 5);
return 0;
}