;;; -*- mode: lisp -*-
;;; $Id: wc.cmucl,v 1.3 2001/06/05 13:19:24 doug Exp $
;;; http://www.bagley.org/~doug/shootout/
;;; from Bulent Murtezaoglu (with some code from Andrew McDowell)
(declaim (optimize (speed 3) (debug 0) (safety 0) (space 0) (compilation-speed 0)))
(let* ((start 0)
(current #\X) ;junk char save me the locally
(end 0)
(nc 0)
(buffer (make-string 4096)))
(declare (type (simple-base-string 4096) buffer) (fixnum start end nc)
(base-char current))
(labels
((get-char ()
(when (= start end)
(setf start 0)
(setf end (read-sequence buffer *standard-input*))
(incf nc end)
(when (zerop end)
(return-from get-char nil)))
(setf current (schar buffer start))
(incf start)))
(let ((nl 0)
(nw 0)
(inword nil))
(declare (fixnum nl nw))
(loop while (get-char) do
(cond ((char= current #\newline)
(incf nl)
(setq inword nil))
((or (char= current #\space) (char= current #\tab))
(setq inword nil))
((not inword) ;; only tested if we have a word constituent
(incf nw) (setq inword t))))
(format t "~A ~A ~A~%" nl nw nc))))