Justus Winter
2011-Mar-01 12:41 UTC
[syslinux] [PATCH] Replace lendian_{short, int} with the appropriate functions from endian.h
--- utils/isohybrid.c | 52 ++++++++++++---------------------------------------- 1 files changed, 12 insertions(+), 40 deletions(-) diff --git a/utils/isohybrid.c b/utils/isohybrid.c index 7ee9a7f..34ec8a6 100644 --- a/utils/isohybrid.c +++ b/utils/isohybrid.c @@ -36,6 +36,7 @@ #include <unistd.h> #include <sys/stat.h> #include <inttypes.h> +#include <endian.h> #include "isohybrid.h" @@ -201,35 +202,6 @@ check_option(int argc, char *argv[]) } -uint16_t -lendian_short(const uint16_t s) -{ - uint16_t r = 1; - - if (*(uint8_t *)&r) - return s; - - r = (s & 0x00FF) << 8 | (s & 0xFF00) >> 8; - - return r; -} - - -uint32_t -lendian_int(const uint32_t s) -{ - uint32_t r = 1; - - if (*(uint8_t *)&r) - return s; - - r = (s & 0x000000FF) << 24 | (s & 0xFF000000) >> 24 - | (s & 0x0000FF00) << 8 | (s & 0x00FF0000) >> 8; - - return r; -} - - int check_banner(const uint8_t *buf) { @@ -243,7 +215,7 @@ check_banner(const uint8_t *buf) buf += sizeof(banner) - 1; memcpy(&catoffset, buf, sizeof(catoffset)); - catoffset = lendian_int(catoffset); + catoffset = le32toh(catoffset); return 0; } @@ -259,7 +231,7 @@ check_catalogue(const uint8_t *buf) ve[i] = 0; memcpy(&ve[i], buf, sizeof(ve[i])); - ve[i] = lendian_short(ve[i]); + ve[i] = le32toh(ve[i]); buf += 2; cs += ve[i]; @@ -281,22 +253,22 @@ read_catalogue(const uint8_t *buf) memcpy(&de_media, buf++, 1); memcpy(&de_seg, buf, 2); - de_seg = lendian_short(de_seg); + de_seg = le16toh(de_seg); buf += 2; memcpy(&de_sys, buf++, 1); memcpy(&de_mbz1, buf++, 1); memcpy(&de_count, buf, 2); - de_count = lendian_short(de_count); + de_count = le16toh(de_count); buf += 2; memcpy(&de_lba, buf, 4); - de_lba = lendian_int(de_lba); + de_lba = le32toh(de_lba); buf += 4; memcpy(&de_mbz2, buf, 2); - de_mbz2 = lendian_short(de_mbz2); + de_mbz2 = le16toh(de_mbz2); buf += 2; if (de_boot != 0x88 || de_media != 0 @@ -335,7 +307,7 @@ initialise_mbr(uint8_t *mbr) memcpy(mbr, &isohdpfx[hd0 + 3 * partok], MBRSIZE); mbr += MBRSIZE; /* offset 432 */ - tmp = lendian_int(de_lba * 4); + tmp = htole32(de_lba * 4); memcpy(mbr, &tmp, sizeof(tmp)); mbr += sizeof(tmp); /* offset 436 */ @@ -343,7 +315,7 @@ initialise_mbr(uint8_t *mbr) memcpy(mbr, &tmp, sizeof(tmp)); mbr += sizeof(tmp); /* offset 440 */ - tmp = lendian_int(id); + tmp = htole32(id); memcpy(mbr, &tmp, sizeof(tmp)); mbr += sizeof(tmp); /* offset 444 */ @@ -379,10 +351,10 @@ initialise_mbr(uint8_t *mbr) mbr[6] = esect; mbr[7] = ecyle; - tmp = lendian_int(offset); + tmp = htole32(offset); memcpy(&mbr[8], &tmp, sizeof(tmp)); - tmp = lendian_int(psize); + tmp = htole32(psize); memcpy(&mbr[12], &tmp, sizeof(tmp)); } mbr += 16; @@ -517,7 +489,7 @@ main(int argc, char *argv[]) if (fread(&id, 1, 4, fp) != 4) err(1, "%s: read error", argv[0]); - id = lendian_int(id); + id = le32toh(id); if (!id) { if (mode & VERBOSE) -- 1.7.2.3
H. Peter Anvin
2011-Mar-01 21:32 UTC
[syslinux] [PATCH] Replace lendian_{short, int} with the appropriate functions from endian.h
On 03/01/2011 04:41 AM, Justus Winter wrote:> --- > utils/isohybrid.c | 52 ++++++++++++---------------------------------------- > 1 files changed, 12 insertions(+), 40 deletions(-) > > diff --git a/utils/isohybrid.c b/utils/isohybrid.c > index 7ee9a7f..34ec8a6 100644 > --- a/utils/isohybrid.c > +++ b/utils/isohybrid.c > @@ -36,6 +36,7 @@ > #include <unistd.h> > #include <sys/stat.h> > #include <inttypes.h> > +#include <endian.h> >No way, there is no reason for this code not to be portable to non-Linux POSIX platforms. -hpa