;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: Apr 2000
;;;;
-;;;; $Id: strings.lisp,v 1.27 2003/05/14 21:31:42 kevin Exp $
+;;;; $Id: strings.lisp,v 1.33 2003/05/17 07:34:45 kevin Exp $
;;;;
;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
;;;;
(defun count-string-words (str)
(declare (simple-string str)
- (optimize (speed 3) (safety 0)))
+ (optimize (speed 3) (safety 0) (space 0)))
(let ((n-words 0)
(in-word nil))
(declare (fixnum n-words))
- (dotimes (i (length str))
- (let ((ch (char str i)))
- (declare (character ch))
- (if (alphanumericp ch)
- (unless in-word
- (incf n-words)
- (setq in-word t))
- (setq in-word nil))))
- n-words))
+ (do* ((len (length str))
+ (i 0 (1+ i)))
+ ((= i len) n-words)
+ (declare (fixnum i))
+ (if (alphanumericp (schar str i))
+ (unless in-word
+ (incf n-words)
+ (setq in-word t))
+ (setq in-word nil)))))
;; From Larry Hunter with modifications
(defun position-char (char string start max)
(write-string separator strm)))))
(defun prefixed-fixnum-string (num pchar len)
- "Outputs a string of LEN chars with the initial character being
-PCHAR. Leading zeros are printed."
+ "Outputs a string of LEN digit with an optional initial character PCHAR.
+Leading zeros are present."
+ (declare (optimize (speed 3) (safety 0) (space 0))
+ (type fixnum num len))
+ (when pchar
+ (incf len))
+ (do* ((zero-code (char-code #\0))
+ (result (make-string len :initial-element #\0))
+ (minus? (minusp num))
+ (val (if minus? (- 0 num) num) (floor (/ val 10)))
+ (pos (1- len) (1- pos))
+ (mod (mod val 10) (mod val 10)))
+ ((or (zerop val) (minusp pos))
+ (when pchar
+ (setf (schar result 0) pchar))
+ (when minus? (setf (schar result (if pchar 1 0)) #\-))
+ result)
+ (declare (fixnum val mod zero-code pos) (simple-string result))
+ (setf (schar result pos) (code-char (+ zero-code mod)))))
+
+(defun integer-string (num len)
+ "Outputs a string of LEN digit with an optional initial character PCHAR.
+Leading zeros are present."
(declare (optimize (speed 3) (safety 0) (space 0))
- (type fixnum v len))
- (let ((zero-code (char-code #\0))
+ (type fixnum len) (type integer num))
+ (do* ((zero-code (char-code #\0))
(result (make-string len :initial-element #\0))
- (pos (1- len)))
- (declare (fixnum zero-code pos)
- (simple-string result))
- (do* ((val num (floor (/ val 10)))
- (mod (nth-value 1 (floor val 10))
- (nth-value 1 (floor val 10))))
- ((or (zerop val) (minusp pos)))
- (declare (fixnum val mod))
- (setf (schar result pos) (code-char (+ zero-code mod)))
- (decf pos))
- (when pchar
- (setf (schar result 0) pchar))
- result))
+ (minus? (minusp num))
+ (val (if minus? (- 0 num) num) (floor (/ val 10)))
+ (pos (1- len) (1- pos))
+ (mod (mod val 10) (mod val 10)))
+ ((or (zerop val) (minusp pos))
+ (when minus? (setf (schar result (if pchar 1 0)) #\-))
+ result)
+ (declare (fixnum mod zero-code pos) (simple-string result) (integer val))
+ (setf (schar result pos) (code-char (+ zero-code mod)))))