port to avr

This commit is contained in:
Martin Schröder 2016-09-09 23:48:00 +02:00
parent 4bb494cf13
commit 1250439e71
9 changed files with 161 additions and 48 deletions

100
configure vendored
View file

@ -1775,6 +1775,97 @@ $as_echo "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func } # ac_fn_c_check_func
# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
# the include files in INCLUDES and setting the cache variable VAR
# accordingly.
ac_fn_c_check_header_mongrel ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if eval \${$3+:} false; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
else
# Is the header compilable?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
$as_echo_n "checking $2 usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_header_compiler=yes
else
ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
$as_echo "$ac_header_compiler" >&6; }
# Is the header present?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
$as_echo_n "checking $2 presence... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <$2>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
ac_header_preproc=yes
else
ac_header_preproc=no
fi
rm -f conftest.err conftest.i conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
yes:no: )
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
;;
no:yes:* )
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
( $as_echo "## -------------------------------------- ##
## Report this to mkschreder.uk@gmail.com ##
## -------------------------------------- ##"
) | sed "s/^/$as_me: WARNING: /" >&2
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
eval "$3=\$ac_header_compiler"
fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_mongrel
cat >config.log <<_ACEOF cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
@ -12569,6 +12660,15 @@ fi
ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
if test "x$ac_cv_header_unistd_h" = xyes; then :
$as_echo "#define HAVE_UNISTD_H 1" >>confdefs.h
fi
ac_config_files="$ac_config_files Makefile src/Makefile test/Makefile" ac_config_files="$ac_config_files Makefile src/Makefile test/Makefile"
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF

View file

@ -13,5 +13,10 @@ LT_INIT
AC_PROG_CC AC_PROG_CC
AC_CHECK_HEADER([unistd.h],
[AC_DEFINE([HAVE_UNISTD_H], [1],
[Define to 1 if you have <unistd.h>.])],
[])
AC_OUTPUT(Makefile src/Makefile test/Makefile) AC_OUTPUT(Makefile src/Makefile test/Makefile)

View file

