diff options
Diffstat (limited to 'src/casefiddle.c')
| -rw-r--r-- | src/casefiddle.c | 42 |
1 files changed, 18 insertions, 24 deletions
diff --git a/src/casefiddle.c b/src/casefiddle.c index 77222c9e0a3..05d689a9eef 100644 --- a/src/casefiddle.c +++ b/src/casefiddle.c | |||
| @@ -82,8 +82,8 @@ casify_object (enum case_action flag, Lisp_Object obj) | |||
| 82 | wrong_type_argument (Qchar_or_string_p, obj); | 82 | wrong_type_argument (Qchar_or_string_p, obj); |
| 83 | else if (!STRING_MULTIBYTE (obj)) | 83 | else if (!STRING_MULTIBYTE (obj)) |
| 84 | { | 84 | { |
| 85 | EMACS_INT i; | 85 | ptrdiff_t i; |
| 86 | EMACS_INT size = SCHARS (obj); | 86 | ptrdiff_t size = SCHARS (obj); |
| 87 | 87 | ||
| 88 | obj = Fcopy_sequence (obj); | 88 | obj = Fcopy_sequence (obj); |
| 89 | for (i = 0; i < size; i++) | 89 | for (i = 0; i < size; i++) |
| @@ -111,26 +111,20 @@ casify_object (enum case_action flag, Lisp_Object obj) | |||
| 111 | } | 111 | } |
| 112 | else | 112 | else |
| 113 | { | 113 | { |
| 114 | EMACS_INT i, i_byte, size = SCHARS (obj); | 114 | ptrdiff_t i, i_byte, size = SCHARS (obj); |
| 115 | int len; | 115 | int len; |
| 116 | USE_SAFE_ALLOCA; | 116 | USE_SAFE_ALLOCA; |
| 117 | unsigned char *dst, *o; | 117 | unsigned char *dst, *o; |
| 118 | /* Over-allocate by 12%: this is a minor overhead, but should be | 118 | ptrdiff_t o_size = (size < STRING_BYTES_BOUND / MAX_MULTIBYTE_LENGTH |
| 119 | sufficient in 99.999% of the cases to avoid a reallocation. */ | 119 | ? size * MAX_MULTIBYTE_LENGTH |
| 120 | EMACS_INT o_size = SBYTES (obj) + SBYTES (obj) / 8 + MAX_MULTIBYTE_LENGTH; | 120 | : STRING_BYTES_BOUND); |
| 121 | SAFE_ALLOCA (dst, void *, o_size); | 121 | SAFE_ALLOCA (dst, void *, o_size); |
| 122 | o = dst; | 122 | o = dst; |
| 123 | 123 | ||
| 124 | for (i = i_byte = 0; i < size; i++, i_byte += len) | 124 | for (i = i_byte = 0; i < size; i++, i_byte += len) |
| 125 | { | 125 | { |
| 126 | if ((o - dst) + MAX_MULTIBYTE_LENGTH > o_size) | 126 | if (o_size - (o - dst) < MAX_MULTIBYTE_LENGTH) |
| 127 | { /* Not enough space for the next char: grow the destination. */ | 127 | string_overflow (); |
| 128 | unsigned char *old_dst = dst; | ||
| 129 | o_size += o_size; /* Probably overkill, but extremely rare. */ | ||
| 130 | SAFE_ALLOCA (dst, void *, o_size); | ||
| 131 | memcpy (dst, old_dst, o - old_dst); | ||
| 132 | o = dst + (o - old_dst); | ||
| 133 | } | ||
| 134 | c = STRING_CHAR_AND_LENGTH (SDATA (obj) + i_byte, len); | 128 | c = STRING_CHAR_AND_LENGTH (SDATA (obj) + i_byte, len); |
| 135 | if (inword && flag != CASE_CAPITALIZE_UP) | 129 | if (inword && flag != CASE_CAPITALIZE_UP) |
| 136 | c = downcase (c); | 130 | c = downcase (c); |
| @@ -199,14 +193,14 @@ casify_region (enum case_action flag, Lisp_Object b, Lisp_Object e) | |||
| 199 | register int c; | 193 | register int c; |
| 200 | register int inword = flag == CASE_DOWN; | 194 | register int inword = flag == CASE_DOWN; |
| 201 | register int multibyte = !NILP (BVAR (current_buffer, enable_multibyte_characters)); | 195 | register int multibyte = !NILP (BVAR (current_buffer, enable_multibyte_characters)); |
| 202 | EMACS_INT start, end; | 196 | ptrdiff_t start, end; |
| 203 | EMACS_INT start_byte; | 197 | ptrdiff_t start_byte; |
| 204 | 198 | ||
| 205 | /* Position of first and last changes. */ | 199 | /* Position of first and last changes. */ |
| 206 | EMACS_INT first = -1, last IF_LINT (= 0); | 200 | ptrdiff_t first = -1, last IF_LINT (= 0); |
| 207 | 201 | ||
| 208 | EMACS_INT opoint = PT; | 202 | ptrdiff_t opoint = PT; |
| 209 | EMACS_INT opoint_byte = PT_BYTE; | 203 | ptrdiff_t opoint_byte = PT_BYTE; |
| 210 | 204 | ||
| 211 | if (EQ (b, e)) | 205 | if (EQ (b, e)) |
| 212 | /* Not modifying because nothing marked */ | 206 | /* Not modifying because nothing marked */ |
| @@ -351,10 +345,10 @@ character positions to operate on. */) | |||
| 351 | } | 345 | } |
| 352 | 346 | ||
| 353 | static Lisp_Object | 347 | static Lisp_Object |
| 354 | operate_on_word (Lisp_Object arg, EMACS_INT *newpoint) | 348 | operate_on_word (Lisp_Object arg, ptrdiff_t *newpoint) |
| 355 | { | 349 | { |
| 356 | Lisp_Object val; | 350 | Lisp_Object val; |
| 357 | EMACS_INT farend; | 351 | ptrdiff_t farend; |
| 358 | EMACS_INT iarg; | 352 | EMACS_INT iarg; |
| 359 | 353 | ||
| 360 | CHECK_NUMBER (arg); | 354 | CHECK_NUMBER (arg); |
| @@ -376,7 +370,7 @@ See also `capitalize-word'. */) | |||
| 376 | (Lisp_Object arg) | 370 | (Lisp_Object arg) |
| 377 | { | 371 | { |
| 378 | Lisp_Object beg, end; | 372 | Lisp_Object beg, end; |
| 379 | EMACS_INT newpoint; | 373 | ptrdiff_t newpoint; |
| 380 | XSETFASTINT (beg, PT); | 374 | XSETFASTINT (beg, PT); |
| 381 | end = operate_on_word (arg, &newpoint); | 375 | end = operate_on_word (arg, &newpoint); |
| 382 | casify_region (CASE_UP, beg, end); | 376 | casify_region (CASE_UP, beg, end); |
| @@ -390,7 +384,7 @@ With negative argument, convert previous words but do not move. */) | |||
| 390 | (Lisp_Object arg) | 384 | (Lisp_Object arg) |
| 391 | { | 385 | { |
| 392 | Lisp_Object beg, end; | 386 | Lisp_Object beg, end; |
| 393 | EMACS_INT newpoint; | 387 | ptrdiff_t newpoint; |
| 394 | XSETFASTINT (beg, PT); | 388 | XSETFASTINT (beg, PT); |
| 395 | end = operate_on_word (arg, &newpoint); | 389 | end = operate_on_word (arg, &newpoint); |
| 396 | casify_region (CASE_DOWN, beg, end); | 390 | casify_region (CASE_DOWN, beg, end); |
| @@ -406,7 +400,7 @@ With negative argument, capitalize previous words but do not move. */) | |||
| 406 | (Lisp_Object arg) | 400 | (Lisp_Object arg) |
| 407 | { | 401 | { |
| 408 | Lisp_Object beg, end; | 402 | Lisp_Object beg, end; |
| 409 | EMACS_INT newpoint; | 403 | ptrdiff_t newpoint; |
| 410 | XSETFASTINT (beg, PT); | 404 | XSETFASTINT (beg, PT); |
| 411 | end = operate_on_word (arg, &newpoint); | 405 | end = operate_on_word (arg, &newpoint); |
| 412 | casify_region (CASE_CAPITALIZE, beg, end); | 406 | casify_region (CASE_CAPITALIZE, beg, end); |