#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';
}