Annotation of coherent/g/usr/lib/misc/regsub.c, revision 1.1

1.1     ! root        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:  ********* This version is slightly altered to fit cleanly with Coherent
        !            21:  ********* libmisc.a. The original may be obtained freely on mwcbbs.
        !            22:  */
        !            23: #include <stdio.h>
        !            24: #include "local_misc.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: #define FAIL(msg) { regerror(msg); return; }
        !            33: 
        !            34: /*
        !            35:  - regsub - perform substitutions after a regexp match
        !            36:  */
        !            37: void
        !            38: regsub(prog, source, dest)
        !            39: regexp *prog;
        !            40: char *source;
        !            41: char *dest;
        !            42: {
        !            43:        register char *src;
        !            44:        register char *dst;
        !            45:        register char c;
        !            46:        register int no;
        !            47:        register int len;
        !            48:        extern char *strncpy();
        !            49: 
        !            50:        if (prog == NULL || source == NULL || dest == NULL)
        !            51:                FAIL("NULL parm to regsub");
        !            52:        if (UCHARAT(prog->program) != (unsigned char)REG_MAGIC)
        !            53:                FAIL("damaged regexp fed to regsub");
        !            54: 
        !            55:        src = source;
        !            56:        dst = dest;
        !            57:        while ((c = *src++) != '\0') {
        !            58:                if (c == '&')
        !            59:                        no = 0;
        !            60:                else if (c == '\\' && '0' <= *src && *src <= '9')
        !            61:                        no = *src++ - '0';
        !            62:                else
        !            63:                        no = -1;
        !            64: 
        !            65:                if (no < 0)     /* Ordinary character. */
        !            66:                        *dst++ = c;
        !            67:                else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
        !            68:                        len = prog->endp[no] - prog->startp[no];
        !            69:                        (void) strncpy(dst, prog->startp[no], len);
        !            70:                        dst += len;
        !            71:                        /* strncpy hit NUL? */
        !            72:                        if (len != 0 && *(dst-1) == '\0')
        !            73:                                FAIL("damaged mch string");
        !            74:                }
        !            75:        }
        !            76:        *dst++ = '\0';
        !            77: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.