anchor.diff:                         (line-char (point-line point)
                                     (point-charpos point)))))
   
  +(defun text-property-at (point key &optional (offset 0))
  +  (%character-offset point offset
  +                     (lambda (line charpos)
  +                       (line-search-property line key charpos))
  +                     (lambda ()
  +                       (line-search-property (point-line point)
  +                                             key
  +                                             (point-charpos point)))))
  +
  +(defun put-text-property (start-point end-point key value)
  +  (assert (eq (point-buffer start-point)
  +              (point-buffer end-point)))
  +  (%map-region start-point end-point
  +               (lambda (line start end)
  +                 (line-add-property line
  +                                    start
  +                                    (if (null end)
  +                                        (line-length line)
  +                                        end)
  +                                    key
  +                                    value
  +                                    (null end)))))
  +
  +(defun remove-text-property (start-point end-point key)
  +  (assert (eq (point-buffer start-point)
  +              (point-buffer end-point)))
  +  (%map-region start-point end-point
  +               (lambda (line start end)
  +                 (line-remove-property line
  +                                       start
  +                                       (if (null end)
  +                                           (line-length line)
  +                                           end)
  +                                       key))))
  +
  +(defun next-single-property-change (point property-name &optional limit-point)
  +  (let ((first-value (text-property-at point property-name))
  +        (start-point (copy-point point :temporary)))
  +    (loop
  +       (unless (character-offset point 1)
  +	 (move-point point start-point)
  +	 (return nil))
  +       (unless (eq first-value (text-property-at point property-name))
  +	 (return point))
  +       (when (and limit-point (point<= limit-point point))
  +	 (move-point point start-point)
  +	 (return nil)))))
  +
  +(defun previous-single-property-change (point property-name &optional limit-point)
  +  (let ((first-value (text-property-at point property-name -1))
  +        (start-point (copy-point point :temporary)))
  +    (loop
  +       (unless (eq first-value (text-property-at point property-name -1))
  +	 (return point))
  +       (unless (character-offset point -1)
  +	 (move-point point start-point)
  +	 (return nil))
  +       (when (and limit-point (point>= limit-point point))
  +	 (move-point point start-point)
  +	 (return nil)))))
  +
   (defun insert-character (point char &optional (n 1))
     (loop :repeat n :do (insert-char/point point char))
     t)
  
positive.code:               (point-buffer point2)))
    (eq (point-line point1) (point-line point2)))
  
  (defun line-start (point)
    (setf (point-charpos point) 0)
    point)
  
  (defun line-end (point)
    (setf (point-charpos point)
          (line-length (point-line point)))
    point)
  
  (defun buffer-start (point)
    (move-point point (buffers-start (point-buffer point))))
  
  (defun buffer-end (point)
    (move-point point (buffers-end (point-buffer point))))
  
  (defun %move-to-position (point line charpos)
    (assert (line-alive-p line))
  
negative.code:           current-column
            point-to-offset))
  
  (defun buffers-start (buffer)
    (buffer-start-point buffer))
  
  