[mcclim-cvs] CVS mcclim/Drei
thenriksen
thenriksen at common-lisp.net
Thu Jan 3 16:25:16 UTC 2008
Update of /project/mcclim/cvsroot/mcclim/Drei
In directory clnet:/tmp/cvs-serv11398/Drei
Modified Files:
fundamental-syntax.lisp
Log Message:
Fixed reparsing bug in Fundamental syntax.
Because chunk offsets were absolute, and not relative to the line
start mark, line information became out of date when changes were made
to previous lines.
--- /project/mcclim/cvsroot/mcclim/Drei/fundamental-syntax.lisp 2008/01/03 12:32:08 1.9
+++ /project/mcclim/cvsroot/mcclim/Drei/fundamental-syntax.lisp 2008/01/03 16:25:16 1.10
@@ -59,37 +59,50 @@
(%chunks :accessor chunks
:initform (make-array 5
:adjustable t
- :fill-pointer 0))))
+ :fill-pointer 0)
+ :documentation "A list of cons-cells, with the car
+being a buffer offset relative to the `start-mark' of the line,
+and the cdr being T if the chunk covers a non-character, and NIL
+if it covers a character sequence.")))
(defun line-end-offset (line)
"Return the end buffer offset of `line'."
(+ (offset (start-mark line)) (line-length line)))
-(defun get-chunk (buffer chunk-start-offset line-end-offset)
+(defun get-chunk (buffer line-start-offset chunk-start-offset line-end-offset)
+ "Return a chunk in the form of a cons cell. The chunk will
+start at `chunk-start-offset' and extend no further than
+`line-end-offset'."
(let* ((chunk-end-offset (buffer-find-nonchar
buffer chunk-start-offset
(min (+ *maximum-chunk-size*
chunk-start-offset)
line-end-offset))))
(cond ((= chunk-start-offset line-end-offset)
- (cons chunk-end-offset nil))
+ (cons (- chunk-end-offset
+ line-start-offset) nil))
((or (not (= chunk-end-offset chunk-start-offset))
(and (offset-beginning-of-line-p buffer chunk-start-offset)
(offset-end-of-line-p buffer chunk-end-offset)))
- (cons chunk-end-offset nil))
+ (cons (- chunk-end-offset
+ line-start-offset) nil))
((not (characterp (buffer-object buffer chunk-end-offset)))
- (cons (1+ chunk-end-offset) t)))))
+ (cons (- (1+ chunk-end-offset)
+ line-start-offset) t)))))
(defmethod initialize-instance :after ((line line-object)
&rest initargs)
(declare (ignore initargs))
(loop with buffer = (buffer (start-mark line))
- with chunk-start-offset = (offset (start-mark line))
- with line-end-offset = (end-of-line-offset buffer (offset (start-mark line)))
- for chunk-info = (get-chunk (buffer (start-mark line))
+ with line-start-offset = (offset (start-mark line))
+ with line-end-offset = (+ line-start-offset (line-length line))
+ with chunk-start-offset = line-start-offset
+ for chunk-info = (get-chunk buffer
+ line-start-offset
chunk-start-offset line-end-offset)
do (vector-push-extend chunk-info (chunks line))
- (setf chunk-start-offset (car chunk-info))
+ (setf chunk-start-offset (+ (car chunk-info)
+ line-start-offset))
when (= chunk-start-offset line-end-offset)
do (loop-finish)))
@@ -168,11 +181,13 @@
(defun fetch-chunk (line chunk-index)
"Retrieve the `chunk-index'th chunk from `line'. The return
value is either an integer, in which case it specifies the
-end-offset of a string chunk, or a function, in which case it is
-the drawing function for a single-object non-character chunk."
- (destructuring-bind (chunk-end-offset . objectp)
+end-offset of a string chunk relative to the start of the line,
+or a function, in which case it is the drawing function for a
+single-object non-character chunk."
+ (destructuring-bind (relative-chunk-end-offset . objectp)
(aref (chunks line) chunk-index)
- (if objectp (object-drawer) chunk-end-offset)))
+ (if objectp (object-drawer) (+ relative-chunk-end-offset
+ (offset (start-mark line))))))
(defmethod stroke-pump-with-syntax ((view textual-drei-syntax-view)
(syntax fundamental-syntax) stroke
More information about the Mcclim-cvs
mailing list