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 #include <regexp.h> 22 #include <stdio.h> 23 #include <string.h> 24 #include "regmagic.h" 25 26 #ifndef CHARBITS 27 #define UCHARAT(p) ((int)*(unsigned char *)(p)) 28 #else 29 #define UCHARAT(p) ((int)*(p)&CHARBITS) 30 #endif 31 32 /* 33 - regsub - perform substitutions after a regexp match 34 */ 35 void 36 regsub(prog, source, dest) 37 const regexp *prog; 38 const char *source; 39 char *dest; 40 { 41 register char *src; 42 register char *dst; 43 register char c; 44 register int no; 45 register int len; 46 extern char *strncpy(); 47 48 if (prog == NULL || source == NULL || dest == NULL) { 49 regerror("NULL parm to regsub"); 50 return; 51 } 52 if (UCHARAT(prog->program) != MAGIC) { 53 regerror("damaged regexp fed to regsub"); 54 return; 55 } 56 57 src = (char *)source; 58 dst = dest; 59 while ((c = *src++) != '\0') { 60 if (c == '&') 61 no = 0; 62 else if (c == '\\' && '0' <= *src && *src <= '9') 63 no = *src++ - '0'; 64 else 65 no = -1; 66 if (no < 0) { /* Ordinary character. */ 67 if (c == '\\' && (*src == '\\' || *src == '&')) 68 c = *src++; 69 *dst++ = c; 70 } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) { 71 len = prog->endp[no] - prog->startp[no]; 72 (void) strncpy(dst, prog->startp[no], len); 73 dst += len; 74 if (len != 0 && *(dst-1) == '\0') { /* strncpy hit NUL. */ 75 regerror("damaged match string"); 76 return; 77 } 78 } 79 } 80 *dst++ = '\0'; 81 } 82