Ejemplo n.º 1
0
void CLuaArguments::ReadTable ( lua_State* luaVM, int iIndexBegin, std::map < const void*, CLuaArguments* > * pKnownTables )
{
    bool bKnownTablesCreated = false;
    if ( !pKnownTables )
    {
        pKnownTables = new std::map < const void*, CLuaArguments* > ();
        bKnownTablesCreated = true;
    }

    pKnownTables->insert ( std::make_pair ( lua_topointer(luaVM, iIndexBegin), this ) );

    // Delete the previous arguments if any
    DeleteArguments ();

    lua_pushnil(luaVM);  /* first key */
    if ( iIndexBegin < 0 )
        iIndexBegin--;

    while (lua_next(luaVM, iIndexBegin) != 0) {
        /* uses 'key' (at index -2) and 'value' (at index -1) */
        CLuaArgument* pArgument = new CLuaArgument ( luaVM, -2, pKnownTables );
        m_Arguments.push_back ( pArgument ); // push the key first

        pArgument = new CLuaArgument ( luaVM, -1, pKnownTables );
        m_Arguments.push_back ( pArgument ); // then the value
       
        /* removes 'value'; keeps 'key' for next iteration */
        lua_pop(luaVM, 1);
    }

    if ( bKnownTablesCreated )
        delete pKnownTables;
}
Ejemplo n.º 2
0
void CLuaArguments::CopyRecursive ( const CLuaArguments& Arguments, std::map < CLuaArguments*, CLuaArguments* > * pKnownTables )
{
    // Clear our previous list if any
    DeleteArguments ();

    bool bKnownTablesCreated = false;
    if ( !pKnownTables )
    {
        pKnownTables = new std::map < CLuaArguments*, CLuaArguments* > ();
        bKnownTablesCreated = true;
    }

    pKnownTables->insert ( std::make_pair ( (CLuaArguments *)&Arguments, (CLuaArguments *)this ) );

    // Copy all the arguments
    vector < CLuaArgument* > ::const_iterator iter = Arguments.m_Arguments.begin ();
    for ( ; iter != Arguments.m_Arguments.end (); iter++ )
    {
        CLuaArgument* pArgument = new CLuaArgument ( **iter, pKnownTables );
        m_Arguments.push_back ( pArgument );
    }

    if ( bKnownTablesCreated )
        delete pKnownTables;
}
Ejemplo n.º 3
0
void CLuaArguments::ReadArguments ( lua_State* luaVM, unsigned int uiIndexBegin )
{
    // Delete the previous arguments if any
    DeleteArguments ();

    // Start reading arguments until there are none left
    while ( lua_type ( luaVM, uiIndexBegin ) != LUA_TNONE )
    {
        // Create an argument, let it read out the argument and add it to our vector
        CLuaArgument* pArgument = new CLuaArgument ( luaVM, uiIndexBegin++ );
        m_Arguments.push_back ( pArgument );
    }
}
Ejemplo n.º 4
0
const CLuaArguments& CLuaArguments::operator = ( const CLuaArguments& Arguments )
{
    // Clear our previous list if any
    DeleteArguments ();

    // Copy all the arguments
    vector < CLuaArgument* > ::const_iterator iter = Arguments.m_Arguments.begin ();
    for ( ; iter != Arguments.m_Arguments.end (); iter++ )
    {
        CLuaArgument* pArgument = new CLuaArgument ( **iter );
        m_Arguments.push_back ( pArgument );
    }

    // Return the given reference allowing for chaining
    return Arguments;
}
Ejemplo n.º 5
0
void CLuaArguments::ReadArguments ( lua_State* luaVM, signed int uiIndexBegin )
{
    // Delete the previous arguments if any
    DeleteArguments ();

    std::map < const void*, CLuaArguments* > knownTables;

    // Start reading arguments until there are none left
    while ( lua_type ( luaVM, uiIndexBegin ) != LUA_TNONE )
    {
        // Create an argument, let it read out the argument and add it to our vector
        CLuaArgument* pArgument = new CLuaArgument ( luaVM, uiIndexBegin++, &knownTables );
        m_Arguments.push_back ( pArgument );

        knownTables.clear ();
    }
}
Ejemplo n.º 6
0
  //
  // ParseArguments
  //
  // Creates var items from command line arguments
  //
  void CmdParse::ParseArguments(void *context, Bool rawVar, Bool rawData)
  {
    U32 argCount = 0;
    VarPathIdent argPath;
    VarPathIdent argOffsetPath;
    VNode *node;

    // Reset argument count
    argCount = 0;

    // Delete the current scope if it exists (may exit this function via exception)
    DeleteArguments();

    // Store command name in first argument
    MakeArgName(CmdParse::StackLevel(), argPath, argCount);
    VarSys::CreateString(argPath.str, tBuf.lastToken, VarSys::DEFAULT);

    MakeArgOffset(CmdParse::StackLevel(), argOffsetPath, argCount++);
    VarSys::CreateInteger(argOffsetPath.str, 0);

    if (rawData)
    {
      // Store rest of command line in second argument
      MakeArgName(CmdParse::StackLevel(), argPath, argCount);
      VarSys::CreateString(argPath.str, tBuf.CurrentStr());

      MakeArgOffset(CmdParse::StackLevel(), argOffsetPath, argCount++);
      VarSys::CreateInteger(argOffsetPath.str, argCount);

      // Finished parsing
      while (tBuf.NextToken() != TR_EOF) {}
    }
    else
    {
      Bool done = FALSE;

      // Parse all arguments
      while (!done)
      { 
        // Save the position of this argument
        U32 argPos = tBuf.CurrentPos();

        // Generate argument name
        MakeArgName(CmdParse::StackLevel(), argPath, argCount);

        // Generate argument index name
        MakeArgOffset(CmdParse::StackLevel(), argOffsetPath, argCount);

        // Parse the VNode data
        if ((node = StdParse::ParseAtomicVNode(&tBuf)) != NULL)
        {
          // Create the offset var
          VarSys::CreateInteger(argOffsetPath.str, argPos);

          switch (node->aType)
          {
            case VNode::AT_INTEGER:
              VarSys::CreateInteger(argPath.str, node->GetInteger());
              break;

            case VNode::AT_FPOINT:
              VarSys::CreateFloat(argPath.str, node->GetFPoint());
              break;

            case VNode::AT_STRING:
              VarSys::CreateString(argPath.str, node->GetString());
              break;

            default:
              ERR_FATAL(("Invalid node type!"));
          }

          // Successfully made an arg
          argCount++;

          // Delete the temporary VNode
          delete node;   
        }
        else
        {
          // Examine what we've got
          switch (tBuf.PeekToken())
          { 
            case TR_OK :
            {
              VarSys::VarItem *varItem;

              // Create the offset var
              VarSys::CreateInteger(argOffsetPath.str, argPos);

              // Accept the identifier
              tBuf.AcceptIdent();

              // Are we in raw var mode or is this argument a var item
              if (!rawVar && (varItem = VarSys::FindVarItem(tBuf.lastToken, context)) != NULL)
              { 
                switch(varItem->type)
                {
                  // Able to copy these types
                  case VarSys::VI_STRING:
                  case VarSys::VI_INTEGER:
                  case VarSys::VI_FPOINT:
                    VarSys::CopyVarItem(argPath.str, varItem);
                    break;

                  // Invalid item type
                  default:
                  {
                    // Convert single token into a string argument
                    VarSys::CreateString(argPath.str, tBuf.lastToken);
                  }
                }
              }
              else
              {
                // Convert single token into a string argument
                VarSys::CreateString(argPath.str, tBuf.lastToken);
              }

              // Successfully made an arg
              argCount++;
         
              break;
            }
          
            case TR_PUN:
              switch (*tBuf.peekToken)
              {
                // Continue to next argument
                case ',':
                  tBuf.AcceptPunct();
                  continue;

                // We're finished
                case ';':
                  done = TRUE;
                  break;

                // Ignore brackets
                case '(':
                case ')':
                  tBuf.AcceptPunct();
                  continue;

                default :
                  tBuf.TokenError("Unexpected punctuation '%c'", *tBuf.peekToken);
                  break;
              }

            case TR_EOF:
              done = TRUE;
              break;

            default:
              ERR_FATAL(("Missing case"));
              break;
          }    
        }
      }
    }

    // Create argCount item (only created when successful)
    MakeArgCount(CmdParse::StackLevel(), argPath);
    VarSys::CreateInteger(argPath.str, argCount);
  }