--- util-linux-2.12p/misc-utils/cal.c.wide 2004-12-05 20:20:36.000000000 +0100 +++ util-linux-2.12p/misc-utils/cal.c 2006-01-02 15:13:50.000000000 +0100 @@ -368,7 +368,7 @@ int i, wd; #ifdef ENABLE_WIDECHAR wchar_t day_headings_wc[22],j_day_headings_wc[29]; - wchar_t wd_wc[10]; + char *cur_dh = day_headings, *cur_j_dh = j_day_headings; #endif strcpy(day_headings,""); @@ -385,30 +385,25 @@ #endif for(i = 0 ; i < 7 ; i++ ) { + ssize_t space_left; wd = (i + week1stday) % 7; #ifdef ENABLE_WIDECHAR - mbstowcs(wd_wc,weekday(wd),10); - if (wcswidth(wd_wc,10) < 3) - wcscat(j_day_headings_wc,L" "); - if (wcswidth(wd_wc,10) < 2) { - wcscat(day_headings_wc, L" "); - wcscat(j_day_headings_wc, L" "); - } - wcsncat(day_headings_wc,wd_wc,2); - wcsncat(j_day_headings_wc,wd_wc,3); - wcscat(day_headings_wc, L" "); - wcscat(j_day_headings_wc, L" "); + swprintf(day_headings_wc, sizeof(day_headings_wc)/sizeof(day_headings_wc[0]), + L"%1.2s ", weekday(wd)); + swprintf(j_day_headings_wc, sizeof(j_day_headings_wc)/sizeof(j_day_headings_wc[0]), + L"%3.3s ", weekday(wd)); + space_left = sizeof(day_headings)-(cur_dh-day_headings); + if(space_left <= 0) break; + cur_dh += wcstombs(cur_dh,day_headings_wc, space_left); + space_left = sizeof(j_day_headings)-(cur_j_dh-j_day_headings); + if(space_left <= 0) break; + cur_j_dh += wcstombs(cur_j_dh,j_day_headings_wc, space_left); #else sprintf(eos(day_headings), "%2.2s ", weekday(wd)); sprintf(eos(j_day_headings), "%3.3s ", weekday(wd)); #endif } -#ifdef ENABLE_WIDECHAR - wcstombs(day_headings,day_headings_wc,sizeof(day_headings)); - wcstombs(j_day_headings,j_day_headings_wc,sizeof(j_day_headings)); -#endif - trim_trailing_spaces(day_headings); trim_trailing_spaces(j_day_headings); #undef weekday