aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOscar Najera <hi@oscarnajera.com>2025-06-06 17:27:21 +0200
committerOscar Najera <hi@oscarnajera.com>2025-06-06 18:27:04 +0200
commit0ce7a9320aab651218585d25738269692017b4ac (patch)
tree98677bf59657543304cf2a35655a5060402328e5
parent2a5a72f9338bdc971fe7d95a44e310b78066fa7d (diff)
downloadscratch-0ce7a9320aab651218585d25738269692017b4ac.tar.gz
scratch-0ce7a9320aab651218585d25738269692017b4ac.tar.bz2
scratch-0ce7a9320aab651218585d25738269692017b4ac.zip
pointer read length is an argument
With this I don't need to read again the same byte and keep track of going one byte back
-rw-r--r--geoip/ip.lisp26
1 files changed, 12 insertions, 14 deletions
diff --git a/geoip/ip.lisp b/geoip/ip.lisp
index e00ba89..a61989d 100644
--- a/geoip/ip.lisp
+++ b/geoip/ip.lisp
@@ -42,11 +42,12 @@
(5am:is (= (parse-ipv4 "8.8.8.8") 134744072))
(5am:is (= (parse-ipv6 "::1") 1)))
-(defparameter *metadata-marker*
- (concatenate 'vector
- #(#xab #xcd #xef)
- (map 'vector #'char-code "MaxMind.com")))
-
+(alexandria:define-constant
+ +metadata-marker+
+ (concatenate 'vector
+ #(#xab #xcd #xef)
+ (map 'vector #'char-code "MaxMind.com"))
+ :test #'equalp)
(defstruct maxmind-database
(filename nil :read-only t)
@@ -153,8 +154,6 @@
(length (ldb (byte 5 0) control-byte)))
(when (zerop type)
(setf type (+ 7 (read-db-char db-ptr))))
- (when (= type 1)
- (incf-pointer (db-reader-db-ptr db-ptr) -1))
(list type
(cond
((or (= type 1) (< length 29))
@@ -177,19 +176,18 @@
(defun mread-list (db-ptr length)
(loop repeat length collect (mread-data db-ptr)))
-(defun read-pointer (reader)
- (let* ((control-byte (read-db-char reader))
- (size-bits (ldb (byte 2 3) control-byte))
- (value-bits (ldb (byte 3 0) control-byte)))
+(defun read-pointer (reader length)
+ (let ((size-bits (ldb (byte 2 3) length))
+ (value-bits (ldb (byte 3 0) length)))
(ecase size-bits
(0 (+ (ash value-bits 8) (read-db-char reader)))
(1 (+ (ash value-bits 16) (mread-unsigned reader 2) 2048))
(2 (+ (ash value-bits 24) (mread-unsigned reader 3) 526336))
(3 (mread-unsigned reader 4)))))
-(defun mread-pointer (reader)
+(defun mread-pointer (reader length)
(with-slots (db-ptr head-ptr data-offset) reader
- (let* ((target (+ (read-pointer reader) data-offset))
+ (let* ((target (+ (read-pointer reader length) data-offset))
(curr-ptr db-ptr)
(result))
(setf db-ptr (inc-pointer head-ptr target))
@@ -200,7 +198,7 @@
(defun mread-data (db-ptr)
(destructuring-bind (type length) (mread-datafield-metadata db-ptr)
(ecase type
- (1 (mread-pointer db-ptr))
+ (1 (mread-pointer db-ptr length))
(2 (mread-uft8 db-ptr length))
(3 (cons 'double (mread-unsigned db-ptr 8)))
(4 (bytes-from-foreign db-ptr length))