]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libregexp/regsub.c
rune(2): add Runeerror reencoding considerations in BUGS section (thanks aiju)
[plan9front.git] / sys / src / libregexp / regsub.c
1 #include <u.h>
2 #include <libc.h>
3 #include "regexp.h"
4
5 /* substitute into one string using the matches from the last regexec() */
6 extern  void
7 regsub(char *sp,        /* source string */
8         char *dp,       /* destination string */
9         int dlen,
10         Resub *mp,      /* subexpression elements */
11         int ms)         /* number of elements pointed to by mp */
12 {
13         char *ssp, *ep;
14         int i;
15
16         ep = dp+dlen-1;
17         while(*sp != '\0'){
18                 if(*sp == '\\'){
19                         switch(*++sp){
20                         case '0':
21                         case '1':
22                         case '2':
23                         case '3':
24                         case '4':
25                         case '5':
26                         case '6':
27                         case '7':
28                         case '8':
29                         case '9':
30                                 i = *sp-'0';
31                                 if(mp!=0 && mp[i].sp != 0 && ms>i)
32                                         for(ssp = mp[i].sp;
33                                              ssp < mp[i].ep;
34                                              ssp++)
35                                                 if(dp < ep)
36                                                         *dp++ = *ssp;
37                                 break;
38                         case '\\':
39                                 if(dp < ep)
40                                         *dp++ = '\\';
41                                 break;
42                         case '\0':
43                                 sp--;
44                                 break;
45                         default:
46                                 if(dp < ep)
47                                         *dp++ = *sp;
48                                 break;
49                         }
50                 }else if(*sp == '&'){
51                         if(mp!=0 && mp[0].sp != 0 && ms>0)
52                                 for(ssp = mp[0].sp;
53                                      ssp < mp[0].ep; ssp++)
54                                         if(dp < ep)
55                                                 *dp++ = *ssp;
56                 }else{
57                         if(dp < ep)
58                                 *dp++ = *sp;
59                 }
60                 sp++;
61         }
62         *dp = '\0';
63 }