OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [uclinux/] [uC-libc/] [regexp/] [regsub.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 199 simons
/*
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
 
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') {
75
                                                        /* strncpy hit NUL. */
76
                                regerror("damaged match string");
77
                                return;
78
                        }
79
                }
80
        }
81
        *dst++ = '\0';
82
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.