xref: /plan9/sys/src/libregexp/rregsub.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include "regexp.h"
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier /* substitute into one string using the matches from the last regexec() */
63e12c5d1SDavid du Colombier extern	void
rregsub(Rune * sp,Rune * dp,int dlen,Resub * mp,int ms)73e12c5d1SDavid du Colombier rregsub(Rune *sp,	/* source string */
83e12c5d1SDavid du Colombier 	Rune *dp,	/* destination string */
9*9a747e4fSDavid du Colombier 	int dlen,
103e12c5d1SDavid du Colombier 	Resub *mp,	/* subexpression elements */
113e12c5d1SDavid du Colombier 	int ms)		/* number of elements pointed to by mp */
123e12c5d1SDavid du Colombier {
13*9a747e4fSDavid du Colombier 	Rune *ssp, *ep;
143e12c5d1SDavid du Colombier 	int i;
153e12c5d1SDavid du Colombier 
16*9a747e4fSDavid du Colombier 	ep = dp+(dlen/sizeof(Rune))-1;
173e12c5d1SDavid du Colombier 	while(*sp != '\0'){
183e12c5d1SDavid du Colombier 		if(*sp == '\\'){
193e12c5d1SDavid du Colombier 			switch(*++sp){
203e12c5d1SDavid du Colombier 			case '0':
213e12c5d1SDavid du Colombier 			case '1':
223e12c5d1SDavid du Colombier 			case '2':
233e12c5d1SDavid du Colombier 			case '3':
243e12c5d1SDavid du Colombier 			case '4':
253e12c5d1SDavid du Colombier 			case '5':
263e12c5d1SDavid du Colombier 			case '6':
273e12c5d1SDavid du Colombier 			case '7':
283e12c5d1SDavid du Colombier 			case '8':
293e12c5d1SDavid du Colombier 			case '9':
303e12c5d1SDavid du Colombier 				i = *sp-'0';
313e12c5d1SDavid du Colombier 				if(mp[i].rsp != 0 && mp!=0 && ms>i)
323e12c5d1SDavid du Colombier 					for(ssp = mp[i].rsp;
333e12c5d1SDavid du Colombier 					     ssp < mp[i].rep;
343e12c5d1SDavid du Colombier 					     ssp++)
35*9a747e4fSDavid du Colombier 						if(dp < ep)
363e12c5d1SDavid du Colombier 							*dp++ = *ssp;
373e12c5d1SDavid du Colombier 				break;
383e12c5d1SDavid du Colombier 			case '\\':
39*9a747e4fSDavid du Colombier 				if(dp < ep)
403e12c5d1SDavid du Colombier 					*dp++ = '\\';
413e12c5d1SDavid du Colombier 				break;
423e12c5d1SDavid du Colombier 			case '\0':
433e12c5d1SDavid du Colombier 				sp--;
443e12c5d1SDavid du Colombier 				break;
453e12c5d1SDavid du Colombier 			default:
46*9a747e4fSDavid du Colombier 				if(dp < ep)
473e12c5d1SDavid du Colombier 					*dp++ = *sp;
483e12c5d1SDavid du Colombier 				break;
493e12c5d1SDavid du Colombier 			}
503e12c5d1SDavid du Colombier 		}else if(*sp == '&'){
513e12c5d1SDavid du Colombier 			if(mp[0].rsp != 0 && mp!=0 && ms>0)
523e12c5d1SDavid du Colombier 			if(mp[0].rsp != 0)
533e12c5d1SDavid du Colombier 				for(ssp = mp[0].rsp;
543e12c5d1SDavid du Colombier 				     ssp < mp[0].rep; ssp++)
55*9a747e4fSDavid du Colombier 					if(dp < ep)
563e12c5d1SDavid du Colombier 						*dp++ = *ssp;
57*9a747e4fSDavid du Colombier 		}else{
58*9a747e4fSDavid du Colombier 			if(dp < ep)
593e12c5d1SDavid du Colombier 				*dp++ = *sp;
60*9a747e4fSDavid du Colombier 		}
613e12c5d1SDavid du Colombier 		sp++;
623e12c5d1SDavid du Colombier 	}
633e12c5d1SDavid du Colombier 	*dp = '\0';
643e12c5d1SDavid du Colombier }
65