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