Reply to comment

Languages Designed For Embedding

Lua and Javascript (specifically spidermonkey) are two languages which were specifically designed for embedding in a C or C++ application.

The general order of operations for using one of these languages is:

  1. Initialize Scripting Language Context
  2. Add Datatypes to Scripting Language Context
  3. Add Variables to Scripting Language Context
  4. Load Script into Context
  5. Execute Script
  6. Get Results from Context
  7. Close Scripting Language Context

Lua is supported by SWIG, which saves you a lot of work. SWIG generates a method called SWIG_init which accomplishes step #2. It also generates methods SWIG_NewPointerObj and SWIG_ConvertPtr which help you with items #3 & #6 respectively.

In pratice, a simple implementation of this from the Crate Game Engine looks like:

    lua_State *l = lua_open();
 
    luaL_reg lualibs[] = {
        {"base", luaopen_base},
        {"table", luaopen_table},
        /* {"io", luaopen_io}, */
        {"string", luaopen_string},
        {"math", luaopen_math},
        {"debug", luaopen_debug},
        /*{"loadlib", luaopen_loadlib}, */
        /* add your libraries here */
        {SWIG_name, SWIG_init},
        {NULL, NULL}
    };
 
    for(int i=0; lualibs[i].func != 0 ; i++) {
      lualibs[i].func(l);  /* open library */
      lua_settop(l, 0);  /* discard any results */
    }
 
    SWIG_NewPointerObj(l, mWorld, SWIGTYPE_p_CGE__World, false);
    lua_setglobal(l, "mWorld");
    SWIG_NewPointerObj(l, mSystem, SWIGTYPE_p_CGE__System, false);
    lua_setglobal(l, "mSystem");
    SWIG_NewPointerObj(l, useWithObject, SWIGTYPE_p_CGE__Object, false);
    lua_setglobal(l, "useWithObject");
    SWIG_NewPointerObj(l, parentObject, SWIGTYPE_p_CGE__Object, false);
    lua_setglobal(l, "parentObject");
 
    int result = luaL_loadbuffer(l, mScript.c_str(), mScript.length(), "script");
 
    if (result == 0) {
      if (lua_pcall(l, 0, 0, 0) != 0) {
        //Handle Error
      }
 
    } else if (result == LUA_ERRSYNTAX) {
      //Handle Error
    } else if (result == LUA_ERRMEM) {
      //Handle Error
    }
 
    lua_close(l);

Javascript is not supported by SWIG and would require much more code to accomplish the same work.

Reply

  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote>
  • Lines and paragraphs break automatically.
  • You may post PHP code. You should include <?php ?> tags.
  • Web page addresses and e-mail addresses turn into links automatically.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. Beside the tag style "<foo>" it is also possible to use "[foo]". PHP source code can also be enclosed in <?php ... ?> or <% ... %>.
  • Images can be added to this post.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.