From: Frederic Marchal Date: Sat, 26 Jan 2013 19:16:07 +0000 (+0100) Subject: Work around a bug in mingw's snprintf X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d5a8da9d4972921353701936eb653fb2f6edb19b;p=thirdparty%2Fsarg.git Work around a bug in mingw's snprintf snprintf doesn't limit the output string to the requested size (or at least not strictly). The formatted numbers displayed in the report were wrong. --- diff --git a/util.c b/util.c index 92dfd60..e3a5dd6 100644 --- a/util.c +++ b/util.c @@ -594,55 +594,58 @@ char *fixnum(long long int value, int n) char *pret; register int i, j, k; int numlen; - static char abbrev[30]; + static char abbrev[30]=""; my_lltoa(value, num, sizeof(num), 0); if(DisplayedValues==DISPLAY_ABBREV) { numlen = strlen(num); if(numlen <= 3) - sprintf(abbrev,"%s",num); - if(numlen == 4 || numlen == 7 || numlen == 10 || numlen == 13) { - snprintf(abbrev,2,"%s",num); - strncat(abbrev,".",1); - strncat(abbrev,num+1,2); + strcpy(abbrev,num); + else if(numlen == 4 || numlen == 7 || numlen == 10 || numlen == 13) { + memcpy(abbrev,num,1); + abbrev[1]='.'; + strncpy(abbrev+2,num+1,2); + abbrev[4]='\0'; if(!n) return(abbrev); if(numlen == 4) - strncat(abbrev,"K",1); + strcat(abbrev,"K"); else if(numlen == 7) - strncat(abbrev,"M",1); + strcat(abbrev,"M"); else if(numlen == 10) - strncat(abbrev,"G",1); + strcat(abbrev,"G"); else if(numlen == 13) - strncat(abbrev,"T",1); + strcat(abbrev,"T"); } - if(numlen == 5 || numlen == 8 || numlen == 11 || numlen == 14) { - snprintf(abbrev,3,"%s",num); - strncat(abbrev,".",1); - strncat(abbrev,num+2,2); + else if(numlen == 5 || numlen == 8 || numlen == 11 || numlen == 14) { + memcpy(abbrev,num,2); + abbrev[2]='.'; + strncpy(abbrev+3,num+2,2); + abbrev[5]='\0'; if(!n) return(abbrev); if(numlen == 5) - strncat(abbrev,"K",1); + strcat(abbrev,"K"); else if(numlen == 8) - strncat(abbrev,"M",1); + strcat(abbrev,"M"); else if(numlen == 11) - strncat(abbrev,"G",1); + strcat(abbrev,"G"); else if(numlen == 14) - strncat(abbrev,"T",1); + strcat(abbrev,"T"); } - if(numlen == 6 || numlen == 9 || numlen == 12 || numlen == 15) { - snprintf(abbrev,4,"%s",num); - strncat(abbrev,".",1); - strncat(abbrev,num+3,2); + else if(numlen == 6 || numlen == 9 || numlen == 12 || numlen == 15) { + memcpy(abbrev,num,3); + abbrev[3]='.'; + strncpy(abbrev+4,num+3,2); + abbrev[6]='\0'; if(!n) return(abbrev); if(numlen == 6) - strncat(abbrev,"K",1); + strcat(abbrev,"K"); else if(numlen == 9) - strncat(abbrev,"M",1); + strcat(abbrev,"M"); else if(numlen == 12) - strncat(abbrev,"G",1); + strcat(abbrev,"G"); else if(numlen == 15) - strncat(abbrev,"T",1); + strcat(abbrev,"T"); } return(abbrev);