<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[A5] for_each_file - missing</title>
		<link>http://www.allegro.cc/forums/view/614478</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 22 Jul 2014 20:10:40 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi to all.I&#39;m trying to rewrite Allegro 4 code to Allegro 5 and I miss function - for_each_file - in A5. I found some routines on the net but they are not working. I have only little free time for programing so I can&#39;t study those routines for errors.Could someone tell me where can I find functional routine or some really simple way to replace function for_each_file in A5. I need to find all files in directory for example &quot;.jpg&quot; files and store their file names in a field of strings.Thank you very much.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (PeKaGM)</author>
		<pubDate>Mon, 21 Jul 2014 23:54:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Basically you <span class="source-code"><a href="http://www.allegro.cc/manual/al_create_fs_entry"><span class="a">al_create_fs_entry</span></a></span> a filesystem entry for your desired directory, then you <span class="source-code"><a href="http://www.allegro.cc/manual/al_open_directory"><span class="a">al_open_directory</span></a></span> the directory, <span class="source-code"><a href="http://www.allegro.cc/manual/al_read_directory"><span class="a">al_read_directory</span></a></span> it until there are no entries left, and then <span class="source-code"><a href="http://www.allegro.cc/manual/al_close_directory"><span class="a">al_close_directory</span></a></span> it.</p><p>Here is an example program that lists all the files in a given directory. You can specify the directory as a command line argument or else it will default to the current directory.</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="number">  2</span><span class="p">#include "allegro5/allegro.h"</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include &lt;cstdio&gt;</span>
