diff options
author | ben <ben@rana> | 2016-04-26 22:23:44 -0500 |
---|---|---|
committer | ben <ben@rana> | 2016-04-26 22:23:44 -0500 |
commit | 0a460e1722c50e31653359f8a86fe0b606d2b513 (patch) | |
tree | b5a00bbfc883aa98709db012e0a7bacc67e234af /sys/src/libregexp/regsub.c | |
parent | 651d6c2bc68e7e5224c3ba41b094e37b1c1890ed (diff) |
New libregexp and APE ported to native
Diffstat (limited to 'sys/src/libregexp/regsub.c')
-rw-r--r-- | sys/src/libregexp/regsub.c | 109 |
1 files changed, 56 insertions, 53 deletions
diff --git a/sys/src/libregexp/regsub.c b/sys/src/libregexp/regsub.c index 2474d2989..d11d86f25 100644 --- a/sys/src/libregexp/regsub.c +++ b/sys/src/libregexp/regsub.c @@ -1,63 +1,66 @@ #include <u.h> #include <libc.h> -#include "regexp.h" +#include <regexp.h> -/* substitute into one string using the matches from the last regexec() */ -extern void -regsub(char *sp, /* source string */ - char *dp, /* destination string */ - int dlen, - Resub *mp, /* subexpression elements */ - int ms) /* number of elements pointed to by mp */ +void +regsub(char *src, char *dst, int dlen, Resub *match, int msize) { - char *ssp, *ep; int i; + char *ep, c; - ep = dp+dlen-1; - 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!=0 && mp[i].sp != 0 && ms>i) - for(ssp = mp[i].sp; - ssp < mp[i].ep; - ssp++) - if(dp < ep) - *dp++ = *ssp; - break; - case '\\': - if(dp < ep) - *dp++ = '\\'; - break; - case '\0': - sp--; - break; - default: - if(dp < ep) - *dp++ = *sp; - break; + ep = dst + dlen-1; + for(;*src != '\0'; src++) switch(*src) { + case '\\': + switch(*++src) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + i = *src - '0'; + if(match != nil && i < msize && match[i].ep != nil) { + c = *match[i].ep; + *match[i].ep = '\0'; + dst = strecpy(dst, ep+1, match[i].sp); + *match[i].ep = c; } - }else if(*sp == '&'){ - if(mp!=0 && mp[0].sp != 0 && ms>0) - for(ssp = mp[0].sp; - ssp < mp[0].ep; ssp++) - if(dp < ep) - *dp++ = *ssp; - }else{ - if(dp < ep) - *dp++ = *sp; + break; + case '\\': + if(dst < ep) + *dst++ = '\\'; + else + goto End; + break; + case '\0': + goto End; + default: + if(dst < ep) + *dst++ = *src; + else + goto End; + break; } - sp++; + break; + case '&': + if(match != nil && msize > 0 && match[0].sp != nil) { + c = *match[0].ep; + *match[0].ep = '\0'; + dst = strecpy(dst, ep+1, match[0].sp); + *match[0].ep = c; + } + break; + default: + if(dst < ep) + *dst++ = *src; + else + goto End; + break; } - *dp = '\0'; +End: + *dst = '\0'; } |