xref: /plan9/sys/src/libregexp/regsub.c (revision 3468a4915d661daa200976acc4f80f51aae144b2)
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
regsub(char * sp,char * dp,int dlen,Resub * mp,int ms)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 }
64