On Sun, Mar 17, 2019 at 09:23:23PM -0400, Jerry Geis wrote:
> I am trying to use the fnmatch() function in a C program and pass as the
> 3rd arg (options) of case insensitive search...
> 
> When I use the value FNM_CASEFOLD it does not work...
> 
> I'm confused on what to send to fnmatch() to do a case insensitive search.
> 
> Any pointers ? Thanks.

Depends on what you mean by "doesn't work". If you mean that you
get a compile-time error:

cc -o foo foo.c
foo.c: In function \u2018main\u2019:
foo.c:20:35: error: \u2018FNM_CASEFOLD\u2019 undeclared (first use in this 
function)
  ret = fnmatch (argv[1], argv[2], FNM_CASEFOLD);
                                   ^
foo.c:20:35: note: each undeclared identifier is reported only once for each 
function it appears in

that's what I get too. The man page doesn't say anything about special
requirements to use that function, but if you go look at fnmatch.h, 
you'll find:

#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
# define FNM_FILE_NAME   FNM_PATHNAME   /* Preferred GNU name.  */
# define FNM_LEADING_DIR (1 << 3)       /* Ignore `/...' after a match.  */
# define FNM_CASEFOLD    (1 << 4)       /* Compare without regard to case.  */
# define FNM_EXTMATCH    (1 << 5)       /* Use ksh-like extended matching. */
#endif

which indicates that those values aren't available UNLESS your program
has defines matching the first line shown. I haven't bothered to check
for the value of _POSIX_C_SOURCE in the absence of commandline options
that change the GCC default behavior, but just defining _GNU_SOURCE
is enough to make it compile:

[fredex@fcshome tmp]$ cc -o foo foo.c
[fredex@fcshome tmp]$ 

foo.c:

        #include <stdio.h>
        #include <stdlib.h>

        #define _GNU_SOURCE
        #include <fnmatch.h>

        int main (int argc, char ** argv)
                {
                int ret = 0;

                if (argc != 3)
                        {
                        printf ("Oops. please specify two strings to 
compare\n");
                        exit (0);
                        }

                ret = fnmatch (argv[1], argv[2], FNM_CASEFOLD);
                printf ("fnmatch %s, %s returned %d\n", argv[1], argv[2], ret);

                return 0;
                }

and running it results in:

$ ./foo abc abc
fnmatch abc, abc returned 0

$ ./foo abc aBc
fnmatch abc, aBc returned 0

$ ./foo abc aBcz
fnmatch abc, aBcz returned 1

-- 
-------------------------------------------------------------------------------
 .----    Fred Smith   /              
( /__  ,__.   __   __ /  __   : /     
 /    /  /   /__) /  /  /__) .+'           Home: [email protected] 
/    /  (__ (___ (__(_ (___ / :__                                 781-438-5471 
-------------------------------- Jude 1:24,25 ---------------------------------
_______________________________________________
CentOS mailing list
[email protected]
https://lists.centos.org/mailman/listinfo/centos

Reply via email to