From 63c8e29b33498c58790518d18cfd3a5316ce8f9c Mon Sep 17 00:00:00 2001 From: Amine B Date: Fri, 15 Mar 2019 08:46:23 +0100 Subject: [PATCH 01/10] Adding a new parameter to FindValueInArray in order to compare precise number of cells The new parameter 'cellsToCompare' will allow us to compare a certain number of cells, starting from 'block', since FindValue only compares a single cell right now, It is very useful when working with structures that have array as members. Here's an example with an array of 2: --- core/logic/smn_adt_array.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/logic/smn_adt_array.cpp b/core/logic/smn_adt_array.cpp index b8694bce12..1a7529cc48 100644 --- a/core/logic/smn_adt_array.cpp +++ b/core/logic/smn_adt_array.cpp @@ -560,18 +560,30 @@ static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) size_t blocknumber = 0; if (params[0] >= 3) { - blocknumber = (size_t) params[3]; + blocknumber = (size_t) params[3]; } if (blocknumber >= array->blocksize()) { return pContext->ThrowNativeError("Invalid block %d (blocksize: %d)", blocknumber, array->blocksize()); } + + size_t cellsToCompare = 0; + + if (params[0] >= 4) + { + cellsToCompare = (size_t) params[4]; + } + + if (blocknumber + cellsToCompare > array->blocksize()) + { + return pContext->ThrowNativeError("Comparing %d cells (blocksize: %d)", blocknumber + cellsToCompare, array->blocksize()); + } for (unsigned int i = 0; i < array->size(); i++) { cell_t *blk = array->at(i); - if (params[2] == blk[blocknumber]) + if (memcmp(params[2], blk[blocknumber], cellsToCompare > 0 ? cellsToCompare : array->blocksize() - blocknumber) == 0) { return (cell_t) i; } From c064697d930c584f9346a4577c14aec87749a279 Mon Sep 17 00:00:00 2001 From: Amine B Date: Fri, 15 Mar 2019 11:11:36 +0100 Subject: [PATCH 02/10] Update smn_adt_array.cpp --- core/logic/smn_adt_array.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/logic/smn_adt_array.cpp b/core/logic/smn_adt_array.cpp index 1a7529cc48..c12c65cb0f 100644 --- a/core/logic/smn_adt_array.cpp +++ b/core/logic/smn_adt_array.cpp @@ -568,8 +568,7 @@ static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) return pContext->ThrowNativeError("Invalid block %d (blocksize: %d)", blocknumber, array->blocksize()); } - size_t cellsToCompare = 0; - + size_t cellsToCompare = 0; if (params[0] >= 4) { cellsToCompare = (size_t) params[4]; @@ -583,7 +582,7 @@ static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) for (unsigned int i = 0; i < array->size(); i++) { cell_t *blk = array->at(i); - if (memcmp(params[2], blk[blocknumber], cellsToCompare > 0 ? cellsToCompare : array->blocksize() - blocknumber) == 0) + if (memcmp(params[2], blk[blocknumber], sizeof(cell_t) * (cellsToCompare > 0 ? cellsToCompare : array->blocksize() - blocknumber)) == 0) { return (cell_t) i; } From 5bad9a28779c7b31c638e2d476a2430001d333b1 Mon Sep 17 00:00:00 2001 From: Amine B Date: Fri, 15 Mar 2019 12:06:39 +0100 Subject: [PATCH 03/10] Update smn_adt_array.cpp --- core/logic/smn_adt_array.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/logic/smn_adt_array.cpp b/core/logic/smn_adt_array.cpp index c12c65cb0f..054afc3ede 100644 --- a/core/logic/smn_adt_array.cpp +++ b/core/logic/smn_adt_array.cpp @@ -582,7 +582,7 @@ static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) for (unsigned int i = 0; i < array->size(); i++) { cell_t *blk = array->at(i); - if (memcmp(params[2], blk[blocknumber], sizeof(cell_t) * (cellsToCompare > 0 ? cellsToCompare : array->blocksize() - blocknumber)) == 0) + if (memcmp(params + 2, blk + blocknumber, sizeof(cell_t) * (cellsToCompare > 0 ? cellsToCompare : array->blocksize() - blocknumber)) == 0) { return (cell_t) i; } From 4593216ddeab5207993d3e7b8c1bf0734ad0a13d Mon Sep 17 00:00:00 2001 From: Amine B Date: Sat, 6 Apr 2019 21:41:36 +0100 Subject: [PATCH 04/10] Update smn_adt_array.cpp --- core/logic/smn_adt_array.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/core/logic/smn_adt_array.cpp b/core/logic/smn_adt_array.cpp index 054afc3ede..d478a90a05 100644 --- a/core/logic/smn_adt_array.cpp +++ b/core/logic/smn_adt_array.cpp @@ -560,7 +560,7 @@ static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) size_t blocknumber = 0; if (params[0] >= 3) { - blocknumber = (size_t) params[3]; + blocknumber = (size_t) params[3]; } if (blocknumber >= array->blocksize()) @@ -582,9 +582,20 @@ static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) for (unsigned int i = 0; i < array->size(); i++) { cell_t *blk = array->at(i); - if (memcmp(params + 2, blk + blocknumber, sizeof(cell_t) * (cellsToCompare > 0 ? cellsToCompare : array->blocksize() - blocknumber)) == 0) + + if (cellsToCompare > 0) { - return (cell_t) i; + if (memcmp(¶ms[2], &blk[blocknumber], sizeof(cell_t) * cellsToCompare) == 0) + { + return (cell_t) i; + } + } + else + { + if (memcmp(¶ms[2], &blk[blocknumber], sizeof(cell_t) * (array->blocksize() - blocknumber)) == 0) + { + return (cell_t) i; + } } } From e2bcd47ddc03f025ebf416207d7612d6c3d66016 Mon Sep 17 00:00:00 2001 From: Amine B Date: Sat, 6 Apr 2019 21:42:42 +0100 Subject: [PATCH 05/10] Update smn_adt_array.cpp --- core/logic/smn_adt_array.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/logic/smn_adt_array.cpp b/core/logic/smn_adt_array.cpp index d478a90a05..9e9442efe1 100644 --- a/core/logic/smn_adt_array.cpp +++ b/core/logic/smn_adt_array.cpp @@ -579,7 +579,7 @@ static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) return pContext->ThrowNativeError("Comparing %d cells (blocksize: %d)", blocknumber + cellsToCompare, array->blocksize()); } - for (unsigned int i = 0; i < array->size(); i++) + for (size_t i = 0; i < array->size(); i++) { cell_t *blk = array->at(i); From b40562e8379464e9fa3b39aed73c91d39cadca0c Mon Sep 17 00:00:00 2001 From: Amine B Date: Sat, 6 Apr 2019 21:48:32 +0100 Subject: [PATCH 06/10] Update smn_adt_array.cpp --- core/logic/smn_adt_array.cpp | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/core/logic/smn_adt_array.cpp b/core/logic/smn_adt_array.cpp index 9e9442efe1..4b1326b5ce 100644 --- a/core/logic/smn_adt_array.cpp +++ b/core/logic/smn_adt_array.cpp @@ -578,25 +578,17 @@ static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) { return pContext->ThrowNativeError("Comparing %d cells (blocksize: %d)", blocknumber + cellsToCompare, array->blocksize()); } + + size_t cells = cellsToCompare > 0 ? cellsToCompare : array->blocksize() - blocknumber; for (size_t i = 0; i < array->size(); i++) { - cell_t *blk = array->at(i); + cell_t *blk = array->at(i); - if (cellsToCompare > 0) - { - if (memcmp(¶ms[2], &blk[blocknumber], sizeof(cell_t) * cellsToCompare) == 0) - { - return (cell_t) i; - } - } - else + if (memcmp(¶ms[2], &blk[blocknumber], sizeof(cell_t) * cells) == 0) { - if (memcmp(¶ms[2], &blk[blocknumber], sizeof(cell_t) * (array->blocksize() - blocknumber)) == 0) - { - return (cell_t) i; - } - } + return (cell_t) i; + } } return -1; From 31508d652f727c5b88ce08660bcf7b9df904462a Mon Sep 17 00:00:00 2001 From: Amine B Date: Sat, 6 Apr 2019 21:49:29 +0100 Subject: [PATCH 07/10] Update smn_adt_array.cpp --- core/logic/smn_adt_array.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/logic/smn_adt_array.cpp b/core/logic/smn_adt_array.cpp index 4b1326b5ce..e35c86f623 100644 --- a/core/logic/smn_adt_array.cpp +++ b/core/logic/smn_adt_array.cpp @@ -580,15 +580,15 @@ static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) } size_t cells = cellsToCompare > 0 ? cellsToCompare : array->blocksize() - blocknumber; - + for (size_t i = 0; i < array->size(); i++) { - cell_t *blk = array->at(i); + cell_t *blk = array->at(i); if (memcmp(¶ms[2], &blk[blocknumber], sizeof(cell_t) * cells) == 0) { return (cell_t) i; - } + } } return -1; From c7221fbd35f459622f9c25467b6cda9fce6883f5 Mon Sep 17 00:00:00 2001 From: Amine B Date: Sat, 6 Apr 2019 22:17:47 +0100 Subject: [PATCH 08/10] Update adt_array.inc --- plugins/include/adt_array.inc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/include/adt_array.inc b/plugins/include/adt_array.inc index 043898dfbe..fe6fae45fe 100644 --- a/plugins/include/adt_array.inc +++ b/plugins/include/adt_array.inc @@ -203,10 +203,11 @@ methodmap ArrayList < Handle { // value cannot be located, -1 will be returned. // // @param item Value to search for - // @param block Optionally which block to search in + // @param block Optionally which block to search in + // @param cellsToCompare Optionally the number of cells to compare, 0 stands for the rest of the cells // @return Array index, or -1 on failure // @error Invalid block index - public native int FindValue(any item, int block=0); + public native int FindValue(any item, int block=0, int cellsToCompare=1); // Retrieve the size of the array. property int Length { @@ -440,10 +441,11 @@ native int FindStringInArray(Handle array, const char[] item); * @param array Array Handle. * @param item Value to search for * @param block Optionally which block to search in + * @param cellsToCompare Optionally the number of cells to compare, 0 stands for the rest of the cells * @return Array index, or -1 on failure * @error Invalid Handle or invalid block */ -native int FindValueInArray(Handle array, any item, int block=0); +native int FindValueInArray(Handle array, any item, int block=0, int cellsToCompare=1); /** * Returns the blocksize the array was created with. From cf2b245d4a33cb09d7e0477f439149e349c26230 Mon Sep 17 00:00:00 2001 From: Amine B Date: Sat, 6 Apr 2019 22:20:14 +0100 Subject: [PATCH 09/10] Update adt_array.inc --- plugins/include/adt_array.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/include/adt_array.inc b/plugins/include/adt_array.inc index fe6fae45fe..c8ceec5ba5 100644 --- a/plugins/include/adt_array.inc +++ b/plugins/include/adt_array.inc @@ -204,7 +204,7 @@ methodmap ArrayList < Handle { // // @param item Value to search for // @param block Optionally which block to search in - // @param cellsToCompare Optionally the number of cells to compare, 0 stands for the rest of the cells + // @param cellsToCompare Optionally the number of cells to compare, anything below 1 stands for the rest of the cells // @return Array index, or -1 on failure // @error Invalid block index public native int FindValue(any item, int block=0, int cellsToCompare=1); @@ -441,7 +441,7 @@ native int FindStringInArray(Handle array, const char[] item); * @param array Array Handle. * @param item Value to search for * @param block Optionally which block to search in - * @param cellsToCompare Optionally the number of cells to compare, 0 stands for the rest of the cells + * @param cellsToCompare Optionally the number of cells to compare, anything below 1 stands for the rest of the cells * @return Array index, or -1 on failure * @error Invalid Handle or invalid block */ From 2b2521215c032f127cea5c71a87f68092938b164 Mon Sep 17 00:00:00 2001 From: Amine B Date: Sun, 7 Apr 2019 00:05:04 +0100 Subject: [PATCH 10/10] Update smn_adt_array.cpp I just noticed that I forgot to get the physical address of 2nd param, since it can be an array and that's the main purpose here. --- core/logic/smn_adt_array.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/logic/smn_adt_array.cpp b/core/logic/smn_adt_array.cpp index e35c86f623..09ef6958e7 100644 --- a/core/logic/smn_adt_array.cpp +++ b/core/logic/smn_adt_array.cpp @@ -579,13 +579,16 @@ static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) return pContext->ThrowNativeError("Comparing %d cells (blocksize: %d)", blocknumber + cellsToCompare, array->blocksize()); } + cell_t *addr; + pContext->LocalToPhysAddr(params[2], &addr); + size_t cells = cellsToCompare > 0 ? cellsToCompare : array->blocksize() - blocknumber; for (size_t i = 0; i < array->size(); i++) { cell_t *blk = array->at(i); - if (memcmp(¶ms[2], &blk[blocknumber], sizeof(cell_t) * cells) == 0) + if (memcmp(addr, &blk[blocknumber], sizeof(cell_t) * cells) == 0) { return (cell_t) i; }