13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include "regexp.h" 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier /* substitute into one string using the matches from the last regexec() */ 63e12c5d1SDavid du Colombier extern void regsub(char * sp,char * dp,int dlen,Resub * mp,int ms)73e12c5d1SDavid du Colombierregsub(char *sp, /* source string */ 83e12c5d1SDavid du Colombier char *dp, /* destination string */ 99a747e4fSDavid du Colombier int dlen, 103e12c5d1SDavid du Colombier Resub *mp, /* subexpression elements */ 113e12c5d1SDavid du Colombier int ms) /* number of elements pointed to by mp */ 123e12c5d1SDavid du Colombier { 139a747e4fSDavid du Colombier char *ssp, *ep; 143e12c5d1SDavid du Colombier int i; 153e12c5d1SDavid du Colombier 169a747e4fSDavid du Colombier ep = dp+dlen-1; 173e12c5d1SDavid du Colombier while(*sp != '\0'){ 183e12c5d1SDavid du Colombier if(*sp == '\\'){ 193e12c5d1SDavid du Colombier switch(*++sp){ 203e12c5d1SDavid du Colombier case '0': 213e12c5d1SDavid du Colombier case '1': 223e12c5d1SDavid du Colombier case '2': 233e12c5d1SDavid du Colombier case '3': 243e12c5d1SDavid du Colombier case '4': 253e12c5d1SDavid du Colombier case '5': 263e12c5d1SDavid du Colombier case '6': 273e12c5d1SDavid du Colombier case '7': 283e12c5d1SDavid du Colombier case '8': 293e12c5d1SDavid du Colombier case '9': 303e12c5d1SDavid du Colombier i = *sp-'0'; 31*3468a491SDavid du Colombier if(mp!=0 && mp[i].sp != 0 && ms>i) 323e12c5d1SDavid du Colombier for(ssp = mp[i].sp; 333e12c5d1SDavid du Colombier ssp < mp[i].ep; 343e12c5d1SDavid du Colombier ssp++) 359a747e4fSDavid du Colombier if(dp < ep) 363e12c5d1SDavid du Colombier *dp++ = *ssp; 373e12c5d1SDavid du Colombier break; 383e12c5d1SDavid du Colombier case '\\': 399a747e4fSDavid du Colombier if(dp < ep) 403e12c5d1SDavid du Colombier *dp++ = '\\'; 413e12c5d1SDavid du Colombier break; 423e12c5d1SDavid du Colombier case '\0': 433e12c5d1SDavid du Colombier sp--; 443e12c5d1SDavid du Colombier break; 453e12c5d1SDavid du Colombier default: 469a747e4fSDavid du Colombier if(dp < ep) 473e12c5d1SDavid du Colombier *dp++ = *sp; 483e12c5d1SDavid du Colombier break; 493e12c5d1SDavid du Colombier } 503e12c5d1SDavid du Colombier }else if(*sp == '&'){ 517ee8ce7cSDavid du Colombier if(mp!=0 && mp[0].sp != 0 && ms>0) 523e12c5d1SDavid du Colombier for(ssp = mp[0].sp; 533e12c5d1SDavid du Colombier ssp < mp[0].ep; ssp++) 549a747e4fSDavid du Colombier if(dp < ep) 553e12c5d1SDavid du Colombier *dp++ = *ssp; 569a747e4fSDavid du Colombier }else{ 579a747e4fSDavid du Colombier if(dp < ep) 583e12c5d1SDavid du Colombier *dp++ = *sp; 599a747e4fSDavid du Colombier } 603e12c5d1SDavid du Colombier sp++; 613e12c5d1SDavid du Colombier } 623e12c5d1SDavid du Colombier *dp = '\0'; 633e12c5d1SDavid du Colombier } 64