Ejemplo n.º 1
0
int fpattern_matchn(const char *pat, const char *fname, int flength, int keepcase)
{
    int     rc;

    /* Check args */
    if (fname == NULL)
        return (FALSE);

    if (pat == NULL)
        return (FALSE);

    /* Assume that pattern is well-formed
     * NOTA BENE: this function may crash on invalid patterns!
     */
    assert(fpattern_isvalid(pat));

    /* Attempt to match pattern against filename */
    if (flength < 0)
        flength = (int)strlen(fname);
    if (keepcase)
        rc = fpattern_submatch(pat, fname, flength);
    else
        rc = fpattern_submatch_tolower(pat, fname, flength);

    return (rc);
}
Ejemplo n.º 2
0
int fpattern_match(const char *pat, const char *fname, int flength, int keepcase)
{
    int     rc;

    /* Check args */
    if (fname == NULL)
        return (FALSE);

    if (pat == NULL)
        return (FALSE);

    /* Verify that the pattern is valid, and get its length */
    if (!fpattern_isvalid(pat))
        return (FALSE);

    /* Attempt to match pattern against filename */
    if (flength < 0)
        flength = (int)strlen(fname);
    if (flength == 0)
        return (pat[0] == '\0');    /* Special case */
    if (keepcase)
        rc = fpattern_submatch(pat, fname, flength);
    else
        rc = fpattern_submatch_tolower(pat, fname, flength);

    return (rc);
}
Ejemplo n.º 3
0
/* returns the largest packet that matches the pattern */
int fpattern_matchcount(const char *pat, const char *fname, int flength, int minlength, int keepcase)
{
    int len;

    if (fname == NULL)
        return (FALSE);

    if (pat == NULL)
        return (FALSE);

    /* Assume that pattern is well-formed */

    /* Attempt to match pattern against filename */
    if (flength < 0)
        flength = (int)strlen(fname);

    if (keepcase) {
        for (len = flength; len > minlength; len--)
            if (fpattern_submatch(pat, fname, len))
                break;
    } else {
        for (len = flength; len > minlength; len--)
            if (fpattern_submatch_tolower(pat, fname, len))
                break;
    } /* if */

    return (len > minlength) ? len : 0;
}
Ejemplo n.º 4
0
int fpattern_matchn(const char *pat, const char *fname)
{
    int		rc;

    /* Check args */
    if (fname == NULL)
        return (FALSE);

    if (pat == NULL)
        return (FALSE);

    /* Assume that pattern is well-formed */

    /* Attempt to match pattern against filename */
    rc = fpattern_submatch(pat, fname);

    return (rc);
}
Ejemplo n.º 5
0
/* returns the largest packet that matches the pattern */
int fpattern_matchcount(const char *pat, const char *fname, int flength, int keepcase)
{
    int len;

    if (fname == NULL)
        return (FALSE);

    if (pat == NULL)
        return (FALSE);

    /* Assume that pattern is well-formed */

    /* Attempt to match pattern against filename */
    if (flength < 0)
        flength = strlen(fname);

    for (len = flength; len >= 0; len--)
        if (fpattern_submatch(pat, fname, flength, keepcase))
            break;

    return len;
}
Ejemplo n.º 6
0
int fpattern_match(const char *pat, const char *fname)
{
    int		rc;

    /* Check args */
    if (fname == NULL)
        return (FALSE);

    if (pat == NULL)
        return (FALSE);

    /* Verify that the pattern is valid, and get its length */
    if (!fpattern_isvalid(pat))
        return (FALSE);

    /* Attempt to match pattern against filename */
    if (fname[0] == '\0')
        return (pat[0] == '\0');	/* Special case */
    rc = fpattern_submatch(pat, fname);

    return (rc);
}
Ejemplo n.º 7
0
static int fpattern_submatch(const char *pat, const char *fname, int flength, int keepcase)
{
    int		fch;
    int		pch;
    int		i;
    int		yes, match;
    int		lo, hi;

    /* Attempt to match subpattern against subfilename */
    while (*pat != '\0')
    {
        fch = *fname;
        pch = *pat;
        pat++;

        switch (pch)
        {
        case FPAT_ANY:
            /* Match a single char */
        #if DELIM
            if (fch == DEL  ||  fch == DEL2  ||  fch == '\0')
                return (FALSE);
        #else
            if (flength == 0)
                return (FALSE);
        #endif
            fname++;
            flength--;
            break;

        case FPAT_CLOS:
            /* Match zero or more chars */
        #if DELIM
            i = 0;
            while (fname[i] != '\0'  &&
                    fname[i] != DEL  &&  fname[i] != DEL2)
                i++;
        #else
            i = flength;
        #endif
            while (i >= 0)
            {
                if (fpattern_submatch(pat, fname+i, flength-i, keepcase))
                    return (TRUE);
                i--;
            }
            return (FALSE);

	#if SUBCLOS
        case SUB:
            /* Match zero or more chars */
            i = 0;
            while (i < flength  &&
        #if DELIM
                    fname[i] != DEL  &&  fname[i] != DEL2  &&
        #endif
                    fname[i] != '.')
                i++;
            while (i >= 0)
            {
                if (fpattern_submatch(pat, fname+i, flength-i, keepcase))
                    return (TRUE);
                i--;
            }
            return (FALSE);
	#endif

        case QUOTE:
            /* Match a quoted char */
            pch = *pat;
            if (lowercase(fch, keepcase) != lowercase(pch, keepcase)  ||  pch == '\0')
                return (FALSE);
            fname++;
            flength--;
            pat++;
            break;

        case FPAT_SET_L:
            /* Match char set/range */
            yes = TRUE;
            if (*pat == FPAT_SET_NOT)
            {
               pat++;
               yes = FALSE;	/* Set negation */
            }

            /* Look for [s], [-], [abc], [a-c] */
            match = !yes;
            while (*pat != FPAT_SET_R  &&  *pat != '\0')
            {
                if (*pat == QUOTE)
                    pat++;	/* Quoted char */

                if (*pat == '\0')
                    break;
                lo = *pat++;
                hi = lo;

                if (*pat == FPAT_SET_THRU)
                {
                    /* Range */
                    pat++;

                    if (*pat == QUOTE)
                        pat++;	/* Quoted char */

                    if (*pat == '\0')
                        break;
                    hi = *pat++;
                }

                if (*pat == '\0')
                    break;

                /* Compare character to set range */
                if (lowercase(fch, keepcase) >= lowercase(lo, keepcase)  &&
                    lowercase(fch, keepcase) <= lowercase(hi, keepcase))
                    match = yes;
            }

            if (!match)
                return (FALSE);

            if (*pat == '\0')
                return (FALSE);		/* Missing closing bracket */

            fname++;
            flength--;
            pat++;
            break;

        case FPAT_MSET_L:
            /* Match zero or more characters in a char set/range */
            yes = TRUE;
            if (*pat == FPAT_SET_NOT)
            {
               pat++;
               yes = FALSE;	/* Set negation */
            }

            do {
                const char *org_pat = pat;
                /* Look for [s], [-], [abc], [a-c] */
                match = !yes;
                while (*pat != FPAT_MSET_R  &&  *pat != '\0')
                {
                    if (*pat == QUOTE)
                        pat++;	/* Quoted char */

                    if (*pat == '\0')
                        break;
                    lo = *pat++;
                    hi = lo;

                    if (*pat == FPAT_SET_THRU)
                    {
                        /* Range */
                        pat++;

                        if (*pat == QUOTE)
                            pat++;	/* Quoted char */

                        if (*pat == '\0')
                            break;
                        hi = *pat++;
                    }

                    if (*pat == '\0')
                        break;

                    /* Compare character to set range */
                    if (lowercase(fch, keepcase) >= lowercase(lo, keepcase)  &&
                        lowercase(fch, keepcase) <= lowercase(hi, keepcase)) {
                        match = yes;
                        while (*pat != FPAT_MSET_R && *pat != '\0')
                            pat++;
                        break;
                    } /* if */
                }

                if (*pat == '\0')
                    return (FALSE);	/* Missing closing bracket */

                if (match) {
                    fname++;
                    flength--;
                    fch = *fname;
                    if (flength > 0)
                        pat = org_pat;
                }

            } while (match && flength > 0);

            pat++;
            break;

        case FPAT_NOT:
            /* Match only if rest of pattern does not match */
            if (*pat == '\0')
                return (FALSE);		/* Missing subpattern */
            i = fpattern_submatch(pat, fname, flength, keepcase);
            return !i;

#if DELIM
        case DEL:
    #if DEL2 != DEL
        case DEL2:
    #endif
            /* Match path delimiter char */
            if (fch != DEL  &&  fch != DEL2)
                return (FALSE);
            fname++;
            flength--;
            break;
#endif

        default:
            /* Match a (non-null) char exactly */
            if (lowercase(fch, keepcase) != lowercase(pch, keepcase))
                return (FALSE);
            fname++;
            flength--;
            break;
        }
    }

    /* Check for complete match */
    if (flength != 0)
        return (FALSE);

    /* Successful match */
    return (TRUE);
}
Ejemplo n.º 8
0
static int fpattern_submatch(const char *pat, const char *fname)
{
    int		fch;
    int		pch;
    int		i;
    int		yes, match;
    int		lo, hi;

    /* Attempt to match subpattern against subfilename */
    while (*pat != '\0')
    {
        fch = *fname;
        pch = *pat;
        pat++;

        switch (pch)
        {
        case FPAT_ANY:
            /* Match a single char */
        #if DELIM
            if (fch == DEL  ||  fch == DEL2CHR  ||  fch == '\0')
                return (FALSE);
        #else
            if (fch == '\0')
                return (FALSE);
        #endif
            fname++;
            break;

        case FPAT_CLOS:
            /* Match zero or more chars */
            i = 0;
        #if DELIM
            while (fname[i] != '\0'  &&
                    fname[i] != DEL  &&  fname[i] != DEL2CHR)
                i++;
        #else
            while (fname[i] != '\0')
                i++;
        #endif
            while (i >= 0)
            {
                if (fpattern_submatch(pat, fname+i))
                    return (TRUE);
                i--;
            }
            return (FALSE);

        case SUBCHR:
            /* Match zero or more chars */
            i = 0;
            while (fname[i] != '\0'  &&
        #if DELIM
                    fname[i] != DEL  &&  fname[i] != DEL2CHR  &&
        #endif
                    fname[i] != '.')
                i++;
            while (i >= 0)
            {
                if (fpattern_submatch(pat, fname+i))
                    return (TRUE);
                i--;
            }
            return (FALSE);

        case QUOTECHR:
            /* Match a quoted char */
            pch = *pat;
            if (lowercase(fch) != lowercase(pch)  ||  pch == '\0')
                return (FALSE);
            fname++;
            pat++;
            break;

        case FPAT_SET_L:
            /* Match char set/range */
            yes = TRUE;
            if (*pat == FPAT_SET_NOT)
            {
               pat++;
               yes = FALSE;	/* Set negation */
            }

            /* Look for [s], [-], [abc], [a-c] */
            match = !yes;
            while (*pat != FPAT_SET_R  &&  *pat != '\0')
            {
                if (*pat == QUOTECHR)
                    pat++;	/* Quoted char */

                if (*pat == '\0')
                    break;
                lo = *pat++;
                hi = lo;

                if (*pat == FPAT_SET_THRU)
                {
                    /* Range */
                    pat++;

                    if (*pat == QUOTECHR)
                        pat++;	/* Quoted char */

                    if (*pat == '\0')
                        break;
                    hi = *pat++;
                }

                if (*pat == '\0')
                    break;

                /* Compare character to set range */
                if (lowercase(fch) >= lowercase(lo)  &&
                    lowercase(fch) <= lowercase(hi))
                    match = yes;
            }

            if (!match)
                return (FALSE);

            if (*pat == '\0')
                return (FALSE);		/* Missing closing bracket */

            fname++;
            pat++;
            break;

        case FPAT_NOT:
            /* Match only if rest of pattern does not match */
            if (*pat == '\0')
                return (FALSE);		/* Missing subpattern */
            i = fpattern_submatch(pat, fname);
            return !i;

#if DELIM
        case DEL:
    #if DEL2CHR != DEL
        case DEL2CHR:
    #endif
            /* Match path delimiter char */
            if (fch != DEL  &&  fch != DEL2CHR)
                return (FALSE);
            fname++;
            break;
#endif

        default:
            /* Match a (non-null) char exactly */
            if (lowercase(fch) != lowercase(pch))
                return (FALSE);
            fname++;
            break;
        }
    }

    /* Check for complete match */
    if (*fname != '\0')
        return (FALSE);

    /* Successful match */
    return (TRUE);
}
Ejemplo n.º 9
0
static int fpattern_submatch(const char *pat, const char *fname, int flength)
{
    int     fch;
    int     pch, pch2;
    int     i;
    int     yes, match;
    int     lo, hi;

    /* Attempt to match subpattern against subfilename */
    while (*pat != '\0')
    {
        fch = (unsigned char)*fname;
        pch = (unsigned char)*pat;
        pat++;

        switch (pch)
        {
        case FPAT_ANY:
            /* Match a single char */
        #if defined FPAT_DELIM
            if (fch == FPAT_DEL  ||  fch == FPAT_DEL2  ||  fch == '\0')
                return (FALSE);
        #else
            if (flength == 0)
                return (FALSE);
        #endif
            fname++;
            flength--;
            break;

        case FPAT_CLOS:
            /* Match zero or more chars */
        #if defined FPAT_DELIM
            i = 0;
            while (fname[i] != '\0'  &&
                    fname[i] != FPAT_DEL  &&  fname[i] != FPAT_DEL2)
                i++;
        #else
            i = flength;
        #endif
            while (i >= 0)
            {
                if (fpattern_submatch(pat, fname+i, flength-i))
                    return (TRUE);
                i--;
            }
            return (FALSE);

    #ifdef FPAT_SUBCLOS
        case FPAT_CLOSP:
            /* Match zero or more chars */
            i = 0;
            while (i < flength  &&
        #if defined FPAT_DELIM
                    fname[i] != FPAT_DEL  &&  fname[i] != FPAT_DEL2  &&
        #endif
                    fname[i] != '.')
                i++;
            while (i >= 0)
            {
                if (fpattern_submatch(pat, fname+i, flength-i))
                    return (TRUE);
                i--;
            }
            return (FALSE);
    #endif

        case FPAT_QUOTE:
            /* Match a quoted char */
            assert(*pat != '\0');
            pch = (unsigned char)*pat;
            if (ishexdigit(pch)) {
                pch2 = *++pat;
                pch = (hexdigit(pch) << 4) | hexdigit(pch2);
            } /* if */
            if ((fch) != (pch))
                return (FALSE);
            fname++;
            flength--;
            pat++;
            break;

        case FPAT_SET_L:
            /* Match char set/range */
            yes = TRUE;
            if (*pat == FPAT_NOT) {
               pat++;
               yes = FALSE; /* Set negation */
            } /* if */

            /* Look for [s], [-], [abc], [a-c] */
            match = !yes;
            while (*pat != FPAT_SET_R) {
                assert(*pat != '\0');
                pch = (unsigned char)*pat++;
                if (pch == FPAT_QUOTE) {
                    assert(*pat != '\0');
                    pch = (unsigned char)*pat++;
                    if (ishexdigit(pch)) {
                        pch2 = *pat++;
                        lo = (hexdigit(pch) << 4) | hexdigit(pch2);
                    } else {
                        lo = pch;
                    } /* if */
                } else {
                    lo = pch;
                } /* if */

                if (*pat == FPAT_SET_THRU) {
                    /* Range */
                    pat++;
                    pch = (unsigned char)*pat++;

                    if (pch == FPAT_QUOTE) {
                        assert(*pat != '\0');
                        pch = (unsigned char)*pat++;
                        if (ishexdigit(pch)) {
                            pch2 = *pat++;
                            hi = (hexdigit(pch) << 4) | hexdigit(pch2);
                        } else {
                            hi = pch;
                        } /* if */
                    } else {
                      hi = pch;
                    } /* if */

                    /* Compare character to set range */
                    if ((fch) >= (lo) && (fch) <= (hi)) {
                        match = yes;
                        /* skip to the end of the set in the pattern (no need to
                         * search further once a match is found)
                         */
                        while (*pat != FPAT_SET_R) {
                            assert(*pat != '\0');
                            pat++;
                        } /* while */
                        break;
                    } /* if */
                } else {
                    /* Compare character to single char from set */
                    if ((fch) == (lo)) {
                        match = yes;
                        /* skip to the end of the set in the pattern (no need to
                         * search further once a match is found)
                         */
                        while (*pat != FPAT_SET_R) {
                            assert(*pat != '\0');
                            pat++;
                        } /* while */
                        break;
                    } /* if */
                } /* if */

                assert(*pat != '\0');
            } /* while */

            if (!match)
                return (FALSE);

            fname++;
            flength--;
            assert(*pat == FPAT_SET_R);
            pat++;
            break;

#if defined FPAT_MSET_ENABLED
        case FPAT_MSET_L:
            /* Match zero or more characters in a char set/range */
            yes = TRUE;
            if (*pat == FPAT_NOT) {
               pat++;
               yes = FALSE; /* Set negation */
            } /* if */

            do {
                const char *org_pat = pat;
                /* Look for [s], [-], [abc], [a-c] */
                match = !yes;
                while (*pat != FPAT_MSET_R) {
                    assert(*pat != '\0');
                    pch = (unsigned char)*pat++;
                    if (pch == FPAT_QUOTE) {
                        assert(*pat != '\0');
                        pch = (unsigned char)*pat++;
                        if (ishexdigit(pch)) {
                            pch2 = *pat++;
                            lo = (hexdigit(pch) << 4) | hexdigit(pch2);
                        } else {
                            lo = pch;
                        } /* if */
                    } else {
                        lo = pch;
                    } /* if */

                    if (*pat == FPAT_SET_THRU) {
                        /* Range */
                        pat++;
                        pch = (unsigned char)*pat++;

                        if (pch == FPAT_QUOTE) {
                            assert(*pat != '\0');
                            pch = (unsigned char)*pat++;
                            if (ishexdigit(pch)) {
                                pch2 = *pat++;
                                hi = (hexdigit(pch) << 4) | hexdigit(pch2);
                            } else {
                                hi = pch;
                            } /* if */
                        } else {
                            hi = pch;
                        } /* if */

                        /* Compare character to set range */
                        if ((fch) >= (lo) && (fch) <= (hi)) {
                            match = yes;
                            /* skip to the end of the set in the pattern (no
                             * need to search further once a match is found)
                             */
                            while (*pat != FPAT_MSET_R) {
                                assert(*pat != '\0');
                                pat++;
                            } /* while */
                            break;
                        } /* if */
                    } else {
                        /* Compare character to single char from the set */
                        if ((fch) == (lo)) {
                            match = yes;
                            /* skip to the end of the set in the pattern (no
                             * need to search further once a match is found)
                             */
                            while (*pat != FPAT_MSET_R) {
                                assert(*pat != '\0');
                                pat++;
                            } /* while */
                            break;
                        } /* if */
                    } /* if */

                    assert(*pat != '\0');
                } /* while */

                assert(*pat == FPAT_MSET_R);

                if (match) {
                    fname++;
                    flength--;
                    fch = *fname;
                    if (flength > 0)
                        pat = org_pat;
                } /* if */

            } while (match && flength > 0);

            pat++;
            break;
#endif  /* FPAT_MSET_ENABLED */

#if defined FPAT_NOT_ENABLED
        case FPAT_NOT:
            /* Match only if rest of pattern does not match */
            assert(*pat != '\0');
            i = fpattern_submatch(pat, fname, flength);
            return !i;
#endif

#if defined FPAT_DELIM
        case FPAT_DEL:
    #if FPAT_DEL2 != FPAT_DEL
        case FPAT_DEL2:
    #endif
            /* Match path delimiter char */
            if (fch != FPAT_DEL  &&  fch != FPAT_DEL2)
                return (FALSE);
            fname++;
            flength--;
            break;
#endif

        default:
            /* Match a (non-null) char exactly */
            if ((fch) != (pch))
                return (FALSE);
            fname++;
            flength--;
            break;
        }
    }

    /* Check for complete match */
    if (flength != 0)
        return (FALSE);

    /* Successful match */
    return (TRUE);
}