\subsubsection{Structure of the configuration files}

The config files are divided into sections and options/values.

Every section has a type, but does not necessarily have a name.
Every option has a name and a value and is assigned to the section
it was written under.

Syntax:

\begin{Verbatim}
config      <type> ["<name>"]      # Section
    option  <name> "<value>"       # Option
\end{Verbatim}

Every parameter needs to be a single string and is formatted exactly
like a parameter for a shell function. The same rules for Quoting and
special characters also apply, as it is parsed by the shell.

\subsubsection{Parsing configuration files in custom scripts}

To be able to load configuration files, you need to include the common
functions with:

\begin{Verbatim}
. /etc/functions.sh
\end{Verbatim}

Then you can use \texttt{config\_load \textit{<name>}} to load config files. The function
first checks for \textit{<name>} as absolute filename and falls back to loading
it from \texttt{/etc/config} (which is the most common way of using it).

If you want to use special callbacks for sections and/or options, you
need to define the following shell functions before running \texttt{config\_load}
(after including \texttt{/etc/functions.sh}):

\begin{Verbatim}
config_cb() {
    local type="$1"
    local name="$2"
    # commands to be run for every section
}

option_cb() {
    # commands to be run for every option
}
\end{Verbatim}

You can also alter \texttt{option\_cb} from \texttt{config\_cb} based on the section type.
This allows you to process every single config section based on its type
individually.

\texttt{config\_cb} is run every time a new section starts (before options are being
processed). You can access the last section through the \texttt{CONFIG\_SECTION}
variable. Also an extra call to \texttt{config\_cb} (without a new section) is generated
after \texttt{config\_load} is done.
That allows you to process sections both before and after all options were
processed.

Another way of iterating on config sections is using the \texttt{config\_foreach} command.

Syntax:
\begin{Verbatim}
config_foreach <function name> [<sectiontype>] [<arguments...>]
\end{Verbatim}

This command will run the supplied function for every single config section in the currently
loaded config. The section name will be passed to the function as argument 1.
If the section type is added to the command line, the function will only be called for
sections of the given type.


You can access already processed options with the \texttt{config\_get} command
Syntax:

\begin{Verbatim}
# print the value of the option
config_get <section> <option>

# store the value inside the variable
config_get <variable> <section> <option>
\end{Verbatim}

In busybox ash the three-option \texttt{config\_get} is faster, because it does not
result in an extra fork, so it is the preferred way.

Additionally you can also modify or add options to sections by using the
\texttt{config\_set} command.

Syntax:

\begin{Verbatim}
config_set <section> <option> <value>
\end{Verbatim}

If a config section is unnamed, an automatically generated name will
be assigned internally, e.g. \texttt{cfg1}, \texttt{cfg2}, ...

While it is possible, using unnamed sections through these autogenerated names is
strongly discouraged. Use callbacks or \texttt{config\_foreach} instead.