@ -39,7 +39,7 @@ static inline blob_offset_t blob_field_to_offset(struct blob *buf, struct blob_f
return (blob_offset_t)((char *)attr - (char *) buf->buf); return (blob_offset_t)((char *)attr - (char *) buf->buf);
} }
static void blob_field_init(struct blob_field *attr, int id, unsigned int len){ static void blob_field_init(struct blob_field *attr, uint32_t id, uint32_t len){
assert(attr); assert(attr);
memset(attr, 0, sizeof(struct blob_field)); memset(attr, 0, sizeof(struct blob_field));
//len += sizeof(struct blob_field); //len += sizeof(struct blob_field);
@ -213,7 +213,7 @@ blob_offset_t blob_open_array(struct blob *buf){
} }
void blob_close_array(struct blob *buf, blob_offset_t offset){ void blob_close_array(struct blob *buf, blob_offset_t offset){
if((unsigned long)offset > blob_size(buf)) return; if((int)offset > blob_size(buf)) return;
struct blob_field *attr = blob_offset_to_attr(buf, offset); struct blob_field *attr = blob_offset_to_attr(buf, offset);
int len = (buf->buf + blob_field_raw_len(blob_head(buf))) - (void*)attr; int len = (buf->buf + blob_field_raw_len(blob_head(buf))) - (void*)attr;
blob_field_set_raw_len(attr, len); blob_field_set_raw_len(attr, len);
@ -225,7 +225,7 @@ blob_offset_t blob_open_table(struct blob *buf){
} }
void blob_close_table(struct blob *buf, blob_offset_t offset){ void blob_close_table(struct blob *buf, blob_offset_t offset){
if((unsigned long)offset > blob_size(buf)) return; if((int)offset > blob_size(buf)) return;
struct blob_field *attr = blob_offset_to_attr(buf, offset); struct blob_field *attr = blob_offset_to_attr(buf, offset);
int len = (buf->buf + blob_field_raw_len(blob_head(buf))) - (void*)attr; int len = (buf->buf + blob_field_raw_len(blob_head(buf))) - (void*)attr;
blob_field_set_raw_len(attr, len); blob_field_set_raw_len(attr, len);

View file

@ -239,13 +239,13 @@ static void blob_format_element(struct strbuf *s, struct blob_field *attr, bool
sprintf(buf, "%d", be16_to_cpu(*(uint16_t *)data)); sprintf(buf, "%d", be16_to_cpu(*(uint16_t *)data));
break; break;
case BLOB_FIELD_INT32: case BLOB_FIELD_INT32:
sprintf(buf, "%d", (int32_t) be32_to_cpu(*(uint32_t *)data)); sprintf(buf, "%lu", (int32_t) be32_to_cpu(*(uint32_t *)data));
break; break;
case BLOB_FIELD_INT64: case BLOB_FIELD_INT64:
sprintf(buf, "%" PRId64, (int64_t) be64_to_cpu(*(uint64_t *)data)); sprintf(buf, "%llu", (int64_t) be64_to_cpu(*(uint64_t *)data));
break; break;
case BLOB_FIELD_FLOAT32: case BLOB_FIELD_FLOAT32:
sprintf(buf, "%f", (float) unpack754_32(be32_to_cpu(*(uint32_t*)data))); sprintf(buf, "%f", (double) unpack754_32(be32_to_cpu(*(uint32_t*)data)));
break; break;
case BLOB_FIELD_FLOAT64: case BLOB_FIELD_FLOAT64:
sprintf(buf, "%Le", unpack754_64(be64_to_cpu(*(uint64_t*)data))); sprintf(buf, "%Le", unpack754_64(be64_to_cpu(*(uint64_t*)data)));

View file

@ -41,9 +41,9 @@ http://www.opensource.apple.com/source/tcl/tcl-14/tcl/license.terms
#include "blobpack.h" #include "blobpack.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> //#include <unistd.h>
#include <fcntl.h> //#include <fcntl.h>
#include <sys/stat.h> //#include <sys/stat.h>
#include "ujson.h" #include "ujson.h"
#define DEBUG(...) {} #define DEBUG(...) {}
@ -57,13 +57,15 @@ void Object_arrayAddItem(void *prv, JSOBJ obj, JSOBJ value){
DEBUG("new array item \n"); DEBUG("new array item \n");
} }
JSOBJ Object_newString(void *prv, wchar_t *start, wchar_t *end){ JSOBJ Object_newString(void *prv, char *start, char *end){
size_t len = end - start + 1; size_t len = end - start + 1;
char *str = alloca(len); char *str = malloc(len);
memset(str, 0, len); memset(str, 0, len);
wcstombs(str, start, end - start); strncpy(str, start, end - start);
DEBUG("new string %s\n", str); DEBUG("new string %s\n", str);
return blob_put_string(prv, str); void* ret = blob_put_string(prv, str);
free(str);
return ret;
} }
JSOBJ Object_newTrue(void *prv){ JSOBJ Object_newTrue(void *prv){
@ -183,6 +185,7 @@ bool blob_init_from_json(struct blob *self, const char *json){
return true; return true;
} }
#ifdef HAVE_UNISTD_H
bool blob_put_json_from_file(struct blob *self, const char *file){ bool blob_put_json_from_file(struct blob *self, const char *file){
// this is a rather simplistic approach where we just load the whole file into memory and then parse the buffer. // this is a rather simplistic approach where we just load the whole file into memory and then parse the buffer.
// there can probably be better ways where we parse data in place.. // there can probably be better ways where we parse data in place..
@ -193,13 +196,15 @@ bool blob_put_json_from_file(struct blob *self, const char *file){
file_size = lseek(fd, SEEK_END, 0); file_size = lseek(fd, SEEK_END, 0);
if(file_size > 1000000UL) { close(fd); return false; } if(file_size > 1000000UL) { close(fd); return false; }
lseek(fd, SEEK_SET, 0); lseek(fd, SEEK_SET, 0);
char *buffer = alloca(file_size + 1); // allocate on stack char *buffer = malloc(file_size + 1); // allocate on stack
memset(buffer, 0, file_size + 1); memset(buffer, 0, file_size + 1);
if(file_size != read(fd, buffer, file_size)){ if(file_size != read(fd, buffer, file_size)){
close(fd); close(fd);
return false; return false;
} }
close(fd); close(fd);
return blob_put_json(self, buffer); int ret = blob_put_json(self, buffer);
free(buffer);
return ret;
} }
#endif

View file

@ -54,7 +54,6 @@ tree doesn't have cyclic references.
#define __ULTRAJSON_H__ #define __ULTRAJSON_H__
#include <stdio.h> #include <stdio.h>
#include <wchar.h>
// Don't output any extra whitespaces when encoding // Don't output any extra whitespaces when encoding
#define JSON_NO_EXTRA_WHITESPACE #define JSON_NO_EXTRA_WHITESPACE
@ -77,7 +76,7 @@ tree doesn't have cyclic references.
/* /*
Dictates and limits how much stack space for buffers UltraJSON will use before resorting to provided heap functions */ Dictates and limits how much stack space for buffers UltraJSON will use before resorting to provided heap functions */
#ifndef JSON_MAX_STACK_BUFFER_SIZE #ifndef JSON_MAX_STACK_BUFFER_SIZE
#define JSON_MAX_STACK_BUFFER_SIZE 131072 #define JSON_MAX_STACK_BUFFER_SIZE 64
#endif #endif
#ifdef _WIN32 #ifdef _WIN32
@ -300,7 +299,7 @@ EXPORTFUNCTION char *JSON_EncodeObject(JSOBJ obj, JSONObjectEncoder *enc, char *
typedef struct __JSONObjectDecoder typedef struct __JSONObjectDecoder
{ {
JSOBJ (*newString)(void *prv, wchar_t *start, wchar_t *end); JSOBJ (*newString)(void *prv, char *start, char *end);
void (*objectAddKey)(void *prv, JSOBJ obj, JSOBJ name, JSOBJ value); void (*objectAddKey)(void *prv, JSOBJ obj, JSOBJ name, JSOBJ value);
void (*arrayAddItem)(void *prv, JSOBJ obj, JSOBJ value); void (*arrayAddItem)(void *prv, JSOBJ obj, JSOBJ value);
JSOBJ (*newTrue)(void *prv); JSOBJ (*newTrue)(void *prv);

View file

@ -41,7 +41,6 @@ http://www.opensource.apple.com/source/tcl/tcl-14/tcl/license.terms
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#include <wchar.h>
#include <stdlib.h> #include <stdlib.h>
#include <errno.h> #include <errno.h>
@ -57,8 +56,8 @@ struct DecoderState
{ {
char *start; char *start;
char *end; char *end;
wchar_t *escStart; char *escStart;
wchar_t *escEnd; char *escEnd;
int escHeap; int escHeap;
int lastType; int lastType;
JSUINT32 objDepth; JSUINT32 objDepth;
@ -427,8 +426,8 @@ JSOBJ decode_string ( struct DecoderState *ds)
JSUTF16 sur[2] = { 0 }; JSUTF16 sur[2] = { 0 };
int iSur = 0; int iSur = 0;
int index; int index;
wchar_t *escOffset; char *escOffset;
wchar_t *escStart; char *escStart;
size_t escLen = (ds->escEnd - ds->escStart); size_t escLen = (ds->escEnd - ds->escStart);
JSUINT8 *inputOffset; JSUINT8 *inputOffset;
JSUINT8 oct; JSUINT8 oct;
@ -442,11 +441,11 @@ JSOBJ decode_string ( struct DecoderState *ds)
if (ds->escHeap) if (ds->escHeap)
{ {
if (newSize > (SIZE_MAX / sizeof(wchar_t))) if (newSize > (SIZE_MAX / sizeof(char)))
{ {
return SetError(ds, -1, "Could not reserve memory block"); return SetError(ds, -1, "Could not reserve memory block");
} }
escStart = (wchar_t *)ds->dec->realloc(ds->escStart, newSize * sizeof(wchar_t)); escStart = (char *)ds->dec->realloc(ds->escStart, newSize * sizeof(char));
if (!escStart) if (!escStart)
{ {
ds->dec->free(ds->escStart); ds->dec->free(ds->escStart);
@ -456,18 +455,18 @@ JSOBJ decode_string ( struct DecoderState *ds)
} }
else else
{ {
wchar_t *oldStart = ds->escStart; char *oldStart = ds->escStart;
if (newSize > (SIZE_MAX / sizeof(wchar_t))) if (newSize > (SIZE_MAX / sizeof(char)))
{ {
return SetError(ds, -1, "Could not reserve memory block"); return SetError(ds, -1, "Could not reserve memory block");
} }
ds->escStart = (wchar_t *) ds->dec->malloc(newSize * sizeof(wchar_t)); ds->escStart = (char *) ds->dec->malloc(newSize * sizeof(char));
if (!ds->escStart) if (!ds->escStart)
{ {
return SetError(ds, -1, "Could not reserve memory block"); return SetError(ds, -1, "Could not reserve memory block");
} }
ds->escHeap = 1; ds->escHeap = 1;
memcpy(ds->escStart, oldStart, escLen * sizeof(wchar_t)); memcpy(ds->escStart, oldStart, escLen * sizeof(char));
} }
ds->escEnd = ds->escStart + newSize; ds->escEnd = ds->escStart + newSize;
@ -563,7 +562,7 @@ JSOBJ decode_string ( struct DecoderState *ds)
iSur ++; iSur ++;
break; break;
} }
(*escOffset++) = (wchar_t) sur[iSur]; (*escOffset++) = (char) sur[iSur];
iSur = 0; iSur = 0;
} }
else else
@ -574,10 +573,10 @@ JSOBJ decode_string ( struct DecoderState *ds)
return SetError (ds, -1, "Unpaired high surrogate when decoding 'string'"); return SetError (ds, -1, "Unpaired high surrogate when decoding 'string'");
} }
#if WCHAR_MAX == 0xffff #if WCHAR_MAX == 0xffff
(*escOffset++) = (wchar_t) sur[0]; (*escOffset++) = (char) sur[0];
(*escOffset++) = (wchar_t) sur[1]; (*escOffset++) = (char) sur[1];
#else #else
(*escOffset++) = (wchar_t) 0x10000 + (((sur[0] - 0xd800) << 10) | (sur[1] - 0xdc00)); (*escOffset++) = (char) 0x10000 + (((sur[0] - 0xd800) << 10) | (sur[1] - 0xdc00));
#endif #endif
iSur = 0; iSur = 0;
} }
@ -591,7 +590,7 @@ JSOBJ decode_string ( struct DecoderState *ds)
case 1: case 1:
{ {
*(escOffset++) = (wchar_t) (*inputOffset++); *(escOffset++) = (char) (*inputOffset++);
break; break;
} }
@ -605,7 +604,7 @@ JSOBJ decode_string ( struct DecoderState *ds)
} }
ucs |= (*inputOffset++) & 0x3f; ucs |= (*inputOffset++) & 0x3f;
if (ucs < 0x80) return SetError (ds, -1, "Overlong 2 byte UTF-8 sequence detected when decoding 'string'"); if (ucs < 0x80) return SetError (ds, -1, "Overlong 2 byte UTF-8 sequence detected when decoding 'string'");
*(escOffset++) = (wchar_t) ucs; *(escOffset++) = (char) ucs;
break; break;
} }
@ -628,7 +627,7 @@ JSOBJ decode_string ( struct DecoderState *ds)
} }
if (ucs < 0x800) return SetError (ds, -1, "Overlong 3 byte UTF-8 sequence detected when encoding string"); if (ucs < 0x800) return SetError (ds, -1, "Overlong 3 byte UTF-8 sequence detected when encoding string");
*(escOffset++) = (wchar_t) ucs; *(escOffset++) = (char) ucs;
break; break;
} }
@ -656,15 +655,15 @@ JSOBJ decode_string ( struct DecoderState *ds)
if (ucs >= 0x10000) if (ucs >= 0x10000)
{ {
ucs -= 0x10000; ucs -= 0x10000;
*(escOffset++) = (wchar_t) (ucs >> 10) + 0xd800; *(escOffset++) = (char) (ucs >> 10) + 0xd800;
*(escOffset++) = (wchar_t) (ucs & 0x3ff) + 0xdc00; *(escOffset++) = (char) (ucs & 0x3ff) + 0xdc00;
} }
else else
{ {
*(escOffset++) = (wchar_t) ucs; *(escOffset++) = (char) ucs;
} }
#else #else
*(escOffset++) = (wchar_t) ucs; *(escOffset++) = (char) ucs;
#endif #endif
break; break;
} }
@ -866,14 +865,14 @@ JSOBJ JSON_DecodeObject(JSONObjectDecoder *dec, const char *buffer, size_t cbBuf
/* /*
FIXME: Base the size of escBuffer of that of cbBuffer so that the unicode escaping doesn't run into the wall each time */ FIXME: Base the size of escBuffer of that of cbBuffer so that the unicode escaping doesn't run into the wall each time */
struct DecoderState ds; struct DecoderState ds;
wchar_t escBuffer[(JSON_MAX_STACK_BUFFER_SIZE / sizeof(wchar_t))]; char escBuffer[(JSON_MAX_STACK_BUFFER_SIZE / sizeof(char))];
JSOBJ ret; JSOBJ ret;
ds.start = (char *) buffer; ds.start = (char *) buffer;
ds.end = ds.start + cbBuffer; ds.end = ds.start + cbBuffer;
ds.escStart = escBuffer; ds.escStart = escBuffer;
ds.escEnd = ds.escStart + (JSON_MAX_STACK_BUFFER_SIZE / sizeof(wchar_t)); ds.escEnd = ds.escStart + (JSON_MAX_STACK_BUFFER_SIZE / sizeof(char));
ds.escHeap = 0; ds.escHeap = 0;
ds.prv = dec->prv; ds.prv = dec->prv;
ds.dec = dec; ds.dec = dec;

View file

@ -42,9 +42,13 @@ http://www.opensource.apple.com/source/tcl/tcl-14/tcl/license.terms
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#include <limits.h>
#include <float.h> #include <float.h>
#ifndef HUGE_VAL
#define HUGE_VAL INT_MAX
#endif
#ifndef TRUE #ifndef TRUE
#define TRUE 1 #define TRUE 1
#endif #endif
@ -344,7 +348,7 @@ int Buffer_EscapeStringValidated (JSOBJ obj, JSONObjectEncoder *enc, const char
memcpy(&in8, io + 2, sizeof(JSUINT8)); memcpy(&in8, io + 2, sizeof(JSUINT8));
#ifdef __LITTLE_ENDIAN__ #ifdef __LITTLE_ENDIAN__
in = (JSUTF32) in16; in = (JSUTF32) in16;
in |= in8 << 16; in |= (JSUTF32)in8 << 16;
ucs = ((in & 0x0f) << 12) | ((in & 0x3f00) >> 2) | ((in & 0x3f0000) >> 16); ucs = ((in & 0x0f) << 12) | ((in & 0x3f00) >> 2) | ((in & 0x3f0000) >> 16);
#else #else
in = in16 << 8; in = in16 << 8;

View file

@ -19,11 +19,9 @@
#ifndef __LIBUBOX_UTILS_H #ifndef __LIBUBOX_UTILS_H
#define __LIBUBOX_UTILS_H #define __LIBUBOX_UTILS_H
#include <sys/types.h>
#include <sys/time.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include <time.h> #include <stdlib.h>
/* /*
* calloc_a(size_t len, [void **addr, size_t len,...], NULL) * calloc_a(size_t len, [void **addr, size_t len,...], NULL)
@ -85,6 +83,9 @@ int clock_gettime(int type, struct timespec *tv);
#include <sys/endian.h> #include <sys/endian.h>
#define bswap_32(x) bswap32(x) #define bswap_32(x) bswap32(x)
#define bswap_64(x) bswap64(x) #define bswap_64(x) bswap64(x)
#elif defined(__AVR)
#define __LITTLE_ENDIAN 1234
#define __BYTE_ORDER __LITTLE_ENDIAN
#else #else
#include <machine/endian.h> #include <machine/endian.h>
#define bswap_32(x) swap32(x) #define bswap_32(x) swap32(x)