Rewrite for extended test suite.
[kopensolaris-gnu/glibc.git] / posix / globtest.c
1 /* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public License as
6    published by the Free Software Foundation; either version 2 of the
7    License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public
15    License along with the GNU C Library; see the file COPYING.LIB.  If not,
16    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17    Boston, MA 02111-1307, USA.  */
18
19 #include <getopt.h>
20 #include <stdio.h>
21 #include <unistd.h>
22 #include <glob.h>
23
24 int
25 main (int argc, char *argv[])
26 {
27   int i, j;
28   int glob_flags = 0;
29   glob_t g;
30   int quotes = 1;
31
32   while ((i = getopt (argc, argv, "bcdegmopqst")) != -1)
33     switch(i)
34       {
35       case 'b':
36         glob_flags |= GLOB_BRACE;
37         break;
38       case 'c':
39         glob_flags |= GLOB_NOCHECK;
40         break;
41       case 'd':
42         glob_flags |= GLOB_ONLYDIR;
43         break;
44       case 'e':
45         glob_flags |= GLOB_NOESCAPE;
46         break;
47       case 'g':
48         glob_flags |= GLOB_NOMAGIC;
49         break;
50       case 'm':
51         glob_flags |= GLOB_MARK;
52         break;
53       case 'o':
54         glob_flags |= GLOB_DOOFFS;
55         g.gl_offs = 1;
56         break;
57       case 'p':
58         glob_flags |= GLOB_PERIOD;
59         break;
60       case 'q':
61         quotes = 0;
62         break;
63       case 's':
64         glob_flags |= GLOB_NOSORT;
65         break;
66       case 't':
67         glob_flags |= GLOB_TILDE;
68         break;
69       default:
70         exit (-1);
71       }
72
73   if (optind >= argc || chdir (argv[optind]))
74     exit(1);
75
76   j = optind + 1;
77   if (optind + 1 >= argc)
78     exit (1);
79
80   /* Do a glob on each remaining argument.  */
81   for (j = optind + 1; j < argc; j++) {
82     i = glob (argv[j], glob_flags, NULL, &g);
83     if (i != 0)
84       break;
85     glob_flags |= GLOB_APPEND;
86   }
87
88   /* Was there an error? */
89   if (i == GLOB_NOSPACE)
90     puts ("GLOB_NOSPACE");
91   else if (i == GLOB_ABORTED)
92     puts ("GLOB_ABORTED");
93   else if (i == GLOB_NOMATCH)
94     puts ("GLOB_NOMATCH");
95
96   /* If we set an offset, fill in the first field.  */
97   if (glob_flags & GLOB_DOOFFS)
98     g.gl_pathv[0] = (char *) "abc";
99
100   /* Print out the names.  Unless otherwise specified, qoute them.  */
101   if (g.gl_pathv)
102     {
103       for (i = 0; i < g.gl_pathc; ++i)
104         printf ("%s%s%s\n", quotes ? "`" : "", g.gl_pathv[i],
105                 quotes ? "'" : "");
106     }
107   return 0;
108 }