// File: globSample.cpp
// Library: SimpleOpt
// Author: Brodie Thiesfield <code@jellycan.com>
// Source: http://code.jellycan.com/simpleopt/
//
// MIT LICENCE
// ===========
// The licence text below is the boilerplate "MIT Licence" used from:
// http://www.opensource.org/licenses/mit-license.php
//
// Copyright (c) 2006, Brodie Thiesfield
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is furnished
// to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#if defined(_MSC_VER)
# include <windows.h>
# include <tchar.h>
#else
# define TCHAR char
# define _T(x) x
# define _tprintf printf
# define _tmain main
#endif
#include <stdio.h>
#include <locale.h>
#include "SimpleOpt.h"
#include "SimpleGlob.h"
static void ShowUsage()
{
_tprintf(
_T("Usage: globSample [OPTIONS] [FILES]\n")
_T("\n")
_T(" -e Return upon read error (e.g. directory does not have\n")
_T(" read permission)\n")
_T(" -m Append a slash (backslash in Windows) to each path which\n")
_T(" corresponds to a directory\n")
_T(" -s Don't sort the returned pathnames\n")
_T(" -o Sort all pathnames as a single group instead of in filespec groups\n")
_T(" -c If no pattern matches, return the original pattern\n")
_T(" -t Tilde expansion is carried out (on Unix platforms)\n")
_T(" -d Return only directories (not compatible with --only-file)\n")
_T(" -f Return only files (not compatible with --only-dir)\n")
_T(" -n Do not return the \".\" or \"..\" special files\n")
_T("\n")
_T(" -? Output this help.\n")
);
}
CSimpleOpt::SOption g_rgOptions[] =
{
{ SG_GLOB_ERR, _T("-e"), SO_NONE },
{ SG_GLOB_MARK, _T("-m"), SO_NONE },
{ SG_GLOB_NOSORT, _T("-s"), SO_NONE },
{ SG_GLOB_NOCHECK, _T("-c"), SO_NONE },
{ SG_GLOB_TILDE, _T("-t"), SO_NONE },
{ SG_GLOB_ONLYDIR, _T("-d"), SO_NONE },
{ SG_GLOB_ONLYFILE, _T("-f"), SO_NONE },
{ SG_GLOB_NODOT, _T("-n"), SO_NONE },
{ SG_GLOB_FULLSORT, _T("-o"), SO_NONE },
{ 0, _T("-?"), SO_NONE },
{ 0, _T("-h"), SO_NONE },
SO_END_OF_OPTIONS
};
static const TCHAR *
GetLastErrorText(
int a_nError
)
{
switch (a_nError) {
case SO_SUCCESS: return _T("Success");
case SO_OPT_INVALID: return _T("Unrecognized option");
case SO_OPT_MULTIPLE: return _T("Option matched multiple strings");
case SO_ARG_INVALID: return _T("Option does not accept argument");
case SO_ARG_INVALID_TYPE: return _T("Invalid argument format");
case SO_ARG_MISSING: return _T("Required argument is missing");
case SO_ARG_INVALID_DATA: return _T("Invalid argument data");
default: return _T("Unknown error");
}
}
int _tmain(int argc, TCHAR * argv[]) {
unsigned int uiFlags = 0;
CSimpleOpt args(argc, argv, g_rgOptions, true);
while (args.Next()) {
if (args.LastError() != SO_SUCCESS) {
_tprintf(
_T("%s: '%s' (use --help to get command line help)\n"),
GetLastErrorText(args.LastError()), args.OptionText());
continue;
}
if (args.OptionId() == 0) {
ShowUsage();
return 0;
}
uiFlags |= (unsigned int) args.OptionId();
}
CSimpleGlob glob(uiFlags);
if (glob.Add(args.FileCount(), args.Files()) < SG_SUCCESS) {
_tprintf(_T("Error while globbing files\n"));
return 1;
}
for (int n = 0; n < glob.FileCount(); ++n)
_tprintf(_T("file %2d: '%s'\n"), n, glob.File(n));
return 0;
}