xref: /plan9-contrib/sys/src/ape/lib/regexp/regsub.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include <stdlib.h>
2 #include <stdio.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 	Resub *mp,	/* subexpression elements */
10 	int ms)		/* number of elements pointed to by mp */
11 {
12 	char *ssp;
13 	int i;
14 
15 	while(*sp != '\0'){
16 		if(*sp == '\\'){
17 			switch(*++sp){
18 			case '0':
19 			case '1':
20 			case '2':
21 			case '3':
22 			case '4':
23 			case '5':
24 			case '6':
25 			case '7':
26 			case '8':
27 			case '9':
28 				i = *sp-'0';
29 				if(mp[i].s.sp != 0 && mp!=0 && ms>i)
30 					for(ssp = mp[i].s.sp;
31 					     ssp < mp[i].e.ep;
32 					     ssp++)
33 						*dp++ = *ssp;
34 				break;
35 			case '\\':
36 				*dp++ = '\\';
37 				break;
38 			case '\0':
39 				sp--;
40 				break;
41 			default:
42 				*dp++ = *sp;
43 				break;
44 			}
45 		}else if(*sp == '&'){
46 			if(mp[0].s.sp != 0 && mp!=0 && ms>0)
47 			if(mp[0].s.sp != 0)
48 				for(ssp = mp[0].s.sp;
49 				     ssp < mp[0].e.ep; ssp++)
50 					*dp++ = *ssp;
51 		}else
52 			*dp++ = *sp;
53 		sp++;
54 	}
55 	*dp = '\0';
56 }
57