diff --git a/src/functions.c b/src/functions.c index abec004..ce84b84 100644 --- a/src/functions.c +++ b/src/functions.c @@ -121,34 +121,41 @@ void log_debug_set(int value) { void logmsg(int level, const char *msg, ...) { va_list ap; - static char oldmsg[1024] = ""; + static char oldmsg[20][256]; + static int curroldmsg = 0; char newmsg[1024]; + int i; va_start(ap, msg); vsnprintf((char*)&newmsg, 1024, msg, ap); va_end(ap); - if (strncmp(newmsg,(char*)&oldmsg,1024) != 0) /* only log the same message once */ - { - switch (level) { - case LOG_MARK: - fprintf(stderr,"Info: ******************************\n"); - fprintf(stderr,"Info: %s\n",(char*)&newmsg); - fprintf(stderr,"Info: ******************************\n"); - break; - case LOG_WARNING: - fprintf(stderr,"Warning: %s\n",(char*)&newmsg); - break; - case LOG_ERROR: - fprintf(stderr,"Error: %s\n",(char*)&newmsg); - break; - case LOG_DEBUG: - if (debug_log == 1) fprintf(stderr,"DEBUG: %s\n",(char*)&newmsg); - break; - default: - break; - } - strncpy(oldmsg,newmsg,1024); + for (i = 0; i < 20; i++) { + /* only log the same message once */ + if (!strncmp(newmsg,(char*)&(oldmsg[i]),256)) return; + } + + switch (level) { + case LOG_MARK: + fprintf(stderr,"Info: ******************************\n"); + fprintf(stderr,"Info: %s\n",(char*)&newmsg); + fprintf(stderr,"Info: ******************************\n"); + break; + case LOG_WARNING: + fprintf(stderr,"Warning: %s\n",(char*)&newmsg); + break; + case LOG_ERROR: + fprintf(stderr,"Error: %s\n",(char*)&newmsg); + break; + case LOG_DEBUG: + if (debug_log == 1) fprintf(stderr,"DEBUG: %s\n",(char*)&newmsg); + break; + default: + break; + } + if ((level == LOG_WARNING) || (level == LOG_ERROR)) { + strncpy(oldmsg[curroldmsg++],newmsg,256); + if (curroldmsg >= 20) curroldmsg = 0; } }