Annotation of coherent/e/bin/pax/wildmat.c, revision 1.1

1.1     ! root        1: /* $Source: /src386/usr/bin/pax/wildmat.c,v $
        !             2:  *
        !             3:  * $Revision: 1.1 $
        !             4:  *
        !             5:  * wildmat.c - simple regular expression pattern matching routines 
        !             6:  *
        !             7:  * DESCRIPTION 
        !             8:  *
        !             9:  *     These routines provide simple UNIX style regular expression matching.  
        !            10:  *     They were originally written by Rich Salz, the comp.sources.unix 
        !            11:  *     moderator for inclusion in some of his software.  These routines 
        !            12:  *     were released into the public domain and used by John Gilmore in 
        !            13:  *     USTAR. 
        !            14:  *
        !            15:  * AUTHORS 
        !            16:  *
        !            17:  *     Mark H. Colburn, NAPS International ([email protected]        !            18:  *     John Gilmore (gnu@hoptoad) 
        !            19:  *     Rich Salz ([email protected]        !            20:  *
        !            21:  *
        !            22:  * Sponsored by The USENIX Association for public distribution. 
        !            23:  *
        !            24:  * Copyright (c) 1989 Mark H. Colburn.
        !            25:  * All rights reserved.
        !            26:  *
        !            27:  * Redistribution and use in source and binary forms are permitted
        !            28:  * provided that the above copyright notice is duplicated in all such 
        !            29:  * forms and that any documentation, advertising materials, and other 
        !            30:  * materials related to such distribution and use acknowledge that the 
        !            31:  * software was developed * by Mark H. Colburn and sponsored by The 
        !            32:  * USENIX Association. 
        !            33:  *
        !            34:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            35:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            36:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            37:  *
        !            38:  * $Log:       wildmat.c,v $
        !            39:  * Revision 1.1  92/08/28  08:03:16  bin
        !            40:  * Initial revision
        !            41:  * 
        !            42:  * Revision 1.1  89/02/14  16:48:52  jep
        !            43:  * Initial revision
        !            44:  * 
        !            45:  * Revision 1.1  88/12/23  18:02:41  mark
        !            46:  * Initial revision
        !            47:  * 
        !            48:  */
        !            49: 
        !            50: #ifndef lint
        !            51: static char *ident = "$Id: wildmat.c,v 1.1 92/08/28 08:03:16 bin Exp Locker: bin $";
        !            52: static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
        !            53: #endif /* ! lint */
        !            54: 
        !            55: 
        !            56: /* Headers */
        !            57: 
        !            58: #include "pax.h"
        !            59: 
        !            60: 
        !            61: /* Function Prototypes */
        !            62: 
        !            63: #if __STDC__
        !            64: static int star(char *, char *);
        !            65: #else  /* !__STDC__ */
        !            66: static int      star();
        !            67: #endif /* __STDC__ */
        !            68: 
        !            69: 
        !            70: /*
        !            71:  * star - handle trailing * in a regular expression 
        !            72:  *
        !            73:  * DESCRIPTION
        !            74:  *
        !            75:  *     Star is used to match filename expansions containing a trailing
        !            76:  *     asterisk ('*').  Star call wildmat() to determine if the substring
        !            77:  *     passed to it is matches the regular expression.
        !            78:  *
        !            79:  * PARAMETERS 
        !            80:  *
        !            81:  *     char *pattern   - The regular expression which we are supposed to 
        !            82:  *                       match to. 
        !            83:  *     char *source    - The source string which is to be compared to the 
        !            84:  *                       regular expression pattern. 
        !            85:  *
        !            86:  * RETURNS 
        !            87:  *
        !            88:  *     Returns non-zero if the entire source string is completely matched by 
        !            89:  *     the regular expression pattern, returns 0 otherwise. This is used to 
        !            90:  *     see if *'s in a pattern matched the entire source string. 
        !            91:  *
        !            92:  */
        !            93: 
        !            94: #if __STDC__
        !            95: 
        !            96: static int star(char *source, char *pattern)
        !            97: 
        !            98: #else
        !            99: 
        !           100: static int star(source, pattern)
        !           101: char           *source;                /* source operand */
        !           102: char           *pattern;       /* regular expression to match */
        !           103: 
        !           104: #endif
        !           105: {
        !           106:     while (!wildmat(pattern, source)) {
        !           107:        if (*++source == '\0') {
        !           108:            return (0);
        !           109:        }
        !           110:     }
        !           111:     return (1);
        !           112: }
        !           113: 
        !           114: 
        !           115: /*
        !           116:  * wildmat - match a regular expression 
        !           117:  *
        !           118:  * DESCRIPTION
        !           119:  *
        !           120:  *     Wildmat attempts to match the string pointed to by source to the 
        !           121:  *     regular expression pointed to by pattern.  The subset of regular 
        !           122:  *     expression syntax which is supported is defined by POSIX P1003.2 
        !           123:  *     FILENAME EXPANSION rules.
        !           124:  *
        !           125:  * PARAMETERS 
        !           126:  *
        !           127:  *     char *pattern   - The regular expression which we are supposed to 
        !           128:  *                       match to. 
        !           129:  *     char *source    - The source string which is to be compared to the 
        !           130:  *                       regular expression pattern. 
        !           131:  *
        !           132:  * RETURNS 
        !           133:  *
        !           134:  *     Returns non-zero if the source string matches the regular expression 
        !           135:  *     pattern specified, returns 0 otherwise. 
        !           136:  *
        !           137:  */
        !           138: 
        !           139: #if __STDC__
        !           140: 
        !           141: int wildmat(char *pattern, char *source)
        !           142: 
        !           143: #else
        !           144: 
        !           145: int wildmat(pattern, source)
        !           146: char           *pattern;       /* regular expression to match */
        !           147: char           *source;                /* source operand */
        !           148: 
        !           149: #endif
        !           150: {
        !           151:     int             last;      /* last character matched */
        !           152:     int             matched;   /* !0 if a match occurred */
        !           153:     int             reverse;   /* !0 if sense of match is reversed */
        !           154: 
        !           155:     for (; *pattern; source++, pattern++) {
        !           156:        switch (*pattern) {
        !           157:        case '\\':
        !           158:            /* Literal match with following character */
        !           159:            pattern++;
        !           160:            /* FALLTHRU */
        !           161:        default:
        !           162:            if (*source != *pattern) {
        !           163:                return (0);
        !           164:            }
        !           165:            continue;
        !           166:        case '?':
        !           167:            /* Match anything. */
        !           168:            if (*source == '\0') {
        !           169:                return (0);
        !           170:            }
        !           171:            continue;
        !           172:        case '*':
        !           173:            /* Trailing star matches everything. */
        !           174:            return (*++pattern ? star(source, pattern) : 1);
        !           175:        case '[':
        !           176:            /* [^....] means inverse character class. */
        !           177:            if (reverse = pattern[1] == '^') {
        !           178:                pattern++;
        !           179:            }
        !           180:            for (last = 0400, matched = 0;
        !           181:                 *++pattern && *pattern != ']'; last = *pattern) {
        !           182:                /* This next line requires a good C compiler. */
        !           183:                if (*pattern == '-'
        !           184:                    ? *source <= *++pattern && *source >= last
        !           185:                    : *source == *pattern) {
        !           186:                    matched = 1;
        !           187:                }
        !           188:            }
        !           189:            if (matched == reverse) {
        !           190:                return (0);
        !           191:            }
        !           192:            continue;
        !           193:        }
        !           194:     }
        !           195: 
        !           196:     /*
        !           197:      * For "tar" use, matches that end at a slash also work. --hoptoad!gnu 
        !           198:      */
        !           199:     return (*source == '\0' || *source == '/');
        !           200: }

unix.superglobalmegacorp.com

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