… | |
… | |
6 | #include <string.h> |
6 | #include <string.h> |
7 | #include <stdlib.h> |
7 | #include <stdlib.h> |
8 | #include <stdio.h> |
8 | #include <stdio.h> |
9 | #include <limits.h> |
9 | #include <limits.h> |
10 | #include <float.h> |
10 | #include <float.h> |
|
|
11 | #include <inttypes.h> |
11 | |
12 | |
12 | #if defined(__BORLANDC__) || defined(_MSC_VER) |
13 | #if defined(__BORLANDC__) || defined(_MSC_VER) |
13 | # define snprintf _snprintf // C compilers have this in stdio.h |
14 | # define snprintf _snprintf // C compilers have this in stdio.h |
14 | #endif |
15 | #endif |
15 | |
16 | |
… | |
… | |
361 | } enc_t; |
362 | } enc_t; |
362 | |
363 | |
363 | INLINE void |
364 | INLINE void |
364 | need (enc_t *enc, STRLEN len) |
365 | need (enc_t *enc, STRLEN len) |
365 | { |
366 | { |
366 | if (expect_false (enc->cur + len >= enc->end)) |
367 | if (expect_false ((uintptr_t)(enc->end - enc->cur) < len)) |
367 | { |
368 | { |
368 | STRLEN cur = enc->cur - (char *)SvPVX (enc->sv); |
369 | STRLEN cur = enc->cur - (char *)SvPVX (enc->sv); |
369 | SvGROW (enc->sv, cur + (len < (cur >> 2) ? cur >> 2 : len) + 1); |
370 | SvGROW (enc->sv, cur + (len < (cur >> 2) ? cur >> 2 : len) + 1); |
370 | enc->cur = SvPVX (enc->sv) + cur; |
371 | enc->cur = SvPVX (enc->sv) + cur; |
371 | enc->end = SvPVX (enc->sv) + SvLEN (enc->sv) - 1; |
372 | enc->end = SvPVX (enc->sv) + SvLEN (enc->sv) - 1; |