+(defmacro ascii-digit (int)
+ (let ((offset (gensym)))
+ `(let ((,offset (- ,int +char-code-zero+)))
+ (declare (fixnum ,int ,offset))
+ (if (and (plusp ,offset)
+ (< ,offset 10))
+ ,offset
+ nil))))
+
+#+ignore
+(defun read-double-from-socket (socket length)
+ (let ((before-decimal 0)
+ (after-decimal 0)
+ (decimal-count 0)
+ (exponent 0)
+ (char (read-byte socket))
+ (decimalp nil)
+ (minusp nil))
+ (declare (fixnum first-char))
+ (cond
+ ((eql char +char-code-minus+)
+ (setq minusp t)
+ (setq char (read-byte socket))
+ (decf length))
+ ((eql char +char-code-plus+)
+ (setq char (read-byte socket))
+ (decf length)))
+
+ (dotimes (i (1- length))
+ (let ((weight (ascii-digit char)))
+ (cond
+ ((and weight (not decimalp)) ;; before decimal point
+ (setq before-decimal (+ weight (* 10 before-decimal))))
+ ((and weight decimalp) ;; after decimal point
+ (setq after-decimal (+ weight (* 10 after-decimal)))
+ (incf decimal-count))
+ ((and (eql char +char-code-period+) decimalp)
+ (setq decimalp t))
+ ((or (eql char +char-code-e+) ;; E is for exponent
+ (eql char +char-code-upper-e+))
+ (multiple-value-bind (num idx)
+ (parse-integer string :start (1+ index) :end end
+ :radix radix :junk-allowed junk-allowed)
+ (setq exponent (or num 0)
+ index idx)
+ (when (= index end) (return nil))))
+ )
+ (setq char (read-byte socket))))
+
+
+
+
+ ))
+
+
+(defun read-double-from-socket (socket length)
+ (let ((result (make-string length)))
+ (read-socket-sequence result socket)
+ (let ((*read-default-float-format* 'double-float))
+ (read-from-string result))))