Blob


1 #include "lib9.h"
2 #include "regexp9.h"
4 /* substitute into one string using the matches from the last regexec() */
5 extern void
6 rregsub(Rune *sp, /* source string */
7 Rune *dp, /* destination string */
8 int dlen,
9 Resub *mp, /* subexpression elements */
10 int ms) /* number of elements pointed to by mp */
11 {
12 Rune *ssp, *ep;
13 int i;
15 ep = dp+(dlen/sizeof(Rune))-1;
16 while(*sp != '\0'){
17 if(*sp == '\\'){
18 switch(*++sp){
19 case '0':
20 case '1':
21 case '2':
22 case '3':
23 case '4':
24 case '5':
25 case '6':
26 case '7':
27 case '8':
28 case '9':
29 i = *sp-'0';
30 if(mp!=0 && mp[i].s.rsp != 0 && ms>i)
31 for(ssp = mp[i].s.rsp;
32 ssp < mp[i].e.rep;
33 ssp++)
34 if(dp < ep)
35 *dp++ = *ssp;
36 break;
37 case '\\':
38 if(dp < ep)
39 *dp++ = '\\';
40 break;
41 case '\0':
42 sp--;
43 break;
44 default:
45 if(dp < ep)
46 *dp++ = *sp;
47 break;
48 }
49 }else if(*sp == '&'){
50 if(mp!=0 && mp[0].s.rsp != 0 && ms>0)
51 for(ssp = mp[0].s.rsp;
52 ssp < mp[0].e.rep; ssp++)
53 if(dp < ep)
54 *dp++ = *ssp;
55 }else{
56 if(dp < ep)
57 *dp++ = *sp;
58 }
59 sp++;
60 }
61 *dp = '\0';
62 }