MCPcopy Create free account
hub / github.com/oschwald/maxminddb-golang / decodePointer

Method decodePointer

internal/decoder/data_decoder.go:247–280  ·  view source on GitHub ↗

DecodePointer decodes a pointer from the given offset.

(
	size uint,
	offset uint,
)

Source from the content-addressed store, hash-verified

245
246// DecodePointer decodes a pointer from the given offset.
247func (d *DataDecoder) decodePointer(
248 size uint,
249 offset uint,
250) (uint, uint, error) {
251 pointerSize := ((size >> 3) & 0x3) + 1
252 newOffset := offset + pointerSize
253 if newOffset > uint(len(d.buffer)) {
254 return 0, 0, mmdberrors.NewOffsetError()
255 }
256 pointerBytes := d.buffer[offset:newOffset]
257 var prefix uint
258 if pointerSize == 4 {
259 prefix = 0
260 } else {
261 prefix = size & 0x7
262 }
263 unpacked := uintFromBytes(prefix, pointerBytes)
264
265 var pointerValueOffset uint
266 switch pointerSize {
267 case 1, 4:
268 pointerValueOffset = 0
269 case 2:
270 pointerValueOffset = pointerBase2
271 case 3:
272 pointerValueOffset = pointerBase3
273 default:
274 return 0, 0, mmdberrors.NewInvalidDatabaseError("invalid pointer size: %d", pointerSize)
275 }
276
277 pointer := unpacked + pointerValueOffset
278
279 return pointer, newOffset, nil
280}
281
282// DecodeBool decodes a boolean from the given offset.
283func (*DataDecoder) decodeBool(size, offset uint) (bool, uint, error) {

Callers 8

decodeKeyMethod · 0.95
OffsetMethod · 0.80
resolveCtrlDataMethod · 0.80
IsEmptyValueAtMethod · 0.80
DecodePathMethod · 0.80
unmarshalPointerMethod · 0.80

Calls 3

NewOffsetErrorFunction · 0.92
NewInvalidDatabaseErrorFunction · 0.92
uintFromBytesFunction · 0.85

Tested by

no test coverage detected