Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature_fixcpp/sys/src/libregexp/regsub.c – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include "regexp.h"
4
 
5
/* substitute into one string using the matches from the last regexec() */
6
extern	void
7
regsub(char *sp,	/* source string */
8
	char *dp,	/* destination string */
9
	int dlen,
10
	Resub *mp,	/* subexpression elements */
11
	int ms)		/* number of elements pointed to by mp */
12
{
13
	char *ssp, *ep;
14
	int i;
15
 
16
	ep = dp+dlen-1;
17
	while(*sp != '\0'){
18
		if(*sp == '\\'){
19
			switch(*++sp){
20
			case '0':
21
			case '1':
22
			case '2':
23
			case '3':
24
			case '4':
25
			case '5':
26
			case '6':
27
			case '7':
28
			case '8':
29
			case '9':
30
				i = *sp-'0';
31
				if(mp!=0 && mp[i].sp != 0 && ms>i)
32
					for(ssp = mp[i].sp;
33
					     ssp < mp[i].ep;
34
					     ssp++)
35
						if(dp < ep)
36
							*dp++ = *ssp;
37
				break;
38
			case '\\':
39
				if(dp < ep)
40
					*dp++ = '\\';
41
				break;
42
			case '\0':
43
				sp--;
44
				break;
45
			default:
46
				if(dp < ep)
47
					*dp++ = *sp;
48
				break;
49
			}
50
		}else if(*sp == '&'){
51
			if(mp!=0 && mp[0].sp != 0 && ms>0)
52
				for(ssp = mp[0].sp;
53
				     ssp < mp[0].ep; ssp++)
54
					if(dp < ep)
55
						*dp++ = *ssp;
56
		}else{
57
			if(dp < ep)
58
				*dp++ = *sp;
59
		}
60
		sp++;
61
	}
62
	*dp = '\0';
63
}