[PATCH 2/5] usp10: Use usp10_array_reserve() in computeBracketPairs().
Aric Stewart
aric at codeweavers.com
Tue Feb 20 13:41:57 CST 2018
Signed-off-by: Aric Stewart <aric at codeweavers.com>
On 2/20/18 12:34 AM, Henri Verbeet wrote:
> Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
> ---
> dlls/usp10/bidi.c | 71 +++++++++++++++++++++++++++----------------------------
> 1 file changed, 35 insertions(+), 36 deletions(-)
>
> diff --git a/dlls/usp10/bidi.c b/dlls/usp10/bidi.c
> index 2277190..b0df781 100644
> --- a/dlls/usp10/bidi.c
> +++ b/dlls/usp10/bidi.c
> @@ -694,6 +694,7 @@ static BracketPair *computeBracketPairs(IsolatedRun *iso_run)
> int stack_top = iso_run->length;
> unsigned int pair_count = 0;
> BracketPair *out = NULL;
> + SIZE_T out_size = 0;
> int i;
>
> open_stack = heap_alloc(iso_run->length * sizeof(*open_stack));
> @@ -702,42 +703,43 @@ static BracketPair *computeBracketPairs(IsolatedRun *iso_run)
> for (i = 0; i < iso_run->length; i++)
> {
> unsigned short ubv = get_table_entry(bidi_bracket_table, iso_run->item[i].ch);
> - if (ubv)
> +
> + if (!ubv)
> + continue;
> +
> + if ((ubv >> 8) == 0)
> {
> - if (!out)
> - {
> - out = heap_alloc(sizeof(*out));
> - out[0].start = -1;
> - }
> + --stack_top;
> + open_stack[stack_top] = iso_run->item[i].ch + (signed char)(ubv & 0xff);
> + /* Deal with canonical equivalent U+2329/232A and U+3008/3009. */
> + if (open_stack[stack_top] == 0x232a)
> + open_stack[stack_top] = 0x3009;
> + stack_index[stack_top] = i;
> + }
> + else if ((ubv >> 8) == 1)
> + {
> + unsigned int j;
>
> - if ((ubv >> 8) == 0)
> - {
> - stack_top --;
> - open_stack[stack_top] = iso_run->item[i].ch + (signed char)(ubv & 0xff);
> - /* deal with canonical equivalent U+2329/232A and U+3008/3009 */
> - if (open_stack[stack_top] == 0x232A)
> - open_stack[stack_top] = 0x3009;
> - stack_index[stack_top] = i;
> - }
> - else if ((ubv >> 8) == 1)
> + for (j = stack_top; j < iso_run->length; ++j)
> {
> - int j;
> - if (stack_top == iso_run->length) continue;
> - for (j = stack_top; j < iso_run->length; j++)
> - {
> - WCHAR c = iso_run->item[i].ch;
> - if (c == 0x232A) c = 0x3009;
> - if (c == open_stack[j])
> - {
> - out[pair_count].start = stack_index[j];
> - out[pair_count].end = i;
> - pair_count++;
> - out = HeapReAlloc(GetProcessHeap(), 0, out, sizeof(BracketPair) * (pair_count+1));
> - out[pair_count].start = -1;
> - stack_top = j+1;
> - break;
> - }
> - }
> + WCHAR c = iso_run->item[i].ch;
> +
> + if (c == 0x232a)
> + c = 0x3009;
> +
> + if (c != open_stack[j])
> + continue;
> +
> + if (!(usp10_array_reserve((void **)&out, &out_size, pair_count + 2, sizeof(*out))))
> + ERR("Failed to grow output array.\n");
> +
> + out[pair_count].start = stack_index[j];
> + out[pair_count].end = i;
> + ++pair_count;
> +
> + out[pair_count].start = -1;
> + stack_top = j + 1;
> + break;
> }
> }
> }
> @@ -746,10 +748,7 @@ static BracketPair *computeBracketPairs(IsolatedRun *iso_run)
> heap_free(stack_index);
>
> if (!pair_count)
> - {
> - heap_free(out);
> return NULL;
> - }
>
> qsort(out, pair_count, sizeof(*out), compr);
>
>
More information about the wine-devel
mailing list