Skip to content

Commit fb312fa

Browse files
committed
Fix (get|put)_double wrt. endianess
These functions are currently unused, but might be in the future to support O (dBASE) and B (FoxPro) doubles, so we already fix them for little-endian systems. git-svn-id: http://svn.php.net/repository/pecl/dbase/trunk@340801 c90b9560-bf6c-de11-be94-00142212c4b1
1 parent 7c432e3 commit fb312fa

File tree

1 file changed

+28
-18
lines changed

1 file changed

+28
-18
lines changed

dbf_misc.c

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,16 @@
1212

1313
#include "php_reentrancy.h"
1414

15+
#if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__))
16+
# if defined(__LITTLE_ENDIAN__)
17+
# undef WORDS_BIGENDIAN
18+
# else
19+
# if defined(__BIG_ENDIAN__)
20+
# define WORDS_BIGENDIAN
21+
# endif
22+
# endif
23+
#endif
24+
1525
/*
1626
* routine to change little endian long to host long
1727
*/
@@ -60,31 +70,31 @@ double get_double(char *cp)
6070
{
6171
double ret;
6272
unsigned char *dp = (unsigned char *)&ret;
63-
64-
dp[7] = *cp++;
65-
dp[6] = *cp++;
66-
dp[5] = *cp++;
67-
dp[4] = *cp++;
68-
dp[3] = *cp++;
69-
dp[2] = *cp++;
70-
dp[1] = *cp++;
71-
dp[0] = *cp++;
73+
int i;
74+
75+
#ifdef WORDS_BIGENDIAN
76+
for (i = 7; i >= 0; i--) {
77+
#else
78+
for (i = 0; i <= 7; i++) {
79+
#endif
80+
dp[i] = *cp++;
81+
}
7282

7383
return ret;
7484
}
7585

7686
void put_double(char *cp, double fval)
7787
{
7888
unsigned char *dp = (unsigned char *)&fval;
79-
80-
cp[7] = *dp++;
81-
cp[6] = *dp++;
82-
cp[5] = *dp++;
83-
cp[4] = *dp++;
84-
cp[3] = *dp++;
85-
cp[2] = *dp++;
86-
cp[1] = *dp++;
87-
cp[0] = *dp++;
89+
int i;
90+
91+
#ifdef WORDS_BIGENDIAN
92+
for (i = 7; i >= 0; i--) {
93+
#else
94+
for (i = 0; i <= 7; i++) {
95+
#endif
96+
cp[i] = *dp++;
97+
}
8898
}
8999

90100
void copy_fill(char *dp, char *sp, int len)

0 commit comments

Comments
 (0)