+
+(defun !parse-integer (string junk-allow)
+ (block nil
+ (let ((value 0)
+ (index 0)
+ (size (length string))
+ (sign 1))
+ (when (zerop size) (return (values nil 0)))
+ ;; Optional sign
+ (case (char string 0)
+ (#\+ (incf index))
+ (#\- (setq sign -1)
+ (incf index)))
+ ;; First digit
+ (unless (and (< index size)
+ (setq value (digit-char-p (char string index))))
+ (return (values nil index)))
+ (incf index)
+ ;; Other digits
+ (while (< index size)
+ (let ((digit (digit-char-p (char string index))))
+ (unless digit (return))
+ (setq value (+ (* value 10) digit))
+ (incf index)))
+ (if (or junk-allow
+ (= index size)
+ (char= (char string index) #\space))
+ (values (* sign value) index)
+ (values nil index)))))
+
+#+ecmalisp
+(defun parse-integer (string)
+ (!parse-integer string nil))
+