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 rregsub(Rune * sp,Rune * dp,int dlen,Resub * mp,int ms)7rregsub(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 } 65