From 1fe6c1941bf9f19b35589a54cacaccf69bf7aa20 Mon Sep 17 00:00:00 2001 From: Michael Strelnikov Date: Wed, 31 Dec 2008 05:44:48 +0200 Subject: [PATCH] Improved $display task Added a proper zero padding to formats like %04d --- vpi/sys_display.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/vpi/sys_display.c b/vpi/sys_display.c index 3f0c1fe9c..59f70ed29 100644 --- a/vpi/sys_display.c +++ b/vpi/sys_display.c @@ -511,6 +511,7 @@ static int format_str_char(vpiHandle scope, unsigned int mcd, return 1; } + char *res_val_str; if (fsize==-1){ /* simple %d parameter, or %0d parameter. * Size is now determined by the width @@ -521,9 +522,34 @@ static int format_str_char(vpiHandle scope, unsigned int mcd, fsize = (leading_zero==1) ? 0 : vpi_get_dec_size(argv[idx]); - } + res_val_str = strdup(value.value.str); + } else { + if(leading_zero == 1){ + // case of '%04d' - padding with zeros + int abs_fsize = abs(fsize); + int res_val_str_len, res_val_str_indx=0, val_indx=0; + res_val_str_len = (strlen(value.value.str) > abs_fsize ? strlen(value.value.str) : abs_fsize) + 2; + res_val_str = malloc(sizeof(char)*res_val_str_len); + assert(res_val_str); + if(value.value.str[0] == '-'){ + res_val_str[res_val_str_indx++] = '-'; + val_indx++; + } + // padding with zeros (if required) + if(abs_fsize > strlen(value.value.str)) { + memset(&res_val_str[res_val_str_indx], '0', abs_fsize-strlen(value.value.str)); + res_val_str_indx += abs_fsize-strlen(value.value.str); + } + // copy rest of the value + strcpy(&res_val_str[res_val_str_indx], &value.value.str[val_indx]); + } else { + // case of '%4d' + res_val_str = strdup(value.value.str); + } + } - my_mcd_printf(mcd, "%*s", fsize, value.value.str); + my_mcd_printf(mcd, "%*s", fsize, res_val_str); + free(res_val_str); use_count = 1; break;