From c2b3d1a5a07fa9609995c8107392b381fc468da8 Mon Sep 17 00:00:00 2001 From: Flugente Date: Sat, 11 Mar 2017 15:35:39 +0000 Subject: [PATCH] Speed up inventory rendering by avoiding unnecessary function calls git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8394 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/Interface Items.cpp | 21 +- Tactical/Items.cpp | 340 ++++++++--------------- Tactical/World Items.cpp | 2 +- Tactical/XML_IncompatibleAttachments.cpp | 10 +- 4 files changed, 145 insertions(+), 228 deletions(-) diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp index 5c6330ed..46c75a81 100644 --- a/Tactical/Interface Items.cpp +++ b/Tactical/Interface Items.cpp @@ -2733,9 +2733,7 @@ void INVRenderINVPanelItem( SOLDIERTYPE *pSoldier, INT16 sPocket, UINT8 fDirtyLe RenderPocketItemCapacity( guiSAVEBUFFER, itemSlotLimit, sPocket, pSoldier, &pSoldier->inv[sPocket], sX, sY ); if ( itemSlotLimit == 0 ) - { fHatchItOut = TRUE; - } } // CHRISL: Change whether we hatch a pocket to be dependant on the current item @@ -2743,8 +2741,10 @@ void INVRenderINVPanelItem( SOLDIERTYPE *pSoldier, INT16 sPocket, UINT8 fDirtyLe { fHatchItOut = FALSE; } - else if (!UsingNewAttachmentSystem( ) && !ValidAttachment( gpItemPointer->usItem, pObject ) || - (UsingNewAttachmentSystem( ) && !ValidItemAttachmentSlot( pObject, gpItemPointer->usItem, FALSE, FALSE )) ) + // Flugente: we call this function a lot, so only call if necessary + else if ( !fHatchItOut && ( + !UsingNewAttachmentSystem( ) && !ValidAttachment( gpItemPointer->usItem, pObject ) || + (UsingNewAttachmentSystem( ) && !ValidItemAttachmentSlot( pObject, gpItemPointer->usItem, FALSE, FALSE )) ) ) { fHatchItOut = TRUE; } @@ -2915,12 +2915,21 @@ void HandleAnyMercInSquadHasCompatibleStuff( UINT8 ubSquad, OBJECTTYPE *pObject, BOOLEAN IsMutuallyValidAttachmentOrLaunchable(UINT16 usAttItem, UINT16 usItem)//dnl ch76 091113 { UINT32 uiLoop = 0; - while(Attachment[uiLoop][0] | Launchable[uiLoop][0]) + while ( Attachment[uiLoop][0] ) { - if(Attachment[uiLoop][0] == usAttItem && Attachment[uiLoop][1] == usItem || Attachment[uiLoop][0] == usItem && Attachment[uiLoop][1] == usAttItem || Launchable[uiLoop][0] == usAttItem && Launchable[uiLoop][1] == usItem || Launchable[uiLoop][0] == usItem && Launchable[uiLoop][1] == usAttItem) + if(Attachment[uiLoop][0] == usAttItem && Attachment[uiLoop][1] == usItem || Attachment[uiLoop][0] == usItem && Attachment[uiLoop][1] == usAttItem ) return(TRUE); ++uiLoop; } + + uiLoop = 0; + while ( Launchable[uiLoop][0] ) + { + if ( Launchable[uiLoop][0] == usAttItem && Launchable[uiLoop][1] == usItem || Launchable[uiLoop][0] == usItem && Launchable[uiLoop][1] == usAttItem ) + return(TRUE); + ++uiLoop; + } + return(FALSE); } diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index 6766ed3e..133171b3 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -1175,6 +1175,9 @@ ComboMergeInfoStruct AttachmentComboMerge[MAXITEMS+1];// = // HEADROCK HAM 5: Item Transformations table, containing all possible Transformations. TransformInfoStruct Transform[MAXITEMS+1]; +// Flugente: in order not to loop over MAXATTACHMENTS entries in IncompatibleAttachments[] if we only have a few thousand, remember the actual number read in +UINT32 extern gINCOMPATIBLEATTACHMENTS_READ; + UINT16 IncompatibleAttachments[MAXATTACHMENTS][2];// = //{ // {BIPOD,UNDER_GLAUNCHER}, @@ -1214,7 +1217,7 @@ UINT16 ReplacementGuns[][2] = { 0, 0 } }; -UINT16 ReplacementAmmo[][2] = +/*UINT16 ReplacementAmmo[][2] = { { CLIP545_30_AP, CLIP556_30_AP }, { CLIP545_30_HP, CLIP556_30_HP }, @@ -1223,7 +1226,7 @@ UINT16 ReplacementAmmo[][2] = { CLIP762W_10_HP, CLIP762N_5_HP }, { CLIP762W_30_HP, CLIP762N_20_HP }, { 0, 0 } -}; +};*/ // CHRISL: Structure Definitions for new inventory system items. std::vector LoadBearingEquipment; @@ -1350,7 +1353,7 @@ UINT16 StandardGunListReplacement( UINT16 usGun ) } } -UINT16 StandardGunListAmmoReplacement( UINT16 usAmmo ) +/*UINT16 StandardGunListAmmoReplacement( UINT16 usAmmo ) { UINT8 ubLoop; @@ -1373,7 +1376,7 @@ UINT16 StandardGunListAmmoReplacement( UINT16 usAmmo ) { return( NOTHING ); } -} +}*/ BOOLEAN WeaponInHand( SOLDIERTYPE * pSoldier ) { @@ -2127,7 +2130,7 @@ BOOLEAN ValidAttachmentClass( UINT16 usAttachment, UINT16 usItem ) } } } - iLoop++; + ++iLoop; if (AttachmentInfo[iLoop].usItem == 0) { // end of the array @@ -2137,7 +2140,7 @@ BOOLEAN ValidAttachmentClass( UINT16 usAttachment, UINT16 usItem ) return( FALSE ); } -INT8 GetAttachmentInfoIndex( UINT16 usItem ) +INT32 GetAttachmentInfoIndex( UINT16 usItem ) { INT32 iLoop = 0; @@ -2145,9 +2148,9 @@ INT8 GetAttachmentInfoIndex( UINT16 usItem ) { if ( AttachmentInfo[ iLoop ].usItem == usItem ) { - return( (INT8) iLoop ); + return( iLoop ); } - iLoop++; + ++iLoop; if (AttachmentInfo[iLoop].usItem == 0) { // end of the array @@ -2183,7 +2186,7 @@ BOOLEAN ValidAttachment( UINT16 usAttachment, UINT16 usItem, UINT8 * pubAPCost ) { break; } - iLoop++; + ++iLoop; if (Attachment[iLoop][0] == 0) { // the proposed item cannot be attached to anything! @@ -2195,14 +2198,14 @@ BOOLEAN ValidAttachment( UINT16 usAttachment, UINT16 usItem, UINT8 * pubAPCost ) { if (Attachment[iLoop][1] == usItem) { - if((UsingNewAttachmentSystem()==false && Attachment[iLoop][3] != 1) || UsingNewAttachmentSystem()==true) { - if (pubAPCost) { + if ( UsingNewAttachmentSystem( ) || Attachment[iLoop][3] != 1 ) + { + if (pubAPCost) *pubAPCost = (UINT8)Attachment[iLoop][2]; //Madd: get ap cost of attaching items :) - } break; } } - iLoop++; + ++iLoop; if (Attachment[iLoop][0] != usAttachment) { // the proposed item cannot be attached to the item in question @@ -2294,79 +2297,92 @@ UINT8 AttachmentAPCost( UINT16 usAttachment, OBJECTTYPE * pObj, SOLDIERTYPE * pS return ubAPCost; } +// Flugente: as we call this function quite a lot during rendering, I've modified it so that we evaluate as quickly as possible //Determine if this slot can receive this attachment. This is different, in that it may //be possible to have this attachment on this item, but may already have an attachment //in the slot we're trying to attach to. BOOLEAN ValidItemAttachmentSlot( OBJECTTYPE * pObj, UINT16 usAttachment, BOOLEAN fAttemptingAttachment, BOOLEAN fDisplayMessage, UINT8 subObject, INT16 slotCount, BOOLEAN fIgnoreAttachmentInSlot, OBJECTTYPE ** ppAttachInSlot, std::vector usAttachmentSlotIndexVector) { - BOOLEAN fSimilarItems = FALSE, fSameItem = FALSE, fNoSpace = FALSE; + BOOLEAN fSimilarItems = FALSE, fSameItem = FALSE; UINT16 usSimilarItem = NOTHING; INT16 ubSlotIndex = 0; -// INT32 iLoop2 = 0; -// INT16 sTimesToRun = 0; UINT8 curSlot = 0; UINT8 ubVolumeTaken; BOOLEAN foundValidAttachment = FALSE; - if (pObj->exists() == false) { + if (pObj->exists() == false) return FALSE; - } //It's possible we could get here without being sent the usAttachmentSlotIndexVector parameter if(usAttachmentSlotIndexVector.empty()) usAttachmentSlotIndexVector = GetItemSlots(pObj, subObject); //No slots means nothing will ever be valid, also a slotCount outside this vector will never be valid either. - if(usAttachmentSlotIndexVector.empty() || (INT16)usAttachmentSlotIndexVector.size() <= slotCount) + if ( (INT16)usAttachmentSlotIndexVector.size() <= slotCount) return FALSE; - - //Search for incompatible attachments - //Madd: check for gun on tripwire first - if ( Item[pObj->usItem].tripwire && Item[usAttachment].usItemClass & IC_GUN && FindAttachmentByClass(pObj,IC_GUN,subObject) != 0 ) + + // some checks are only necessary if we want to attach the thing in the first place + if ( fAttemptingAttachment ) { - fSimilarItems = TRUE; - OBJECTTYPE * tmpObj = FindAttachmentByClass(pObj,IC_GUN,subObject); - usSimilarItem = tmpObj->usItem; - } - if ( !fSameItem ) //Nav: why is this check here? fSameItem can only be false here, doesn't hurt I guess... - { - //for(int i = 0;iusItem].tripwire && Item[usAttachment].usItemClass & IC_GUN && FindAttachmentByClass( pObj, IC_GUN, subObject ) != 0 ) { - if ( FindAttachment(pObj, usAttachment, subObject) != 0 && !IsAttachmentClass(usAttachment, (AC_GRENADE|AC_ROCKET|AC_MODPOUCH) ) ) - {//Search for identical attachments unless we're dealing with rifle grenades - //DBrot: or pouches + fSimilarItems = TRUE; + OBJECTTYPE * tmpObj = FindAttachmentByClass( pObj, IC_GUN, subObject ); + usSimilarItem = tmpObj->usItem; + } + + if ( !fSameItem ) //Nav: why is this check here? fSameItem can only be false here, doesn't hurt I guess... + { + if ( !IsAttachmentClass( usAttachment, (AC_GRENADE | AC_ROCKET | AC_MODPOUCH) ) && FindAttachment( pObj, usAttachment, subObject ) != 0 ) + { + //Search for identical attachments unless we're dealing with rifle grenades + //DBrot: or pouches fSameItem = TRUE; - break; } - if ( IncompatibleAttachments[i][0] == NONE ) - break; //0 terminated, end search, when we are done with all entries and nothing meaningful is left - if ( IncompatibleAttachments[i][0] == usAttachment && FindAttachment (pObj,IncompatibleAttachments[i][1],subObject) != 0 ) //TODO fill in comment 1 + if ( !fSameItem ) { - fSimilarItems = TRUE; - usSimilarItem = IncompatibleAttachments[i][1]; - break; + for ( int i = 0; i < gINCOMPATIBLEATTACHMENTS_READ; ++i ) + { + if ( IncompatibleAttachments[i][0] == usAttachment && FindAttachment (pObj,IncompatibleAttachments[i][1],subObject) != 0 ) //TODO fill in comment 1 + { + fSimilarItems = TRUE; + usSimilarItem = IncompatibleAttachments[i][1]; + break; + } + } } } - } - if (Item[pObj->usItem].usItemClass == IC_LBEGEAR && Item[usAttachment].usItemClass == IC_LBEGEAR){ - ubVolumeTaken = GetVolumeAlreadyTaken(pObj, slotCount); - if(LoadBearingEquipment[Item[pObj->usItem].ubClassIndex].lbeAvailableVolume < (ubVolumeTaken + LBEPocketType[GetFirstPocketOnItem(usAttachment)].pVolume)){ - fNoSpace = TRUE; + + if ( fSameItem ) + { + if ( fDisplayMessage ) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, Message[STR_ATTACHMENT_ALREADY] ); + return(FALSE); + } + + if (Item[pObj->usItem].usItemClass == IC_LBEGEAR && Item[usAttachment].usItemClass == IC_LBEGEAR) + { + ubVolumeTaken = GetVolumeAlreadyTaken(pObj, slotCount); + if(LoadBearingEquipment[Item[pObj->usItem].ubClassIndex].lbeAvailableVolume < (ubVolumeTaken + LBEPocketType[GetFirstPocketOnItem(usAttachment)].pVolume)) + { + if ( fDisplayMessage ) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, Message[STR_NO_SPACE_FOR_POCKET] ); + return(FALSE); + } } } //Do we want to check all attachment slots or just the one in slotcount? - if(slotCount == -1){ + if(slotCount == -1) + { //Loop through slots UINT32 uiSlots = min((*pObj)[subObject]->attachments.size(), usAttachmentSlotIndexVector.size());//dnl ch76 091113 ugly fix as AK74 after attach/remove GL will have more attachments then usAttachmentSlotIndexVector which lead to CTD - for(UINT8 curSlot = 0; curSlot < uiSlots && !foundValidAttachment; curSlot++){ + for ( UINT8 curSlot = 0; curSlot < uiSlots; ++curSlot) + { //Any attachment that is already in this slot will go here. - OBJECTTYPE * pAttachment; - //Get the current attachment in the slot we're looking at. - pAttachment = (*pObj)[subObject]->GetAttachmentAtIndex(curSlot); + OBJECTTYPE* pAttachment = (*pObj)[subObject]->GetAttachmentAtIndex( curSlot ); ubSlotIndex = usAttachmentSlotIndexVector[curSlot]; //WarmSteel - does this particular slot already hold an item? @@ -2382,22 +2398,25 @@ BOOLEAN ValidItemAttachmentSlot( OBJECTTYPE * pObj, UINT16 usAttachment, BOOLEAN ValidLaunchable(usAttachment, pObj->usItem))) { foundValidAttachment = TRUE; + break; } } - } else { - - OBJECTTYPE * pAttachment; - - pAttachment = (*pObj)[subObject]->GetAttachmentAtIndex((UINT8)slotCount); + } + else + { + OBJECTTYPE* pAttachment = (*pObj)[subObject]->GetAttachmentAtIndex( (UINT8)slotCount ); ubSlotIndex = usAttachmentSlotIndexVector[slotCount]; //WarmSteel - does this particular slot already hold an item? :( If we have a pAttachInSlot we're trying to switch, so then it doesn't matter. - if(!fIgnoreAttachmentInSlot && pAttachment->exists() && fAttemptingAttachment && (!ppAttachInSlot || Item[pAttachment->usItem].inseparable == 1)){ + if(!fIgnoreAttachmentInSlot && pAttachment->exists() && fAttemptingAttachment && (!ppAttachInSlot || Item[pAttachment->usItem].inseparable == 1)) + { //If we have a parameter to return pAttachment to, store it, else the item does not attach to this slot. fSimilarItems = TRUE; usSimilarItem = pAttachment->usItem; - } else { + } + else + { //CHRISL: This should allow attachment swapping even if our attachments can't normally be on the weapon at the same time. if(slotCount != -1 && pAttachment->exists() && usSimilarItem == pAttachment->usItem && FindAttachmentSlot(pObj, pAttachment->usItem, subObject) == slotCount) fSimilarItems = FALSE; @@ -2419,22 +2438,13 @@ BOOLEAN ValidItemAttachmentSlot( OBJECTTYPE * pObj, UINT16 usAttachment, BOOLEAN } } - if(fAttemptingAttachment){ + if(fAttemptingAttachment) + { if (fSimilarItems) { if(fDisplayMessage) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, Message[ STR_CANT_USE_TWO_ITEMS ], ItemNames[ usSimilarItem ], ItemNames[ usAttachment ] ); return( FALSE ); } - else if (fSameItem) - { - if (fDisplayMessage) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, Message[ STR_ATTACHMENT_ALREADY ] ); - return( FALSE ); - } - else if (fNoSpace) - { - if (fDisplayMessage) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, Message[ STR_NO_SPACE_FOR_POCKET ] ); - return( FALSE ); - } else if ( !foundValidAttachment && fDisplayMessage && !ValidMerge( usAttachment, pObj->usItem ) ) { //We don't want a message if we might be merging this little thingey later. @@ -2454,34 +2464,15 @@ BOOLEAN ValidItemAttachmentSlot( OBJECTTYPE * pObj, UINT16 usAttachment, BOOLEAN //it which doesn't work simultaneously with the new attachment (like a silencer and duckbill). BOOLEAN ValidItemAttachment( OBJECTTYPE * pObj, UINT16 usAttachment, BOOLEAN fAttemptingAttachment, BOOLEAN fDisplayMessage, UINT8 subObject, std::vector usAttachmentSlotIndexVector) { - BOOLEAN fSameItem = FALSE, fSimilarItems = FALSE; - UINT16 usSimilarItem = NOTHING; - - if (pObj->exists() == false) { + if (pObj->exists() == false) return FALSE; - } + if ( !ValidAttachment( usAttachment, pObj, NULL, subObject, usAttachmentSlotIndexVector ) ) { // check for an underslung grenade launcher attached to the gun if ( (IsGrenadeLauncherAttached ( pObj, subObject ) ) && ValidLaunchable( usAttachment, GetAttachedGrenadeLauncher( pObj ) ) ) { return ( TRUE ); - /* - if ( fAttemptingAttachment ) - { - // if there is no other grenade attached already, then we can attach it - if (FindAttachmentByClass( pObj, IC_GRENADE) != ITEM_NOT_FOUND) - { - return( FALSE ); - } - // keep going, it can be attached to the grenade launcher - } - else - { - // logically, can be added - return( TRUE ); - } - */ } else { @@ -2497,133 +2488,41 @@ BOOLEAN ValidItemAttachment( OBJECTTYPE * pObj, UINT16 usAttachment, BOOLEAN fAt return( FALSE ); } } - // special conditions go here - // can't have two of the same attachment on an item - /* - if (FindAttachment( pObj, usAttachment ) != 0) - { - fSameItem = TRUE; - } - */ - //Madd: check for gun on tripwire first - if ( Item[pObj->usItem].tripwire && Item[usAttachment].usItemClass & IC_GUN && FindAttachmentByClass(pObj,IC_GUN,subObject) != 0 ) - { - fSimilarItems = TRUE; - OBJECTTYPE * tmpObj = FindAttachmentByClass(pObj,IC_GUN,subObject); - usSimilarItem = tmpObj->usItem; - } - - if ( !fSameItem ) - { - //for(int i = 0;iusItem].tripwire && Item[usAttachment].usItemClass & IC_GUN && FindAttachmentByClass( pObj, IC_GUN, subObject ) != 0 ) + { + fSimilarItems = TRUE; + OBJECTTYPE * tmpObj = FindAttachmentByClass( pObj, IC_GUN, subObject ); + usSimilarItem = tmpObj->usItem; + } + + if ( !fSameItem ) + { + if ( FindAttachment( pObj, usAttachment, subObject ) != 0 ) + { + fSameItem = TRUE; + } + + if ( !fSameItem ) + { + for ( int i = 0; i < gINCOMPATIBLEATTACHMENTS_READ; ++i ) + { + if ( IncompatibleAttachments[i][0] == usAttachment && FindAttachment( pObj, IncompatibleAttachments[i][1], subObject ) != 0 ) + { + fSimilarItems = TRUE; + usSimilarItem = IncompatibleAttachments[i][1]; + break; + } + } + } + } + if (fSameItem) { if (fDisplayMessage) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, Message[ STR_ATTACHMENT_ALREADY ] ); @@ -2668,7 +2567,7 @@ BOOLEAN CompatibleFaceItem( UINT16 usItem1, UINT16 usItem2 ) { break; } - iLoop++; + ++iLoop; if (CompatibleFaceItems[iLoop][0] == 0) { // the proposed item cannot fit with anything! @@ -2682,7 +2581,7 @@ BOOLEAN CompatibleFaceItem( UINT16 usItem1, UINT16 usItem2 ) { break; } - iLoop++; + ++iLoop; if (CompatibleFaceItems[iLoop][0] != usItem1) { // the proposed item cannot be attached to the item in question @@ -4115,7 +4014,8 @@ BOOLEAN OBJECTTYPE::AttachObjectOAS( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttac INT8 bLoop; UINT8 ubType, ubAPCost; INT32 iCheckResult; - INT8 bAttachInfoIndex = -1, bAttachComboMerge; + INT32 bAttachInfoIndex = -1; + INT8 bAttachComboMerge; BOOLEAN fValidLaunchable = FALSE; UINT16 oldMagSize = 0; @@ -4686,7 +4586,6 @@ BOOLEAN OBJECTTYPE::AttachObject( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttachme //WarmSteel - if uiItemPos is -1, we're not checking for a specific slot, but scrolling through them all. TODO comment the rest BOOLEAN OBJECTTYPE::AttachObjectNAS( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttachment, BOOLEAN playSound, UINT8 subObject, INT32 iItemPos, BOOLEAN fRemoveProhibited, std::vector usAttachmentSlotIndexVector ) { - if (pAttachment->exists() == false) { return FALSE; } @@ -4695,7 +4594,8 @@ BOOLEAN OBJECTTYPE::AttachObjectNAS( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttac INT8 bLoop; UINT8 ubType, ubAPCost; INT32 iCheckResult; - INT8 bAttachInfoIndex = -1, bAttachComboMerge; + INT32 bAttachInfoIndex = -1; + INT8 bAttachComboMerge; BOOLEAN fValidLaunchable = FALSE; BOOLEAN fValidItemAttachment = FALSE; INT32 curSlot = 0; diff --git a/Tactical/World Items.cpp b/Tactical/World Items.cpp index 3338490c..d99c45f3 100644 --- a/Tactical/World Items.cpp +++ b/Tactical/World Items.cpp @@ -42,7 +42,7 @@ UINT32 guiNumWorldBombs = 0; void DeleteWorldItemsBelongingToTerroristsWhoAreNotThere( void ); void DeleteWorldItemsBelongingToQueenIfThere( void ); -extern UINT16 StandardGunListAmmoReplacement( UINT16 usAmmo ); +//extern UINT16 StandardGunListAmmoReplacement( UINT16 usAmmo ); extern UINT8 GetDealerItemCategoryNumber( UINT16 usItemIndex ); //dnl ch33 120909 diff --git a/Tactical/XML_IncompatibleAttachments.cpp b/Tactical/XML_IncompatibleAttachments.cpp index 16f2f505..e888a660 100644 --- a/Tactical/XML_IncompatibleAttachments.cpp +++ b/Tactical/XML_IncompatibleAttachments.cpp @@ -9,6 +9,9 @@ #include "XML.h" #endif +// Flugente: in order not to loop over MAXATTACHMENTS entries in IncompatibleAttachments[] if we only have a few thousand, remember the actual number read in +UINT32 gINCOMPATIBLEATTACHMENTS_READ = 0; + struct { PARSE_STAGE curElement; @@ -91,6 +94,9 @@ incompatibleattachmentEndElementHandle(void *userData, const XML_Char *name) { pData->curElement = ELEMENT_LIST; + // Flugente: new entry + gINCOMPATIBLEATTACHMENTS_READ = pData->curIndex; + if(pData->curIndex < pData->maxArraySize) { //DebugMsg(TOPIC_JA2, DBG_LEVEL_3,"IncompatibleAttachmentStartElementHandle: writing incompatibleattachment to array"); @@ -172,8 +178,10 @@ BOOLEAN ReadInIncompatibleAttachmentStats(STR fileName) return FALSE; } - MemFree(lpcBuffer); + // read was x -> x+1 entries + ++gINCOMPATIBLEATTACHMENTS_READ; + MemFree(lpcBuffer); XML_ParserFree(parser);