[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    Re: koffice/filters/kspread/excel/sidewinder
From:       Carlos Licea <carlos_licea () hotmail ! com>
Date:       2010-07-30 21:09:26
Message-ID: 201007301509.26986.carlos_licea () hotmail ! com
[Download RAW message or body]

On Jueves 29 Julio 2010 00:28:12 Marijn Kruisselbrink escribió:
> SVN commit 1156412 by mkruisselbrink:
> 
> warnings--, I hope I still got all the endianness logic right :)
> 
>  M  +5 -5      excel.cpp
>  M  +18 -37    utils.h
> 
> 
> --- trunk/koffice/filters/kspread/excel/sidewinder/excel.cpp
> #1156411:1156412 @@ -72,15 +72,15 @@
>          isInteger = false;
>          unsigned char* s = (unsigned char*) & rkvalue;
>          unsigned char* r = (unsigned char*) & f;
> -        if (Swinder::isLittleEndian()) {
> +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
>              r[0] = r[1] = r[2] = r[3] = 0;
>              r[4] = s[0] & 0xfc;
>              r[5] = s[1]; r[6] = s[2];  r[7] = s[3];
> -        } else {
> +#else
>              r[0] = r[1] = r[2] = r[3] = 0;
>              r[4] = s[0] & 0xfc;
>              r[5] = s[1]; r[6] = s[2];  r[7] = s[3];
> -        }
> +#endif
>          memcpy(&f, r, 8);
>          f *= factor;
>      }
> @@ -1437,9 +1437,9 @@
>              return;
>          }
>          const unsigned long ft2 = readU16(startPict + 6);
> -        Q_ASSERT(ft2 == 0x0008);
> +        Q_ASSERT(ft2 == 0x0008); Q_UNUSED(ft2);
>          const unsigned long cb2 = readU16(startPict + 8);
> -        Q_ASSERT(cb2 == 0x0002);
> +        Q_ASSERT(cb2 == 0x0002); Q_UNUSED(cb2);
>          const unsigned long opts2 = readU16(startPict + 10);
>          //const bool fAutoPict = opts2 & 0x01;
>          fDde = opts2 & 0x02; // dynamic data exchange reference?
> --- trunk/koffice/filters/kspread/excel/sidewinder/utils.h #1156411:1156412
> @@ -103,47 +103,28 @@
>          ptr[9], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14],
> ptr[15]); }
> 
> -typedef double& data_64;
> -static inline void convert_64(data_64 convert)
> -{
> -    register unsigned char temp;
> -    register unsigned int u_int_temp;
> -    temp = ((unsigned char*) & convert)[0];
> -    ((unsigned char*)&convert)[0] = ((unsigned char*) & convert)[3];
> -    ((unsigned char*)&convert)[3] = temp;
> -    temp = ((unsigned char*) & convert)[1];
> -    ((unsigned char*)&convert)[1] = ((unsigned char*) & convert)[2];
> -    ((unsigned char*)&convert)[2] = temp;
> -    temp = ((unsigned char*) & convert)[4];
> -    ((unsigned char*)&convert)[4] = ((unsigned char*) & convert)[7];
> -    ((unsigned char*)&convert)[7] = temp;
> -    temp = ((unsigned char*) & convert)[5];
> -    ((unsigned char*)&convert)[5] = ((unsigned char*) & convert)[6];
> -    ((unsigned char*)&convert)[6] = temp;
> -
> -    u_int_temp = ((unsigned int *) & convert)[0];
> -    ((unsigned int *)&convert)[0] = ((unsigned int *) & convert)[1];
> -    ((unsigned int *)&convert)[1] = u_int_temp;
> -}
> -
> -static inline bool isLittleEndian(void)
> -{
> -    long i = 0x44332211;
> -    unsigned char* a = (unsigned char*) & i;
> -    return (*a == 0x11);
> -}
> -
> -
>  // FIXME check that double is 64 bits
>  static inline double readFloat64(const void*p)
>  {
> -    const double* ptr = (const double*) p;
>      double num = 0.0;
> -    num = *ptr;
> -
> -    if (!isLittleEndian())
> -        convert_64(num);
> -
> +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
> +    memcpy(&num, p, sizeof num);
> +#else
> +    union {
> +        double v1;
> +        char v2[8];
> +    } x;
> +    char* b = (char*)p;
> +    x.v2[0] = b[7];
> +    x.v2[1] = b[6];
> +    x.v2[2] = b[5];
> +    x.v2[3] = b[4];
> +    x.v2[4] = b[3];
> +    x.v2[5] = b[2];
> +    x.v2[6] = b[1];
> +    x.v2[7] = b[0];
> +    num = x.v1;
> +#endif
>      return num;
>  }
Can't you just use QtEndian?
-- 
Carlos Licea

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic