<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Something is terribly wrong with al_ustr_new()</title>
		<link>http://www.allegro.cc/forums/view/611905</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 25 Jan 2013 00:05:30 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I now work on a project which loads allegro unicode strings from lua script. It goes like this: first a function in lua creates strings, then it passes an array of these strings to c++ code which places them into a vector for later use.<br />Here is my simple lua code which creates strings, pretty straight-forward:</p><p> </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>function CreateStrings<span class="k2">(</span>lang<span class="k2">)</span>
<span class="number">  2</span>  lang <span class="k3">=</span> lang <span class="k1">or</span> <span class="s">"english"</span>
<span class="number">  3</span>  local strings <span class="k3">=</span>  <span class="k2">{</span> <span class="k2">}</span>
<span class="number">  4</span>  <span class="k1">if</span> <span class="k2">(</span>lang <span class="k3">=</span><span class="k3">=</span> <span class="s">"english"</span><span class="k2">)</span> then
<span class="number">  5</span>    strings <span class="k3">=</span> 
<span class="number">  6</span>    <span class="k2">{</span>
<span class="number">  7</span>      <span class="s">"Select Class"</span>,
<span class="number">  8</span>      <span class="s">"Edit Class"</span>
<span class="number">  9</span>    <span class="k2">}</span>
<span class="number"> 10</span>  end
<span class="number"> 11</span>
<span class="number"> 12</span>  <span class="k1">if</span> <span class="k2">(</span>lang <span class="k3">=</span><span class="k3">=</span> <span class="s">"russian"</span><span class="k2">)</span> then
<span class="number"> 13</span>    strings <span class="k3">=</span>
<span class="number"> 14</span>    <span class="k2">{</span>
<span class="number"> 15</span>      <span class="s">"Выбор класса"</span>,
<span class="number"> 16</span>      <span class="s">"Редактирование класса"</span>
<span class="number"> 17</span>    <span class="k2">}</span>
<span class="number"> 18</span>  end
<span class="number"> 19</span>  <span class="k1">return</span> strings  
<span class="number"> 20</span>end
<span class="number"> 21</span>
<span class="number"> 22</span>function GetStrings<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 23</span>  local strings <span class="k3">=</span> CreateStrings<span class="k2">(</span><span class="s">"russian"</span><span class="k2">)</span>
<span class="number"> 24</span>  <span class="k1">return</span> strings
<span class="number"> 25</span>end
</div></div><p>

As you can see, it creates an array of strings either in Russian or in English. Then it gets passed to the c++ code here:</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">  2</span><span class="k1">void</span> CPlGameView::LoadStringsFromLua<span class="k2">(</span><span class="k2">)</span>
<span class="number">  3</span><span class="k2">{</span>
<span class="number">  4</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_USTR"><span class="a">ALLEGRO_USTR</span></a><span class="k3">*</span> str<span class="k2">;</span>
<span class="number">  5</span>  LuaFunction<span class="k3">&lt;</span>LuaObject&gt; GetStrings <span class="k3">=</span> LuaManager.GetGlobalState<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>GetGlobal<span class="k2">(</span><span class="s">"GetStrings"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>  LuaObject luaStrings <span class="k3">=</span> GetStrings<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> STRID_LAST_ID<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  8</span>  <span class="k2">{</span>
<span class="number">  9</span>    <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> ch<span class="k2">;</span>
<span class="number"> 10</span>    ch <span class="k3">=</span> luaStrings<span class="k2">[</span>i<span class="k3">+</span><span class="n">1</span><span class="k2">]</span>.GetString<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    strings.push_back<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_ustr_new"><span class="a">al_ustr_new</span></a><span class="k2">(</span>ch<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>  <span class="k2">}</span>
<span class="number"> 13</span><span class="k2">}</span>
</div></div><p>

These strings should be window titles. However, when I later try to display the text with al_draw_ustr:</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"> 3</span><a href="http://www.allegro.cc/manual/al_draw_ustr"><span class="a">al_draw_ustr</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>,<a href="http://www.allegro.cc/manual/PALETTE"><span class="a">PALETTE</span></a><span class="k2">[</span>BACKGROUND_COLOR<span class="k2">]</span>,pos.x<span class="k3">+</span><span class="n">2</span>,pos.y,<span class="n">0</span>,title<span class="k2">)</span><span class="k2">;</span>
</div></div><p>

I get empty window titles when choosing russian. Everything displays fine if I choose English. Look attachements.<br />You may think that this is the lua problem, however, I tried to substitute the variable ch for literal cyrillic string:</p><p> </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"> 4</span>strings.push_back<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_ustr_new"><span class="a">al_ustr_new</span></a><span class="k2">(</span><span class="s">"Выбор класса"</span><span class="k2">)</span><span class="k2">)</span>
</div></div><p>

 - the situation is the same. No text. On the other hand, everything is again fine with literal string in english is used.<br />I went even further and debugged the variables.<br />So, when the code gets c string from lua everything is fine, which is no wonder (you can look it in attachements). But what is more astonishing is that when I look at contents of ALLEGERO_USTR the text displayed in the debegger is again right. Even right before displaying the window title. However the russian text is still not displayed.</p><p>So, maybe al_draw_ustr is to blame? No. I wrote code loading ALLEGRO_USTR right from a file without using al_ustr_new():</p><p> </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">  5</span><span class="k1">bool</span> CPlGameView::LoadStrings<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> lang<span class="k2">)</span>
<span class="number">  6</span><span class="k2">{</span>
<span class="number">  7</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_USTR"><span class="a">ALLEGRO_USTR</span></a><span class="k3">*</span> str<span class="k2">;</span>
<span class="number">  8</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a><span class="k3">*</span> langfile<span class="k2">;</span>
<span class="number">  9</span>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>lang,<span class="s">"russian"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 10</span>  <span class="k2">{</span>
<span class="number"> 11</span>    langfile <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fopen"><span class="a">al_fopen</span></a><span class="k2">(</span><span class="s">"rus.l"</span>,<span class="s">"r"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>  <span class="k2">}</span>
<span class="number"> 13</span>  <span class="k1">else</span>
<span class="number"> 14</span>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>lang,<span class="s">"english"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 15</span>    langfile <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fopen"><span class="a">al_fopen</span></a><span class="k2">(</span><span class="s">"eng.l"</span>,<span class="s">"r"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>  <span class="k1">else</span>
<span class="number"> 17</span>  <span class="k2">{</span>
<span class="number"> 18</span>    WRITE_VIEWLOG<span class="k2">(</span><span class="s">"error: wrong language file name!"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 20</span>  <span class="k2">}</span>
<span class="number"> 21</span>
<span class="number"> 22</span>  str <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fget_ustr"><span class="a">al_fget_ustr</span></a><span class="k2">(</span>langfile<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>  <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_feof"><span class="a">al_feof</span></a><span class="k2">(</span>langfile<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 24</span>  <span class="k2">{</span>
<span class="number"> 25</span>    str <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fget_ustr"><span class="a">al_fget_ustr</span></a><span class="k2">(</span>langfile<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>    <a href="http://www.allegro.cc/manual/al_ustr_rtrim_ws"><span class="a">al_ustr_rtrim_ws</span></a><span class="k2">(</span>str<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>    strings.push_back<span class="k2">(</span>str<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>  <span class="k2">}</span>
<span class="number"> 29</span>  <a href="http://www.allegro.cc/manual/al_fclose"><span class="a">al_fclose</span></a><span class="k2">(</span>langfile<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 31</span><span class="k2">}</span>
</div></div><p>

which loads russian text. Then this text gets displayed with al_draw_ustr() just fine. So, there is either a bug here with loading multibyte utf-8 characters with al_ustr_new(), or I am doing something wrong, which you probably can explain to me. Thank you for you patience if you read to the end <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Aikei_c)</author>
		<pubDate>Thu, 24 Jan 2013 23:42:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Usually these types of problems are caused by your source code editor not saving files as proper UTF8.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Thu, 24 Jan 2013 23:50:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You know, I just checked it and it seems you were right. Thsnks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Aikei_c)</author>
		<pubDate>Fri, 25 Jan 2013 00:05:30 +0000</pubDate>
	</item>
</rss>
