summaryrefslogtreecommitdiff
path: root/sys/src/libregexp/regsub.c
diff options
context:
space:
mode:
authorben <ben@rana>2016-04-26 22:23:44 -0500
committerben <ben@rana>2016-04-26 22:23:44 -0500
commit0a460e1722c50e31653359f8a86fe0b606d2b513 (patch)
treeb5a00bbfc883aa98709db012e0a7bacc67e234af /sys/src/libregexp/regsub.c
parent651d6c2bc68e7e5224c3ba41b094e37b1c1890ed (diff)
New libregexp and APE ported to native
Diffstat (limited to 'sys/src/libregexp/regsub.c')
-rw-r--r--sys/src/libregexp/regsub.c109
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';
}