]> granicus.if.org Git - postgis/commitdiff
Moved getMachineEndian from parser to liblwgeom.{h,c}.
authorSandro Santilli <strk@keybit.net>
Fri, 17 Dec 2004 11:08:53 +0000 (11:08 +0000)
committerSandro Santilli <strk@keybit.net>
Fri, 17 Dec 2004 11:08:53 +0000 (11:08 +0000)
Added XDR and NDR defines.
Fixed all usage of them.

git-svn-id: http://svn.osgeo.org/postgis/trunk@1162 b70326c6-7e19-0410-871a-916f4a2858ee

lwgeom/liblwgeom.c
lwgeom/liblwgeom.h
lwgeom/lwgeom_inout.c
lwgeom/lwgparse.c
lwgeom/wktparse.h
lwgeom/wktunparse.c

index e9a4f361140ff04dac863abf128f299e49b45e3e..13310472a3e4bae83f6b162cb192a10902f993f8 100644 (file)
@@ -169,3 +169,13 @@ trim_trailing_zeros(char *str)
        
        //lwnotice("output: %s", str);
 }
+
+char getMachineEndian()
+{
+       static int endian_check_int = 1; // dont modify this!!!
+
+       return *((char *) &endian_check_int); // 0 = big endian | xdr,
+                                             // 1 = little endian | ndr
+}
+
+
index f43ce9c3170bb84cb3e3b4247e700803cd082876..5ba027c4af7d25514d158f37a7b2a0b7a7149f6b 100644 (file)
@@ -350,6 +350,8 @@ extern int pointArray_ptsize(const POINTARRAY *pa);
 
 #define WKBZOFFSET 0x80000000
 #define WKBMOFFSET 0x40000000
+#define WKBSRIDFLAG 0x20000000
+#define WKBBBOXFLAG 0x10000000
 
 #define TYPE_SETTYPE(c,t) ((c)=(((c)&0xF0)|(t)))
 #define TYPE_SETZM(t,z,m) ((t)=(((t)&0xCF)|((z)<<5)|((m)<<4)))
@@ -1030,4 +1032,9 @@ extern void lwfree(void *mem);
 /* Utilities */
 extern void trim_trailing_zeros(char *num);
 
+/* Machine endianness */
+#define XDR 0
+#define NDR 1
+extern char getMachineEndian(void);
+
 #endif // !defined _LIBLWGEOM_H 
index 1835a979201a3d75dbef72140f91b7fc2536e6fa..afd6db24b66ef91c9d9fc83bb3f119b5632cbb0b 100644 (file)
@@ -23,7 +23,7 @@
 #include "stringBuffer.h"
 
 
-#define DEBUG 1
+//#define DEBUG 1
 
 #include "lwgeom_pg.h"
 #include "wktparse.h"
@@ -251,7 +251,7 @@ Datum LWGEOMFromWKB(PG_FUNCTION_ARGS)
 
        size_header = sprintf(sridText,"SRID=%i;",SRID);
        //SRID text size + wkb size (+1 = NULL term)
-       size_result = size_header +  2*(wkb_input->size -4) + 1; 
+       size_result = size_header +  2*(wkb_input->size-4) + 1; 
 
        wkb_srid_hexized = palloc(size_result);
        wkb_srid_hexized[0] = 0; // empty
@@ -312,11 +312,11 @@ Datum WKBFromLWGEOM(PG_FUNCTION_ARGS)
                if  ( ! strncmp(VARDATA(type), "xdr", 3) ||
                        ! strncmp(VARDATA(type), "XDR", 3) )
                {
-                       byteorder = BIG_ENDIAN;
+                       byteorder = XDR;
                }
                else
                {
-                       byteorder = LITTLE_ENDIAN;
+                       byteorder = NDR;
                }
        }
 
@@ -494,7 +494,7 @@ Datum LWGEOM_recv(PG_FUNCTION_ARGS)
 #endif
 
 #ifdef DEBUG
-       elog(NOTICE, "LWGEOMFromWKB returned %s", unparse_WKB(SERIALIZED_FORM(result),pg_alloc,pg_free,-1));
+       elog(NOTICE, "LWGEOM_from_bytea returned %s", unparse_WKB(SERIALIZED_FORM(result),pg_alloc,pg_free,-1));
 #endif
 
 
index 1768a86ff8622ed94f3374f9f34b5a386fd79251..6947ef5fa07f131c8e2b185b207435464087adac 100644 (file)
 void set_zm(char z, char m);
 void close_parser(void);
 
-#undef LITTLE_ENDIAN
-#define LITTLE_ENDIAN 1
-char getMachineEndian()
-{
-       static int endian_check_int = 1; // dont modify this!!!
-
-       return *((char *) &endian_check_int); // 0 = big endian, 1 = little endian
-}
-
-
 typedef unsigned long int4;
 
 typedef struct tag_tuple tuple;
