void asCRestore::WriteFunction(asCScriptFunction* func) { char c; // If there is no function, then store a null char if( func == 0 ) { c = '\0'; WRITE_NUM(c); return; } // First check if the function has been saved already for( asUINT f = 0; f < savedFunctions.GetLength(); f++ ) { if( savedFunctions[f] == func ) { c = 'r'; WRITE_NUM(c); WRITE_NUM(f); return; } } // Keep a reference to the function in the list savedFunctions.PushLast(func); c = 'f'; WRITE_NUM(c); asUINT i, count; WriteFunctionSignature(func); count = (asUINT)func->byteCode.GetLength(); WRITE_NUM(count); WriteByteCode(func->byteCode.AddressOf(), count); count = (asUINT)func->objVariablePos.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteObjectType(func->objVariableTypes[i]); WRITE_NUM(func->objVariablePos[i]); } WRITE_NUM(func->stackNeeded); asUINT length = (asUINT)func->lineNumbers.GetLength(); WRITE_NUM(length); for( i = 0; i < length; ++i ) WRITE_NUM(func->lineNumbers[i]); WRITE_NUM(func->vfTableIdx); // TODO: Write variables // TODO: Store script section index }
void asCRestore::WriteObjectType(asCObjectType* ot) { char ch; // Only write the object type name if( ot ) { // Check for template instances/specializations if( ot->templateSubType.GetTokenType() != ttUnrecognizedToken && ot != engine->defaultArrayObjectType ) { ch = 'a'; WRITE_NUM(ch); if( ot->templateSubType.IsObject() ) { ch = 's'; WRITE_NUM(ch); WriteObjectType(ot->templateSubType.GetObjectType()); if( ot->templateSubType.IsObjectHandle() ) ch = 'h'; else ch = 'o'; WRITE_NUM(ch); } else { ch = 't'; WRITE_NUM(ch); eTokenType t = ot->templateSubType.GetTokenType(); WRITE_NUM(t); } } else if( ot->flags & asOBJ_TEMPLATE_SUBTYPE ) { ch = 's'; WRITE_NUM(ch); WriteString(&ot->name); } else { ch = 'o'; WRITE_NUM(ch); WriteString(&ot->name); } } else { ch = '\0'; WRITE_NUM(ch); // Write a null string asDWORD null = 0; WRITE_NUM(null); } }
void appCopyPaste::CopyPages(const MenuPageArray& pageData) { if (pageData.IsEmpty()) return; try { appConfigFile::OpenAsClipboard(false); WritePageHeader(); // get counts int nPages = pageData.Size(); int ntotalPages = nPages; int ntotalObjects = 0; for (int i = 0; i < nPages; i++) { const MenuPageC& currPage = pageData.GetRef(i); ntotalPages += GetChildPageCount(currPage); ntotalObjects += GetChildObjectCount(currPage); } // write counts WriteInt(nPages); WriteInt(ntotalPages); WriteInt(ntotalObjects); WriteLine(); // page types for (int i = 0; i < nPages; i++) WritePageType(pageData.GetRef(i)); // object types for (int i = 0; i < nPages; i++) WriteObjectType(pageData.GetRef(i)); // object list -- this has to include all objects to avoid problems on read WriteAppGlobals(); // and finally pages for (int i = 0; i < nPages; i++) pageData[i]->WriteToFile(); } catch (TextC::TextError re) { GenAppErrorMsg("CopyPages", re.errMsg); } appConfigFile::Close(); }
void asCRestore::WriteFunction(asCScriptFunction* func) { int i, count; WriteString(&func->name); WriteDataType(&func->returnType); count = func->parameterTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteDataType(&func->parameterTypes[i]); WRITE_NUM(func->id); count = func->byteCode.GetLength(); WRITE_NUM(count); WriteByteCode(func->byteCode.AddressOf(), count); count = func->objVariablePos.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteObjectType(func->objVariableTypes[i]); WRITE_NUM(func->objVariablePos[i]); } WRITE_NUM(func->stackNeeded); WriteObjectType(func->objectType); int length = func->lineNumbers.GetLength(); WRITE_NUM(length); for( i = 0; i < length; ++i ) WRITE_NUM(func->lineNumbers[i]); }
void asCRestore::WriteDataType(const asCDataType *dt) { bool b; int t = dt->GetTokenType(); WRITE_NUM(t); WriteObjectType(dt->GetObjectType()); b = dt->IsObjectHandle(); WRITE_NUM(b); b = dt->IsReadOnly(); WRITE_NUM(b); b = dt->IsHandleToConst(); WRITE_NUM(b); b = dt->IsReference(); WRITE_NUM(b); }
void asCRestore::WriteObjectType(asCObjectType* ot) { char ch; // Only write the object type name if( ot ) { if( ot->flags & asOBJ_SCRIPT_ARRAY && ot->name != asDEFAULT_ARRAY ) { ch = 'a'; WRITE_NUM(ch); if( ot->subType ) { ch = 's'; WRITE_NUM(ch); WriteObjectType(ot->subType); ch = ot->arrayType & 1 ? 'h' : 'o'; WRITE_NUM(ch); } else { ch = 't'; WRITE_NUM(ch); WRITE_NUM(ot->tokenType); } } else { ch = 'o'; WRITE_NUM(ch); WriteString(&ot->name); } } else { ch = '\0'; WRITE_NUM(ch); // Write a null string asDWORD null = 0; WRITE_NUM(null); } }
static void WriteObjectType(const MenuPageC& parentPage) { for (int i = 0; i < parentPage.pageObjects.Size(); i++) { const MenuObjC& currObj = parentPage.pageObjects.GetRef(i); if (currObj.objFunction != 0) { const char* objName = currObj.GetAllocName(); // kluge for main plot objects -- set to DPO_PenSet which all apps should have if ((strncmp(objName, "PPD", 3) == 0) || (strncmp(objName, "CPD", 3) == 0)) objName = "DPO_PenSet"; WriteText(objName); } } for (int i = 0; i < parentPage.childPages.Size(); i++) WriteObjectType(parentPage.childPages.GetRef(i)); }
void asCRestore::WriteFunctionSignature(asCScriptFunction *func) { asUINT i, count; WriteString(&func->name); WriteDataType(&func->returnType); count = (asUINT)func->parameterTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteDataType(&func->parameterTypes[i]); count = (asUINT)func->inOutFlags.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WRITE_NUM(func->inOutFlags[i]); WRITE_NUM(func->funcType); WriteObjectType(func->objectType); WRITE_NUM(func->isReadOnly); }
void asCRestore::WriteDataType(const asCDataType *dt) { if( dt->IsScriptArray() ) { bool b = true; WRITE_NUM(b); b = dt->IsObjectHandle(); WRITE_NUM(b); b = dt->IsReadOnly(); WRITE_NUM(b); b = dt->IsHandleToConst(); WRITE_NUM(b); b = dt->IsReference(); WRITE_NUM(b); asCDataType sub = dt->GetSubType(); WriteDataType(&sub); } else { bool b = false; WRITE_NUM(b); int t = dt->GetTokenType(); WRITE_NUM(t); WriteObjectType(dt->GetObjectType()); b = dt->IsObjectHandle(); WRITE_NUM(b); b = dt->IsReadOnly(); WRITE_NUM(b); b = dt->IsHandleToConst(); WRITE_NUM(b); b = dt->IsReference(); WRITE_NUM(b); } }
int asCRestore::Save() { unsigned long i, count; // Store everything in the same order that the builder parses scripts // Store enums count = (asUINT)module->enumTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; i++ ) { WriteObjectTypeDeclaration(module->enumTypes[i], false); WriteObjectTypeDeclaration(module->enumTypes[i], true); } // Store type declarations first count = (asUINT)module->classTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; i++ ) { // Store only the name of the class/interface types WriteObjectTypeDeclaration(module->classTypes[i], false); } // Now store all interface methods for( i = 0; i < count; i++ ) { if( module->classTypes[i]->IsInterface() ) WriteObjectTypeDeclaration(module->classTypes[i], true); } // Then store the class methods, properties, and behaviours for( i = 0; i < count; ++i ) { if( !module->classTypes[i]->IsInterface() ) WriteObjectTypeDeclaration(module->classTypes[i], true); } // Store typedefs count = (asUINT)module->typeDefs.GetLength(); WRITE_NUM(count); for( i = 0; i < count; i++ ) { WriteObjectTypeDeclaration(module->typeDefs[i], false); WriteObjectTypeDeclaration(module->typeDefs[i], true); } // scriptGlobals[] count = (asUINT)module->scriptGlobals.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteGlobalProperty(module->scriptGlobals[i]); // scriptFunctions[] count = 0; for( i = 0; i < module->scriptFunctions.GetLength(); i++ ) if( module->scriptFunctions[i]->objectType == 0 ) count++; WRITE_NUM(count); for( i = 0; i < module->scriptFunctions.GetLength(); ++i ) if( module->scriptFunctions[i]->objectType == 0 ) WriteFunction(module->scriptFunctions[i]); // globalFunctions[] count = (int)module->globalFunctions.GetLength(); WRITE_NUM(count); for( i = 0; i < count; i++ ) { WriteFunction(module->globalFunctions[i]); } // bindInformations[] count = (asUINT)module->bindInformations.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteFunction(module->bindInformations[i]->importedFunctionSignature); WriteString(&module->bindInformations[i]->importFromModule); } // usedTypes[] count = (asUINT)usedTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteObjectType(usedTypes[i]); } // usedTypeIds[] WriteUsedTypeIds(); // usedFunctions[] WriteUsedFunctions(); // usedGlobalProperties[] WriteUsedGlobalProps(); // usedStringConstants[] WriteUsedStringConstants(); // TODO: Store script section names return asSUCCESS; }
int asCRestore::Save() { unsigned long i, count; // structTypes[] count = module->structTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteObjectTypeDeclaration(module->structTypes[i]); } // usedTypeIndices[] count = module->usedTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteObjectType(module->usedTypes[i]); } // scriptGlobals[] count = module->scriptGlobals.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteProperty(module->scriptGlobals[i]); // globalMem size (can restore data using @init()) count = module->globalMem.GetLength(); WRITE_NUM(count); // globalVarPointers[] WriteGlobalVarPointers(); // initFunction WriteFunction(&module->initFunction); // scriptFunctions[] count = module->scriptFunctions.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteFunction(module->scriptFunctions[i]); // stringConstants[] count = module->stringConstants.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteString(module->stringConstants[i]); // importedFunctions[] and bindInformations[] count = module->importedFunctions.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteFunction(module->importedFunctions[i]); WRITE_NUM(module->bindInformations[i].importFrom); } // usedTypeIds[] WriteUsedTypeIds(); return asSUCCESS; }
void asCRestore::WriteObjectTypeDeclaration(asCObjectType *ot, bool writeProperties) { if( !writeProperties ) { // name WriteString(&ot->name); // size int size = ot->size; WRITE_NUM(size); // flags asDWORD flags = ot->flags; WRITE_NUM(flags); } else { if( ot->flags & asOBJ_ENUM ) { // enumValues[] int size = (int)ot->enumValues.GetLength(); WRITE_NUM(size); for( int n = 0; n < size; n++ ) { WriteString(&ot->enumValues[n]->name); WRITE_NUM(ot->enumValues[n]->value); } } else if( ot->flags & asOBJ_TYPEDEF ) { eTokenType t = ot->templateSubType.GetTokenType(); WRITE_NUM(t); } else { WriteObjectType(ot->derivedFrom); // interfaces[] int size = (asUINT)ot->interfaces.GetLength(); WRITE_NUM(size); asUINT n; for( n = 0; n < ot->interfaces.GetLength(); n++ ) { WriteObjectType(ot->interfaces[n]); } // properties[] size = (asUINT)ot->properties.GetLength(); WRITE_NUM(size); for( n = 0; n < ot->properties.GetLength(); n++ ) { WriteObjectProperty(ot->properties[n]); } // behaviours if( !ot->IsInterface() && ot->flags != asOBJ_TYPEDEF && ot->flags != asOBJ_ENUM ) { WriteFunction(engine->scriptFunctions[ot->beh.construct]); WriteFunction(engine->scriptFunctions[ot->beh.destruct]); WriteFunction(engine->scriptFunctions[ot->beh.factory]); size = (int)ot->beh.constructors.GetLength() - 1; WRITE_NUM(size); for( n = 1; n < ot->beh.constructors.GetLength(); n++ ) { WriteFunction(engine->scriptFunctions[ot->beh.constructors[n]]); WriteFunction(engine->scriptFunctions[ot->beh.factories[n]]); } } // methods[] size = (int)ot->methods.GetLength(); WRITE_NUM(size); for( n = 0; n < ot->methods.GetLength(); n++ ) { WriteFunction(engine->scriptFunctions[ot->methods[n]]); } // virtualFunctionTable[] size = (int)ot->virtualFunctionTable.GetLength(); WRITE_NUM(size); for( n = 0; n < (asUINT)size; n++ ) { WriteFunction(ot->virtualFunctionTable[n]); } } } }