if (frac_width != 0) {
const gchar *dot_pos = memchr (dtoabuf, '.', slen);
- if (dot_pos && frac_width < (slen - ((dot_pos - dtoabuf) + 1))) {
- slen = (dot_pos - dtoabuf) + 1 + /* xxx. */
- frac_width; /* .yyy */
+ if (dot_pos) {
+ if (frac_width < (slen - ((dot_pos - dtoabuf) + 1))) {
+ /* Truncate */
+ slen = (dot_pos - dtoabuf) + 1 + /* xxx. */
+ frac_width; /* .yyy */
+ }
+ else if (frac_width + dot_pos + 1 < dtoabuf + sizeof (dtoabuf)) {
+ /* Expand */
+ frac_width -= slen - ((dot_pos - dtoabuf) + 1);
+ memset (dtoabuf + slen, '0', frac_width);
+ slen += frac_width;
+ }
+ }
+ else {
+ /* Expand */
+ frac_width = MIN (frac_width, sizeof (dtoabuf) - slen - 1);
+ dtoabuf[slen ++] = '.';
+ memset (dtoabuf + slen, '0', frac_width);
+ slen += frac_width;
}
}