return search_command (regexp, bound, noerror, count, 1, 1, 1);
}
\f
-DEFUN ("replace-match", Freplace_match, Sreplace_match, 1, 4, 0,
+DEFUN ("replace-match", Freplace_match, Sreplace_match, 1, 5, 0,
"Replace text matched by last search with NEWTEXT.\n\
If second arg FIXEDCASE is non-nil, do not alter case of replacement text.\n\
Otherwise maybe capitalize the whole text, or maybe just word initials,\n\
\n\
The optional fourth argument STRING can be a string to modify.\n\
In that case, this function creates and returns a new string\n\
-which is made by replacing the part of STRING that was matched.")
- (newtext, fixedcase, literal, string)
- Lisp_Object newtext, fixedcase, literal, string;
+which is made by replacing the part of STRING that was matched.\n\
+\n\
+The optional fifth argument SUBEXP specifies a subexpression of the match.\n\
+It says to replace just that subexpression instead of the whole match.\n\
+This is useful only after a regular expression search or match\n\
+since only regular expressions have distinguished subexpressions.")
+ (newtext, fixedcase, literal, string, subexp)
+ Lisp_Object newtext, fixedcase, literal, string, subexp;
{
enum { nochange, all_caps, cap_initial } case_action;
register int pos, last;
int some_nonuppercase_initial;
register int c, prevc;
int inslen;
+ int sub;
CHECK_STRING (newtext, 0);
if (search_regs.num_regs <= 0)
error ("replace-match called before any match found");
+ if (NILP (subexp))
+ sub = 0;
+ else
+ {
+ CHECK_NUMBER (subexp, 3);
+ sub = XINT (subexp);
+ if (sub < 0 || sub >= search_regs.num_regs)
+ args_out_of_range (subexp, make_number (search_regs.num_regs));
+ }
+
if (NILP (string))
{
- if (search_regs.start[0] < BEGV
- || search_regs.start[0] > search_regs.end[0]
- || search_regs.end[0] > ZV)
- args_out_of_range (make_number (search_regs.start[0]),
- make_number (search_regs.end[0]));
+ if (search_regs.start[sub] < BEGV
+ || search_regs.start[sub] > search_regs.end[sub]
+ || search_regs.end[sub] > ZV)
+ args_out_of_range (make_number (search_regs.start[sub]),
+ make_number (search_regs.end[sub]));
}
else
{
- if (search_regs.start[0] < 0
- || search_regs.start[0] > search_regs.end[0]
- || search_regs.end[0] > XSTRING (string)->size)
- args_out_of_range (make_number (search_regs.start[0]),
- make_number (search_regs.end[0]));
+ if (search_regs.start[sub] < 0
+ || search_regs.start[sub] > search_regs.end[sub]
+ || search_regs.end[sub] > XSTRING (string)->size)
+ args_out_of_range (make_number (search_regs.start[sub]),
+ make_number (search_regs.end[sub]));
}
if (NILP (fixedcase))
{
/* 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 = FETCH_CHAR (pos);
Lisp_Object before, after;
before = Fsubstring (string, make_number (0),
- make_number (search_regs.start[0]));
- after = Fsubstring (string, make_number (search_regs.end[0]), Qnil);
+ make_number (search_regs.start[sub]));
+ after = Fsubstring (string, make_number (search_regs.end[sub]), Qnil);
/* Do case substitution into NEWTEXT if desired. */
if (NILP (literal))
c = XSTRING (newtext)->data[++pos];
if (c == '&')
{
- substart = search_regs.start[0];
- subend = search_regs.end[0];
+ substart = search_regs.start[sub];
+ subend = search_regs.end[sub];
}
else if (c >= '1' && c <= '9' && c <= search_regs.num_regs + '0')
{
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. */
- SET_PT (search_regs.start[0]);
+ SET_PT (search_regs.start[sub]);
if (!NILP (literal))
Finsert_and_inherit (1, &newtext);
else
for (pos = 0; pos < XSTRING (newtext)->size; pos++)
{
- int offset = point - search_regs.start[0];
+ int offset = point - search_regs.start[sub];
c = XSTRING (newtext)->data[pos];
if (c == '\\')
if (c == '&')
Finsert_buffer_substring
(Fcurrent_buffer (),
- make_number (search_regs.start[0] + offset),
- make_number (search_regs.end[0] + offset));
+ make_number (search_regs.start[sub] + offset),
+ make_number (search_regs.end[sub] + offset));
else if (c >= '1' && c <= '9' && c <= search_regs.num_regs + '0')
{
if (search_regs.start[c - '0'] >= 1)
UNGCPRO;
}
- inslen = point - (search_regs.start[0]);
- del_range (search_regs.start[0] + inslen, search_regs.end[0] + inslen);
+ inslen = point - (search_regs.start[sub]);
+ del_range (search_regs.start[sub] + inslen, search_regs.end[sub] + inslen);
if (case_action == all_caps)
Fupcase_region (make_number (point - inslen), make_number (point));