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 rregsub(Rune * sp,Rune * dp,int dlen,Resub * mp,int ms)73e12c5d1SDavid du Colombierrregsub(Rune *sp, /* source string */ 83e12c5d1SDavid du Colombier Rune *dp, /* destination string */ 9*9a747e4fSDavid 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 { 13*9a747e4fSDavid du Colombier Rune *ssp, *ep; 143e12c5d1SDavid du Colombier int i; 153e12c5d1SDavid du Colombier 16*9a747e4fSDavid du Colombier ep = dp+(dlen/sizeof(Rune))-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'; 313e12c5d1SDavid du Colombier if(mp[i].rsp != 0 && mp!=0 && ms>i) 323e12c5d1SDavid du Colombier for(ssp = mp[i].rsp; 333e12c5d1SDavid du Colombier ssp < mp[i].rep; 343e12c5d1SDavid du Colombier ssp++) 35*9a747e4fSDavid du Colombier if(dp < ep) 363e12c5d1SDavid du Colombier *dp++ = *ssp; 373e12c5d1SDavid du Colombier break; 383e12c5d1SDavid du Colombier case '\\': 39*9a747e4fSDavid 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: 46*9a747e4fSDavid du Colombier if(dp < ep) 473e12c5d1SDavid du Colombier *dp++ = *sp; 483e12c5d1SDavid du Colombier break; 493e12c5d1SDavid du Colombier } 503e12c5d1SDavid du Colombier }else if(*sp == '&'){ 513e12c5d1SDavid du Colombier if(mp[0].rsp != 0 && mp!=0 && ms>0) 523e12c5d1SDavid du Colombier if(mp[0].rsp != 0) 533e12c5d1SDavid du Colombier for(ssp = mp[0].rsp; 543e12c5d1SDavid du Colombier ssp < mp[0].rep; ssp++) 55*9a747e4fSDavid du Colombier if(dp < ep) 563e12c5d1SDavid du Colombier *dp++ = *ssp; 57*9a747e4fSDavid du Colombier }else{ 58*9a747e4fSDavid du Colombier if(dp < ep) 593e12c5d1SDavid du Colombier *dp++ = *sp; 60*9a747e4fSDavid du Colombier } 613e12c5d1SDavid du Colombier sp++; 623e12c5d1SDavid du Colombier } 633e12c5d1SDavid du Colombier *dp = '\0'; 643e12c5d1SDavid du Colombier } 65