summaryrefslogtreecommitdiff
path: root/src/data.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2020-01-17 23:59:52 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2020-01-18 00:02:12 -0800
commitac121d8c8f1863c0c1a0f3c8250518abfc26b2a9 (patch)
tree7e09d7970d81dc656b4431daeb647a3d6ec7f194 /src/data.c
parentc1b6d5c5b9f8eee8aa3a8071292e8b3281ecf28a (diff)
downloademacs-ac121d8c8f1863c0c1a0f3c8250518abfc26b2a9.tar.gz
Make Faset nonrecursive
* src/data.c (Faset): Refactor Faset so that it’s not recursive. This helps the compiler and makes the code a bit clearer.
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c56
1 files changed, 28 insertions, 28 deletions
diff --git a/src/data.c b/src/data.c
index cd7db6a0bb9..fae9cee7db1 100644
--- a/src/data.c
+++ b/src/data.c
@@ -2293,45 +2293,45 @@ bool-vector. IDX starts at 0. */)
}
else /* STRINGP */
{
- int c;
-
CHECK_IMPURE (array, XSTRING (array));
if (idxval < 0 || idxval >= SCHARS (array))
args_out_of_range (array, idx);
CHECK_CHARACTER (newelt);
- c = XFIXNAT (newelt);
+ int c = XFIXNAT (newelt);
+ ptrdiff_t idxval_byte;
+ int prev_bytes;
+ unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
if (STRING_MULTIBYTE (array))
{
- unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf;
- ptrdiff_t idxval_byte = string_char_to_byte (array, idxval);
- unsigned char *p1 = SDATA (array) + idxval_byte;
-
- int prev_bytes = BYTES_BY_CHAR_HEAD (*p1);
- int new_bytes = CHAR_STRING (c, p0);
- if (prev_bytes != new_bytes)
- p1 = resize_string_data (array, idxval_byte, prev_bytes, new_bytes);
-
- do
- *p1++ = *p0++;
- while (--new_bytes != 0);
+ idxval_byte = string_char_to_byte (array, idxval);
+ p1 = SDATA (array) + idxval_byte;
+ prev_bytes = BYTES_BY_CHAR_HEAD (*p1);
}
- else
+ else if (SINGLE_BYTE_CHAR_P (c))
{
- if (! SINGLE_BYTE_CHAR_P (c))
- {
- ptrdiff_t i;
-
- for (i = SBYTES (array) - 1; i >= 0; i--)
- if (SREF (array, i) >= 0x80)
- args_out_of_range (array, newelt);
- /* ARRAY is an ASCII string. Convert it to a multibyte
- string, and try `aset' again. */
- STRING_SET_MULTIBYTE (array);
- return Faset (array, idx, newelt);
- }
SSET (array, idxval, c);
+ return newelt;
}
+ else
+ {
+ for (ptrdiff_t i = SBYTES (array) - 1; i >= 0; i--)
+ if (!ASCII_CHAR_P (SREF (array, i)))
+ args_out_of_range (array, newelt);
+ /* ARRAY is an ASCII string. Convert it to a multibyte string. */
+ STRING_SET_MULTIBYTE (array);
+ idxval_byte = idxval;
+ p1 = SDATA (array) + idxval_byte;
+ prev_bytes = 1;
+ }
+
+ int new_bytes = CHAR_STRING (c, p0);
+ if (prev_bytes != new_bytes)
+ p1 = resize_string_data (array, idxval_byte, prev_bytes, new_bytes);
+
+ do
+ *p1++ = *p0++;
+ while (--new_bytes != 0);
}
return newelt;