]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libregexp/regsub.c
libregexp: improve the transition to next available thread, instruction, and generation
[plan9front.git] / sys / src / libregexp / regsub.c
1 #include <u.h>
2 #include <libc.h>
3 #include <regexp.h>
4
5 void
6 regsub(char *src, char *dst, int dlen, Resub *match, int msize)
7 {
8         int i;
9         char *ep, c;
10
11         ep = dst + dlen-1;
12         for(;*src != '\0'; src++) switch(*src) {
13         case '\\':
14                 switch(*++src) {
15                 case '0':
16                 case '1':
17                 case '2':
18                 case '3':
19                 case '4':
20                 case '5':
21                 case '6':
22                 case '7':
23                 case '8':
24                 case '9':
25                         i = *src - '0';
26                         if(match != nil && i < msize && match[i].ep != nil) {
27                                 c = *match[i].ep;
28                                 *match[i].ep = '\0';
29                                 dst = strecpy(dst, ep+1, match[i].sp);
30                                 *match[i].ep = c;
31                         }
32                         break;
33                 case '\\':
34                         if(dst < ep)
35                                 *dst++ = '\\';
36                         else
37                                 goto End;
38                         break;
39                 case '\0':
40                         goto End;
41                 default:
42                         if(dst < ep)
43                                 *dst++ = *src;
44                         else
45                                 goto End;
46                         break;
47                 }
48                 break;
49         case '&':
50                 if(match != nil && msize > 0 && match[0].sp != nil) {
51                         c = *match[0].ep;
52                         *match[0].ep = '\0';
53                         dst = strecpy(dst, ep+1, match[0].sp);
54                         *match[0].ep = c;
55                 }
56                 break;
57         default:
58                 if(dst < ep)
59                         *dst++ = *src;
60                 else
61                         goto End;
62                 break;
63         }
64 End:
65         *dst = '\0';
66 }