in the pattern. Others don't matter anyway! */
xzero (simple_translate);
for (i = 0; i < 0400; i++)
- simple_translate[i] = i;
+ simple_translate[i] = (Bufbyte) i;
i = 0;
while (i != infinity)
{
while ((j = TRANSLATE (inverse_trt, j)) != k)
{
- simple_translate[j] = k;
+ simple_translate[j] = (Bufbyte) k;
BM_tab[j] = dirlen - i;
}
#endif
defaults to the current buffer. When fourth argument is not a string,
the buffer that the match occurred in has automatically been remembered
and you do not need to specify it.
+
+When fourth argument is nil, STRBUFFER specifies a subexpression of
+the match. It says to replace just that subexpression instead of the
+whole match. This is useful only after a regular expression search or
+match since only regular expressions have distinguished subexpressions.
*/
(replacement, fixedcase, literal, string, strbuffer))
{
Lisp_Object buffer;
int_dynarr *ul_action_dynarr = 0;
int_dynarr *ul_pos_dynarr = 0;
+ int sub = 0;
int speccount;
CHECK_STRING (replacement);
}
else
{
+ if (!NILP (strbuffer))
+ {
+ CHECK_INT (strbuffer);
+ sub = XINT (strbuffer);
+ if (sub < 0 || sub >= (int) search_regs.num_regs)
+ args_out_of_range (strbuffer, make_int (search_regs.num_regs));
+ }
if (!BUFFERP (last_thing_searched))
error ("last thing matched was not a buffer");
buffer = last_thing_searched;
if (NILP (string))
{
- if (search_regs.start[0] < BUF_BEGV (buf)
- || search_regs.start[0] > search_regs.end[0]
- || search_regs.end[0] > BUF_ZV (buf))
- args_out_of_range (make_int (search_regs.start[0]),
- make_int (search_regs.end[0]));
+ if (search_regs.start[sub] < BUF_BEGV (buf)
+ || search_regs.start[sub] > search_regs.end[sub]
+ || search_regs.end[sub] > BUF_ZV (buf))
+ args_out_of_range (make_int (search_regs.start[sub]),
+ make_int (search_regs.end[sub]));
}
else
{
{
/* Decide how to casify by examining the matched text. */
- last = search_regs.end[0];
+ last = search_regs.end[sub];
prevc = '\n';
case_action = all_caps;
some_nonuppercase_initial = 0;
some_uppercase = 0;
- for (pos = search_regs.start[0]; pos < last; pos++)
+ for (pos = search_regs.start[sub]; pos < last; pos++)
{
if (NILP (string))
c = BUF_FETCH_CHAR (buf, pos);
return concat3 (before, replacement, after);
}
- mc_count = begin_multiple_change (buf, search_regs.start[0],
- search_regs.end[0]);
+ mc_count = begin_multiple_change (buf, search_regs.start[sub],
+ search_regs.end[sub]);
/* begin_multiple_change() records an unwind-protect, so we need to
record this value now. */
delete the original text. This means that markers at the
beginning or end of the original will float to the corresponding
position in the replacement. */
- BUF_SET_PT (buf, search_regs.start[0]);
+ BUF_SET_PT (buf, search_regs.start[sub]);
if (!NILP (literal))
Finsert (1, &replacement);
else
GCPRO1 (replacement);
for (strpos = 0; strpos < stlen; strpos++)
{
- Charcount offset = BUF_PT (buf) - search_regs.start[0];
+ /* on the first iteration assert(offset==0),
+ exactly complementing BUF_SET_PT() above.
+ During the loop, it keeps track of the amount inserted.
+ */
+ Charcount offset = BUF_PT (buf) - search_regs.start[sub];
c = string_char (XSTRING (replacement), strpos);
if (c == '\\' && strpos < stlen - 1)
{
+ /* XXX FIXME: replacing just a substring non-literally
+ using backslash refs to the match looks dangerous. But
+ <15366.18513.698042.156573@ns.caldera.de> from Torsten Duwe
+ <duwe@caldera.de> claims Finsert_buffer_substring already
+ handles this correctly.
+ */
c = string_char (XSTRING (replacement), ++strpos);
if (c == '&')
Finsert_buffer_substring
UNGCPRO;
}
- inslen = BUF_PT (buf) - (search_regs.start[0]);
- buffer_delete_range (buf, search_regs.start[0] + inslen, search_regs.end[0] +
- inslen, 0);
+ inslen = BUF_PT (buf) - (search_regs.start[sub]);
+ buffer_delete_range (buf, search_regs.start[sub] + inslen,
+ search_regs.end[sub] + inslen, 0);
if (case_action == all_caps)
Fupcase_region (make_int (BUF_PT (buf) - inslen),