@@ -234,21 +234,28 @@ end
234234# strings
235235function _fmt (buf, pos, spec:: FmtSpec{FmtStr} , arg)
236236 altf, width, prec = spec. altf, spec. width, spec. prec
237- str = altf && (arg isa Symbol || arg isa AbstractString) ? repr (arg) : string (arg)
238- slen = length (str)
239- op = p = prec == - 1 ? slen : min (slen, prec)
237+ s = altf && (arg isa Symbol || arg isa AbstractString) ? repr (arg) : string (arg)
238+ slen = textwidth (s)
239+ str, slen = 0 <= prec < slen ? _truncstr (s, slen, prec) : (s, slen)
240+ prepad = postpad = 0
241+ pad = width - slen
242+ if pad > 0
243+ if spec. leftalign
244+ postpad = pad
245+ else
246+ prepad = pad
247+ end
248+ end
249+
240250 # Make sure there is enough room in buffer
241- nlen = max (width, p)
242- buflen = sizeof (buf) - pos
243- buflen < nlen && resize! (buf, nlen + pos)
244- ! spec . leftalign && width > p && (pos = padn (buf, pos, width - p ))
251+ nlen = pos + prepad + sizeof (str) + postpad
252+ nlen > sizeof (buf) && resize! (buf, nlen)
253+
254+ prepad == 0 || (pos = padn (buf, pos, prepad ))
245255 for c in str
246- p == 0 && break
247256 pos = writechar (buf, pos, c)
248- p -= 1
249257 end
250- spec. leftalign && width > op && return padn (buf, pos, width - op)
251- return pos
258+ return postpad == 0 ? pos : padn (buf, pos, postpad)
252259end
253260
254261const BaseInt = Union{Int8, Int16, Int32, Int64, Int128}
0 commit comments