anchor.diff:  ;;; Protocol::NulTerminatedString
   ;;; A string terminated by a NUL byte.
   
  -(defun read-null-terminated-string (stream &optional (eof-error-p t))
  -  (let* ((length 16)
  -         (octets (make-array length :element-type '(unsigned-byte 8)
  -                                    :initial-element 0
  -                                    :adjustable t)))
  +(defgeneric read-null-terminated-string (stream &optional eof-error-p)
  +  (:documentation
  +  "Read bytes from STREAM until we find a NUL byte.
  +   Accepts the following keyword arguments:
  +    EOF-ERROR-P - if NIL, treat EOF as NUL. (default: T)"))
  +
  +(defmethod read-null-terminated-string (stream &optional (eof-error-p t)
  +                                        &aux (length 16))
  +  (let ((octets (make-array length :element-type '(unsigned-byte 8)
  +                                   :initial-element 0
  +                                   :adjustable t)))
       (loop
         for i fixnum from 0
         as b fixnum = (read-byte stream eof-error-p (unless eof-error-p 0))
  
positive.code:         return (adjust-array octets i)
        do (setf (aref octets i) b))))
  
  (defun write-null-terminated-string (octets stream)
    (assert (notany #'zerop octets))
    (write-sequence octets stream)
  
negative.code: 
  ;;; Protocol::VariableLengthString
  ;;; A string with a length determine by another field
  ;;; This will be implemented at a higher level using fixed-length-strings
  ;;; and knowledge of the other field.
  
  ;;; Protocol::LengthEncodedString
  ;;; A string prefixed by its length as a length-encoded integer
  