Annotation of quake2/linux/glob.c, revision 1.1.1.1

1.1       root        1: 
                      2: #include <stdio.h>
                      3: #include "../linux/glob.h"
                      4: 
                      5: /* Like glob_match, but match PATTERN against any final segment of TEXT.  */
                      6: static int glob_match_after_star(char *pattern, char *text)
                      7: {
                      8:        register char *p = pattern, *t = text;
                      9:        register char c, c1;
                     10: 
                     11:        while ((c = *p++) == '?' || c == '*')
                     12:                if (c == '?' && *t++ == '\0')
                     13:                        return 0;
                     14: 
                     15:        if (c == '\0')
                     16:                return 1;
                     17: 
                     18:        if (c == '\\')
                     19:                c1 = *p;
                     20:        else
                     21:                c1 = c;
                     22: 
                     23:        while (1) {
                     24:                if ((c == '[' || *t == c1) && glob_match(p - 1, t))
                     25:                        return 1;
                     26:                if (*t++ == '\0')
                     27:                        return 0;
                     28:        }
                     29: }
                     30: 
                     31: /* Return nonzero if PATTERN has any special globbing chars in it.  */
                     32: static int glob_pattern_p(char *pattern)
                     33: {
                     34:        register char *p = pattern;
                     35:        register char c;
                     36:        int open = 0;
                     37: 
                     38:        while ((c = *p++) != '\0')
                     39:                switch (c) {
                     40:                case '?':
                     41:                case '*':
                     42:                        return 1;
                     43: 
                     44:                case '[':               /* Only accept an open brace if there is a close */
                     45:                        open++;         /* brace to match it.  Bracket expressions must be */
                     46:                        continue;       /* complete, according to Posix.2 */
                     47:                case ']':
                     48:                        if (open)
                     49:                                return 1;
                     50:                        continue;
                     51: 
                     52:                case '\\':
                     53:                        if (*p++ == '\0')
                     54:                                return 0;
                     55:                }
                     56: 
                     57:        return 0;
                     58: }
                     59: 
                     60: /* Match the pattern PATTERN against the string TEXT;
                     61:    return 1 if it matches, 0 otherwise.
                     62: 
                     63:    A match means the entire string TEXT is used up in matching.
                     64: 
                     65:    In the pattern string, `*' matches any sequence of characters,
                     66:    `?' matches any character, [SET] matches any character in the specified set,
                     67:    [!SET] matches any character not in the specified set.
                     68: 
                     69:    A set is composed of characters or ranges; a range looks like
                     70:    character hyphen character (as in 0-9 or A-Z).
                     71:    [0-9a-zA-Z_] is the set of characters allowed in C identifiers.
                     72:    Any other character in the pattern must be matched exactly.
                     73: 
                     74:    To suppress the special syntactic significance of any of `[]*?!-\',
                     75:    and match the character exactly, precede it with a `\'.
                     76: */
                     77: 
                     78: int glob_match(char *pattern, char *text)
                     79: {
                     80:        register char *p = pattern, *t = text;
                     81:        register char c;
                     82: 
                     83:        while ((c = *p++) != '\0')
                     84:                switch (c) {
                     85:                case '?':
                     86:                        if (*t == '\0')
                     87:                                return 0;
                     88:                        else
                     89:                                ++t;
                     90:                        break;
                     91: 
                     92:                case '\\':
                     93:                        if (*p++ != *t++)
                     94:                                return 0;
                     95:                        break;
                     96: 
                     97:                case '*':
                     98:                        return glob_match_after_star(p, t);
                     99: 
                    100:                case '[':
                    101:                        {
                    102:                                register char c1 = *t++;
                    103:                                int invert;
                    104: 
                    105:                                if (!c1)
                    106:                                        return (0);
                    107: 
                    108:                                invert = ((*p == '!') || (*p == '^'));
                    109:                                if (invert)
                    110:                                        p++;
                    111: 
                    112:                                c = *p++;
                    113:                                while (1) {
                    114:                                        register char cstart = c, cend = c;
                    115: 
                    116:                                        if (c == '\\') {
                    117:                                                cstart = *p++;
                    118:                                                cend = cstart;
                    119:                                        }
                    120:                                        if (c == '\0')
                    121:                                                return 0;
                    122: 
                    123:                                        c = *p++;
                    124:                                        if (c == '-' && *p != ']') {
                    125:                                                cend = *p++;
                    126:                                                if (cend == '\\')
                    127:                                                        cend = *p++;
                    128:                                                if (cend == '\0')
                    129:                                                        return 0;
                    130:                                                c = *p++;
                    131:                                        }
                    132:                                        if (c1 >= cstart && c1 <= cend)
                    133:                                                goto match;
                    134:                                        if (c == ']')
                    135:                                                break;
                    136:                                }
                    137:                                if (!invert)
                    138:                                        return 0;
                    139:                                break;
                    140: 
                    141:                          match:
                    142:                                /* Skip the rest of the [...] construct that already matched.  */
                    143:                                while (c != ']') {
                    144:                                        if (c == '\0')
                    145:                                                return 0;
                    146:                                        c = *p++;
                    147:                                        if (c == '\0')
                    148:                                                return 0;
                    149:                                        else if (c == '\\')
                    150:                                                ++p;
                    151:                                }
                    152:                                if (invert)
                    153:                                        return 0;
                    154:                                break;
                    155:                        }
                    156: 
                    157:                default:
                    158:                        if (c != *t++)
                    159:                                return 0;
                    160:                }
                    161: 
                    162:        return *t == '\0';
                    163: }
                    164: 

unix.superglobalmegacorp.com

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