changeset 12807:34d269b30df1

(Freplace_match): New arg SUBEXP.
author Richard M. Stallman <rms@gnu.org>
date Tue, 08 Aug 1995 21:20:07 +0000
parents 826ee893ebdf
children 4db1f387e85f
files src/search.c
diffstat 1 files changed, 42 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/src/search.c	Tue Aug 08 21:18:36 1995 +0000
+++ b/src/search.c	Tue Aug 08 21:20:07 1995 +0000
@@ -1501,7 +1501,7 @@
   return search_command (regexp, bound, noerror, count, 1, 1, 1);
 }
 
-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\
@@ -1521,9 +1521,14 @@
 \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;
@@ -1533,6 +1538,7 @@
   int some_nonuppercase_initial;
   register int c, prevc;
   int inslen;
+  int sub;
 
   CHECK_STRING (newtext, 0);
 
@@ -1545,28 +1551,38 @@
   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;
 
@@ -1577,7 +1593,7 @@
       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);
@@ -1634,8 +1650,8 @@
       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))
@@ -1659,8 +1675,8 @@
 		  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')
 		    {
@@ -1716,7 +1732,7 @@
      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
@@ -1726,7 +1742,7 @@
 
       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 == '\\')
@@ -1735,8 +1751,8 @@
 	      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)
@@ -1754,8 +1770,8 @@
       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));