#include <LuaState.h>
Inheritance diagram for LuaState::
Public Types | |
enum | { NOREF = LUA_NOREF } |
enum | { REFNIL = LUA_REFNIL } |
Public Methods | |
LuaState (lua_State *state) | |
~LuaState () | |
LuaObject | GetMethods (int index) |
LuaObject | GetDefaultMethods (int type) |
void | SetMethods (int index) |
int | GetTop () |
void | SetTop (int index) |
void | PushValue (int index) |
void | PushValue (LuaObject object) |
void | RemoveStack (int index) |
void | InsertStack (int index) |
int | StackSpace () |
const lua_char * | Type (int index) |
int | IsNumber (int index) |
int | IsString (int index) |
int | IsUString (int index) |
int | IsCFunction (int index) |
bool | IsFunction (int index) |
bool | IsTable (int index) |
bool | IsUserData (int index) |
bool | IsNil (int index) |
bool | IsNull (int index) |
bool | IsPointer (int index) const |
int | Tag (int index) |
int | RawTag (int index) |
int | Equal (int index1, int index2) |
int | LessThan (int index1, int index2) |
lua_Number | ToNumber (int index) |
int | ToInteger (int index) |
const lua_char * | ToString (int index) |
const wchar_t * | ToUString (int index) |
size_t | StrLen (int index) |
lua_CFunction | ToCFunction (int index) |
void * | ToUserData (int index) |
const void * | ToPointer (int index) |
const void * | ToLuaPointer (int index) |
void | PushBool (bool value) |
void | PushNil () |
void | PushNumber (double n) |
void | PushLString (const char *s, size_t len) |
void | PushString (const char *s) |
void | PushLUString (const wchar_t *s, size_t len) |
void | PushUString (const wchar_t *s) |
void | PushCClosure (lua_CFunction fn, int n) |
void | PushCClosure (LuaStateCFunction fn, int n) |
void | PushPointer (const void *p) |
LuaObject | GetGlobal (const char *name) |
void | GetTable (int index) |
void | RawGet (int index) |
void | RawGetI (int index, int n) |
LuaObject | GetGlobals () |
void | GetTagMethod (int tag, const char *event) |
LuaObject | GetRef (int ref) |
LuaObject | NewTable (int size=0) |
void | GetRegistry () |
void | GetWeakRegistry () |
void | SetGlobal (const char *name) |
void | SetTable (int index) |
void | RawSet (int index) |
void | RawSetI (int index, int n) |
void | SetGlobals () |
void | SetTagMethod (int tag, const char *event) |
int | Ref (int lock) |
int | Call (int nargs, int nresults) |
void | RawCall (int nargs, int nresults) |
int | LoadFile (const lua_char *filename) |
int | DoFile (const char *filename) |
int | DoString (const char *str) |
int | LoadBuffer (const lua_char *buff, size_t size, const lua_char *name) |
int | DoBuffer (const char *buff, size_t size, const char *name) |
int | GetGCThreshold () |
int | GetGCCount () |
void | SetGCThreshold (int newthreshold) |
int | NewType (const lua_char *name, int basictype) |
int | CopyTagMethods (int tagto, int tagfrom) |
void | SetTag (int tag) |
int | Name2Tag (const lua_char *name) |
const lua_char * | Tag2Name (int tag) |
void | Error (const lua_char *errorStr) |
void | Unref (int ref) |
int | Next (int index) |
int | GetN (int index) |
void | Concat (int n) |
void | PushUserData (void *u) |
void * | NewUserData (size_t size) |
void | NewUserDataBox (void *u) |
void | SetWeakMode (int mode) |
int | GetWeakMode (int index) |
void | Pop () |
void | Pop (int amount) |
void | Register (const char *funcName, lua_CFunction function) |
void | Register (const char *funcName, LuaStateCFunction function) |
void | Unregister (const char *funcName) |
void | Register (const LuaFunctionList *functionList) |
void | Unregister (const LuaFunctionList *functionList) |
void | PushCFunction (lua_CFunction f) |
void | PushCFunction (LuaStateCFunction f) |
int | CloneTag (int t) |
void | CollectGarbage () |
void | SetNilGCMethod (LuaStateCFunction f) |
int | ConfigGetInteger (const char *section, const char *entry, int defaultValue=0) |
float | ConfigGetReal (const char *section, const char *entry, double defaultValue=0.0) |
const char * | ConfigGetString (const char *section, const char *entry, const char *defaultValue="") |
void | ConfigSetInteger (const char *section, const char *entry, int value) |
void | ConfigSetReal (const char *section, const char *entry, double value) |
void | ConfigSetString (const char *section, const char *entry, const char *value) |
void | WriteLuaGlobalsFile (const char *filename, bool writeAll=false, bool alphabetical=false, bool writeTablePointers=false, unsigned int maxIndentLevel=0xffffffff) |
void | WriteLuaFile (const char *filename, const char *name, LuaObject value, int indentLevel, bool writeAll=false, bool alphabetical=false, bool writeTablePointers=false, unsigned int maxIndentLevel=0xffffffff) |
bool | WriteLuaObject (LuaStateOutFile &file, const char *name, LuaObject value, int indentLevel, bool writeAll=false, bool alphabetical=false, bool writeTablePointers=false, unsigned int maxIndentLevel=0xffffffff) |
bool | WriteLuaObject (FILE *file, const char *name, LuaObject value, int indentLevel, bool writeAll=false, bool alphabetical=false, bool writeTablePointers=false, unsigned int maxIndentLevel=0xffffffff) |
operator lua_State * () | |
Public Attributes | |
lua_State * | m_state |
Protected Methods | |
LuaState () |
#include "LuaState.h" static int LS_PrintNumber(LuaState state) { // Retrieve the number passed on the stack. LuaObject numberObj(state, 1); // Verify it is a number and print it. if (numberObj.IsNumber()) printf("%f\n", numberObj.GetNumber()); // No return values. return 0; } static int LS_Add(lua_State* L) { // Using a special LuaState constructor, we can wrap the lua_State pointer // very conveniently. LuaState state(L); // Retrieve the numbers passed on the stack. LuaObject number1Obj(state, 1); LuaObject number2Obj(state, 2); // Verify it is a number and print it. if (number1Obj.IsNumber() && number2Obj.IsNumber()) { state.PushNumber(number1Obj.GetNumber() + number2Obj.GetNumber()); } else { state.PushNumber(0.0); } // 1 return value. return 1; } void DoScriptIniWriteTest() { LuaStateOwner state(false); state.ConfigSetReal("Environment", "WindSpeed", 55.0); state.ConfigSetString("Environment", "TypeStr", "Overcast"); state.ConfigSetInteger("AnotherGroup", "IntegerValue", 1); state.WriteLuaGlobalsFile("ScriptIniTest.dmp"); } void DoScriptIniReadTest() { LuaStateOwner state; state.DoFile("ScriptIniTest.dmp"); float windSpeed = state.ConfigGetReal("Environment", "WindSpeed", 0.0); const char* typeStr = state.ConfigGetString("Environment", "TypeStr", "Clear"); int integerValue = state.ConfigGetInteger("AnotherGroup", "IntegerValue"); } void DoScriptCallbackTest() { LuaStateOwner state; state.Register("PrintNumber", LS_PrintNumber); state.Register("Add", LS_Add); state.DoFile("ScriptCallbackTest.lua"); } void DoScriptSaveTest() { LuaStateOwner state; state.DoFile("ScriptSaveTest.lua"); state.WriteLuaGlobalsFile("ScriptSaveTest.dmp"); } void DoScriptArrayTest() { LuaStateOwner state; state.DoFile("ScriptArrayTest.lua"); LuaObject testTableObj = state.GetGlobals().GetByName("TestArray"); // or state.GetGlobal("TestArray"); for (int i = 1; ; ++i) { LuaAutoBlock block(state); // Automatic stack fixups. LuaObject entryObj = testTableObj.GetByIndex(i); if (entryObj.IsNil()) break; if (entryObj.IsNumber()) // IsNumber() must ALWAYS come first. printf("%f\n", entryObj.GetNumber()); else if (entryObj.IsString()) // IsString() returns true for a number or string. printf("%s\n", entryObj.GetString()); } } static int LS_PointerCall(LuaState state) { bool isPointer = state.IsPointer(1); const void* ptr = state.ToPointer(1); return 0; } void TestPointer() { LuaStateOwner state; state.Register("PointerCall", LS_PointerCall); state.GetGlobal("PointerCall"); state.PushPointer((const void*)0xfedcba98); state.Call(1, 0); } int __cdecl main(int argc, char* argv[]) { DoScriptIniWriteTest(); DoScriptIniReadTest(); DoScriptCallbackTest(); DoScriptSaveTest(); DoScriptArrayTest(); TestPointer(); return 0; }
Definition at line 1049 of file LuaState.h.
|
Definition at line 1053 of file LuaState.h. |
|
Definition at line 1054 of file LuaState.h. |
|
Constructor. Definition at line 1336 of file LuaState.h. |
|
Definition at line 1057 of file LuaState.h. |
|
Definition at line 1264 of file LuaState.h. |
|
Definition at line 1134 of file LuaState.h. |
|
Definition at line 1224 of file LuaState.h. |
|
Definition at line 1226 of file LuaState.h. |
|
Definition at line 1168 of file LuaState.h. |
|
Definition at line 231 of file LuaState.cpp. 00235 { |
|
Definition at line 242 of file LuaState.cpp. 00252 { 00253 LuaAutoBlock block(*this); 00254 |
|
Definition at line 261 of file LuaState.cpp. 00261 { 00262 sectionTable = GetGlobals().CreateTable(section); 00263 } 00264 00265 sectionTable.SetNumber(entry, value); 00266 } 00267 00268 00272 void LuaState::ConfigSetReal(const char* section, const char* entry, double value) 00273 { |
|
Assigns [value] to [section].[entry]. Definition at line 279 of file LuaState.cpp. 00282 { 00283 sectionTable = GetGlobals().CreateTable(section); 00284 } 00285 00286 sectionTable.SetNumber(entry, value); 00287 } 00288 00289 00293 void LuaState::ConfigSetString(const char* section, const char* entry, const char* value) 00294 { |
|
Assigns [value] to [section].[entry]. Definition at line 300 of file LuaState.cpp. 00303 { 00304 sectionTable = GetGlobals().CreateTable(section); 00305 } 00306 00307 sectionTable.SetString(entry, value); 00308 } 00309 00310 00314 static void IndentFile(LuaStateOutFile& file, unsigned int indentLevel) 00315 { |
|
Assigns [value] to [section].[entry]. Definition at line 321 of file LuaState.cpp. 00327 { 00328 LuaStateOutFile file; 00329 file.Assign(stdioFile); 00330 WriteLuaObject(file, name, value, indentLevel, writeAll, alphabetical, 00331 writeTablePointers, maxIndentLevel); 00332 return false; 00333 } 00334 00335 00336 static void luaI_addquotedbinary (LuaStateOutFile& file, lua_State *L, const char* s, int l) |
|
Definition at line 1155 of file LuaState.h. |
|
Definition at line 1143 of file LuaState.h. |
|
Definition at line 1137 of file LuaState.h. |
|
Definition at line 1138 of file LuaState.h. |
|
Definition at line 1087 of file LuaState.h. |
|
Definition at line 1161 of file LuaState.h. |
|
Definition at line 1060 of file LuaState.h. |
|
Definition at line 1150 of file LuaState.h. |
|
Definition at line 1149 of file LuaState.h. |
|
Definition at line 1113 of file LuaState.h. |
|
Definition at line 1117 of file LuaState.h. Referenced by ConfigGetString(), ConfigSetInteger(), and ConfigSetReal().
|
|
Definition at line 1059 of file LuaState.h. |
|
Definition at line 1166 of file LuaState.h. |
|
Definition at line 1119 of file LuaState.h. |
|
Definition at line 1121 of file LuaState.h. |
|
Definition at line 1114 of file LuaState.h. |
|
Definition at line 1118 of file LuaState.h. |
|
Definition at line 1064 of file LuaState.h. |
|
Definition at line 1175 of file LuaState.h. |
|
Definition at line 1122 of file LuaState.h. |
|
Definition at line 1069 of file LuaState.h. |
|
Definition at line 1077 of file LuaState.h. |
|
Definition at line 1078 of file LuaState.h. |
|
Definition at line 1081 of file LuaState.h. |
|
Definition at line 1082 of file LuaState.h. |
|
Definition at line 1074 of file LuaState.h. |
|
Definition at line 1083 of file LuaState.h. |
|
Definition at line 1075 of file LuaState.h. |
|
Definition at line 1079 of file LuaState.h. |
|
Definition at line 1076 of file LuaState.h. |
|
Definition at line 1080 of file LuaState.h. |
|
Definition at line 1088 of file LuaState.h. |
|
Definition at line 1139 of file LuaState.h. |
|
Definition at line 1136 of file LuaState.h. |
|
Definition at line 1158 of file LuaState.h. |
|
Definition at line 1120 of file LuaState.h. |
|
Definition at line 1154 of file LuaState.h. |
|
Definition at line 1171 of file LuaState.h. |
|
Definition at line 1172 of file LuaState.h. |
|
Definition at line 1165 of file LuaState.h. |
|
Definition at line 1180 of file LuaState.h. |
|
Definition at line 1179 of file LuaState.h. |
|
Definition at line 1101 of file LuaState.h. Referenced by LS_WriteLuaFile(), and LS_WriteLuaObject().
|
|
Definition at line 1109 of file LuaState.h. |
|
Definition at line 1108 of file LuaState.h. |
|
Definition at line 1223 of file LuaState.h. |
|
Definition at line 1222 of file LuaState.h. |
|
Definition at line 1104 of file LuaState.h. |
|
Definition at line 1106 of file LuaState.h. |
|
Definition at line 1102 of file LuaState.h. |
|
Definition at line 1103 of file LuaState.h. |
|
Definition at line 1110 of file LuaState.h. |
|
Definition at line 1105 of file LuaState.h. |
|
Definition at line 1107 of file LuaState.h. |
|
|
|
Definition at line 1067 of file LuaState.h. |
|
Definition at line 1066 of file LuaState.h. |
|
Definition at line 1135 of file LuaState.h. |
|
Definition at line 1115 of file LuaState.h. |
|
Definition at line 1116 of file LuaState.h. |
|
Definition at line 1127 of file LuaState.h. |
|
Definition at line 1128 of file LuaState.h. |
|
Definition at line 1085 of file LuaState.h. |
|
Definition at line 1131 of file LuaState.h. |
|
Definition at line 1197 of file LuaState.h. |
|
Definition at line 1183 of file LuaState.h. |
|
Definition at line 1182 of file LuaState.h. |
|
Definition at line 1068 of file LuaState.h. |
|
Definition at line 1151 of file LuaState.h. |
|
Definition at line 1125 of file LuaState.h. |
|
Definition at line 1129 of file LuaState.h. |
|
Definition at line 1061 of file LuaState.h. |
|
Definition at line 1228 of file LuaState.h. |
|
Definition at line 1126 of file LuaState.h. |
|
Definition at line 1156 of file LuaState.h. |
|
Definition at line 1130 of file LuaState.h. |
|
Definition at line 1065 of file LuaState.h. |
|
Definition at line 1174 of file LuaState.h. |
|
Definition at line 1070 of file LuaState.h. |
|
Definition at line 1094 of file LuaState.h. |
|
Definition at line 1084 of file LuaState.h. |
|
Definition at line 1159 of file LuaState.h. |
|
Definition at line 1095 of file LuaState.h. |
|
Definition at line 1091 of file LuaState.h. |
|
Definition at line 1098 of file LuaState.h. |
|
Definition at line 1090 of file LuaState.h. |
|
Definition at line 1097 of file LuaState.h. |
|
Definition at line 1092 of file LuaState.h. Referenced by LS_WriteLuaFile().
|
|
Definition at line 1093 of file LuaState.h. |
|
Definition at line 1096 of file LuaState.h. |
|
Definition at line 1073 of file LuaState.h. |
|
Definition at line 1163 of file LuaState.h. |
|
Definition at line 1210 of file LuaState.h. |
|
Definition at line 1189 of file LuaState.h. |
|
Save the complete script state. Definition at line 850 of file LuaState.cpp. |
|
Save the complete script state. Definition at line 835 of file LuaState.cpp. Referenced by LS_WriteLuaFile().
|
|
Definition at line 352 of file LuaState.cpp. 00352 : file.Print("\\v"); break; 00353 default: 00354 if (isprint((BYTE)*s)) 00355 file.Print("%c", *s); 00356 else 00357 { 00358 file.Print("\\%03d", (BYTE)*s); 00359 } 00360 } 00361 s++; |
|
Writes a Lua object to a text file. Definition at line 432 of file LuaState.cpp. 00438 : indentLevel) * INDENT_SIZE; 00439 IndentFile(file, indentSpaces); 00440 00441 // If the object has a name, write it out. 00442 if (name) 00443 file.Print("%s = ", name); 00444 00445 // If the object's value is a number, write it as a number. 00446 if (value.IsNumber()) 00447 file.Print("%.16g", value.GetNumber()); 00448 00449 // Or if the object's value is a string, write it as a quoted string. 00450 else if (value.IsString()) 00451 { 00452 luaI_addquotedbinary(file, m_state, value.GetString(), value.StrLen()); 00453 } 00454 00455 // Or if the object's value is a string, write it as a quoted string. 00456 else if (value.IsUString()) 00457 { 00458 luaI_addquotedwidebinary(file, m_state, value.GetUString(), value.StrLen()); 00459 } 00460 00461 // Otherwise, see if the object's value is a table. 00462 else if (value.IsTable()) 00463 { 00464 // Write the table header. 00465 if (indentLevel != -1) 00466 { 00467 if (indentLevel < maxIndentLevel) 00468 { 00469 file.Print("\n"); 00470 IndentFile(file, indentSpaces); 00471 } 00472 if (writeTablePointers) 00473 file.Print("{ --%8x\n", lua_topointer(m_state, value)); 00474 else 00475 file.Print("{"); 00476 if (indentLevel < maxIndentLevel) 00477 { 00478 file.Print("\n"); 00479 } 00480 } 00481 00482 // Rename, just for ease of reading. 00483 LuaObject table = value; 00484 00485 // upperIndex is the upper index value of a sequential numerical array 00486 // items. 00487 int upperIndex = 1; 00488 bool wroteSemi = false; 00489 bool hasSequential = false; 00490 00491 // Block to search for array items. 00492 { 00493 // Pop the stack state when done. 00494 LuaAutoBlock block(*this); 00495 00496 // Grab index 1 and index 2 of the table. 00497 LuaObject value1 = table.GetByIndex(1); 00498 LuaObject value2 = table.GetByIndex(2); 00499 00500 // If they both exist, then there is a sequential list. 00501 if (!value1.IsNil() && !value2.IsNil()) 00502 { 00503 // Cycle through the list. 00504 bool firstSequential = true; 00505 for (; ; ++upperIndex) 00506 { 00507 // Restore the stack state each iteration. 00508 LuaAutoBlock block(*this); 00509 00510 // Try retrieving the table entry at upperIndex. 00511 LuaObject value = table.GetByIndex(upperIndex); 00512 00513 // If it doesn't exist, then exit the loop. 00514 if (value.IsNil()) 00515 break; 00516 00517 // Only add the comma and return if not on the first item. 00518 if (!firstSequential && indentLevel != -1) 00519 { 00520 file.Print(","); 00521 if (indentLevel < maxIndentLevel) 00522 { 00523 file.Print("\n"); 00524 } 00525 } 00526 00527 // Write the object as an unnamed entry. 00528 WriteLuaObject(file, NULL, value, indentLevel + 1, writeAll, alphabetical, writeTablePointers, maxIndentLevel); 00529 00530 // We've definitely passed the first item now. 00531 firstSequential = false; 00532 } 00533 } 00534 } 00535 00536 // Did we find any sequential table values? 00537 if (upperIndex > 1) 00538 { 00539 hasSequential = true; 00540 } 00541 00542 if (alphabetical) 00543 { 00544 std::list<std::string> keyNames; 00545 00546 // Cycle through the table. 00547 int i; 00548 PushNil(); 00549 while ((i = Next(table)) != 0) 00550 { 00551 char keyName[255]; 00552 00553 // Retrieve the table entry's key and value. 00554 LuaObject key(this, GetTop() - 1); 00555 00556 // Is the key a number? 00557 if (key.IsNumber()) 00558 { 00559 // Yes, were there sequential array items in this table? 00560 if (hasSequential) 00561 { 00562 // Is the array item's key an integer? 00563 float realNum = key.GetNumber(); 00564 int intNum = (int)realNum; 00565 if (realNum == (float)intNum) 00566 { 00567 // Yes. Is it between 1 and upperIndex? 00568 if (intNum >= 1 && intNum < upperIndex) 00569 { 00570 // We already wrote it as part of the sequential 00571 // list. 00572 Pop(); 00573 continue; 00574 } 00575 } 00576 } 00577 00578 // Build the table entry name for the number. 00579 sprintf(keyName, "[%.16g]", key.GetNumber()); 00580 } 00581 else 00582 { 00583 // Build the table entry name for the string key name. 00584 const char* ptr = key.GetString(); 00585 bool isAlphaNumeric = true; 00586 while (*ptr) 00587 { 00588 if (!isalnum(*ptr) && *ptr != '_') 00589 { 00590 isAlphaNumeric = false; 00591 break; 00592 } 00593 ptr++; 00594 } 00595 if (isAlphaNumeric) 00596 strcpy(keyName, key.GetString()); 00597 else 00598 sprintf(keyName, "[\"%s\"]", key.GetString()); 00599 } 00600 00601 keyNames.push_back(keyName); 00602 00603 // Go to the next item. 00604 Pop(); 00605 } 00606 00607 keyNames.sort(); 00608 00609 if (keyNames.size() > 0) 00610 { 00611 // If we wrote a sequential list, the value we're about to write 00612 // is not nil, and we haven't written the semicolon to separate 00613 // the sequential table entries from the keyed table entries... 00614 if (hasSequential && indentLevel != -1) 00615 { 00616 // Then add a comma (for good measure) and the semicolon. 00617 file.Print(", ;"); 00618 if (indentLevel < maxIndentLevel) 00619 { 00620 file.Print("\n"); 00621 } 00622 wroteSemi = true; 00623 } 00624 } 00625 00626 for(std::list<std::string>::iterator it = keyNames.begin(); it != keyNames.end(); ++it) 00627 { 00628 LuaAutoBlock autoBlock(*this); 00629 const std::string& keyFullName = (*it); 00630 00631 LuaObject value = table; // Temp 00632 if (keyFullName[0] == '[') 00633 { 00634 if (keyFullName[1] == '"') 00635 { 00636 std::string keyName = keyFullName.substr(2, keyFullName.size() - 4); 00637 value = table.GetByName(keyName.c_str()); 00638 } 00639 else 00640 { 00641 std::string keyName = keyFullName.substr(1, keyFullName.size() - 2); 00642 int number = atoi(keyName.c_str()); 00643 value = table.GetByIndex(number); 00644 } 00645 } 00646 else 00647 { 00648 value = table.GetByName(keyFullName.c_str()); 00649 } 00650 00651 // Write the table entry. 00652 bool ret = WriteLuaObject(file, keyFullName.c_str(), value, indentLevel + 1, writeAll, alphabetical, writeTablePointers, maxIndentLevel); 00653 00654 // Add a comma after the table entry. 00655 if (indentLevel != -1 && ret) 00656 { 00657 file.Print(","); 00658 if (indentLevel < maxIndentLevel) 00659 { 00660 file.Print("\n"); 00661 } 00662 } 00663 } 00664 } 00665 else 00666 { 00667 // Cycle through the table. 00668 int i; 00669 PushNil(); 00670 while ((i = Next(table)) != 0) 00671 { 00672 char keyName[255]; 00673 00674 // Retrieve the table entry's key and value. 00675 LuaObject key(this, GetTop() - 1); 00676 LuaObject value(this, GetTop()); 00677 00678 // Is the key a number? 00679 if (key.IsNumber()) 00680 { 00681 // Yes, were there sequential array items in this table? 00682 if (hasSequential) 00683 { 00684 // Is the array item's key an integer? 00685 float realNum = key.GetNumber(); 00686 int intNum = (int)realNum; 00687 if (realNum == (float)intNum) 00688 { 00689 // Yes. Is it between 1 and upperIndex? 00690 if (intNum >= 1 && intNum < upperIndex) 00691 { 00692 // We already wrote it as part of the sequential 00693 // list. 00694 Pop(); 00695 continue; 00696 } 00697 } 00698 } 00699 00700 // Build the table entry name for the number. 00701 sprintf(keyName, "[%.16g]", key.GetNumber()); 00702 } 00703 else 00704 { 00705 // Build the table entry name for the string key name. 00706 const char* ptr = key.GetString(); 00707 bool isAlphaNumeric = true; 00708 while (*ptr) 00709 { 00710 if (!isalnum(*ptr) && *ptr != '_') 00711 { 00712 isAlphaNumeric = false; 00713 break; 00714 } 00715 ptr++; 00716 } 00717 if (isAlphaNumeric) 00718 strcpy(keyName, key.GetString()); 00719 else 00720 sprintf(keyName, "[\"%s\"]", key.GetString()); 00721 } 00722 00723 // If we wrote a sequential list, the value we're about to write 00724 // is not nil, and we haven't written the semicolon to separate 00725 // the sequential table entries from the keyed table entries... 00726 if (hasSequential && !value.IsNil() && !wroteSemi) 00727 { 00728 // Then add a comma (for good measure) and the semicolon. 00729 if (indentLevel != -1) 00730 { 00731 file.Print(", ;"); 00732 if (indentLevel < maxIndentLevel) 00733 { 00734 file.Print("\n"); 00735 } 00736 } 00737 wroteSemi = true; 00738 } 00739 00740 // Write the table entry. 00741 bool ret = WriteLuaObject(file, keyName, value, indentLevel + 1, writeAll, alphabetical, writeTablePointers, maxIndentLevel); 00742 00743 // Add a comma after the table entry. 00744 if (ret && indentLevel != -1) 00745 { 00746 file.Print(","); 00747 if (indentLevel < maxIndentLevel) 00748 { 00749 file.Print("\n"); 00750 } 00751 } 00752 00753 // Go to the next item. 00754 Pop(); 00755 } 00756 } 00757 00758 // If we wrote a sequential list and haven't written a semicolon, then 00759 // there were no keyed table entries. Just write the final comma. 00760 if (hasSequential && !wroteSemi && indentLevel != -1) 00761 { 00762 file.Print(","); 00763 if (indentLevel < maxIndentLevel) 00764 { 00765 file.Print("\n"); 00766 } 00767 } 00768 00769 // Indent, with the intent of closing up the table. 00770 IndentFile(file, indentSpaces); 00771 00772 // If the indentation level is 0, then we're at the root position. 00773 if (indentLevel == 0) 00774 { 00775 // Add a couple extra returns for readability's sake. 00776 file.Print("}"); 00777 if (indentLevel < maxIndentLevel) 00778 { 00779 file.Print("\n\n", file); 00780 } 00781 } 00782 else if (indentLevel > 0) 00783 { 00784 // Close the table. The comma is written when WriteObject() 00785 // returns from the recursive call. 00786 file.Print("}"); 00787 } 00788 } 00789 00790 // If the indentation level is at the root, then add a return to separate 00791 // the lines. 00792 if (indentLevel == 0) 00793 { 00794 if (indentLevel < maxIndentLevel) 00795 { 00796 file.Print("\n"); 00797 } 00798 } 00799 00800 return true; 00801 } 00802 00803 00807 void LuaState::WriteLuaGlobalsFile(const char* filename, bool writeAll, 00808 bool alphabetical, bool writeTablePointers, 00809 unsigned int maxIndentLevel) 00810 { 00811 // For safety, just in case we leave something behind on the script stack. 00812 LuaAutoBlock block(*this); 00813 00814 WriteLuaFile(filename, NULL, GetGlobals(), -1, writeAll, alphabetical, 00815 writeTablePointers, maxIndentLevel); 00816 } 00817 00818 00822 void LuaState::WriteLuaFile(const char* filename, const char* name, LuaObject value, 00823 int indentLevel, bool writeAll, bool alphabetical, 00824 bool writeTablePointers, unsigned int maxIndentLevel) 00825 { 00826 // Open the text file to write the script state to. 00827 LuaStateOutFile file; 00828 file.Open(filename); 00829 |
|
Definition at line 1258 of file LuaState.h. |
|
Definition at line 1261 of file LuaState.h. |