summaryrefslogtreecommitdiffstats
path: root/src/libregexp/rregsub.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-03-05 05:13:56 +0000
committerrsc <devnull@localhost>2004-03-05 05:13:56 +0000
commit62390091b7ff715e9336cc69a3ee41a6c458221e (patch)
tree352da5cb2dce3e3310f6c8324ec79c326d13200a /src/libregexp/rregsub.c
parent4da83e7ccebd8ab6eb33747d16292567ec59d7dd (diff)
downloadplan9port-62390091b7ff715e9336cc69a3ee41a6c458221e.tar.gz
plan9port-62390091b7ff715e9336cc69a3ee41a6c458221e.zip
Update libregexp with recent bug fixes from Plan 9.
Diffstat (limited to 'src/libregexp/rregsub.c')
-rw-r--r--src/libregexp/rregsub.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/libregexp/rregsub.c b/src/libregexp/rregsub.c
index 15f3c174..5a4a564d 100644
--- a/src/libregexp/rregsub.c
+++ b/src/libregexp/rregsub.c
@@ -5,12 +5,14 @@
extern void
rregsub(Rune *sp, /* source string */
Rune *dp, /* destination string */
+ int dlen,
Resub *mp, /* subexpression elements */
int ms) /* number of elements pointed to by mp */
{
- Rune *ssp;
+ Rune *ssp, *ep;
int i;
+ ep = dp+(dlen/sizeof(Rune))-1;
while(*sp != '\0'){
if(*sp == '\\'){
switch(*++sp){
@@ -29,16 +31,19 @@ rregsub(Rune *sp, /* source string */
for(ssp = mp[i].s.rsp;
ssp < mp[i].e.rep;
ssp++)
- *dp++ = *ssp;
+ if(dp < ep)
+ *dp++ = *ssp;
break;
case '\\':
- *dp++ = '\\';
+ if(dp < ep)
+ *dp++ = '\\';
break;
case '\0':
sp--;
break;
default:
- *dp++ = *sp;
+ if(dp < ep)
+ *dp++ = *sp;
break;
}
}else if(*sp == '&'){
@@ -46,9 +51,12 @@ rregsub(Rune *sp, /* source string */
if(mp[0].s.rsp != 0)
for(ssp = mp[0].s.rsp;
ssp < mp[0].e.rep; ssp++)
- *dp++ = *ssp;
- }else
- *dp++ = *sp;
+ if(dp < ep)
+ *dp++ = *ssp;
+ }else{
+ if(dp < ep)
+ *dp++ = *sp;
+ }
sp++;
}
*dp = '\0';