/** Pack an entire setting description into the buffer */ static int packSetting(unsigned char *pBuffer, int index, int size, SettingDescription &setting) { if (index>=size) return 0; // 1 byte for type pBuffer[index++] = setting.typeAndModifier; // The name if ((index=packString(pBuffer, index, size, setting.name))<=0) return index; // And the value itself switch(setting.typeAndModifier & SETTING_TYPE_MASK) { case StringSetting: index = packString(pBuffer, index, size, setting.value.string); break; case IntegerSetting: index = packInteger(pBuffer, index, size, setting.value.integer); break; case BooleanSetting: index = packBoolean(pBuffer, index, size, setting.value.boolean); break; case NumberSetting: index = packDouble(pBuffer, index, size, setting.value.number); break; default: index = 0; } return index; }
void pack(Packer& pk, int index) const { int t = lua_type(L, index); switch (t) { case LUA_TNUMBER: packNumber(pk, index); break; case LUA_TBOOLEAN: packBoolean(pk, index); break; case LUA_TSTRING: packString(pk, index); break; case LUA_TTABLE: packTable(pk, index); break; case LUA_TUSERDATA: // TODO: support userdata serialization. // Calling __serialize meta-method may be good. // raise an error temporally luaL_error(L, "Packing userdata has not been supported yet. " "However, it will be implemented soon."); return; case LUA_TNIL: case LUA_TTHREAD: case LUA_TLIGHTUSERDATA: default: luaL_error(L, "invalid type for pack: %s", lua_typename(L, t)); break; } }