@@ -295,7 +285,7 @@ void
 WRITE_INT4(output_state * out,int4 val)
 {
        if ( val <= 0x7f ){
-               if ( getMachineEndian() == LITTLE_ENDIAN ){
+               if ( getMachineEndian() == NDR ){
                        val = (val<<1) | 1;
                }
                else{
@@ -306,7 +296,7 @@ WRITE_INT4(output_state * out,int4 val)
                the_geom.alloc_size-=3;
        }
        else{
-               if ( getMachineEndian() == LITTLE_ENDIAN ){
+               if ( getMachineEndian() == NDR ){
                        val <<=1;
                }
                WRITE_INT4_REAL(out,val);
@@ -749,13 +739,9 @@ parse_wkb(const char** b)
        byte xdr = read_wkb_byte(b);
        swap_order=0;
 
-       if ( xdr == 0x01 ){  // wkb is in little endian
-               if ( getMachineEndian() != LITTLE_ENDIAN )
-                       swap_order=1;
-       }
-       else if ( xdr == 0x00 ){ // wkb is in big endian
-               if ( getMachineEndian() == LITTLE_ENDIAN )
-                       swap_order=1;
+       if ( xdr != getMachineEndian() )
+       {
+               swap_order=1;
        }
 
        type = read_wkb_int(b);
@@ -777,6 +763,12 @@ parse_wkb(const char** b)
        }
        else the_geom.hasM = 0;
 
+       if (type & WKBSRIDFLAG )
+       {
+               the_geom.hasZ = 1;
+               the_geom.ndims++;
+       }
+
        type &=0x0f;
 
        if ( the_geom.lwgi  ){
index 2b13051fafb7f6ea0415026f2b914e6ed63acced..44743422b1a3300eb368477e91905d412284f30c 100644 (file)
@@ -68,7 +68,6 @@ void alloc_wkb(const char* parser);
 byte* parse_lwg(const char* wkt,allocator allocfunc,report_error errfunc);
 byte* parse_lwgi(const char* wkt,allocator allocfunc,report_error errfunc);
 char* unparse_WKT(byte* serialized, allocator alloc,freeor free);
-char* unparse_WKB(byte* serialized, allocator alloc,freeor free, unsigned int endian);
+char* unparse_WKB(byte* serialized, allocator alloc,freeor free, char endian);
 
 
-char getMachineEndian();
index a76f624a5ced19aed51c211b160609bf196c8ba5..6e6a3384a5e8bc3cb176596c9ac73b001416e4ea 100644 (file)
 
 #include "liblwgeom.h"
 
-static int endian_check_int = 1; // dont modify this!!!
-
-#define LITTLE_ENDIAN_CHECK 1
-static unsigned int getMachineEndian()
-{
-       // 0 = big endian, 1 = little endian
-       if ( *((char *) &endian_check_int) )
-       {
-               return LITTLE_ENDIAN;
-       }
-       else
-       {
-               return BIG_ENDIAN;
-       }
-}
-
 //-- Typedefs ----------------------------------------------
 
 typedef unsigned long int4;
@@ -133,7 +117,7 @@ read_int(byte** geom)
 {
        int4 ret;
 #ifdef SHRINK_INTS
-       if ( getMachineEndian() == LITTLE_ENDIAN_CHECK ){
+       if ( getMachineEndian() == NDR ){
                if( (**geom)& 0x01){
                        ret = **geom >>1;
                        (*geom)++;
@@ -151,7 +135,7 @@ read_int(byte** geom)
        memcpy(&ret,*geom,4);
 
 #ifdef SHRINK_INTS
-       if ( getMachineEndian() == LITTLE_ENDIAN_CHECK ){
+       if ( getMachineEndian() == NDR ){
                ret >>= 1;
        }
 #endif
@@ -524,7 +508,7 @@ output_wkb(byte* geom)
 }
 
 char *
-unparse_WKB(byte* serialized, allocator alloc, freeor free, unsigned int endian)
+unparse_WKB(byte* serialized, allocator alloc, freeor free, char endian)
 {
 
 #ifdef DEBUG
@@ -540,13 +524,14 @@ unparse_WKB(byte* serialized, allocator alloc, freeor free, unsigned int endian)
        out_start = out_pos = alloc(len);
        lwgi=0;
 
-       if ( endian == -1 ) endian = getMachineEndian();
-
-       if ( endian == LITTLE_ENDIAN) endianbyte=1;
-       else endianbyte=0;
-
-       if ( endian != getMachineEndian() ) flipbytes = 1;
-       else flipbytes = 0;
+       if ( endian == -1 ) {
+               endianbyte = getMachineEndian();
+               flipbytes = 0;
+       } else {
+               endianbyte = endian;
+               if ( endianbyte != getMachineEndian() ) flipbytes = 1;
+               else flipbytes = 0;
+       }
 
        output_wkb(serialized);
        ensure(1);
@@ -558,6 +543,11 @@ unparse_WKB(byte* serialized, allocator alloc, freeor free, unsigned int endian)
 
 /******************************************************************
  * $Log$
+ * Revision 1.14  2004/12/17 11:08:53  strk
+ * Moved getMachineEndian from parser to liblwgeom.{h,c}.
+ * Added XDR and NDR defines.
+ * Fixed all usage of them.
+ *
  * Revision 1.13  2004/10/25 12:27:33  strk
  * Removed useless network type includes,
  * Added param.h include for BYTE_ORDER defines under win32.