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