;;;----- Licensing notice ---------------------------------------------------
;;;
-;;; This file is part of the Sensble Object Design, an object system for C.
+;;; This file is part of the Sensible Object Design, an object system for C.
;;;
;;; SOD is free software; you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License as published by
(export '(string-scanner make-string-scanner string-scanner-p))
(defstruct (string-scanner
(:constructor make-string-scanner
- (string &key (start 0) end
+ (string
+ &key (start 0) end filename
&aux (%string string)
(index start)
(limit (or end (length string))))))
"Scanner structure for a simple string scanner."
(%string "" :type string :read-only t)
+ (filename "<string>" :type string :read-only t)
(index 0 :type (and fixnum unsigned-byte))
- (limit nil :type (and fixnum unsigned-byte) :read-only t))
+ (limit nil :type (and fixnum unsigned-byte) :read-only t)
+ (line 1 :type fixnum)
+ (column 0 :type fixnum))
(define-access-wrapper string-scanner-string string-scanner-%string
:read-only t)
(char (string-scanner-string scanner) (string-scanner-index scanner)))
(defmethod scanner-step ((scanner string-scanner))
- (incf (string-scanner-index scanner)))
+ (let ((index (string-scanner-index scanner)))
+ (setf (values (string-scanner-line scanner)
+ (string-scanner-column scanner))
+ (update-position (char (string-scanner-string scanner) index)
+ (string-scanner-line scanner)
+ (string-scanner-column scanner))
+ (string-scanner-index scanner) (1+ index))))
+
+(defmethod scanner-unread ((scanner string-scanner) char)
+ (let ((index (1- (string-scanner-index scanner))))
+ (setf (values (string-scanner-line scanner)
+ (string-scanner-column scanner))
+ (backtrack-position (char (string-scanner-string scanner) index)
+ (string-scanner-line scanner)
+ (string-scanner-column scanner))
+ (string-scanner-index scanner) index)))
+
+(defmethod scanner-filename ((scanner string-scanner))
+ (string-scanner-filename scanner))
+(defmethod scanner-line ((scanner string-scanner))
+ (string-scanner-line scanner))
+(defmethod scanner-column ((scanner string-scanner))
+ (string-scanner-column scanner))
+(defmethod file-location ((scanner string-scanner))
+ (make-file-location (string-scanner-filename scanner)
+ (string-scanner-line scanner)
+ (string-scanner-column scanner)))
(defmethod scanner-capture-place ((scanner string-scanner))
(string-scanner-index scanner))