+ (minusp nil))
+ (declare (fixnum first-char))
+ (if (zerop length)
+ nil
+ (progn
+ (cond
+ ((= first-char +char-code-minus+)
+ (setq minusp t))
+ ((= first-char +char-code-plus+)
+ ) ; nothing to do
+ (t
+ (setq val (- first-char +char-code-zero+))))
+ (dotimes (i (1- length))
+ (declare (fixnum i))
+ (setq val (+
+ (* 10 val)
+ (- (read-byte socket) +char-code-zero+))))
+ (if minusp
+ (- val)
+ val)))))
+
+(defmacro ascii-digit (int)
+ (let ((offset (gensym)))
+ `(let ((,offset (- ,int +char-code-zero+)))
+ (declare (fixnum ,int ,offset))
+ (if (and (>= ,offset 0)
+ (< ,offset 10))
+ ,offset
+ nil))))
+
+(defun read-double-from-socket (socket length)
+ (let ((before-decimal 0)
+ (after-decimal 0)
+ (decimal-count 0)
+ (exponent 0)
+ (decimalp nil)
+ (minusp nil)
+ (result nil)
+ (char (read-byte socket)))
+ (declare (fixnum char))
+ (decf length) ;; already read first character
+ (cond
+ ((= char +char-code-minus+)
+ (setq minusp t)
+ (setq char (read-byte socket))
+ (decf length))
+ ((= char +char-code-plus+)
+ (setq char (read-byte socket))
+ (decf length)))
+
+ (dotimes (i length)
+ (let ((weight (ascii-digit char)))
+ (cond
+ ((and weight (not decimalp)) ;; before decimal point
+ (setq before-decimal (+ weight (* 10 before-decimal)))
+ (setq char (read-byte socket)))
+ ((and weight decimalp) ;; after decimal point
+ (setq after-decimal (+ weight (* 10 after-decimal)))
+ (incf decimal-count)
+ (setq char (read-byte socket)))
+ ((and (= char +char-code-period+))
+ (setq decimalp t)
+ (setq char (read-byte socket)))
+ ((or (= char +char-code-lower-e+) ;; E is for exponent
+ (= char +char-code-upper-e+))
+ (setq exponent (read-integer-from-socket socket (- length i)))
+ (format t "~&exp: ~a" exponent)
+ (setq exponent (or exponent 0))
+ (setq i length))
+ (t
+ (break "Unexpected value"))
+ )
+ ))
+ (setq result (* (+ (coerce before-decimal 'double-float)
+ (* after-decimal
+ (expt 10 (- decimal-count))))
+ (expt 10 exponent)))
+ (if minusp
+ (- result)
+ result)))
+
+
+#+ignore
+(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))))