/<a href='/cgit.cgi/openwrt/upstream/tree/tools?h=v23.05.0-rc4&amp;id=f82c93b93c0a021921ac7a30ba6e7a090c7ddd1c'>tools</a>/<a href='/cgit.cgi/openwrt/upstream/tree/tools/firmware-utils?h=v23.05.0-rc4&amp;id=f82c93b93c0a021921ac7a30ba6e7a090c7ddd1c'>firmware-utils</a>/<a href='/cgit.cgi/openwrt/upstream/tree/tools/firmware-utils/src?h=v23.05.0-rc4&amp;id=f82c93b93c0a021921ac7a30ba6e7a090c7ddd1c'>src</a>/<a href='/cgit.cgi/openwrt/upstream/tree/tools/firmware-utils/src/bcmalgo.c?h=v23.05.0-rc4&amp;id=f82c93b93c0a021921ac7a30ba6e7a090c7ddd1c'>bcmalgo.c</a></div><div class='content'>blob: fd6c1c116edd4512ce70f3275d9a887eb4215461 (<a href='/cgit.cgi/openwrt/upstream/plain/tools/firmware-utils/src/bcmalgo.c?h=v23.05.0-rc4&amp;id=f82c93b93c0a021921ac7a30ba6e7a090c7ddd1c'>plain</a>)
<table summary='blob content' class='blob'>
<tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a>
<a id='n2' href='#n2'>2</a>
<a id='n3' href='#n3'>3</a>
<a id='n4' href='#n4'>4</a>
<a id='n5' href='#n5'>5</a>
<a id='n6' href='#n6'>6</a>
<a id='n7' href='#n7'>7</a>
<a id='n8' href='#n8'>8</a>
<a id='n9' href='#n9'>9</a>
<a id='n10' href='#n10'>10</a>
<a id='n11' href='#n11'>11</a>
<a id='n12' href='#n12'>12</a>
<a id='n13' href='#n13'>13</a>
<a id='n14' href='#n14'>14</a>
<a id='n15' href='#n15'>15</a>
<a id='n16' href='#n16'>16</a>
<a id='n17' href='#n17'>17</a>
<a id='n18' href='#n18'>18</a>
<a id='n19' href='#n19'>19</a>
<a id='n20' href='#n20'>20</a>
<a id='n21' href='#n21'>21</a>
<a id='n22' href='#n22'>22</a>
<a id='n23' href='#n23'>23</a>
<a id='n24' href='#n24'>24</a>
<a id='n25' href='#n25'>25</a>
<a id='n26' href='#n26'>26</a>
<a id='n27' href='#n27'>27</a>
<a id='n28' href='#n28'>28</a>
<a id='n29' href='#n29'>29</a>
<a id='n30' href='#n30'>30</a>
<a id='n31' href='#n31'>31</a>
<a id='n32' href='#n32'>32</a>
<a id='n33' href='#n33'>33</a>
<a id='n34' href='#n34'>34</a>
<a id='n35' href='#n35'>35</a>
<a id='n36' href='#n36'>36</a>
<a id='n37' href='#n37'>37</a>
<a id='n38' href='#n38'>38</a>
<a id='n39' href='#n39'>39</a>
<a id='n40' href='#n40'>40</a>
<a id='n41' href='#n41'>41</a>
<a id='n42' href='#n42'>42</a>
<a id='n43' href='#n43'>43</a>
<a id='n44' href='#n44'>44</a>
<a id='n45' href='#n45'>45</a>
<a id='n46' href='#n46'>46</a>
<a id='n47' href='#n47'>47</a>
<a id='n48' href='#n48'>48</a>
<a id='n49' href='#n49'>49</a>
<a id='n50' href='#n50'>50</a>
<a id='n51' href='#n51'>51</a>
<a id='n52' href='#n52'>52</a>
<a id='n53' href='#n53'>53</a>
<a id='n54' href='#n54'>54</a>
<a id='n55' href='#n55'>55</a>
<a id='n56' href='#n56'>56</a>
<a id='n57' href='#n57'>57</a>
<a id='n58' href='#n58'>58</a>
<a id='n59' href='#n59'>59</a>
<a id='n60' href='#n60'>60</a>
<a id='n61' href='#n61'>61</a>
<a id='n62' href='#n62'>62</a>
<a id='n63' href='#n63'>63</a>
<a id='n64' href='#n64'>64</a>
<a id='n65' href='#n65'>65</a>
<a id='n66' href='#n66'>66</a>
<a id='n67' href='#n67'>67</a>
<a id='n68' href='#n68'>68</a>
<a id='n69' href='#n69'>69</a>
<a id='n70' href='#n70'>70</a>
<a id='n71' href='#n71'>71</a>
<a id='n72' href='#n72'>72</a>
<a id='n73' href='#n73'>73</a>
<a id='n74' href='#n74'>74</a>
<a id='n75' href='#n75'>75</a>
<a id='n76' href='#n76'>76</a>
<a id='n77' href='#n77'>77</a>
<a id='n78' href='#n78'>78</a>
<a id='n79' href='#n79'>79</a>
<a id='n80' href='#n80'>80</a>
<a id='n81' href='#n81'>81</a>
<a id='n82' href='#n82'>82</a>
<a id='n83' href='#n83'>83</a>
<a id='n84' href='#n84'>84</a>
<a id='n85' href='#n85'>85</a>
<a id='n86' href='#n86'>86</a>
<a id='n87' href='#n87'>87</a>
<a id='n88' href='#n88'>88</a>
<a id='n89' href='#n89'>89</a>
<a id='n90' href='#n90'>90</a>
<a id='n91' href='#n91'>91</a>
<a id='n92' href='#n92'>92</a>
<a id='n93' href='#n93'>93</a>
<a id='n94' href='#n94'>94</a>
<a id='n95' href='#n95'>95</a>
<a id='n96' href='#n96'>96</a>
<a id='n97' href='#n97'>97</a>
<a id='n98' href='#n98'>98</a>
<a id='n99' href='#n99'>99</a>
<a id='n100' href='#n100'>100</a>
<a id='n101' href='#n101'>101</a>
<a id='n102' href='#n102'>102</a>
<a id='n103' href='#n103'>103</a>
<a id='n104' href='#n104'>104</a>
<a id='n105' href='#n105'>105</a>
<a id='n106' href='#n106'>106</a>
<a id='n107' href='#n107'>107</a>
<a id='n108' href='#n108'>108</a>
<a id='n109' href='#n109'>109</a>
<a id='n110' href='#n110'>110</a>
<a id='n111' href='#n111'>111</a>
<a id='n112' href='#n112'>112</a>
<a id='n113' href='#n113'>113</a>
<a id='n114' href='#n114'>114</a>
<a id='n115' href='#n115'>115</a>
<a id='n116' href='#n116'>116</a>
<a id='n117' href='#n117'>117</a>
<a id='n118' href='#n118'>118</a>
<a id='n119' href='#n119'>119</a>
<a id='n120' href='#n120'>120</a>
<a id='n121' href='#n121'>121</a>
<a id='n122' href='#n122'>122</a>
<a id='n123' href='#n123'>123</a>
<a id='n124' href='#n124'>124</a>
<a id='n125' href='#n125'>125</a>
<a id='n126' href='#n126'>126</a>
<a id='n127' href='#n127'>127</a>
<a id='n128' href='#n128'>128</a>
<a id='n129' href='#n129'>129</a>
<a id='n130' href='#n130'>130</a>
<a id='n131' href='#n131'>131</a>
<a id='n132' href='#n132'>132</a>
<a id='n133' href='#n133'>133</a>
<a id='n134' href='#n134'>134</a>
<a id='n135' href='#n135'>135</a>
<a id='n136' href='#n136'>136</a>
<a id='n137' href='#n137'>137</a>
<a id='n138' href='#n138'>138</a>
<a id='n139' href='#n139'>139</a>
<a id='n140' href='#n140'>140</a>
<a id='n141' href='#n141'>141</a>
<a id='n142' href='#n142'>142</a>
<a id='n143' href='#n143'>143</a>
<a id='n144' href='#n144'>144</a>
<a id='n145' href='#n145'>145</a>
<a id='n146' href='#n146'>146</a>
<a id='n147' href='#n147'>147</a>
<a id='n148' href='#n148'>148</a>
<a id='n149' href='#n149'>149</a>
<a id='n150' href='#n150'>150</a>
<a id='n151' href='#n151'>151</a>
<a id='n152' href='#n152'>152</a>
<a id='n153' href='#n153'>153</a>
<a id='n154' href='#n154'>154</a>
<a id='n155' href='#n155'>155</a>
<a id='n156' href='#n156'>156</a>
<a id='n157' href='#n157'>157</a>
<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="c1">// SPDX-License-Identifier: GPL-2.0-only</span>
<span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;sys/types.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;inttypes.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;getopt.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;sys/time.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;sys/stat.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&quot;bcmalgo.h&quot;</span><span class="cp"></span>


