<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to How_to_make_an_extension</title><link>https://sourceforge.net/p/hpg-projects2/wiki/How_to_make_an_extension/</link><description>Recent changes to How_to_make_an_extension</description><atom:link href="https://sourceforge.net/p/hpg-projects2/wiki/How_to_make_an_extension/feed" rel="self"/><language>en</language><lastBuildDate>Sun, 07 Apr 2024 02:42:56 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/hpg-projects2/wiki/How_to_make_an_extension/feed" rel="self" type="application/rss+xml"/><item><title>How_to_make_an_extension modified by Hugh Greene</title><link>https://sourceforge.net/p/hpg-projects2/wiki/How_to_make_an_extension/</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;Apparently, lots of people have been asking how to make&lt;br/&gt;
&lt;a class="" href="../extensions" title="wikilink"&gt;extensions&lt;/a&gt;, so here's a tutorial.&lt;/p&gt;
&lt;p&gt;Before you start, you'll want to make sure you're familiar with C++ and&lt;br/&gt;
&lt;a class="" href="../eYAML" title="wikilink"&gt;eYAML&lt;/a&gt;, and make sure that you have any prerequisites&lt;br/&gt;
that your extension will need, and are familiar with their API.&lt;/p&gt;
&lt;p&gt;For example, for a &lt;a class="" href="http://www.lua.org/about.html" rel="nofollow"&gt;Lua&lt;/a&gt; extension, I had&lt;br/&gt;
to get lua and its C++ binding. (make and make install&lt;br/&gt;
&lt;a href="http://www.lua.org/ftp/" rel="nofollow"&gt;http://www.lua.org/ftp/&lt;/a&gt; and then apt-get install'd lua5.1 and&lt;br/&gt;
libluabind-dev from the Ubuntu repositories. Dunno if it was all&lt;br/&gt;
necessary, but it worked in the end).&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Navigate to&lt;br/&gt;
&lt;code&gt;enigma-dev-trunk/ENIGMAsystem/SHELL/Universal_System/Extensions/&lt;/code&gt;. This&lt;br/&gt;
is currently where all extensions are housed - each extension has its&lt;br/&gt;
own folder.&lt;/p&gt;
&lt;p&gt;An extension folder will contain some key files, like About.ey,&lt;br/&gt;
include.h, implement.h, Makefile, and a .cpp file containing your code,&lt;br/&gt;
a .svg file for your extension's icon (for when the user selects or&lt;br/&gt;
deselects your extension), and a .png prerendered version of the icon&lt;br/&gt;
(since the extension selection system is written in Java, which doesn't&lt;br/&gt;
currently support .svg). See &lt;a class="" href="/p/hpg-projects2/wiki/Extensions/" title="wikilink"&gt;Extensions&lt;/a&gt; for&lt;br/&gt;
more information on these files.&lt;/p&gt;
&lt;p&gt;It may be easier to copy over another extension folder and replace the&lt;br/&gt;
files than to create them from scratch. In my case, I duplicated the&lt;br/&gt;
&lt;em&gt;DataStructures&lt;/em&gt; folder and renamed it &lt;em&gt;Lua&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Then, I changed the About.ey.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;E-YAML&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="nt"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Lua&lt;/span&gt;
&lt;span class="nt"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Lua&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Adds a Lua interpreter like a boss.&lt;/span&gt;
&lt;span class="nt"&gt;Build-date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;09/28/2011&lt;/span&gt;
&lt;span class="nt"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;datastructures.png&lt;/span&gt;

&lt;span class="nt"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;None&lt;/span&gt;
&lt;span class="nt"&gt;Dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;None&lt;/span&gt;
&lt;span class="nt"&gt;Implement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;extension_lua&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that &lt;strong&gt;ID&lt;/strong&gt; should have no spaces. &lt;strong&gt;Name&lt;/strong&gt; can though.&lt;br/&gt;
&lt;strong&gt;Build-date&lt;/strong&gt; probably doesn't matter. &lt;strong&gt;Implement&lt;/strong&gt; seems to be in the&lt;br/&gt;
form of extension_(lowercase ID). &lt;strong&gt;Depends&lt;/strong&gt; documents any other&lt;br/&gt;
ENIGMA systems that this extension may depend on, in normal&lt;br/&gt;
&lt;a class="" href="/p/hpg-projects2/wiki/About.ey/" title="wikilink"&gt;About.ey&lt;/a&gt; format.&lt;/p&gt;
&lt;p&gt;Now, I opened &lt;strong&gt;include.h&lt;/strong&gt;. From looking at other extensions, this is&lt;br/&gt;
where any #includes (For example, lua.h) of external libraries&lt;br/&gt;
belongs.(After deleting Poly's code), I #included lua.h, lualib.h and&lt;br/&gt;
luaxlib.h within an 'extern "C"', which isn't required unless the .h's&lt;br/&gt;
are for C, not C++.&lt;/p&gt;
&lt;p&gt;Lua requires you to link lua and dl with your project. To do that, go&lt;br/&gt;
back into your &lt;strong&gt;About.ey&lt;/strong&gt; and add in a &lt;strong&gt;Links:&lt;/strong&gt; line. After that, I&lt;br/&gt;
put &lt;em&gt;-llua -ldl&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Now, for the fun part. In &lt;strong&gt;include.h&lt;/strong&gt;, I added in all the functions I&lt;br/&gt;
wanted after the extern&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;elua_start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;elua_stop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;elua_execute_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fileid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;elua_execute_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;execstr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then, I renamed data_structures.cpp to lua.cpp and modified the&lt;br/&gt;
makefiles too.&lt;/p&gt;
&lt;p&gt;I left implement the way it was, and moved onto lua.cpp&lt;/p&gt;
&lt;p&gt;In there, I wrote the actual functions. For those interested, it looked&lt;br/&gt;
like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;include.h&amp;gt;&lt;/span&gt;



&lt;span class="k"&gt;typedef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;signed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sample_t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;



&lt;span class="n"&gt;lua_State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;elua_start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lua_open&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;luaL_openlibs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;elua_stop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lua_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;elua_execute_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;filedir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;luaL_dofile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;filedir&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;elua_execute_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;execstr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;luaL_dostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;execstr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then, I tested it out.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Hugh Greene</dc:creator><pubDate>Sun, 07 Apr 2024 02:42:56 -0000</pubDate><guid>https://sourceforge.netcfafe2dd916b9c1b9a07cc986cbf72dfbfb4b5fb</guid></item></channel></rss>