diff options
Diffstat (limited to 'geoip/ip.lisp')
-rw-r--r-- | geoip/ip.lisp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/geoip/ip.lisp b/geoip/ip.lisp index 95d2ae2..8db396d 100644 --- a/geoip/ip.lisp +++ b/geoip/ip.lisp @@ -142,6 +142,12 @@ (incf-pointer db-ptr size) r))) +(defun mread-int32 (db-ptr length) + (let ((uval (mread-unsigned db-ptr length))) + (if (and (= length 4) (logbitp 31 uval)) + (- uval #.(expt 2 32)) + uval))) + (5am:test reader (with-foreign-array (a #(0 0 1 23 126 195 159 195 156) '(:array :uint8 9)) (let ((r (make-db-reader :db-ptr a))) @@ -183,9 +189,13 @@ (destructuring-bind (type length) (mread-datafield-metadata db-ptr) (ecase type (2 (mread-uft8 db-ptr length)) + (4 (bytes-from-foreign db-ptr length)) ((5 6 9 10) (mread-unsigned db-ptr length)) (7 (mread-map db-ptr length)) - (11 (mread-list db-ptr length))))) + (8 (mread-int32 db-ptr length)) + (11 (mread-list db-ptr length)) + (14 (< 0 length)) ; bool + ))) (defvar *refdb* (cl-maxminddb:make-mmdb "GeoLite2-Country.mmdb")) |