xref: /plan9-contrib/sys/src/libregexp/rregsub.c (revision 0a4f5b8ee35d2d62b8600a1c256abb8ff2d92d7d)
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 */
99a747e4fSDavid 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 {
139a747e4fSDavid du Colombier 	Rune *ssp, *ep;
143e12c5d1SDavid du Colombier 	int i;
153e12c5d1SDavid du Colombier 
169a747e4fSDavid 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';
31*0a4f5b8eSDavid du Colombier 				if(mp!=0 && mp[i].rsp != 0 && ms>i)
323e12c5d1SDavid du Colombier 					for(ssp = mp[i].rsp;
333e12c5d1SDavid du Colombier 					     ssp < mp[i].rep;
343e12c5d1SDavid du Colombier 					     ssp++)
359a747e4fSDavid du Colombier 						if(dp < ep)
363e12c5d1SDavid du Colombier 							*dp++ = *ssp;
373e12c5d1SDavid du Colombier 				break;
383e12c5d1SDavid du Colombier 			case '\\':
399a747e4fSDavid 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:
469a747e4fSDavid 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 				for(ssp = mp[0].rsp;
533e12c5d1SDavid du Colombier 				     ssp < mp[0].rep; ssp++)
549a747e4fSDavid du Colombier 					if(dp < ep)
553e12c5d1SDavid du Colombier 						*dp++ = *ssp;
569a747e4fSDavid du Colombier 		}else{
579a747e4fSDavid du Colombier 			if(dp < ep)
583e12c5d1SDavid du Colombier 				*dp++ = *sp;
599a747e4fSDavid du Colombier 		}
603e12c5d1SDavid du Colombier 		sp++;
613e12c5d1SDavid du Colombier 	}
623e12c5d1SDavid du Colombier 	*dp = '\0';
633e12c5d1SDavid du Colombier }
64