--- compat/posix/current/ChangeLog | 6 + compat/posix/current/cdl/posix.cdl | 18 +++ compat/posix/current/include/fnmatch.h | 68 ++++++++++++ compat/posix/current/src/fnmatch.c | 185 +++++++++++++++++++++++++++++++++ isoinfra/current/ChangeLog | 5 isoinfra/current/cdl/isoinfra.cdl | 6 + isoinfra/current/include/fnmatch.h | 68 ++++++++++++ 7 files changed, 356 insertions(+) Index: packages/isoinfra/current/ChangeLog =================================================================== --- packages.orig/isoinfra/current/ChangeLog +++ packages/isoinfra/current/ChangeLog @@ -1,3 +1,8 @@ +2007-01-24 Peter Korsgaard + + * cdl/isoinfra.cdl: + * include/fnmatch.h: fnmatch() support. + 2006-03-17 Sergei Organov * include/assert.h: Replace #if defined(CYGINT_ISO_EXIT) with #if Index: packages/isoinfra/current/include/fnmatch.h =================================================================== --- /dev/null +++ packages/isoinfra/current/include/fnmatch.h @@ -0,0 +1,68 @@ +#ifndef CYGONCE_ISO_FNMATCH_H +#define CYGONCE_ISO_FNMATCH_H +/*======================================================================== +// +// fnmatch.h +// +// fnmatch() +// +//======================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 2007 eCosCentric Limited +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//======================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): Peter Korsgaard +// Contributors: +// Date: 2007-01-24 +// Purpose: This file provides the fnmatch() function +// required by POSIX 1003.2-1992, section B.6. +// Description: The real contents of this file get set from the +// configuration (set by the implementation) +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//====================================================================== +*/ + +/* CONFIGURATION */ + +#include /* Configuration header */ + +/* INCLUDES */ + +#ifdef CYGBLD_ISO_FNMATCH_HEADER +# include CYGBLD_ISO_FNMATCH_HEADER +#endif + +#endif /* CYGONCE_ISO_FNMATCH_H multiple inclusion protection */ + +/* EOF fnmatch.h */ Index: packages/compat/posix/current/cdl/posix.cdl =================================================================== --- packages.orig/compat/posix/current/cdl/posix.cdl +++ packages/compat/posix/current/cdl/posix.cdl @@ -329,6 +329,24 @@ } # ---------------------------------------------------------------- + # fnmatch component + + cdl_component CYGPKG_POSIX_FNMATCH { + display "POSIX fnmatch configuration" + flavor bool + default_value 1 + requires CYGPKG_LIBC_STRING + requires CYGINT_ISO_CTYPE + requires { CYGBLD_ISO_FNMATCH_HEADER == \ + "" } + description " + This component provides configuration controls for + the POSIX fnmatch() function." + + compile fnmatch.c + } + + # ---------------------------------------------------------------- # Tests cdl_option CYGPKG_POSIX_TESTS { Index: packages/isoinfra/current/cdl/isoinfra.cdl =================================================================== --- packages.orig/isoinfra/current/cdl/isoinfra.cdl +++ packages/isoinfra/current/cdl/isoinfra.cdl @@ -577,6 +577,12 @@ default_value 0 } + cdl_option CYGBLD_ISO_FNMATCH_HEADER { + display "fnmatch implementation header" + flavor booldata + default_value 0 + } + cdl_interface CYGINT_ISO_POSIX_TIMER_TYPES { display "Number of implementations of POSIX timer types" requires { 1 >= CYGINT_ISO_POSIX_TIMER_TYPES } Index: packages/compat/posix/current/ChangeLog =================================================================== --- packages.orig/compat/posix/current/ChangeLog +++ packages/compat/posix/current/ChangeLog @@ -1,3 +1,9 @@ +2007-01-24 Peter Korsgaard + + * cdl/posix.cdl: + * src/fnmatch.c: + * include/fnmatch.h: Added fnmatch() implementation (from NetBSD). + 2006-07-18 Jonathan Larmour * src/signal.cxx (pause): Although already POSIX compliant, if we wait Index: packages/compat/posix/current/include/fnmatch.h =================================================================== --- /dev/null +++ packages/compat/posix/current/include/fnmatch.h @@ -0,0 +1,68 @@ +#ifndef CYGONCE_POSIX_FNMATCH_H +#define CYGONCE_POSIX_FNMATCH_H + +//========================================================================== +// +// fnmatch.h +// +//========================================================================== +//####BSDCOPYRIGHTBEGIN#### +// +// ------------------------------------------- +// +// Portions of this software may have been derived from NetBSD, and are +// covered by the appropriate copyright disclaimers included herein. +// +// ------------------------------------------- +// +//####BSDCOPYRIGHTEND#### + +/* $NetBSD: fnmatch.h,v 1.12 2005/02/03 04:39:32 perry Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fnmatch.h 8.1 (Berkeley) 6/2/93 + */ + +#include +#include // common type definitions and support + +#define FNM_NOMATCH 1 /* Match failed. */ +#define FNM_NOSYS 2 /* Function not implemented. */ + +#define FNM_NOESCAPE 0x01 /* Disable backslash escaping. */ +#define FNM_PATHNAME 0x02 /* Slash must be matched by slash. */ +#define FNM_PERIOD 0x04 /* Period must be matched by period. */ +#define FNM_CASEFOLD 0x08 /* Pattern is matched case-insensitive */ +#define FNM_LEADING_DIR 0x10 /* Ignore / after Imatch. */ + +__externC int +fnmatch(const char *, const char *, int); + +#endif /* !CYGONCE_POSIX_FNMATCH_H */ Index: packages/compat/posix/current/src/fnmatch.c =================================================================== --- /dev/null +++ packages/compat/posix/current/src/fnmatch.c @@ -0,0 +1,185 @@ +/* $NetBSD: fnmatch.c,v 1.21 2005/12/24 21:11:16 perry Exp $ */ + +/* + * Copyright (c) 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Guido van Rossum. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. + * Compares a filename or pathname to a pattern. + */ + +#include // assertion macros +#include +#include +#include + +#define EOS '\0' + +static const char *rangematch(const char *, int, int); + +static inline int +foldcase(int ch, int flags) +{ + + if ((flags & FNM_CASEFOLD) != 0 && isupper(ch)) + return (tolower(ch)); + return (ch); +} + +#define FOLDCASE(ch, flags) foldcase((unsigned char)(ch), (flags)) + +int +fnmatch(const char *pattern, const char *string, int flags) +{ + const char *stringstart; + char c, test; + + CYG_ASSERT(pattern != NULL, "pattern NULL pointer!"); + CYG_ASSERT(string != NULL, "string NULL pointer!"); + + for (stringstart = string;;) + switch (c = FOLDCASE(*pattern++, flags)) { + case EOS: + if ((flags & FNM_LEADING_DIR) && *string == '/') + return (0); + return (*string == EOS ? 0 : FNM_NOMATCH); + case '?': + if (*string == EOS) + return (FNM_NOMATCH); + if (*string == '/' && (flags & FNM_PATHNAME)) + return (FNM_NOMATCH); + if (*string == '.' && (flags & FNM_PERIOD) && + (string == stringstart || + ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) + return (FNM_NOMATCH); + ++string; + break; + case '*': + c = FOLDCASE(*pattern, flags); + /* Collapse multiple stars. */ + while (c == '*') + c = FOLDCASE(*++pattern, flags); + + if (*string == '.' && (flags & FNM_PERIOD) && + (string == stringstart || + ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) + return (FNM_NOMATCH); + + /* Optimize for pattern with * at end or before /. */ + if (c == EOS) { + if (flags & FNM_PATHNAME) + return ((flags & FNM_LEADING_DIR) || + strchr(string, '/') == NULL ? + 0 : FNM_NOMATCH); + else + return (0); + } else if (c == '/' && flags & FNM_PATHNAME) { + if ((string = strchr(string, '/')) == NULL) + return (FNM_NOMATCH); + break; + } + + /* General case, use recursion. */ + while ((test = FOLDCASE(*string, flags)) != EOS) { + if (!fnmatch(pattern, string, + flags & ~FNM_PERIOD)) + return (0); + if (test == '/' && flags & FNM_PATHNAME) + break; + ++string; + } + return (FNM_NOMATCH); + case '[': + if (*string == EOS) + return (FNM_NOMATCH); + if (*string == '/' && flags & FNM_PATHNAME) + return (FNM_NOMATCH); + if ((pattern = + rangematch(pattern, FOLDCASE(*string, flags), + flags)) == NULL) + return (FNM_NOMATCH); + ++string; + break; + case '\\': + if (!(flags & FNM_NOESCAPE)) { + if ((c = FOLDCASE(*pattern++, flags)) == EOS) { + c = '\\'; + --pattern; + } + } + /* FALLTHROUGH */ + default: + if (c != FOLDCASE(*string++, flags)) + return (FNM_NOMATCH); + break; + } + /* NOTREACHED */ +} + +static const char * +rangematch(const char *pattern, int test, int flags) +{ + int negate, ok; + char c, c2; + + CYG_ASSERT(pattern != NULL, "pattern NULL pointer!"); + + /* + * A bracket expression starting with an unquoted circumflex + * character produces unspecified results (IEEE 1003.2-1992, + * 3.13.2). This implementation treats it like '!', for + * consistency with the regular expression syntax. + * J.T. Conklin (conklin@ngai.kaleida.com) + */ + if ((negate = (*pattern == '!' || *pattern == '^')) != 0) + ++pattern; + + for (ok = 0; (c = FOLDCASE(*pattern++, flags)) != ']';) { + if (c == '\\' && !(flags & FNM_NOESCAPE)) + c = FOLDCASE(*pattern++, flags); + if (c == EOS) + return (NULL); + if (*pattern == '-' + && (c2 = FOLDCASE(*(pattern+1), flags)) != EOS && + c2 != ']') { + pattern += 2; + if (c2 == '\\' && !(flags & FNM_NOESCAPE)) + c2 = FOLDCASE(*pattern++, flags); + if (c2 == EOS) + return (NULL); + if (c <= test && test <= c2) + ok = 1; + } else if (c == test) + ok = 1; + } + return (ok == negate ? NULL : pattern); +}