xref: /plan9/sys/src/libregexp/regsub.c (revision 3468a4915d661daa200976acc4f80f51aae144b2)
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
regsub(char * sp,char * dp,int dlen,Resub * mp,int ms)73e12c5d1SDavid du Colombier regsub(char *sp,	/* source string */
83e12c5d1SDavid du Colombier 	char *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 	char *ssp, *ep;
143e12c5d1SDavid du Colombier 	int i;
153e12c5d1SDavid du Colombier 
169a747e4fSDavid du Colombier 	ep = dp+dlen-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*3468a491SDavid du Colombier 				if(mp!=0 && mp[i].sp != 0 && ms>i)
323e12c5d1SDavid du Colombier 					for(ssp = mp[i].sp;
333e12c5d1SDavid du Colombier 					     ssp < mp[i].ep;
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 == '&'){
517ee8ce7cSDavid du Colombier 			if(mp!=0 && mp[0].sp != 0 && ms>0)
523e12c5d1SDavid du Colombier 				for(ssp = mp[0].sp;
533e12c5d1SDavid du Colombier 				     ssp < mp[0].ep; 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