<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Endianness</title>
		<link>http://www.allegro.cc/forums/view/618705</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 15 Aug 2022 22:08:58 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Does Allegro have a function to check endianness?</p><p>Can someone post a snippet of a) how to tell what endianness the machine has b) how they would read/write an 32bit int? </p><p>You could read/write little e regardless of machine type then convert to big e if required. Sound about correct?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Fri, 29 Jul 2022 20:59:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>IIRC there&#39;s a define somewhere in the header files (maybe type.h?) so you can use #IFDEF to know the endianess.  Also, there are defines for the target system (CPU and operating system).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Niunio)</author>
		<pubDate>Fri, 29 Jul 2022 21:06:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>FYI, Allegro defines endianness with ALLEGRO_LITTLE_ENDIAN or ALLEGRO_BIG_ENDIAN defined</p><p>What about this pseudocode?<br />&#39;type&#39; would be a primitive like int, float, etc.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">// returns number of bytes written or EOF if error</span>
<span class="number">  2</span><span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_866.html" target="_blank">write</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a> <span class="k3">*</span>file, type value<span class="k2">)</span>
<span class="number">  3</span><span class="k2">{</span>
<span class="number">  4</span>    <span class="c">// if big endian, swap bytes</span>
<span class="number">  5</span><span class="p">#ifdef ALLEGRO_BIG_ENDIAN</span>
<span class="number">  6</span>    value <span class="k3">=</span> swap_bytes<span class="k2">(</span><span class="k3">&amp;</span>value, <span class="k1">sizeof</span><span class="k2">(</span>type<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span><span class="p">#endif</span>
<span class="number">  8</span>
<span class="number">  9</span>    <span class="c">// write little endian</span>
<span class="number"> 10</span>    <span class="k1">return</span> write_bytes<span class="k2">(</span>file, <span class="k3">&amp;</span>value, <span class="k1">sizeof</span><span class="k2">(</span>type<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span><span class="k2">}</span>
<span class="number"> 12</span>
<span class="number"> 13</span><span class="c">// returns number of bytes read or EOF if error</span>
<span class="number"> 14</span><span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_642.html" target="_blank">read</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a> <span class="k3">*</span>file, type<span class="k3">&amp;</span>value<span class="k2">)</span>
<span class="number"> 15</span><span class="k2">{</span>
<span class="number"> 16</span>    <span class="c">// read little endian</span>
<span class="number"> 17</span>    <span class="k1">int</span> sz <span class="k3">=</span> read_bytes<span class="k2">(</span>file, <span class="k3">&amp;</span>value, <span class="k1">sizeof</span><span class="k2">(</span>type<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>
<span class="number"> 19</span>    <span class="k1">if</span> <span class="k2">(</span>sz <span class="k3">=</span><span class="k3">=</span> EOF<span class="k2">)</span> <span class="k1">return</span> EOF:
<span class="number"> 20</span>
<span class="number"> 21</span>    <span class="c">// if big endian, swap bytes</span>
<span class="number"> 22</span><span class="p">#ifdef ALLEGRO_BIG_ENDIAN</span>
<span class="number"> 23</span>    value <span class="k3">=</span> swap_bytes<span class="k2">(</span><span class="k3">&amp;</span>value, <span class="k1">sizeof</span><span class="k2">(</span>type<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span><span class="p">#endif</span>
<span class="number"> 25</span>
<span class="number"> 26</span>    <span class="k1">return</span> sz<span class="k2">;</span>
<span class="number"> 27</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Tue, 02 Aug 2022 22:13:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Allegro aside, here are some macros I&#39;m using in my lib, mainly a scrap of a lot of detection macros that I took here and there.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">/*! Little endian macro value */</span>
<span class="number">  2</span><span class="p">#define BYTEORDER_LITTLE_ENDIAN 0 // Little endian machine.</span>
<span class="number">  3</span><span class="c">/*! Big endian macro value */</span>
<span class="number">  4</span><span class="p">#define BYTEORDER_BIG_ENDIAN 1 // Big endian machine.</span>
<span class="number">  5</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="p">#ifndef BYTEORDER_ENDIAN</span>
<span class="number">  8</span><span class="c">// Detect with GCC 4.6's macro.</span>
<span class="number">  9</span><span class="p">#if defined(__BYTE_ORDER__)</span>
<span class="number"> 10</span><span class="p">#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)</span>
<span class="number"> 11</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN</span>
<span class="number"> 12</span><span class="p">#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)</span>
<span class="number"> 13</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN</span>
<span class="number"> 14</span><span class="p">#else</span>
<span class="number"> 15</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN</span>
<span class="number"> 16</span><span class="p">#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."</span>
<span class="number"> 17</span><span class="p">#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"</span>
<span class="number"> 18</span><span class="p">#endif</span>
<span class="number"> 19</span><span class="c">// Detect with GLIBC's endian.h.</span>
<span class="number"> 20</span><span class="p">#elif defined(__GLIBC__)</span>
<span class="number"> 21</span><span class="p">#include &lt;endian.h&gt;</span>
<span class="number"> 22</span><span class="p">#if (__BYTE_ORDER == __LITTLE_ENDIAN)</span>
<span class="number"> 23</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN</span>
<span class="number"> 24</span><span class="p">#elif (__BYTE_ORDER == __BIG_ENDIAN)</span>
<span class="number"> 25</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN</span>
<span class="number"> 26</span><span class="p">#else</span>
<span class="number"> 27</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN</span>
<span class="number"> 28</span><span class="p">#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."</span>
<span class="number"> 29</span><span class="p">#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"</span>
<span class="number"> 30</span><span class="p">#endif</span>
<span class="number"> 31</span><span class="c">// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro.</span>
<span class="number"> 32</span><span class="p">#elif defined(_LITTLE_ENDIAN) &amp;&amp; !defined(_BIG_ENDIAN)</span>
<span class="number"> 33</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN</span>
<span class="number"> 34</span><span class="p">#elif defined(_BIG_ENDIAN) &amp;&amp; !defined(_LITTLE_ENDIAN)</span>
<span class="number"> 35</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN</span>
<span class="number"> 36</span><span class="c">// Detect with architecture macros.</span>
<span class="number"> 37</span><span class="p">#elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__)</span>
<span class="number"> 38</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN</span>
<span class="number"> 39</span><span class="p">#elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__)</span>
<span class="number"> 40</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN</span>
<span class="number"> 41</span><span class="p">#elif defined(_MSC_VER) &amp;&amp; (defined(_M_ARM) || defined(_M_ARM64))</span>
<span class="number"> 42</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN</span>
<span class="number"> 43</span><span class="p">#else</span>
<span class="number"> 44</span><span class="p">#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN</span>
<span class="number"> 45</span><span class="p">#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."</span>
<span class="number"> 46</span><span class="p">#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"</span>
<span class="number"> 47</span><span class="p">#endif</span>
<span class="number"> 48</span><span class="p">#endif</span>
</div></div><p>

Well. Old and new GCC specific code, maybe. I had no problem with it on Solaris, AIX, Linux, Windows MinGW.</p><p>BTW I also had to detect 32 or 64 bits, and that little piece covered all my needs:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#if defined( _WIN32 ) || defined( _WIN64 )</span>
<span class="number">  2</span><span class="p">#if defined( _WIN64 )</span>
<span class="number">  3</span><span class="p">#define __ENVBITS ENV_64BITS</span>
<span class="number">  4</span><span class="p">#else</span>
<span class="number">  5</span><span class="p">#define __ENVBITS ENV_32BITS</span>
<span class="number">  6</span><span class="p">#endif</span>
<span class="number">  7</span><span class="p">#endif</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="p">#if !defined( __ENVBITS ) </span>
<span class="number"> 10</span><span class="p">#if defined( __GNUC__ )</span>
<span class="number"> 11</span><span class="p">#if defined( __x86_64__ ) || defined( __ppc64__ )</span>
<span class="number"> 12</span><span class="p">#define __ENVBITS __ENV_64BITS</span>
<span class="number"> 13</span><span class="p">#else</span>
<span class="number"> 14</span><span class="p">#define  __ENVBITS __ENV_32BITS</span>
<span class="number"> 15</span><span class="p">#endif</span>
<span class="number"> 16</span><span class="p">#endif</span>
<span class="number"> 17</span><span class="p">#endif</span>
</div></div><p>

Your mileage may vary. It may only be right on my own os targets.</p><p>Edit:<br />BTW endianness is only a problem if you are having datas or networks communications between systems that are not the same endian or bits. Problems may arise if i.e you write a datafile containing dumps on A and read it on B, and that B is not the same bits / endianness as A.<br />Commonly when I need to write something I&#39;m rarely dumping a int64, as it&#39;s not portable across all my targets ( a mix of 32/64bits ), and anyway I always htonX before dumping, and ntohX when reading the dump. That way data is consistent. <br />I&#39;m not sure if I&#39;m clear, but my dear I&#39;m tired today X-D
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Fri, 05 Aug 2022 00:05:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It seems there is a definition somewhere in the header files (maybe type.h?) so you can check the endianness using #IFDEF. It specifies the target system&#39;s CPU and operating system.<a href="https://maxifoot.info/">https://maxifoot.info/</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (guin hanki)</author>
		<pubDate>Sat, 13 Aug 2022 12:19:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can perform a run time check easily enough.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">bool</span> BigEndian<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
   <span class="k1">int</span> pack <span class="k3">=</span> <span class="s">'b'</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">24</span> <span class="k3">|</span> <span class="s">'e'</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">16</span> <span class="k3">|</span> <span class="s">'e'</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">8</span> <span class="k3">|</span> <span class="s">'l'</span><span class="k2">;</span>
   <span class="k1">return</span> <span class="k2">(</span><span class="k1">char</span><span class="k3">*</span><span class="k2">)</span><span class="k2">(</span>pack<span class="k2">)</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="s">'b'</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 13 Aug 2022 19:41:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Beels live in memory.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Polybios)</author>
		<pubDate>Sun, 14 Aug 2022 02:22:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, as I said before, it&#39;s defined by Allegro depending on how Allegro was compiled</p><p>ALLEGRO_LITTLE_ENDIAN or ALLEGRO_BIG_ENDIAN</p><p>This is about what I have. </p><p>Written and Read as little. Convert to big if needed.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>    <span class="k1">void</span> SwapBytes<span class="k2">(</span><span class="k1">const</span> <span class="k1">void</span><span class="k3">*</span> input, <span class="k1">void</span><span class="k3">*</span> output, <span class="k1">size_t</span> bytes<span class="k2">)</span><span class="k2">;</span>
<span class="number">  2</span>    <span class="k1">int32_t</span> WriteBytes<span class="k2">(</span>Allegro::File<span class="k3">&amp;</span> file, <span class="k1">const</span> <span class="k1">void</span><span class="k3">*</span> value, <span class="k1">size_t</span> bytes<span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>    <span class="k1">int32_t</span> ReadBytes<span class="k2">(</span>Allegro::File<span class="k3">&amp;</span> file, <span class="k1">void</span><span class="k3">*</span> value, <span class="k1">size_t</span> bytes<span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>    <span class="k1">template</span> <span class="k3">&lt;</span><span class="k1">typename</span> type&gt;
<span class="number">  6</span>    <span class="k1">int32_t</span> WritePrimitive<span class="k2">(</span>Allegro::File<span class="k3">&amp;</span> file, <span class="k1">const</span> type value<span class="k2">)</span>
<span class="number">  7</span>    <span class="k2">{</span>
<span class="number">  8</span>        <span class="k1">const</span> type output<span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span><span class="p">#ifdef ALLEGRO_LITTLE_ENDIAN</span>
<span class="number"> 11</span>        output <span class="k3">=</span> value<span class="k2">;</span>
<span class="number"> 12</span><span class="p">#else</span>
<span class="number"> 13</span>        SwapBytes<span class="k2">(</span>value, output, <span class="k1">sizeof</span><span class="k2">(</span>type<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span><span class="p">#endif</span>
<span class="number"> 15</span>
<span class="number"> 16</span>        <span class="k1">return</span> Wind::WriteBytes<span class="k2">(</span>file, <span class="k3">&amp;</span>output, <span class="k1">sizeof</span><span class="k2">(</span>type<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    <span class="k2">}</span>
<span class="number"> 18</span>
<span class="number"> 19</span>    <span class="c">// special case. read/write as byte 0 or 1</span>
<span class="number"> 20</span>    <span class="k1">template</span> <span class="k3">&lt;</span><span class="k3">&gt;</span> <span class="k1">int32_t</span> WritePrimitive<span class="k2">(</span>Allegro::File<span class="k3">&amp;</span> file, <span class="k1">const</span> <span class="k1">bool</span><span class="k3">&amp;</span> input<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>
<span class="number"> 22</span>
<span class="number"> 23</span>    <span class="k1">template</span> <span class="k3">&lt;</span><span class="k1">typename</span> type&gt;
<span class="number"> 24</span>    <span class="k1">int32_t</span> ReadPrimitive<span class="k2">(</span>Allegro::File<span class="k3">&amp;</span> file, type<span class="k3">&amp;</span> value<span class="k2">)</span>
<span class="number"> 25</span>    <span class="k2">{</span>
<span class="number"> 26</span>        type input<span class="k2">;</span>
<span class="number"> 27</span>        <span class="k1">int32_t</span> size <span class="k3">=</span> Wind::ReadBytes<span class="k2">(</span>file, <span class="k3">&amp;</span>input, <span class="k1">sizeof</span><span class="k2">(</span>type<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>
<span class="number"> 29</span>        <span class="k1">if</span> <span class="k2">(</span>size <span class="k3">=</span><span class="k3">=</span> EOF<span class="k2">)</span>
<span class="number"> 30</span>        <span class="k2">{</span>
<span class="number"> 31</span>            <span class="k1">return</span> EOF<span class="k2">;</span>
<span class="number"> 32</span>        <span class="k2">}</span>
<span class="number"> 33</span>
<span class="number"> 34</span><span class="p">#ifdef ALLEGRO_BIG_ENDIAN</span>
<span class="number"> 35</span>        SwapBytes<span class="k2">(</span>input, value, <span class="k1">sizeof</span><span class="k2">(</span>type<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span><span class="p">#else</span>
<span class="number"> 37</span>        value <span class="k3">=</span> input<span class="k2">;</span>
<span class="number"> 38</span><span class="p">#endif</span>
<span class="number"> 39</span>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 40</span>    <span class="k2">}</span>
<span class="number"> 41</span>
<span class="number"> 42</span>    <span class="c">// special case. read/write as byte 0 or 1</span>
<span class="number"> 43</span>    <span class="k1">template</span> <span class="k3">&lt;</span><span class="k3">&gt;</span> <span class="k1">int32_t</span> ReadPrimitive<span class="k2">(</span>Allegro::File<span class="k3">&amp;</span> file, <span class="k1">const</span> <span class="k1">bool</span><span class="k3">&amp;</span> input<span class="k2">)</span><span class="k2">;</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Mon, 15 Aug 2022 22:08:58 +0000</pubDate>
	</item>
</rss>
