Sun compat
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c
index e7478a0..039a973 100644
--- a/skeletons/OBJECT_IDENTIFIER.c
+++ b/skeletons/OBJECT_IDENTIFIER.c
@@ -56,6 +56,15 @@
};
+/*
+ * Endianness check. Will be optimized out by the compiler.
+ */
+static int
+little_endian() {
+ int le_check = 1;
+ return *(char *)&le_check;
+}
+
int
OBJECT_IDENTIFIER_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
@@ -81,7 +90,6 @@
int
OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbufp, unsigned int rvsize) {
- unsigned LE CC_NOTUSED = 1; /* Little endian (x86) */
const uint8_t *arcend = arcbuf + arclen; /* End of arc */
unsigned int cache = 0; /* No more than 14 significant bits */
unsigned char *rvbuf = (unsigned char *)rvbufp;
@@ -126,15 +134,15 @@
arcbuf++;
}
}
-
/* Faster path for common size */
- if(rvsize == (CHAR_BIT * sizeof(unsigned long))) {
+ if(rvsize == (CHAR_BIT * sizeof(unsigned long))
+ && (arcend-arcbuf) <= (ssize_t)sizeof(unsigned long)) {
unsigned long accum;
/* Gather all bits into the accumulator */
for(accum = cache; arcbuf < arcend; arcbuf++)
accum = (accum << 7) | (*arcbuf & ~0x80);
if(accum < (unsigned)-add
- || accum > (ULONG_MAX-(unsigned long)(-add))) {
+ || accum > ULONG_MAX-(unsigned long)(-add)) {
errno = ERANGE; /* Overflow */
return -1;
}
@@ -143,15 +151,14 @@
return 0;
}
-#ifndef WORDS_BIGENDIAN
- if(*(unsigned char *)&LE) { /* Little endian (x86) */
+ if(little_endian()) { /* Little endian (x86) */
/* "Convert" to big endian */
rvbuf += rvsize / CHAR_BIT - 1;
rvstart--;
inc = -1; /* Descending */
- } else
-#endif /* !WORDS_BIGENDIAN */
- inc = +1; /* Big endian is known [at compile time] */
+ } else {
+ inc = +1; /* Big endian */
+ }
{
int bits; /* typically no more than 3-4 bits */
@@ -401,7 +408,6 @@
/*
* First two arcs are encoded through the backdoor.
*/
- unsigned LE = 1; /* Little endian */
int first_arc;
num_arcs++;
if(!arc_slots) { num_arcs++; continue; }
@@ -414,7 +420,7 @@
add = -40 * first_arc;
memset(arcs, 0, arc_type_size);
*(unsigned char *)((char *)arcs
- + ((*(char *)&LE)?0:(arc_type_size - 1)))
+ + (little_endian()?0:(arc_type_size - 1)))
= first_arc;
arcs = ((char *)arcs) + arc_type_size;
}
@@ -423,8 +429,9 @@
if(arcs < arcs_end) {
if(OBJECT_IDENTIFIER_get_single_arc(&oid->buf[startn],
i - startn + 1, add,
- arcs, arc_type_size))
+ arcs, arc_type_size)) {
return -1;
+ }
startn = i + 1;
arcs = ((char *)arcs) + arc_type_size;
add = 0;
@@ -448,19 +455,13 @@
* assert(arcval_size <= 16);
* assert(arcbuf);
*/
-#ifdef WORDS_BIGENDIAN
- const unsigned isLittleEndian = 0;
-#else
- unsigned LE = 1;
- unsigned isLittleEndian = *(char *)&LE;
-#endif
const uint8_t *tend, *tp;
unsigned int cache;
uint8_t *bp = arcbuf;
int bits;
uint8_t buffer[16];
- if(isLittleEndian && !prepared_order) {
+ if(little_endian() && !prepared_order) {
const uint8_t *a = (const unsigned char *)arcval + arcval_size - 1;
const uint8_t *aend = (const uint8_t *)arcval;
uint8_t *msb = buffer + arcval_size - 1;
@@ -511,8 +512,6 @@
OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, const void *arcs, unsigned int arc_type_size, unsigned int arc_slots) {
uint8_t *buf;
uint8_t *bp;
- unsigned LE = 1; /* Little endian (x86) */
- unsigned isLittleEndian = *((char *)&LE);
unsigned int arc0;
unsigned int arc1;
unsigned size;
@@ -540,7 +539,7 @@
break;
default:
arc1 = arc0 = 0;
- if(isLittleEndian) { /* Little endian (x86) */
+ if(little_endian()) { /* Little endian (x86) */
const unsigned char *ps, *pe;
/* If more significant bytes are present,
* make them > 255 quick */
@@ -613,7 +612,7 @@
/* Copy the second (1'st) arcs[1] into the first_value */
*fv++ = 0;
arcs = ((const char *)arcs) + arc_type_size;
- if(isLittleEndian) {
+ if(little_endian()) {
const uint8_t *aend = (const unsigned char *)arcs - 1;
const uint8_t *a1 = (const unsigned char *)arcs + arc_type_size - 1;
for(; a1 > aend; fv++, a1--) *fv = *a1;