[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Clipping output
> From: ELIOT%cs.umass.edu@RELAY.CS.NET
> Is there any good way, preferably in FORMAT to
> clip output longer than a specified length?
> ...
> The effect I need is equivalent to:
> (subseq (format nil "~a" XXX) 0 20)
> but I would rather not do all the consing that this implies.
> In general, I would like to be able to specify
> the maximum field width of most of the format directives.
The code below would truncate output with minimal consing (at least
close to a constant).
Of course, this only works for ONE call to FORMAT, and so you
would need to break down a format string
into separate calls to get the effect on more than one directive.
With all the other whiz-bang features of format, a max-width field is
probably not too much to ask for. Anybody have any idea how difficult
it would be to add it in?
- Kelly
(defvar *truncate-buffer* (make-array 200 ;; The bigger it is, less consing
:element-type 'string-char
:adjustable t
:fill-pointer 0))
(defun TRUNCATE-FORMAT (max-width stream format-string &rest format-args)
(setf (fill-pointer *truncate-buffer*) 0) ;; Start Empty
(with-output-to-string (string-stream *truncate-buffer*) ;; Cons a stream.
(apply #'format string-stream format-string format-args)) ;; Fill it up
(when (> (fill-pointer *truncate-buffer*) max-width) ;; Truncate
(setf (fill-pointer *truncate-buffer*) max-width))
(format stream "~A" *truncate-buffer*)) ;; Output