rregsub.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
rregsub.c (1156B) | |
--- | |
1 #include "lib9.h" | |
2 #include "regexp9.h" | |
3 | |
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; | |
14 | |
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[i].s.rsp != 0 && mp!=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].s.rsp != 0 && mp!=0 && ms>0) | |
51 if(mp[0].s.rsp != 0) | |
52 for(ssp = mp[0].s.rsp; | |
53 ssp < mp[0].e.rep; 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 } |