comparison src/search.c @ 2655:594a33ffed85

* search.c (Freplace_match): Arrange for markers sitting at the beginning or end of the original text to float to the corresponding position in the replacement text.
author Jim Blandy <jimb@redhat.com>
date Tue, 04 May 1993 02:35:38 +0000
parents 052bbdf1b817
children e94a593c3952
comparison
equal deleted inserted replaced
2654:ba685dcc3750 2655:594a33ffed85
1234 case_action = cap_initial; 1234 case_action = cap_initial;
1235 else 1235 else
1236 case_action = nochange; 1236 case_action = nochange;
1237 } 1237 }
1238 1238
1239 SET_PT (search_regs.end[0]); 1239 /* We insert the replacement text before the old text, and then
1240 delete the original text. This means that markers at the
1241 beginning or end of the original will float to the corresponding
1242 position in the replacement. */
1243 SET_PT (search_regs.start[0]);
1240 if (!NILP (literal)) 1244 if (!NILP (literal))
1241 Finsert (1, &string); 1245 Finsert (1, &string);
1242 else 1246 else
1243 { 1247 {
1244 struct gcpro gcpro1; 1248 struct gcpro gcpro1;
1245 GCPRO1 (string); 1249 GCPRO1 (string);
1246 1250
1247 for (pos = 0; pos < XSTRING (string)->size; pos++) 1251 for (pos = 0; pos < XSTRING (string)->size; pos++)
1248 { 1252 {
1253 int offset = point - search_regs.start[0];
1254
1249 c = XSTRING (string)->data[pos]; 1255 c = XSTRING (string)->data[pos];
1250 if (c == '\\') 1256 if (c == '\\')
1251 { 1257 {
1252 c = XSTRING (string)->data[++pos]; 1258 c = XSTRING (string)->data[++pos];
1253 if (c == '&') 1259 if (c == '&')
1254 Finsert_buffer_substring (Fcurrent_buffer (), 1260 Finsert_buffer_substring
1255 make_number (search_regs.start[0]), 1261 (Fcurrent_buffer (),
1256 make_number (search_regs.end[0])); 1262 make_number (search_regs.start[0] + offset),
1263 make_number (search_regs.end[0] + offset));
1257 else if (c >= '1' && c <= search_regs.num_regs + '0') 1264 else if (c >= '1' && c <= search_regs.num_regs + '0')
1258 { 1265 {
1259 if (search_regs.start[c - '0'] >= 1) 1266 if (search_regs.start[c - '0'] >= 1)
1260 Finsert_buffer_substring (Fcurrent_buffer (), 1267 Finsert_buffer_substring
1261 make_number (search_regs.start[c - '0']), 1268 (Fcurrent_buffer (),
1262 make_number (search_regs.end[c - '0'])); 1269 make_number (search_regs.start[c - '0'] + offset),
1270 make_number (search_regs.end[c - '0'] + offset));
1263 } 1271 }
1264 else 1272 else
1265 insert_char (c); 1273 insert_char (c);
1266 } 1274 }
1267 else 1275 else
1268 insert_char (c); 1276 insert_char (c);
1269 } 1277 }
1270 UNGCPRO; 1278 UNGCPRO;
1271 } 1279 }
1272 1280
1273 inslen = point - (search_regs.end[0]); 1281 inslen = point - (search_regs.start[0]);
1274 del_range (search_regs.start[0], search_regs.end[0]); 1282 del_range (search_regs.start[0] + inslen, search_regs.end[0] + inslen);
1275 1283
1276 if (case_action == all_caps) 1284 if (case_action == all_caps)
1277 Fupcase_region (make_number (point - inslen), make_number (point)); 1285 Fupcase_region (make_number (point - inslen), make_number (point));
1278 else if (case_action == cap_initial) 1286 else if (case_action == cap_initial)
1279 upcase_initials_region (make_number (point - inslen), make_number (point)); 1287 upcase_initials_region (make_number (point - inslen), make_number (point));