From: Nicklas Avén Date: Mon, 11 Aug 2014 04:49:12 +0000 (+0000) Subject: going back to put varint functions in varint.c X-Git-Tag: 2.2.0rc1~892 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=553272c2153e5271279b80b8544f0a13aa41344d;p=postgis going back to put varint functions in varint.c git-svn-id: http://svn.osgeo.org/postgis/trunk@12883 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/liblwgeom/Makefile.in b/liblwgeom/Makefile.in index 1fdc01aa2..14566bf89 100644 --- a/liblwgeom/Makefile.in +++ b/liblwgeom/Makefile.in @@ -89,7 +89,8 @@ SA_OBJS = \ lwgeom_geos_clean.o \ lwgeom_geos_node.o \ lwgeom_geos_split.o \ - lwgeom_transform.o + lwgeom_transform.o \ + varint.o NM_OBJS = \ lwspheroid.o diff --git a/liblwgeom/varint.c b/liblwgeom/varint.c new file mode 100644 index 000000000..1a965d63a --- /dev/null +++ b/liblwgeom/varint.c @@ -0,0 +1,141 @@ +/********************************************************************** + * + * PostGIS - Spatial Types for PostgreSQL + * http://postgis.net + * + * Copyright (C) 2014 Sandro Santilli + * Copyright (C) 2013 Nicklas Avén + * + * This is free software; you can redistribute and/or modify it under + * the terms of the GNU General Public Licence. See the COPYING file. + * + ********************************************************************** + * + * Handle varInt values, as described here: + * http://developers.google.com/protocol-buffers/docs/encoding#varints + * + **********************************************************************/ + +#include "varint.h" +#include "lwgeom_log.h" +#include "liblwgeom.h" + +/** + * Constants to find the range of Varint. + * Since Varint only uses 7 bits instead of 8 in each byte a 8 byte varint + * only uses 56 bits for the number and 8 for telling if next byte is used + */ +const int64_t varint_u64_max = ((int64_t) 1<<56) - 1; +const int64_t varint_s64_min = (int64_t) -1<<55; +const int64_t varint_s64_max = ((int64_t)1<<55) - 1; +const int32_t varint_u32_max = ((int32_t) 1<<28) - 1; +const int32_t varint_s32_min = (int32_t) -1<<27; +const int32_t varint_s32_max = ((int32_t)1<<27) - 1; + +static unsigned +_varint_u64_encoded_size(uint64_t q) +{ + int n=0; + while ((q>>(7*(n+1))) >0) ++n; + return ++n; +} + +static uint8_t* +_varint_u64_encode_buf(uint64_t q, uint8_t *buf) +{ + int n=0, grp; + while ((q>>(7*(n+1))) >0) + { + grp=128^(127&(q>>(7*n))); + buf[n++]=grp; + } + grp=127&(q>>(7*n)); + buf[n++]=grp; + + return buf+=n; +} + +unsigned +varint_u32_encoded_size(uint32_t val) +{ + LWDEBUGF(2, "Entered varint_u32_encoded_size, value %u", val); + + if( val>varint_u32_max ) { + lwerror("Value is out of range for unsigned 32bit varint (0 to %ld)", + varint_u32_max); + } + + return _varint_u64_encoded_size(val); /* implicit upcast to 64bit int */ +} + +uint8_t* +varint_u32_encode_buf(uint32_t val, uint8_t *buf) +{ + LWDEBUGF(2, "Entered varint_u32_encode_buf, value %u", val); + return _varint_u64_encode_buf(val, buf); /* implicit upcast to 64bit */ +} + +unsigned +varint_s32_encoded_size(int32_t val) +{ + LWDEBUGF(2, "Entered varint_s32_encoded_size, value %d", val); + + if(valvarint_s32_max) { + lwerror("Value is out of range for signed 32bit varint (%d to %d)", + varint_s32_min, varint_s32_max); + } + + uint32_t q = (val << 1) ^ (val >> 31); /* zig-zag encode */ + return _varint_u64_encoded_size(q); /* implicit upcast to 64bit int */ +} + +uint8_t* +varint_s32_encode_buf(int32_t val, uint8_t *buf) +{ + LWDEBUGF(2, "Entered varint_s32_encode_buf, value %d", val); + uint32_t q = (val << 1) ^ (val >> 31); /* zig-zag encode */ + return _varint_u64_encode_buf(q, buf); /* implicit upcast to 64bit */ +} + +unsigned +varint_s64_encoded_size(int64_t val) +{ + LWDEBUGF(2, "Entered varint_s64_encoded_size, value %ld", val); + + if(valvarint_s64_max) { + lwerror("Value is out of range for signed 64bit varint (%ld to %ld)", + varint_s64_min, varint_s64_max); + } + + uint64_t q = (val << 1) ^ (val >> 63); /* zig-zag encode */ + return _varint_u64_encoded_size(q); +} + +uint8_t* +varint_s64_encode_buf(int64_t val, uint8_t *buf) +{ + LWDEBUGF(2, "Entered varint_s64_encode_buf, value %ld", val); + + uint64_t q = (val << 1) ^ (val >> 63); /* zig-zag encode */ + return _varint_u64_encode_buf(q, buf); +} + +unsigned +varint_u64_encoded_size(uint64_t val) +{ + LWDEBUGF(2, "Entered varint_u64_encoded_size, value %lu", val); + + if( val>varint_u64_max ) { + lwerror("Value is out of range for unsigned 64bit varint (0 to %ld)", + varint_u64_max); + } + + return _varint_u64_encoded_size(val); +} + +uint8_t* +varint_u64_encode_buf(uint64_t val, uint8_t *buf) +{ + LWDEBUGF(2, "Entered varint_u64_encode_buf, value %lu", val); + return _varint_u64_encode_buf(val, buf); +} diff --git a/liblwgeom/varint.h b/liblwgeom/varint.h index 808b0bb5d..db363e2c1 100644 --- a/liblwgeom/varint.h +++ b/liblwgeom/varint.h @@ -4,7 +4,7 @@ * http://postgis.net * * Copyright (C) 2014 Sandro Santilli - * Copyright (C) 2013 Nicklas Avén + * Copyright (C) 2013 Nicklas Avén * * This is free software; you can redistribute and/or modify it under * the terms of the GNU General Public Licence. See the COPYING file. @@ -20,140 +20,29 @@ #define _LIBLWGEOM_VARINT_H 1 #include -#include "lwgeom_log.h" -#include "liblwgeom.h" -/** - * Constants to find the range of Varint. - * Since Varint only uses 7 bits instead of 8 in each byte a 8 byte varint - * only uses 56 bits for the number and 8 for telling if next byte is used - */ -const int64_t varint_u64_max = ((int64_t) 1<<56) - 1; -const int64_t varint_s64_min = (int64_t) -1<<55; -const int64_t varint_s64_max = ((int64_t)1<<55) - 1; -const int32_t varint_u32_max = ((int32_t) 1<<28) - 1; -const int32_t varint_s32_min = (int32_t) -1<<27; -const int32_t varint_s32_max = ((int32_t)1<<27) - 1; - -unsigned _varint_u64_encoded_size(uint64_t q); -uint8_t* _varint_u64_encode_buf(uint64_t q, uint8_t *buf); +/* Find encoded size for unsigned 32bit integer */ unsigned varint_u32_encoded_size(uint32_t val); -uint8_t* varint_u32_encode_buf(uint32_t val, uint8_t *buf); -unsigned varint_s32_encoded_size(int32_t val); -uint8_t* varint_s32_encode_buf(int32_t val, uint8_t *buf); -unsigned varint_s64_encoded_size(int64_t val); -uint8_t* varint_s64_encode_buf(int64_t val, uint8_t *buf); -unsigned varint_u64_encoded_size(uint64_t val); -uint8_t* varint_u64_encode_buf(uint64_t val, uint8_t *buf); - - -unsigned -_varint_u64_encoded_size(uint64_t q) -{ - int n=0; - while ((q>>(7*(n+1))) >0) ++n; - return ++n; -} - -uint8_t* -_varint_u64_encode_buf(uint64_t q, uint8_t *buf) -{ - int n=0, grp; - while ((q>>(7*(n+1))) >0) - { - grp=128^(127&(q>>(7*n))); - buf[n++]=grp; - } - grp=127&(q>>(7*n)); - buf[n++]=grp; - - return buf+=n; -} - -unsigned -varint_u32_encoded_size(uint32_t val) -{ - LWDEBUGF(2, "Entered varint_u32_encoded_size, value %u", val); - - if( val>varint_u32_max ) { - lwerror("Value is out of range for unsigned 32bit varint (0 to %ld)", - varint_u32_max); - } - - return _varint_u64_encoded_size(val); /* implicit upcast to 64bit int */ -} -uint8_t* -varint_u32_encode_buf(uint32_t val, uint8_t *buf) -{ - LWDEBUGF(2, "Entered varint_u32_encode_buf, value %u", val); - return _varint_u64_encode_buf(val, buf); /* implicit upcast to 64bit */ -} - -unsigned -varint_s32_encoded_size(int32_t val) -{ - LWDEBUGF(2, "Entered varint_s32_encoded_size, value %d", val); - - if(valvarint_s32_max) { - lwerror("Value is out of range for signed 32bit varint (%d to %d)", - varint_s32_min, varint_s32_max); - } - - uint32_t q = (val << 1) ^ (val >> 31); /* zig-zag encode */ - return _varint_u64_encoded_size(q); /* implicit upcast to 64bit int */ -} - -uint8_t* -varint_s32_encode_buf(int32_t val, uint8_t *buf) -{ - LWDEBUGF(2, "Entered varint_s32_encode_buf, value %d", val); - uint32_t q = (val << 1) ^ (val >> 31); /* zig-zag encode */ - return _varint_u64_encode_buf(q, buf); /* implicit upcast to 64bit */ -} - -unsigned -varint_s64_encoded_size(int64_t val) -{ - LWDEBUGF(2, "Entered varint_s64_encoded_size, value %ld", val); - - if(valvarint_s64_max) { - lwerror("Value is out of range for signed 64bit varint (%ld to %ld)", - varint_s64_min, varint_s64_max); - } - - uint64_t q = (val << 1) ^ (val >> 63); /* zig-zag encode */ - return _varint_u64_encoded_size(q); -} - -uint8_t* -varint_s64_encode_buf(int64_t val, uint8_t *buf) -{ - LWDEBUGF(2, "Entered varint_s64_encode_buf, value %ld", val); +/* Encode unsigned 32bit integer */ +uint8_t* varint_u32_encode_buf(uint32_t val, uint8_t *buf); - uint64_t q = (val << 1) ^ (val >> 63); /* zig-zag encode */ - return _varint_u64_encode_buf(q, buf); -} +/* Find encoded size for signed 32bit integer */ +unsigned varint_s32_encoded_size(int32_t val); -unsigned -varint_u64_encoded_size(uint64_t val) -{ - LWDEBUGF(2, "Entered varint_u64_encoded_size, value %lu", val); +/* Encode signed 32bit integer */ +uint8_t* varint_s32_encode_buf(int32_t val, uint8_t *buf); - if( val>varint_u64_max ) { - lwerror("Value is out of range for unsigned 64bit varint (0 to %ld)", - varint_u64_max); - } +/* Find encoded size for unsigned 64bit integer */ +unsigned varint_u64_encoded_size(uint64_t val); - return _varint_u64_encoded_size(val); -} +/* Encode unsigned 64bit integer */ +uint8_t* varint_u64_encode_buf(uint64_t val, uint8_t *buf); -uint8_t* -varint_u64_encode_buf(uint64_t val, uint8_t *buf) -{ - LWDEBUGF(2, "Entered varint_u64_encode_buf, value %lu", val); - return _varint_u64_encode_buf(val, buf); -} +/* Find encoded size for signed 64bit integer */ +unsigned varint_s64_encoded_size(int64_t val); +/* Encode unsigned 64bit integer */ +uint8_t* varint_s64_encode_buf(int64_t val, uint8_t *buf); -#endif /* !defined _LIBLWGEOM_VARINT_H */ +#endif /* !defined _LIBLWGEOM_VARINT_H */ \ No newline at end of file