ref: 5611a46d8fb04ec3fd60c05a1486743cea98a311
dir: /utils/libregexp/rregsub.c/
#include <lib9.h> #include "regexp.h" /* substitute into one string using the matches from the last regexec() */ extern void rregsub(Rune *sp, /* source string */ Rune *dp, /* destination string */ Resub *mp, /* subexpression elements */ int ms) /* number of elements pointed to by mp */ { Rune *ssp; int i; while(*sp != '\0'){ if(*sp == '\\'){ switch(*++sp){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': i = *sp-'0'; if(mp[i].s.rsp != 0 && mp!=0 && ms>i) for(ssp = mp[i].s.rsp; ssp < mp[i].e.rep; ssp++) *dp++ = *ssp; break; case '\\': *dp++ = '\\'; break; case '\0': sp--; break; default: *dp++ = *sp; break; } }else if(*sp == '&'){ if(mp[0].s.rsp != 0 && mp!=0 && ms>0) if(mp[0].s.rsp != 0) for(ssp = mp[0].s.rsp; ssp < mp[0].e.rep; ssp++) *dp++ = *ssp; }else *dp++ = *sp; sp++; } *dp = '\0'; }