aboutsummaryrefslogtreecommitdiffstats
path: root/src/casefiddle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/casefiddle.c')
-rw-r--r--src/casefiddle.c42
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
353static Lisp_Object 347static Lisp_Object
354operate_on_word (Lisp_Object arg, EMACS_INT *newpoint) 348operate_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);