]> granicus.if.org Git - postgis/commitdiff
going back to put varint functions in varint.c
authorNicklas Avén <nicklas.aven@jordogskog.no>
Mon, 11 Aug 2014 04:49:12 +0000 (04:49 +0000)
committerNicklas Avén <nicklas.aven@jordogskog.no>
Mon, 11 Aug 2014 04:49:12 +0000 (04:49 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@12883 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/Makefile.in
liblwgeom/varint.c [new file with mode: 0644]
liblwgeom/varint.h

index 1fdc01aa23f5ba91450303e7f46734ffff081b98..14566bf892af1066ea4ea78de339c8ddf1f6c473 100644 (file)
@@ -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 (file)
index 0000000..1a965d6
--- /dev/null
@@ -0,0 +1,141 @@
+/**********************************************************************
+ *
+ * PostGIS - Spatial Types for PostgreSQL
+ * http://postgis.net
+ *
+ * Copyright (C) 2014 Sandro Santilli <strk@keybit.net>
+ * 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(val<varint_s32_min||val>varint_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(val<varint_s64_min||val>varint_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);
+}
index 808b0bb5db5d2f99e381deb7c274c02042542d42..db363e2c1856fccb85700d28acdcf385325e1af6 100644 (file)
@@ -4,7 +4,7 @@
  * http://postgis.net
  *
  * Copyright (C) 2014 Sandro Santilli <strk@keybit.net>
- * 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.
 #define _LIBLWGEOM_VARINT_H 1
 
 #include <stdint.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;
-
-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(val<varint_s32_min||val>varint_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(val<varint_s64_min||val>varint_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