-(unless (aref parse-time-digits ?0)
- (loop for i from ?0 to ?9
- do (aset parse-time-digits i (- i ?0))))
-
-(unless (aref parse-time-syntax ?0)
- (loop for i from ?0 to ?9
- do (aset parse-time-syntax i ?0))
- (loop for i from ?A to ?Z
- do (aset parse-time-syntax i ?A))
- (loop for i from ?a to ?z
- do (aset parse-time-syntax i ?a))
- (aset parse-time-syntax ?+ 1)
- (aset parse-time-syntax ?- -1)
- (aset parse-time-syntax ?: ?d))
-
-(defsubst digit-char-p (char)
- (aref parse-time-digits char))
-
-;; Note: the function definition differs from the one in Emacs
-;; in order to keep the compatibility with XEmacs.
-(defsubst parse-time-string-chars (char)
- (and (< char (length parse-time-syntax))
- (aref parse-time-syntax char)))
-
-(put 'parse-error 'error-conditions '(parse-error error))
-(put 'parse-error 'error-message "Parsing error")
-
-(defsubst parse-integer (string &optional start end)
- "[CL] Parse and return the integer in STRING, or nil if none."
- (let ((integer 0)
- (digit 0)
- (index (or start 0))
- (end (or end (length string))))
- (when (< index end)
- (let ((sign (aref string index)))
- (if (or (eq sign ?+) (eq sign ?-))
- (setq sign (parse-time-string-chars sign)
- index (1+ index))
- (setq sign 1))
- (while (and (< index end)
- (setq digit (digit-char-p (aref string index))))
- (setq integer (+ (* integer 10) digit)
- index (1+ index)))
- (if (/= index end)
- (signal 'parse-error `("not an integer"
- ,(substring string (or start 0) end)))
- (* sign integer))))))
+(eval-and-compile
+ (if (featurep 'xemacs)
+ (progn
+ (defvar parse-time-syntax (make-vector 256 nil))
+ (loop for i from ?0 to ?9
+ do (aset parse-time-syntax i ?0))
+ (loop for i from ?A to ?Z
+ do (aset parse-time-syntax i ?A))
+ (loop for i from ?a to ?z
+ do (aset parse-time-syntax i ?a))
+ (aset parse-time-syntax ?+ 1)
+ (aset parse-time-syntax ?- -1)
+ (aset parse-time-syntax ?: ?d)
+ (defsubst parse-time-string-chars (char)
+ (and (< char (length parse-time-syntax))
+ (aref parse-time-syntax char))))
+ (defsubst parse-time-string-chars (char)
+ (save-match-data
+ (let (case-fold-search str)
+ (cond ((eq char ?+) 1)
+ ((eq char ?-) -1)
+ ((eq char ?:) ?d)
+ ((string-match "[[:upper:]]" (setq str (string char))) ?A)
+ ((string-match "[[:lower:]]" str) ?a)
+ ((string-match "[[:digit:]]" str) ?0)))))))
+
+(eval-and-compile
+ (if (fboundp 'cl-parse-integer)
+ (defalias 'parse-time-integer 'cl-parse-integer)
+ (defvar parse-time-digits (make-vector 256 nil))
+ (loop for i from ?0 to ?9
+ do (aset parse-time-digits i (- i ?0)))
+ (defun parse-time-integer (string &rest keys)
+ "[CL] Parse and return the integer in STRING, or nil if none."
+ (let* ((start (plist-get keys :start))
+ (end (or (plist-get keys :end) (length string)))
+ (integer 0)
+ (digit 0)
+ (index (or start 0)))
+ (when (< index end)
+ (let ((sign (aref string index)))
+ (if (or (eq sign ?+) (eq sign ?-))
+ (setq sign (parse-time-string-chars sign)
+ index (1+ index))
+ (setq sign 1))
+ (while (and (< index end)
+ (setq digit (aref parse-time-digits
+ (aref string index))))
+ (setq integer (+ (* integer 10) digit)
+ index (1+ index)))
+ (if (/= index end)
+ (error "Not an integer string: `%s'" string)
+ (* sign integer))))))))