rregsub.c (1153B)
1 #include "plan9.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 }