From 0ce7a9320aab651218585d25738269692017b4ac Mon Sep 17 00:00:00 2001 From: Oscar Najera Date: Fri, 6 Jun 2025 17:27:21 +0200 Subject: 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 --- geoip/ip.lisp | 26 ++++++++++++-------------- 1 file 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)) -- cgit v1.2.3