Annotation of embedaddon/php/ext/mysqlnd/mysqlnd_portability.h, revision 1.1.1.1

1.1       misho       1: /* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB 
                      2: This file is public domain and comes with NO WARRANTY of any kind */
                      3: 
                      4: /*
                      5:   Parts of the original, which are not applicable to mysqlnd have been removed.
                      6:   
                      7:   With small modifications, mostly casting but adding few more macros by
                      8:   Andrey Hristov <andrey@mysql.com> . The additions are in the public domain and
                      9:   were added to improve the header file, to get it more consistent.
                     10: */
                     11: 
                     12: #ifndef MYSQLND_PORTABILITY_H
                     13: #define MYSQLND_PORTABILITY_H
                     14: 
                     15: 
                     16: 
                     17: /* Comes from global.h as OFFSET, renamed to STRUCT_OFFSET */
                     18: #define STRUCT_OFFSET(t, f)   ((size_t)(char *)&((t *)0)->f)
                     19: 
                     20: #ifndef __attribute
                     21: #if !defined(__GNUC__)
                     22: #define __attribute(A)
                     23: #endif
                     24: #endif
                     25: 
                     26: #ifdef __CYGWIN__
                     27: /* We use a Unix API, so pretend it's not Windows */
                     28: #undef WIN
                     29: #undef WIN32
                     30: #undef _WIN
                     31: #undef _WIN32
                     32: #undef _WIN64
                     33: #undef __WIN__
                     34: #undef __WIN32__
                     35: #endif /* __CYGWIN__ */
                     36: 
                     37: #if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32)
                     38: #  include "ext/mysqlnd/config-win.h"
                     39: #else 
                     40: #  include <ext/mysqlnd/php_mysqlnd_config.h>
                     41: #endif /* _WIN32... */
                     42: 
                     43: #if __STDC_VERSION__ < 199901L && !defined(atoll)
                     44:   /* "inline" is a keyword */
                     45:   #define atoll atol
                     46: #endif
                     47: 
                     48: 
                     49: #ifdef HAVE_SYS_TYPES_H
                     50: #include <sys/types.h>
                     51: #endif
                     52: 
                     53: #ifdef HAVE_STDINT_H
                     54: #include <stdint.h>
                     55: #endif
                     56: 
                     57: #if SIZEOF_LONG_LONG > 4 && !defined(_LONG_LONG)
                     58: #define _LONG_LONG 1        /* For AIX string library */
                     59: #endif
                     60: 
                     61: 
                     62: /* Go around some bugs in different OS and compilers */
                     63: #if defined(_HPUX_SOURCE) && defined(HAVE_SYS_STREAM_H)
                     64: #include <sys/stream.h>        /* HPUX 10.20 defines ulong here. UGLY !!! */
                     65: #define HAVE_ULONG
                     66: #endif
                     67: 
                     68: 
                     69: #if SIZEOF_LONG_LONG > 4
                     70: #define HAVE_LONG_LONG 1
                     71: #endif
                     72: 
                     73: 
                     74: /* Typdefs for easyier portability */
                     75: #ifndef HAVE_INT8_T
                     76: #ifndef HAVE_INT8
                     77: typedef signed char int8_t;                    /* Signed integer >= 8    bits */
                     78: #else
                     79: typedef int8 int8_t;                           /* Signed integer >= 8    bits */
                     80: #endif
                     81: #endif
                     82: 
                     83: #ifndef HAVE_UINT8_T
                     84: #ifndef HAVE_UINT8
                     85: typedef unsigned char uint8_t;         /* Unsigned integer >= 8    bits */
                     86: #else
                     87: typedef uint8 uint8_t;                         /* Signed integer >= 8    bits */
                     88: #endif
                     89: #endif
                     90: 
                     91: #ifndef HAVE_INT16_T
                     92: #ifndef HAVE_INT16
                     93: typedef signed short int16_t;          /* Signed integer >= 16 bits */
                     94: #else
                     95: typedef int16 int16_t;                         /* Signed integer >= 16 bits */
                     96: #endif
                     97: #endif
                     98: 
                     99: #ifndef HAVE_UINT16_T
                    100: #ifndef HAVE_UINT16
                    101: typedef unsigned short uint16_t;               /* Signed integer >= 16 bits */
                    102: #else
                    103: typedef uint16 uint16_t;                       /* Signed integer >= 16 bits */
                    104: #endif
                    105: #endif
                    106: 
                    107: 
                    108: #ifndef HAVE_INT32_T
                    109: #ifdef HAVE_INT32
                    110: typedef int32 int32_t;
                    111: #elif SIZEOF_INT == 4
                    112: typedef signed int int32_t;
                    113: #elif SIZEOF_LONG == 4
                    114: typedef signed long int32_t;
                    115: #else
                    116: error "Neither int nor long is of 4 bytes width"
                    117: #endif
                    118: #endif /* HAVE_INT32_T */
                    119: 
                    120: #ifndef HAVE_UINT32_T
                    121: #ifdef HAVE_UINT32
                    122: typedef uint32 uint32_t;
                    123: #elif SIZEOF_INT == 4
                    124: typedef unsigned int uint32_t;
                    125: #elif SIZEOF_LONG == 4
                    126: typedef unsigned long uint32_t;
                    127: #else
                    128: #error "Neither int nor long is of 4 bytes width"
                    129: #endif
                    130: #endif /* HAVE_UINT32_T */
                    131: 
                    132: #ifndef HAVE_INT64_T
                    133: #ifdef HAVE_INT64
                    134: typedef int64 int64_t;
                    135: #elif SIZEOF_INT == 8
                    136: typedef signed int int64_t;
                    137: #elif SIZEOF_LONG == 8
                    138: typedef signed long int64_t;
                    139: #elif SIZEOF_LONG_LONG == 8
                    140: #ifdef PHP_WIN32
                    141: typedef __int64 int64_t;
                    142: #else
                    143: typedef signed long long int64_t;
                    144: #endif
                    145: #else
                    146: #error "Neither int nor long nor long long is of 8 bytes width"
                    147: #endif
                    148: #endif /* HAVE_INT64_T */
                    149: 
                    150: #ifndef HAVE_UINT64_T
                    151: #ifdef HAVE_UINT64
                    152: typedef uint64 uint64_t;
                    153: #elif SIZEOF_INT == 8
                    154: typedef unsigned int uint64_t;
                    155: #elif SIZEOF_LONG == 8
                    156: typedef unsigned long uint64_t;
                    157: #elif SIZEOF_LONG_LONG == 8
                    158: #ifdef PHP_WIN32
                    159: typedef unsigned __int64 uint64_t;
                    160: #else
                    161: typedef unsigned long long uint64_t;
                    162: #endif
                    163: #else
                    164: #error "Neither int nor long nor long long is of 8 bytes width"
                    165: #endif
                    166: #endif /* HAVE_INT64_T */
                    167: 
                    168: 
                    169: #ifdef PHP_WIN32
                    170: #define MYSQLND_LLU_SPEC "%I64u"
                    171: #define MYSQLND_LL_SPEC "%I64d"
                    172: #define MYSQLND_SZ_T_SPEC "%Id"
                    173: #ifndef L64
                    174: #define L64(x) x##i64
                    175: #endif
                    176: #else
                    177: 
                    178: #if __i386__
                    179: #define MYSQLND_LL_SPEC        "%lli"
                    180: #define MYSQLND_LLU_SPEC "%llu"
                    181: #endif
                    182: 
                    183: #if __ia64__
                    184: #define MYSQLND_LL_SPEC        "%li"
                    185: #define MYSQLND_LLU_SPEC "%lu"
                    186: #endif
                    187: 
                    188: #if __powerpc64__ || __ppc64__
                    189: #define MYSQLND_LL_SPEC        "%li"
                    190: #define MYSQLND_LLU_SPEC "%lu"
                    191: #endif
                    192: 
                    193: #if (__powerpc__ || __ppc__ ) && !(__powerpc64__ || __ppc64__)
                    194: #define MYSQLND_LL_SPEC        "%lli"
                    195: #define MYSQLND_LLU_SPEC "%llu"
                    196: #endif
                    197: 
                    198: #if __x86_64__
                    199: #define MYSQLND_LL_SPEC        "%li"
                    200: #define MYSQLND_LLU_SPEC "%lu"
                    201: #endif
                    202: 
                    203: #if __s390x__
                    204: #define MYSQLND_LL_SPEC        "%li"
                    205: #define MYSQLND_LLU_SPEC "%lu"
                    206: #endif
                    207: 
                    208: #if __s390__ && !__s390x__
                    209: #define MYSQLND_LL_SPEC        "%lli"
                    210: #define MYSQLND_LLU_SPEC "%llu"
                    211: #endif
                    212: 
                    213: #ifdef _AIX
                    214: #define MYSQLND_LL_SPEC "%lli"
                    215: #define MYSQLND_LLU_SPEC "%llu"
                    216: #endif
                    217: 
                    218: #ifndef MYSQLND_LL_SPEC
                    219:   #if SIZEOF_LONG == 8
                    220:     #define MYSQLND_LL_SPEC "%li"
                    221:   #elif SIZEOF_LONG == 4
                    222:     #define MYSQLND_LL_SPEC "%lli"
                    223:   #endif
                    224: #endif
                    225: 
                    226: #ifndef MYSQLND_LLU_SPEC
                    227:   #if SIZEOF_LONG == 8
                    228:     #define MYSQLND_LLU_SPEC "%lu"
                    229:   #elif SIZEOF_LONG == 4
                    230:     #define MYSQLND_LLU_SPEC "%llu"
                    231:    #endif
                    232: #endif /* MYSQLND_LLU_SPEC*/
                    233: 
                    234: 
                    235: #define MYSQLND_SZ_T_SPEC "%zd"
                    236: #ifndef L64
                    237: #define L64(x) x##LL
                    238: #endif
                    239: #endif
                    240: 
                    241: 
                    242: #define int1store(T,A) do { *((int8_t*) (T)) = (A); } while(0)
                    243: #define uint1korr(A)   (*(((uint8_t*)(A))))
                    244: 
                    245: /* Bit values are sent in reverted order of bytes, compared to normal !!! */
                    246: #define bit_uint2korr(A) ((uint16_t) (((uint16_t) (((unsigned char*) (A))[1])) +\
                    247:                                    ((uint16_t) (((unsigned char*) (A))[0]) << 8)))
                    248: #define bit_uint3korr(A) ((uint32_t) (((uint32_t) (((unsigned char*) (A))[2])) +\
                    249:                                    (((uint32_t) (((unsigned char*) (A))[1])) << 8) +\
                    250:                                    (((uint32_t) (((unsigned char*) (A))[0])) << 16)))
                    251: #define bit_uint4korr(A) ((uint32_t) (((uint32_t) (((unsigned char*) (A))[3])) +\
                    252:                                    (((uint32_t) (((unsigned char*) (A))[2])) << 8) +\
                    253:                                    (((uint32_t) (((unsigned char*) (A))[1])) << 16) +\
                    254:                                    (((uint32_t) (((unsigned char*) (A))[0])) << 24)))
                    255: #define bit_uint5korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[4])) +\
                    256:                                     (((uint32_t) (((unsigned char*) (A))[3])) << 8) +\
                    257:                                     (((uint32_t) (((unsigned char*) (A))[2])) << 16) +\
                    258:                                    (((uint32_t) (((unsigned char*) (A))[1])) << 24)) +\
                    259:                                     (((uint64_t) (((unsigned char*) (A))[0])) << 32))
                    260: #define bit_uint6korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[5])) +\
                    261:                                     (((uint32_t) (((unsigned char*) (A))[4])) << 8) +\
                    262:                                     (((uint32_t) (((unsigned char*) (A))[3])) << 16) +\
                    263:                                     (((uint32_t) (((unsigned char*) (A))[2])) << 24)) +\
                    264:                         (((uint64_t) (((uint32_t) (((unsigned char*) (A))[1])) +\
                    265:                                     (((uint32_t) (((unsigned char*) (A))[0]) << 8)))) <<\
                    266:                                      32))
                    267: #define bit_uint7korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[6])) +\
                    268:                                     (((uint32_t) (((unsigned char*) (A))[5])) << 8) +\
                    269:                                     (((uint32_t) (((unsigned char*) (A))[4])) << 16) +\
                    270:                                    (((uint32_t) (((unsigned char*) (A))[3])) << 24)) +\
                    271:                         (((uint64_t) (((uint32_t) (((unsigned char*) (A))[2])) +\
                    272:                                     (((uint32_t) (((unsigned char*) (A))[1])) << 8) +\
                    273:                                     (((uint32_t) (((unsigned char*) (A))[0])) << 16))) <<\
                    274:                                      32))
                    275: #define bit_uint8korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[7])) +\
                    276:                                     (((uint32_t) (((unsigned char*) (A))[6])) << 8) +\
                    277:                                     (((uint32_t) (((unsigned char*) (A))[5])) << 16) +\
                    278:                                     (((uint32_t) (((unsigned char*) (A))[4])) << 24)) +\
                    279:                         (((uint64_t) (((uint32_t) (((unsigned char*) (A))[3])) +\
                    280:                                     (((uint32_t) (((unsigned char*) (A))[2])) << 8) +\
                    281:                                     (((uint32_t) (((unsigned char*) (A))[1])) << 16) +\
                    282:                                     (((uint32_t) (((unsigned char*) (A))[0])) << 24))) <<\
                    283:                                     32))
                    284: 
                    285: 
                    286: /*
                    287: ** Define-funktions for reading and storing in machine independent format
                    288: **  (low byte first)
                    289: */
                    290: 
                    291: /* Optimized store functions for Intel x86, non-valid for WIN64. __i386__ is GCC */
                    292: #if defined(__i386__) && !defined(_WIN64)
                    293: #define sint2korr(A)    (*((int16_t *) (A)))
                    294: #define sint3korr(A)    ((int32_t) ((((zend_uchar) (A)[2]) & 128) ? \
                    295:                    (((uint32_t) 255L << 24) | \
                    296:                    (((uint32_t) (zend_uchar) (A)[2]) << 16) |\
                    297:                    (((uint32_t) (zend_uchar) (A)[1]) << 8) | \
                    298:                     ((uint32_t) (zend_uchar) (A)[0])) : \
                    299:                    (((uint32_t) (zend_uchar) (A)[2]) << 16) |\
                    300:                    (((uint32_t) (zend_uchar) (A)[1]) << 8) | \
                    301:                     ((uint32_t) (zend_uchar) (A)[0])))
                    302: #define sint4korr(A)  (*((long *) (A)))
                    303: 
                    304: #define uint2korr(A)  (*((uint16_t *) (A)))
                    305: #define uint3korr(A)  (uint32_t) (((uint32_t) ((zend_uchar) (A)[0])) +\
                    306:                                (((uint32_t) ((zend_uchar) (A)[1])) << 8) +\
                    307:                                (((uint32_t) ((zend_uchar) (A)[2])) << 16))
                    308: #define uint4korr(A)  (*((unsigned long *) (A)))
                    309: 
                    310: 
                    311: 
                    312: #define uint8korr(A)    (*((uint64_t *) (A)))
                    313: #define sint8korr(A)    (*((int64_t *) (A)))
                    314: #define int2store(T,A)    *((uint16_t*) (T))= (uint16_t) (A)
                    315: #define int3store(T,A)   { \
                    316:                   *(T)=  (zend_uchar) ((A));\
                    317:                   *(T+1)=(zend_uchar) (((uint32_t) (A) >> 8));\
                    318:                   *(T+2)=(zend_uchar) (((A) >> 16)); }
                    319: #define int4store(T,A)    *((long *) (T))= (long) (A)
                    320: #define int5store(T,A)    { \
                    321:               *((zend_uchar *)(T))= (zend_uchar)((A));\
                    322:               *(((zend_uchar *)(T))+1)=(zend_uchar) (((A) >> 8));\
                    323:               *(((zend_uchar *)(T))+2)=(zend_uchar) (((A) >> 16));\
                    324:               *(((zend_uchar *)(T))+3)=(zend_uchar) (((A) >> 24)); \
                    325:               *(((zend_uchar *)(T))+4)=(zend_uchar) (((A) >> 32)); }
                    326: 
                    327: /* From Andrey Hristov, based on int5store() */
                    328: #define int6store(T,A)    { \
                    329:               *(((zend_uchar *)(T)))= (zend_uchar)((A));\
                    330:               *(((zend_uchar *)(T))+1))=(zend_uchar) (((A) >> 8));\
                    331:               *(((zend_uchar *)(T))+2))=(zend_uchar) (((A) >> 16));\
                    332:               *(((zend_uchar *)(T))+3))=(zend_uchar) (((A) >> 24)); \
                    333:               *(((zend_uchar *)(T))+4))=(zend_uchar) (((A) >> 32)); \
                    334:               *(((zend_uchar *)(T))+5))=(zend_uchar) (((A) >> 40)); }
                    335: 
                    336: #define int8store(T,A)    *((uint64_t *) (T))= (uint64_t) (A)
                    337: 
                    338: typedef union {
                    339:   double v;
                    340:   long m[2];
                    341: } float8get_union;
                    342: #define float8get(V,M)    { ((float8get_union *)&(V))->m[0] = *((long*) (M)); \
                    343:                             ((float8get_union *)&(V))->m[1] = *(((long*) (M))+1); }
                    344: #define float8store(T,V) { *((long *) (T))     = ((float8get_union *)&(V))->m[0]; \
                    345:                            *(((long *) (T))+1) = ((float8get_union *)&(V))->m[1]; }
                    346: #define float4get(V,M) { *((float *) &(V)) = *((float*) (M)); }
                    347: /* From Andrey Hristov based on float8get */
                    348: #define floatget(V,M)    memcpy((char*) &(V),(char*) (M),sizeof(float))
                    349: #endif /* __i386__ */ 
                    350: 
                    351: 
                    352: /* If we haven't defined sint2korr, which is because the platform is not x86 or it's WIN64 */
                    353: #ifndef sint2korr
                    354: #define sint2korr(A)    (int16_t) (((int16_t) ((zend_uchar) (A)[0])) +\
                    355:                                  ((int16_t) ((int16_t) (A)[1]) << 8))
                    356: #define sint3korr(A)    ((int32_t) ((((zend_uchar) (A)[2]) & 128) ? \
                    357:                   (((uint32_t) 255L << 24) | \
                    358:                   (((uint32_t) (zend_uchar) (A)[2]) << 16) |\
                    359:                   (((uint32_t) (zend_uchar) (A)[1]) << 8) | \
                    360:                    ((uint32_t) (zend_uchar) (A)[0])) : \
                    361:                   (((uint32_t) (zend_uchar) (A)[2]) << 16) |\
                    362:                   (((uint32_t) (zend_uchar) (A)[1]) << 8) | \
                    363:                   ((uint32_t) (zend_uchar) (A)[0])))
                    364: #define sint4korr(A)  (int32_t) (((int32_t) ((zend_uchar) (A)[0])) +\
                    365:                               (((int32_t) ((zend_uchar) (A)[1]) << 8)) +\
                    366:                               (((int32_t) ((zend_uchar) (A)[2]) << 16)) +\
                    367:                               (((int32_t) ((int16_t) (A)[3]) << 24)))
                    368: 
                    369: #define sint8korr(A)  (int64_t) uint8korr(A)
                    370: #define uint2korr(A)  (uint16_t) (((uint16_t) ((zend_uchar) (A)[0])) +\
                    371:                                ((uint16_t) ((zend_uchar) (A)[1]) << 8))
                    372: #define uint3korr(A)  (uint32_t) (((uint32_t) ((zend_uchar) (A)[0])) +\
                    373:                                (((uint32_t) ((zend_uchar) (A)[1])) << 8) +\
                    374:                                (((uint32_t) ((zend_uchar) (A)[2])) << 16))
                    375: #define uint4korr(A)  (uint32_t) (((uint32_t) ((zend_uchar) (A)[0])) +\
                    376:                                (((uint32_t) ((zend_uchar) (A)[1])) << 8) +\
                    377:                                (((uint32_t) ((zend_uchar) (A)[2])) << 16) +\
                    378:                                (((uint32_t) ((zend_uchar) (A)[3])) << 24))
                    379: 
                    380: #define uint8korr(A)   ((uint64_t)(((uint32_t) ((zend_uchar) (A)[0])) +\
                    381:                                                                        (((uint32_t) ((zend_uchar) (A)[1])) << 8) +\
                    382:                                                                        (((uint32_t) ((zend_uchar) (A)[2])) << 16) +\
                    383:                                                                        (((uint32_t) ((zend_uchar) (A)[3])) << 24)) +\
                    384:                                                                        (((uint64_t) (((uint32_t) ((zend_uchar) (A)[4])) +\
                    385:                                                                        (((uint32_t) ((zend_uchar) (A)[5])) << 8) +\
                    386:                                                                        (((uint32_t) ((zend_uchar) (A)[6])) << 16) +\
                    387:                                                                        (((uint32_t) ((zend_uchar) (A)[7])) << 24))) << 32))
                    388: 
                    389: 
                    390: #define int2store(T,A)  do { uint32_t def_temp= (uint32_t) (A) ;\
                    391:                   *((zend_uchar*) (T))  =  (zend_uchar)(def_temp); \
                    392:                   *((zend_uchar*) (T+1)) = (zend_uchar)((def_temp >> 8)); } while (0)
                    393: #define int3store(T,A)  do { /*lint -save -e734 */\
                    394:                   *(((char *)(T)))   = (char) ((A));\
                    395:                   *(((char *)(T))+1) = (char) (((A) >> 8));\
                    396:                   *(((char *)(T))+2) = (char) (((A) >> 16)); \
                    397:                   /*lint -restore */} while (0)
                    398: #define int4store(T,A)  do { \
                    399:                   *(((char *)(T)))   = (char) ((A));\
                    400:                   *(((char *)(T))+1) = (char) (((A) >> 8));\
                    401:                   *(((char *)(T))+2) = (char) (((A) >> 16));\
                    402:                   *(((char *)(T))+3) = (char) (((A) >> 24)); } while (0)
                    403: #define int5store(T,A)  do { \
                    404:                   *(((char *)(T)))   = (char)((A));\
                    405:                   *(((char *)(T))+1) = (char)(((A) >> 8));\
                    406:                   *(((char *)(T))+2) = (char)(((A) >> 16));\
                    407:                   *(((char *)(T))+3) = (char)(((A) >> 24)); \
                    408:                   *(((char *)(T))+4) = (char)(((A) >> 32)); } while (0)
                    409: /* Based on int5store() from Andrey Hristov */
                    410: #define int6store(T,A)  do { \
                    411:                   *(((char *)(T)))   = (char)((A));\
                    412:                   *(((char *)(T))+1) = (char)(((A) >> 8));\
                    413:                   *(((char *)(T))+2) = (char)(((A) >> 16));\
                    414:                   *(((char *)(T))+3) = (char)(((A) >> 24)); \
                    415:                   *(((char *)(T))+4) = (char)(((A) >> 32)); \
                    416:                   *(((char *)(T))+5) = (char)(((A) >> 40)); } while (0)
                    417: #define int8store(T,A)        { uint32_t def_temp= (uint32_t) (A), def_temp2= (uint32_t) ((A) >> 32); \
                    418:                   int4store((T),def_temp); \
                    419:                   int4store((T+4),def_temp2); \
                    420:                 }
                    421: #ifdef WORDS_BIGENDIAN
                    422: #define float4get(V,M)   do { float def_temp;\
                    423:                           ((char*) &def_temp)[0] = (M)[3];\
                    424:                           ((char*) &def_temp)[1] = (M)[2];\
                    425:                           ((char*) &def_temp)[2] = (M)[1];\
                    426:                           ((char*) &def_temp)[3] = (M)[0];\
                    427:                           (V)=def_temp; } while (0)
                    428: #define float8store(T,V)  do { \
                    429:                            *(((char *)(T)))   = (char) ((char *) &(V))[7];\
                    430:                            *(((char *)(T))+1) = (char) ((char *) &(V))[6];\
                    431:                            *(((char *)(T))+2) = (char) ((char *) &(V))[5];\
                    432:                            *(((char *)(T))+3) = (char) ((char *) &(V))[4];\
                    433:                            *(((char *)(T))+4) = (char) ((char *) &(V))[3];\
                    434:                            *(((char *)(T))+5) = (char) ((char *) &(V))[2];\
                    435:                            *(((char *)(T))+6) = (char) ((char *) &(V))[1];\
                    436:                            *(((char *)(T))+7) = (char) ((char *) &(V))[0]; } while (0)
                    437: 
                    438: #define float8get(V,M)   do { double def_temp;\
                    439:                           ((char*) &def_temp)[0] = (M)[7];\
                    440:                           ((char*) &def_temp)[1] = (M)[6];\
                    441:                           ((char*) &def_temp)[2] = (M)[5];\
                    442:                           ((char*) &def_temp)[3] = (M)[4];\
                    443:                           ((char*) &def_temp)[4] = (M)[3];\
                    444:                           ((char*) &def_temp)[5] = (M)[2];\
                    445:                           ((char*) &def_temp)[6] = (M)[1];\
                    446:                           ((char*) &def_temp)[7] = (M)[0];\
                    447:                           (V) = def_temp; \
                    448:                          } while (0)
                    449: #else
                    450: #define float4get(V,M)   memcpy((char*) &(V),(char*) (M),sizeof(float))
                    451: 
                    452: #if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN)
                    453: #define float8store(T,V)  do { \
                    454:                          *(((char *)(T)))= ((char *) &(V))[4];\
                    455:                          *(((char *)(T))+1)=(char) ((char *) &(V))[5];\
                    456:                          *(((char *)(T))+2)=(char) ((char *) &(V))[6];\
                    457:                          *(((char *)(T))+3)=(char) ((char *) &(V))[7];\
                    458:                          *(((char *)(T))+4)=(char) ((char *) &(V))[0];\
                    459:                          *(((char *)(T))+5)=(char) ((char *) &(V))[1];\
                    460:                          *(((char *)(T))+6)=(char) ((char *) &(V))[2];\
                    461:                          *(((char *)(T))+7)=(char) ((char *) &(V))[3];} while (0)
                    462: #define float8get(V,M) do { double def_temp;\
                    463:                          ((char*) &def_temp)[0]=(M)[4];\
                    464:                          ((char*) &def_temp)[1]=(M)[5];\
                    465:                          ((char*) &def_temp)[2]=(M)[6];\
                    466:                          ((char*) &def_temp)[3]=(M)[7];\
                    467:                          ((char*) &def_temp)[4]=(M)[0];\
                    468:                          ((char*) &def_temp)[5]=(M)[1];\
                    469:                          ((char*) &def_temp)[6]=(M)[2];\
                    470:                          ((char*) &def_temp)[7]=(M)[3];\
                    471:                          (V) = def_temp; } while (0)
                    472: #endif /* __FLOAT_WORD_ORDER */
                    473: 
                    474: #endif /* WORDS_BIGENDIAN */
                    475: 
                    476: #endif /* sint2korr */
                    477: /* To here if the platform is not x86 or it's WIN64 */
                    478: 
                    479: 
                    480: /* Define-funktions for reading and storing in machine format from/to
                    481:    short/long to/from some place in memory V should be a (not
                    482:    register) variable, M is a pointer to byte */
                    483: 
                    484: #ifndef float8get
                    485: 
                    486: #ifdef WORDS_BIGENDIAN
                    487: #define float8get(V,M)         memcpy((char*) &(V),(char*)  (M), sizeof(double))
                    488: #define float8store(T,V)       memcpy((char*)  (T),(char*) &(V), sizeof(double))
                    489: #else
                    490: #define float8get(V,M)    memcpy((char*) &(V),(char*) (M),sizeof(double))
                    491: #define float8store(T,V)  memcpy((char*) (T),(char*) &(V),sizeof(double))
                    492: #endif /* WORDS_BIGENDIAN */
                    493: 
                    494: #endif /* float8get */
                    495: 
                    496: #endif /* MYSQLND_PORTABILITY_H */
                    497: 
                    498: 
                    499: /*
                    500:  * Local variables:
                    501:  * tab-width: 4
                    502:  * c-basic-offset: 4
                    503:  * End:
                    504:  * vim600: noet sw=4 ts=4 fdm=marker
                    505:  * vim<600: noet sw=4 ts=4
                    506:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>