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 regsub(char * sp,char * dp,int dlen,Resub * mp,int ms)7regsub(char *sp, /* source string */ 8 char *dp, /* destination string */ 9 int dlen, 10 Resub *mp, /* subexpression elements */ 11 int ms) /* number of elements pointed to by mp */ 12 { 13 char *ssp, *ep; 14 int i; 15 16 ep = dp+dlen-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!=0 && mp[i].sp != 0 && ms>i) 32 for(ssp = mp[i].sp; 33 ssp < mp[i].ep; 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 && mp[0].sp != 0 && ms>0) 52 for(ssp = mp[0].sp; 53 ssp < mp[0].ep; 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 } 64