]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libregexp/rregsub.c
libsec: use tsmemcmp() when comparing hashes, use mpfield() for ecc, use mptober...
[plan9front.git] / sys / src / libregexp / rregsub.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 rregsub(Rune *sp,       /* source string */
8         Rune *dp,       /* destination string */
9         int dlen,
10         Resub *mp,      /* subexpression elements */
11         int ms)         /* number of elements pointed to by mp */
12 {
13         Rune *ssp, *ep;
14         int i;
15
16         ep = dp+(dlen/sizeof(Rune))-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[i].rsp != 0 && mp!=0 && ms>i)
32                                         for(ssp = mp[i].rsp;
33                                              ssp < mp[i].rep;
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].rsp != 0 && mp!=0 && ms>0)
52                         if(mp[0].rsp != 0)
53                                 for(ssp = mp[0].rsp;
54                                      ssp < mp[0].rep; ssp++)
55                                         if(dp < ep)
56                                                 *dp++ = *ssp;
57                 }else{
58                         if(dp < ep)
59                                 *dp++ = *sp;
60                 }
61                 sp++;
62         }
63         *dp = '\0';
64 }