1 /* 2 * regsub 3 * 4 * Copyright (c) 1986 by University of Toronto. 5 * Written by Henry Spencer. Not derived from licensed software. 6 * 7 * Permission is granted to anyone to use this software for any 8 * purpose on any computer system, and to redistribute it freely, 9 * subject to the following restrictions: 10 * 11 * 1. The author is not responsible for the consequences of use of 12 * this software, no matter how awful, even if they arise 13 * from defects in it. 14 * 15 * 2. The origin of this software must not be misrepresented, either 16 * by explicit claim or by omission. 17 * 18 * 3. Altered versions must be plainly marked as such, and must not 19 * be misrepresented as being the original software. 20 */ 21 22 #include <sys/cdefs.h> 23 #ifndef lint 24 __RCSID("$NetBSD: regsub.c,v 1.5 1997/10/09 10:21:26 lukem Exp $"); 25 #endif /* not lint */ 26 27 #include <regexp.h> 28 #include <stdio.h> 29 #include <string.h> 30 #include "regmagic.h" 31 32 #ifndef CHARBITS 33 #define UCHARAT(p) ((int)*(unsigned char *)(p)) 34 #else 35 #define UCHARAT(p) ((int)*(p)&CHARBITS) 36 #endif 37 38 /* 39 - regsub - perform substitutions after a regexp match 40 */ 41 void 42 regsub(prog, source, dest) 43 const regexp *prog; 44 const char *source; 45 char *dest; 46 { 47 register char *src; 48 register char *dst; 49 register char c; 50 register int no; 51 register int len; 52 53 if (prog == NULL || source == NULL || dest == NULL) { 54 regerror("NULL parm to regsub"); 55 return; 56 } 57 if (UCHARAT(prog->program) != MAGIC) { 58 regerror("damaged regexp fed to regsub"); 59 return; 60 } 61 62 src = (char *)source; 63 dst = dest; 64 while ((c = *src++) != '\0') { 65 if (c == '&') 66 no = 0; 67 else if (c == '\\' && '0' <= *src && *src <= '9') 68 no = *src++ - '0'; 69 else 70 no = -1; 71 if (no < 0) { /* Ordinary character. */ 72 if (c == '\\' && (*src == '\\' || *src == '&')) 73 c = *src++; 74 *dst++ = c; 75 } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) { 76 len = prog->endp[no] - prog->startp[no]; 77 (void) strncpy(dst, prog->startp[no], len); 78 dst += len; 79 if (len != 0 && *(dst-1) == '\0') { /* strncpy hit NUL. */ 80 regerror("damaged match string"); 81 return; 82 } 83 } 84 } 85 *dst++ = '\0'; 86 } 87