<span class="cp">#define UTIL_VERSION &quot;0.1&quot;</span>
<span class="cp">#define ENDIAN_REVERSE_NEEDED</span>

<span class="kt">uint32_t</span> <span class="nf">reverse_endian32</span> <span class="p">(</span> <span class="kt">uint32_t</span> <span class="n">data</span> <span class="p">)</span>
<span class="p">{</span>
<span class="cp">#ifdef ENDIAN_REVERSE_NEEDED</span>
	<span class="k">return</span> <span class="mi">0</span> <span class="o">|</span> <span class="p">(</span> <span class="n">data</span> <span class="o">&amp;</span> <span class="mh">0x000000ff</span> <span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">24</span>
	       <span class="o">|</span> <span class="p">(</span> <span class="n">data</span> <span class="o">&amp;</span> <span class="mh">0x0000ff00</span> <span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span>
	       <span class="o">|</span> <span class="p">(</span> <span class="n">data</span> <span class="o">&amp;</span> <span class="mh">0x00ff0000</span> <span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span>
	       <span class="o">|</span> <span class="p">(</span> <span class="n">data</span> <span class="o">&amp;</span> <span class="mh">0xff000000</span> <span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">24</span><span class="p">;</span>
<span class="cp">#else</span>
	<span class="k">return</span> <span class="n">data</span><span class="p">;</span>
<span class="cp">#endif</span>
<span class="p">}</span>

<span class="kt">uint16_t</span> <span class="nf">reverse_endian16</span> <span class="p">(</span> <span class="kt">uint16_t</span> <span class="n">data</span> <span class="p">)</span>
<span class="p">{</span>
<span class="cp">#ifdef ENDIAN_REVERSE_NEEDED</span>
	<span class="k">return</span> <span class="mi">0</span> <span class="o">|</span> <span class="p">(</span> <span class="n">data</span> <span class="o">&amp;</span> <span class="mh">0x00ff</span> <span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span>
	       <span class="o">|</span> <span class="p">(</span> <span class="n">data</span> <span class="o">&amp;</span> <span class="mh">0xff00</span> <span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span><span class="p">;</span>
<span class="cp">#else</span>
	<span class="k">return</span> <span class="n">data</span><span class="p">;</span>
<span class="cp">#endif</span>
<span class="p">}</span>



<span class="kt">uint32_t</span> <span class="nf">get_buffer_crc</span> <span class="p">(</span> <span class="kt">char</span><span class="o">*</span> <span class="n">filebuffer</span><span class="p">,</span><span class="kt">size_t</span> <span class="n">size</span> <span class="p">)</span>
<span class="p">{</span>

	<span class="kt">long</span> <span class="n">crc</span><span class="o">=</span><span class="mh">0xffffffffL</span><span class="p">;</span>
	<span class="kt">long</span> <span class="n">crcxor</span> <span class="o">=</span> <span class="mh">0xffffffffL</span><span class="p">;</span>
	<span class="kt">long</span> <span class="n">num4</span> <span class="o">=</span> <span class="mh">0xffffffffL</span><span class="p">;</span>
	<span class="kt">long</span> <span class="n">num5</span> <span class="o">=</span> <span class="n">size</span><span class="p">;</span>
	<span class="kt">long</span> <span class="n">num6</span> <span class="o">=</span> <span class="mh">0x4c11db7L</span><span class="p">;</span>
	<span class="kt">long</span> <span class="n">num7</span> <span class="o">=</span> <span class="mh">0x80000000L</span><span class="p">;</span>
	<span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
	<span class="kt">long</span> <span class="n">j</span><span class="p">;</span>
	<span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span> <span class="n">num5</span> <span class="p">);</span> <span class="n">i</span><span class="o">++</span> <span class="p">)</span>
	<span class="p">{</span>
		<span class="kt">long</span> <span class="n">num2</span> <span class="o">=</span> <span class="n">filebuffer</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
		<span class="k">for</span> <span class="p">(</span> <span class="n">j</span> <span class="o">=</span> <span class="mh">0x80L</span><span class="p">;</span> <span class="n">j</span> <span class="o">!=</span> <span class="mf">0L</span><span class="p">;</span> <span class="n">j</span> <span class="o">=</span> <span class="n">j</span> <span class="o">&gt;&gt;</span> <span class="mi">1</span> <span class="p">)</span>
		<span class="p">{</span>
			<span class="kt">long</span> <span class="n">num3</span> <span class="o">=</span> <span class="n">crc</span> <span class="o">&amp;</span> <span class="n">num7</span><span class="p">;</span>
			<span class="n">crc</span> <span class="o">=</span> <span class="n">crc</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">;</span>
			<span class="k">if</span> <span class="p">(</span> <span class="p">(</span> <span class="n">num2</span> <span class="o">&amp;</span> <span class="n">j</span> <span class="p">)</span> <span class="o">!=</span> <span class="mf">0L</span> <span class="p">)</span>
			<span class="p">{</span>
				<span class="n">num3</span> <span class="o">^=</span> <span class="n">num7</span><span class="p">;</span>
			<span class="p">}</span>
			<span class="k">if</span> <span class="p">(</span> <span class="n">num3</span> <span class="o">!=</span> <span class="mf">0L</span> <span class="p">)</span>
			<span class="p">{</span>
				<span class="n">crc</span> <span class="o">^=</span> <span class="n">num6</span><span class="p">;</span>
			<span class="p">}</span>
		<span class="p">}</span>
	<span class="p">}</span>
	<span class="n">crc</span> <span class="o">^=</span> <span class="n">crcxor</span><span class="p">;</span>
	<span class="n">crc</span> <span class="o">&amp;=</span> <span class="n">num4</span><span class="p">;</span>

	<span class="kt">uint8_t</span> <span class="n">b1</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="p">)</span> <span class="p">(</span> <span class="p">(</span> <span class="n">crc</span> <span class="o">&amp;</span> <span class="mi">-16777216L</span> <span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mh">0x18</span> <span class="p">);</span>
	<span class="kt">uint8_t</span> <span class="n">b2</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="p">)</span> <span class="p">(</span> <span class="p">(</span> <span class="n">crc</span> <span class="o">&amp;</span> <span class="mh">0xff0000L</span> <span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mh">0x10</span> <span class="p">);</span>
	<span class="kt">uint8_t</span> <span class="n">b3</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="p">)</span> <span class="p">(</span> <span class="p">(</span> <span class="n">crc</span> <span class="o">&amp;</span> <span class="mh">0xff00L</span> <span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span> <span class="p">);</span>
	<span class="kt">uint8_t</span> <span class="n">b4</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="p">)</span> <span class="p">(</span> <span class="n">crc</span> <span class="o">&amp;</span> <span class="mh">0xffL</span> <span class="p">);</span>
	<span class="kt">int32_t</span> <span class="n">crc_result</span> <span class="o">=</span> <span class="p">(</span> <span class="n">b1</span> <span class="o">|</span> <span class="n">b2</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="o">|</span> <span class="n">b3</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span><span class="o">|</span> <span class="n">b4</span> <span class="o">&lt;&lt;</span><span class="mi">24</span> <span class="p">);</span>
	<span class="k">return</span> <span class="n">reverse_endian32</span> <span class="p">(</span> <span class="n">crc_result</span> <span class="p">);</span>
<span class="p">}</span>

<span class="c1">//Thnx to Vector for the algo.</span>
<span class="kt">uint32_t</span> <span class="nf">get_file_crc</span> <span class="p">(</span> <span class="kt">char</span><span class="o">*</span> <span class="n">filename</span> <span class="p">)</span>
<span class="p">{</span>
	<span class="k">struct</span> <span class="nc">stat</span> <span class="n">buf</span><span class="p">;</span>
	<span class="n">stat</span> <span class="p">(</span> <span class="n">filename</span><span class="p">,</span><span class="o">&amp;</span><span class="n">buf</span> <span class="p">);</span>
	<span class="kt">char</span><span class="o">*</span> <span class="n">filebuffer</span> <span class="o">=</span> <span class="n">malloc</span> <span class="p">(</span> <span class="n">buf</span><span class="p">.</span><span class="n">st_size</span><span class="o">+</span><span class="mi">10</span> <span class="p">);</span>
	<span class="kt">FILE</span><span class="o">*</span> <span class="n">fd</span> <span class="o">=</span> <span class="n">fopen</span> <span class="p">(</span> <span class="n">filename</span><span class="p">,</span><span class="s">&quot;r&quot;</span> <span class="p">);</span>
	<span class="n">fread</span> <span class="p">(</span> <span class="n">filebuffer</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">buf</span><span class="p">.</span><span class="n">st_size</span><span class="p">,</span><span class="n">fd</span> <span class="p">);</span>
	<span class="n">fclose</span> <span class="p">(</span> <span class="n">fd</span> <span class="p">);</span>
	<span class="kt">uint32_t</span> <span class="n">crc</span> <span class="o">=</span> <span class="n">get_buffer_crc</span> <span class="p">(</span> <span class="n">filebuffer</span><span class="p">,</span><span class="n">buf</span><span class="p">.</span><span class="n">st_size</span> <span class="p">);</span>
	<span class="n">free</span> <span class="p">(</span> <span class="n">filebuffer</span> <span class="p">);</span>
	<span class="k">return</span> <span class="n">crc</span><span class="p">;</span>
<span class="p">}</span>



<span class="kt">uint16_t</span> <span class="nf">get_hcs</span> <span class="p">(</span> <span class="n">ldr_header_t</span><span class="o">*</span> <span class="n">hd</span> <span class="p">)</span>
<span class="p">{</span>
	<span class="kt">uint8_t</span><span class="o">*</span> <span class="n">head</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span><span class="o">*</span> <span class="p">)</span> <span class="n">hd</span><span class="p">;</span>
	<span class="kt">uint8_t</span> <span class="n">hcs_minor</span><span class="p">;</span>
	<span class="kt">uint8_t</span> <span class="n">hcs_major</span><span class="p">;</span>
	<span class="kt">uint16_t</span> <span class="n">n</span> <span class="o">=</span> <span class="mh">0xffff</span><span class="p">;</span>
	<span class="kt">int</span> <span class="n">state</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<span class="kt">int</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">;</span>
	<span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mh">0x54</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span> <span class="p">)</span>
	<span class="p">{</span>
		<span class="kt">uint16_t</span> <span class="n">m</span> <span class="o">=</span> <span class="n">head</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
		<span class="n">m</span> <span class="o">=</span> <span class="n">m</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">;</span>
		<span class="k">for</span> <span class="p">(</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="mi">8</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span> <span class="p">)</span>
		<span class="p">{</span>
			<span class="k">if</span> <span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="n">n</span> <span class="o">^</span> <span class="n">m</span> <span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0x8000</span> <span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">)</span>
			<span class="p">{</span>
				<span class="n">state</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
			<span class="p">}</span>
			<span class="k">else</span>
			<span class="p">{</span>
				<span class="n">state</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
			<span class="p">}</span>
			<span class="n">n</span> <span class="o">=</span> <span class="n">n</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">;</span>
			<span class="k">if</span> <span class="p">(</span> <span class="n">state</span> <span class="p">)</span>
			<span class="p">{</span>
				<span class="n">n</span> <span class="o">^=</span> <span class="mh">0x1021</span><span class="p">;</span>
			<span class="p">}</span>
			<span class="n">m</span> <span class="o">=</span> <span class="n">m</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">;</span>
		<span class="p">}</span>
		<span class="n">n</span> <span class="o">&amp;=</span> <span class="mh">0xffff</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="n">n</span> <span class="o">^=</span> <span class="mh">0xffff</span><span class="p">;</span>
	<span class="n">hcs_major</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="p">)</span> <span class="p">(</span> <span class="p">(</span> <span class="n">n</span> <span class="o">&amp;</span> <span class="mh">0xff00</span> <span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span> <span class="p">);</span>
	<span class="n">hcs_minor</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="p">)</span> <span class="p">(</span> <span class="n">n</span> <span class="o">&amp;</span> <span class="mh">0xff</span> <span class="p">);</span>
	<span class="kt">uint16_t</span> <span class="n">hcs</span> <span class="o">=</span> <span class="n">hcs_major</span> <span class="o">&lt;&lt;</span><span class="mi">8</span> <span class="o">|</span> <span class="n">hcs_minor</span><span class="p">;</span>
	<span class="k">return</span> <span class="n">hcs</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">ldr_header_t</span><span class="o">*</span> <span class="nf">construct_header</span> <span class="p">(</span> <span class="kt">uint32_t</span> <span class="n">magic</span><span class="p">,</span> <span class="kt">uint16_t</span> <span class="n">rev_maj</span><span class="p">,</span><span class="kt">uint16_t</span> <span class="n">rev_min</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">build_date</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">filelen</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">ldaddress</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">filename</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">crc_data</span> <span class="p">)</span>
<span class="p">{</span>
	<span class="n">ldr_header_t</span><span class="o">*</span> <span class="n">hd</span> <span class="o">=</span> <span class="n">malloc</span> <span class="p">(</span> <span class="k">sizeof</span> <span class="p">(</span> <span class="n">ldr_header_t</span> <span class="p">)</span> <span class="p">);</span>
	<span class="n">hd</span><span class="o">-&gt;</span><span class="n">magic</span><span class="o">=</span><span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">magic</span> <span class="p">);</span>
	<span class="n">hd</span><span class="o">-&gt;</span><span class="n">control</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="c1">//FixMe: Make use of it once compression is around</span>
	<span class="n">hd</span><span class="o">-&gt;</span><span class="n">rev_min</span> <span class="o">=</span> <span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">rev_min</span> <span class="p">);</span>
	<span class="n">hd</span><span class="o">-&gt;</span><span class="n">rev_maj</span> <span class="o">=</span> <span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">rev_maj</span> <span class="p">);</span>
	<span class="n">hd</span><span class="o">-&gt;</span><span class="n">build_date</span> <span class="o">=</span> <span class="n">reverse_endian32</span> <span class="p">(</span> <span class="n">build_date</span> <span class="p">);</span>
	<span class="n">hd</span><span class="o">-&gt;</span><span class="n">filelen</span> <span class="o">=</span> <span class="n">reverse_endian32</span> <span class="p">(</span> <span class="n">filelen</span> <span class="p">);</span>
	<span class="n">hd</span><span class="o">-&gt;</span><span class="n">ldaddress</span> <span class="o">=</span> <span class="n">reverse_endian32</span> <span class="p">(</span> <span class="n">ldaddress</span> <span class="p">);</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;Creating header for %s...</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">filename</span> <span class="p">);</span>
	<span class="k">if</span> <span class="p">(</span> <span class="n">strlen</span> <span class="p">(</span> <span class="n">filename</span> <span class="p">)</span> <span class="o">&gt;</span><span class="mi">63</span> <span class="p">)</span>
	<span class="p">{</span>
		<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;[!] Filename too long - stripping it to 63 bytes.</span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">);</span>
		<span class="n">strncpy</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">char</span><span class="o">*</span> <span class="p">)</span> <span class="o">&amp;</span><span class="n">hd</span><span class="o">-&gt;</span><span class="n">filename</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="mi">63</span> <span class="p">);</span>
		<span class="n">hd</span><span class="o">-&gt;</span><span class="n">filename</span><span class="p">[</span><span class="mi">63</span><span class="p">]</span><span class="o">=</span><span class="mh">0x00</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="k">else</span>
	<span class="p">{</span>
		<span class="n">strcpy</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">char</span><span class="o">*</span> <span class="p">)</span> <span class="o">&amp;</span><span class="n">hd</span><span class="o">-&gt;</span><span class="n">filename</span><span class="p">,</span> <span class="n">filename</span> <span class="p">);</span>
	<span class="p">}</span>
	<span class="n">hd</span><span class="o">-&gt;</span><span class="n">crc</span><span class="o">=</span><span class="n">reverse_endian32</span> <span class="p">(</span> <span class="n">crc_data</span> <span class="p">);</span>
	<span class="n">hd</span><span class="o">-&gt;</span><span class="n">hcs</span> <span class="o">=</span> <span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">get_hcs</span> <span class="p">(</span> <span class="n">hd</span> <span class="p">)</span> <span class="p">);</span>
	<span class="k">return</span> <span class="n">hd</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">static</span> <span class="kt">char</span> <span class="n">control_unc</span><span class="p">[]</span>  <span class="o">=</span> <span class="s">&quot;Uncompressed&quot;</span><span class="p">;</span>
<span class="k">static</span> <span class="kt">char</span> <span class="n">control_lz</span><span class="p">[]</span>   <span class="o">=</span> <span class="s">&quot;LZRW1/KH&quot;</span><span class="p">;</span>
<span class="k">static</span> <span class="kt">char</span> <span class="n">control_mlzo</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&quot;mini-LZO&quot;</span><span class="p">;</span>
<span class="k">static</span> <span class="kt">char</span> <span class="n">control_nrv</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&quot;NRV2D99 [Bootloader?]&quot;</span><span class="p">;</span>
<span class="k">static</span> <span class="kt">char</span> <span class="n">control_nstdlzma</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&quot;(non-standard) LZMA&quot;</span><span class="p">;</span>
<span class="k">static</span> <span class="kt">char</span> <span class="n">control_unk</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&quot;Unknown&quot;</span><span class="p">;</span>
<span class="kt">char</span><span class="o">*</span> <span class="nf">get_control_info</span> <span class="p">(</span> <span class="kt">uint16_t</span> <span class="n">control</span> <span class="p">)</span>
<span class="p">{</span>
	<span class="n">control</span> <span class="o">=</span> <span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">control</span> <span class="p">);</span>
	<span class="k">switch</span> <span class="p">(</span> <span class="n">control</span> <span class="p">)</span>
	<span class="p">{</span>
		<span class="k">case</span> <span class="mi">0</span><span class="o">:</span>
			<span class="k">return</span> <span class="n">control_unc</span><span class="p">;</span>
			<span class="k">break</span><span class="p">;</span>
		<span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
			<span class="k">return</span> <span class="n">control_lz</span><span class="p">;</span>
			<span class="k">break</span><span class="p">;</span>
		<span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
			<span class="k">return</span> <span class="n">control_mlzo</span><span class="p">;</span>
			<span class="k">break</span><span class="p">;</span>
		<span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
			<span class="k">return</span> <span class="n">control_unc</span><span class="p">;</span>
			<span class="k">break</span><span class="p">;</span>
		<span class="k">case</span> <span class="mi">4</span><span class="o">:</span>
			<span class="k">return</span> <span class="n">control_nrv</span><span class="p">;</span>
			<span class="k">break</span><span class="p">;</span>
		<span class="k">case</span> <span class="mi">5</span><span class="o">:</span>
			<span class="k">return</span> <span class="n">control_nstdlzma</span><span class="p">;</span>
			<span class="k">break</span><span class="p">;</span>
		<span class="k">case</span> <span class="mi">6</span><span class="o">:</span>
			<span class="k">return</span> <span class="n">control_unc</span><span class="p">;</span>
			<span class="k">break</span><span class="p">;</span>
		<span class="k">case</span> <span class="mi">7</span><span class="o">:</span>
			<span class="k">return</span> <span class="n">control_unc</span><span class="p">;</span>
			<span class="k">break</span><span class="p">;</span>
		<span class="k">default</span><span class="o">:</span>
			<span class="k">return</span> <span class="n">control_unk</span><span class="p">;</span>
			<span class="k">break</span><span class="p">;</span>
	<span class="p">}</span>

<span class="p">}</span>

<span class="kt">int</span> <span class="nf">dump_header</span> <span class="p">(</span> <span class="n">ldr_header_t</span><span class="o">*</span> <span class="n">hd</span> <span class="p">)</span>
<span class="p">{</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;=== Header Information ===</span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">);</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;Header magic:</span><span class="se">\t</span><span class="s">0x%04X</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">magic</span> <span class="p">)</span> <span class="p">);</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;Control:</span><span class="se">\t</span><span class="s">0x%04X (%s)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">control</span> <span class="p">),</span> <span class="n">get_control_info</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">control</span> <span class="p">)</span> <span class="p">);</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;Major rev. :</span><span class="se">\t</span><span class="s">0x%04X</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">rev_maj</span> <span class="p">)</span> <span class="p">);</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;Minor rev. :</span><span class="se">\t</span><span class="s">0x%04X</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">rev_min</span> <span class="p">)</span> <span class="p">);</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;File name :</span><span class="se">\t</span><span class="s">%s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="p">(</span> <span class="kt">char</span><span class="o">*</span> <span class="p">)</span> <span class="o">&amp;</span><span class="n">hd</span><span class="o">-&gt;</span><span class="n">filename</span> <span class="p">);</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;File length:</span><span class="se">\t</span><span class="s">%d bytes</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">reverse_endian32</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">filelen</span> <span class="p">)</span> <span class="p">);</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;Build time:</span><span class="se">\t</span><span class="s">0x%08X //FixMe: print in human-readable form</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">reverse_endian32</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">build_date</span> <span class="p">)</span> <span class="p">);</span> <span class="c1">//FixMe:</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;HCS:</span><span class="se">\t\t</span><span class="s">0x%04X  &quot;</span><span class="p">,</span><span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">hcs</span> <span class="p">)</span> <span class="p">);</span>
	<span class="kt">uint16_t</span> <span class="n">hcs</span> <span class="o">=</span> <span class="n">get_hcs</span> <span class="p">(</span> <span class="n">hd</span> <span class="p">);</span>
	<span class="kt">int</span> <span class="n">ret</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
	<span class="k">if</span> <span class="p">(</span> <span class="n">hcs</span> <span class="o">==</span><span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">hcs</span> <span class="p">)</span> <span class="p">)</span>
	<span class="p">{</span>
		<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;(OK!)</span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">);</span>
	<span class="p">}</span>
	<span class="k">else</span>
	<span class="p">{</span>
		<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;(ERROR! expected 0x%04X)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">hcs</span> <span class="p">);</span>
		<span class="n">ret</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
	<span class="p">}</span>
<span class="c1">//printf(&quot;HCS:\t0x%02X&quot;,reverse_endian32(hd-&gt;hcs));</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;Load address:</span><span class="se">\t</span><span class="s">0x%08X</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">reverse_endian32</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">ldaddress</span> <span class="p">)</span> <span class="p">);</span> <span class="c1">//FixMe:</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;HNW:</span><span class="se">\t\t</span><span class="s">0x%04X</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">reverse_endian16</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">her_znaet_chto</span> <span class="p">)</span> <span class="p">);</span> <span class="c1">//Hell knows what</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;CRC:</span><span class="se">\t\t</span><span class="s">0x%08X</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">reverse_endian32</span> <span class="p">(</span> <span class="n">hd</span><span class="o">-&gt;</span><span class="n">crc</span> <span class="p">)</span> <span class="p">);</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;=== Binary Header Dump===</span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">);</span>
	<span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
	<span class="kt">uint8_t</span><span class="o">*</span> <span class="n">head</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span><span class="o">*</span> <span class="p">)</span> <span class="n">hd</span><span class="p">;</span>
	<span class="k">for</span> <span class="p">(</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;=</span><span class="k">sizeof</span> <span class="p">(</span> <span class="n">ldr_header_t</span> <span class="p">);</span><span class="n">i</span><span class="o">++</span> <span class="p">)</span>
	<span class="p">{</span>
		<span class="k">if</span> <span class="p">(</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">8</span><span class="o">==</span><span class="mi">0</span> <span class="p">)</span>
			<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">);</span>
		<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;0x%02x   &quot;</span><span class="p">,</span><span class="n">head</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">);</span>
	<span class="p">}</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;</span><span class="se">\n\n</span><span class="s">== End Of Header dump ==</span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">);</span>
	<span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
<span class="p">}</span>


<span class="kt">void</span> <span class="nf">print_copyright</span><span class="p">()</span>
<span class="p">{</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;Part of bcm-utils package ver. &quot;</span> <span class="n">UTIL_VERSION</span> <span class="s">&quot; </span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">);</span>
	<span class="n">printf</span> <span class="p">(</span> <span class="s">&quot;Copyright (C) 2009  Andrew &#39;Necromant&#39; Andrianov</span><span class="se">\n</span><span class="s">&quot;</span>
	         <span class="s">&quot;This is free software, and you are welcome to redistribute it</span><span class="se">\n</span><span class="s">&quot;</span>
	         <span class="s">&quot;under certain conditions. See COPYING for details</span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">);</span>
<span class="p">}</span>
</pre></div>