<span class="number">  5</span><span class="p">#include &lt;string&gt;</span>
<span class="number">  6</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc , <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  9</span>   
<span class="number"> 10</span>   <span class="k1">char</span><span class="k3">*</span> read_dir <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 11</span>   <span class="k1">bool</span> free_dir <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 12</span>   <span class="k1">bool</span> close_dir <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 13</span>   
<span class="number"> 14</span>   
<span class="number"> 15</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="n">1</span><span class="k2">;</span><span class="k2">}</span>
<span class="number"> 16</span>   
<span class="number"> 17</span>   <span class="k1">if</span> <span class="k2">(</span>argc <span class="k3">=</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 18</span>      <span class="c">// Use first argument as read directory</span>
<span class="number"> 19</span>      read_dir <span class="k3">=</span> argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 20</span>   <span class="k2">}</span>
<span class="number"> 21</span>   <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 22</span>      <span class="c">// Use current directory as read directory</span>
<span class="number"> 23</span>      read_dir <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_current_directory"><span class="a">al_get_current_directory</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>      free_dir <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 25</span>   <span class="k2">}</span>
<span class="number"> 26</span>   
<span class="number"> 27</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_FS_ENTRY"><span class="a">ALLEGRO_FS_ENTRY</span></a><span class="k3">*</span> fs_dir_entry <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_fs_entry"><span class="a">al_create_fs_entry</span></a><span class="k2">(</span>read_dir<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>   
<span class="number"> 29</span>   
<span class="number"> 30</span>   <span class="k1">unsigned</span> <span class="k1">int</span> mode <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_fs_entry_mode"><span class="a">al_get_fs_entry_mode</span></a><span class="k2">(</span>fs_dir_entry<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>   
<span class="number"> 32</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><span class="k2">(</span>mode <span class="k3">&amp;</span> ALLEGRO_FILEMODE_ISDIR<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 33</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Invalid directory! (%s)\n"</span> , read_dir<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>   <span class="k2">}</span>
<span class="number"> 35</span>   
<span class="number"> 36</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_open_directory"><span class="a">al_open_directory</span></a><span class="k2">(</span>fs_dir_entry<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 37</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not open directory %s\n"</span> , read_dir<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</span>   <span class="k2">}</span>
<span class="number"> 39</span>   <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 40</span>      <span class="c">/// Directory is now open</span>
<span class="number"> 41</span>      close_dir <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 42</span>      
<span class="number"> 43</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Contents of directory %s\n"</span> , read_dir<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>      
<span class="number"> 45</span>      <span class="c">// prime the while loop</span>
<span class="number"> 46</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_FS_ENTRY"><span class="a">ALLEGRO_FS_ENTRY</span></a><span class="k3">*</span> fs_entry <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_read_directory"><span class="a">al_read_directory</span></a><span class="k2">(</span>fs_dir_entry<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 47</span>   
<span class="number"> 48</span>      <span class="c">// Loop until there are not more entries</span>
<span class="number"> 49</span>      <span class="k1">while</span><span class="k2">(</span>fs_entry<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 50</span>         
<span class="number"> 51</span>         <span class="c">// String manip to get short name of file/dir</span>
<span class="number"> 52</span>         std::string s <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_fs_entry_name"><span class="a">al_get_fs_entry_name</span></a><span class="k2">(</span>fs_entry<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 53</span>         std::string s2<span class="k2">;</span>
<span class="number"> 54</span>         <span class="k1">char</span> path_sep <span class="k3">=</span> <span class="s">'\\'</span><span class="k2">;</span>
<span class="number"> 55</span>         <span class="k1">if</span> <span class="k2">(</span>s.find_first_of<span class="k2">(</span><span class="s">'/'</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> std::string::npos<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 56</span>            path_sep <span class="k3">=</span> <span class="s">'/'</span><span class="k2">;</span>
<span class="number"> 57</span>         <span class="k2">}</span>
<span class="number"> 58</span>         <span class="k1">unsigned</span> <span class="k1">int</span> last_separator <span class="k3">=</span> s.find_last_of<span class="k2">(</span>path_sep<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 59</span>         <span class="k1">if</span> <span class="k2">(</span>last_separator <span class="k3">=</span><span class="k3">=</span> std::string::npos<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 60</span>            s2 <span class="k3">=</span> s<span class="k2">;</span>
<span class="number"> 61</span>         <span class="k2">}</span>
<span class="number"> 62</span>         <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 63</span>            s2 <span class="k3">=</span> s.substr<span class="k2">(</span>s.find_last_of<span class="k2">(</span>path_sep<span class="k2">)</span> <span class="k3">+</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 64</span>         <span class="k2">}</span>
<span class="number"> 65</span>      
<span class="number"> 66</span>         <span class="c">// output short file/dir name</span>
<span class="number"> 67</span>         <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s\n"</span> , s2.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 68</span>         
<span class="number"> 69</span>         <a href="http://www.allegro.cc/manual/al_destroy_fs_entry"><span class="a">al_destroy_fs_entry</span></a><span class="k2">(</span>fs_entry<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 70</span>         
<span class="number"> 71</span>         fs_entry <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_read_directory"><span class="a">al_read_directory</span></a><span class="k2">(</span>fs_dir_entry<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 72</span>      <span class="k2">}</span>
<span class="number"> 73</span>   <span class="k2">}</span>
<span class="number"> 74</span>
<span class="number"> 75</span>   
<span class="number"> 76</span>   <span class="k1">if</span> <span class="k2">(</span>close_dir<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 77</span>      <a href="http://www.allegro.cc/manual/al_close_directory"><span class="a">al_close_directory</span></a><span class="k2">(</span>fs_dir_entry<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 78</span>   <span class="k2">}</span>
<span class="number"> 79</span>   
<span class="number"> 80</span>   <span class="k1">if</span> <span class="k2">(</span>fs_dir_entry<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 81</span>      <a href="http://www.allegro.cc/manual/al_destroy_fs_entry"><span class="a">al_destroy_fs_entry</span></a><span class="k2">(</span>fs_dir_entry<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 82</span>      fs_dir_entry <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 83</span>   <span class="k2">}</span>
<span class="number"> 84</span>   
<span class="number"> 85</span>   <span class="k1">if</span> <span class="k2">(</span>free_dir<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 86</span>      <a href="http://www.allegro.cc/manual/al_free"><span class="a">al_free</span></a><span class="k2">(</span>read_dir<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 87</span>      read_dir <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 88</span>   <span class="k2">}</span>
<span class="number"> 89</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 90</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 22 Jul 2014 02:59:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hmm, seeing that the code to replicate <span class="source-code">for_each_file</span> is relatively long, I&#39;m in favor of adding an <span class="source-code">al_for_each_file<span class="k2">(</span><span class="k2">)</span></span> function.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Tue, 22 Jul 2014 09:08:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>beoran +1
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Tue, 22 Jul 2014 16:00:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>He could also use the ALLEGRO_PATH api to handle paths and files. Would cut out a bit of that code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 22 Jul 2014 19:10:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/614478/1003288#target">Thomas Fjellstrom</a> said:</div><div class="quote"><p>He could also use the ALLEGRO_PATH api to handle paths and files. Would cut out a bit of that code. </p></div></div><p>

Replace the loop with this then:</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">while</span><span class="k2">(</span>fs_entry<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>    ALLEGRO_PATH <span class="k3">*</span>path <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_path"><span class="a">al_create_path</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_fs_entry_name"><span class="a">al_get_fs_entry_name</span></a><span class="k2">(</span>fs_entry<span class="k2">)</span><span class="k2">)</span>
<span class="number">  3</span>    <span class="c">/* Note: ownership of the strings stays with path */</span>
<span class="number">  4</span>    <span class="k1">char</span> <span class="k1">const</span> <span class="k3">*</span>name <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_path_filename"><span class="a">al_get_path_filename</span></a><span class="k2">(</span>path<span class="k2">)</span>
<span class="number">  5</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k1">not</span> name<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  6</span>        <span class="c">/* Note: ownership of the strings stays with path */</span>
<span class="number">  7</span>        name <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_path_component"><span class="a">al_get_path_component</span></a><span class="k2">(</span>path, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>    <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>name, <span class="s">"."</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>name, <span class="s">".."</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 10</span>        <span class="k1">bool</span> is_dir <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_fs_entry_mode"><span class="a">al_get_fs_entry_mode</span></a><span class="k2">(</span>fs_entry<span class="k2">)</span> <span class="k3">&amp;</span> ALLEGRO_FILEMODE_ISDIR
<span class="number"> 11</span>
<span class="number"> 12</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s%s\n"</span>, name, is_dir ? <span class="s">"/"</span> <span class="k2">:</span> <span class="s">""</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>    <span class="k2">}</span>
<span class="number"> 14</span>    <span class="c">/* Note: This also invalidates the name string. */</span>
<span class="number"> 15</span>    <a href="http://www.allegro.cc/manual/al_destroy_path"><span class="a">al_destroy_path</span></a><span class="k2">(</span>path<span class="k2">)</span> 
<span class="number"> 16</span>    <a href="http://www.allegro.cc/manual/al_destroy_fs_entry"><span class="a">al_destroy_fs_entry</span></a><span class="k2">(</span>fs_entry<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    fs_entry <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_read_directory"><span class="a">al_read_directory</span></a><span class="k2">(</span>fs_dir_entry<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span><span class="k2">}</span>
</div></div><p>

I also added directory detection, but it&#39;s still kinda longish. The proposed change would look something like:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> callback<span class="k2">(</span><span class="k1">char</span> <span class="k1">const</span> <span class="k3">*</span>filename, <span class="k1">void</span> <span class="k3">*</span>user<span class="k2">)</span> <span class="k2">{</span>
    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s\n"</span>, filename<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
al_for_each_file<span class="k2">(</span>read_dir, callback, <span class="k1">int</span> flags, user<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Which is much more simple <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> It also handles common errors someone would make on implementing it on their own, like not ignoring the &quot;.&quot; and &quot;..&quot; entries we have on some platforms and dealing with directories where al_get_path_filename fails.</p><p>Possible flags could be:<br />FULL_PATH - pass the full path to the callback not just the filename<br />RECURSIVE - also recurse into any directories found<br />INCLUDE_DIRECTORIES - also call the callback with directory names not just files
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Tue, 22 Jul 2014 19:39:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Actually I already made a patch, with two functions, documentation and a test. One function uses a callback with char * file names and the other with ALLEGRO_FS_ENTRY. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>The flags parameter is a good idea though, I&#39;ll modify my patch to use that. I&#39;ll probably add the ALLEGRO_EACH_FILE_RECURSE, ALLEGRO_EACH_FILE_DIRECTORIES, ALLEGRO_EACH_FILE_DOTFILES and ALLEGRO_EACH_FILE_SHORT_PATH flags. The default call does not recurse, does not return directories, does return not dotfiles, and does return full file names, not partial ones, since full names are normally most useful.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Tue, 22 Jul 2014 20:10:40 +0000</pubDate>
	</item>
</rss>
