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