1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
*******************************************************************************
*
* Copyright (C) 2000-2011, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
* file name: uoptions.h
* encoding: UTF-8
* tab size: 8 (not used)
* indentation:4
*
* created on: 2000apr17
* created by: Markus W. Scherer
*
* This file provides a command line argument parser.
*/
#ifndef __UOPTIONS_H__
#define __UOPTIONS_H__
#include "unicode/utypes.h"
/* This should usually be called before calling u_parseArgs */
/*#if U_PLATFORM == U_PF_OS390 && (U_CHARSET_FAMILY == U_ASCII_FAMILY)*/
/* translate args from EBCDIC to ASCII */
/*# define U_MAIN_INIT_ARGS(argc, argv) __argvtoascii_a(argc, argv)*/
/*#elif defined(XP_MAC_CONSOLE)*/
#if defined(XP_MAC_CONSOLE)
# include <console.h>
/* Get the arguments from the GUI, since old Macs don't have a console Window. */
# define U_MAIN_INIT_ARGS(argc, argv) argc = ccommand((char***)&argv)
#else
/* Normally we do nothing. */
# define U_MAIN_INIT_ARGS(argc, argv)
#endif
/* forward declarations for the function declaration */
struct UOption;
typedef struct UOption UOption;
/* function to be called for a command line option */
typedef int UOptionFn(void *context, UOption *option);
/* values of UOption.hasArg */
enum { UOPT_NO_ARG, UOPT_REQUIRES_ARG, UOPT_OPTIONAL_ARG };
/* structure describing a command line option */
struct UOption {
const char *longName; /* "foo" for --foo */
const char *value; /* output placeholder, will point to the argument string, if any */
UOptionFn *optionFn; /* function to be called when this option occurs */
void *context; /* parameter for the function */
char shortName; /* 'f' for -f */
char hasArg; /* enum value: option takes no/requires/may have argument */
char doesOccur; /* boolean for "this one occurred" */
};
/* macro for an entry in a declaration of UOption[] */
#define UOPTION_DEF(longName, shortName, hasArg) \
{ longName, NULL, NULL, NULL, shortName, hasArg, 0 }
/* ICU Tools option definitions */
#define UOPTION_HELP_H UOPTION_DEF("help", 'h', UOPT_NO_ARG)
#define UOPTION_HELP_QUESTION_MARK UOPTION_DEF("help", '?', UOPT_NO_ARG)
#define UOPTION_VERBOSE UOPTION_DEF("verbose", 'v', UOPT_NO_ARG)
#define UOPTION_QUIET UOPTION_DEF("quiet", 'q', UOPT_NO_ARG)
#define UOPTION_VERSION UOPTION_DEF("version", 'V', UOPT_NO_ARG)
#define UOPTION_COPYRIGHT UOPTION_DEF("copyright", 'c', UOPT_NO_ARG)
#define UOPTION_DESTDIR UOPTION_DEF("destdir", 'd', UOPT_REQUIRES_ARG)
#define UOPTION_SOURCEDIR UOPTION_DEF("sourcedir", 's', UOPT_REQUIRES_ARG)
#define UOPTION_ENCODING UOPTION_DEF("encoding", 'e', UOPT_REQUIRES_ARG)
#define UOPTION_ICUDATADIR UOPTION_DEF("icudatadir", 'i', UOPT_REQUIRES_ARG)
#define UOPTION_WRITE_JAVA UOPTION_DEF("write-java", 'j', UOPT_OPTIONAL_ARG)
#define UOPTION_PACKAGE_NAME UOPTION_DEF("package-name", 'p', UOPT_REQUIRES_ARG)
#define UOPTION_BUNDLE_NAME UOPTION_DEF("bundle-name", 'b', UOPT_REQUIRES_ARG)
/**
* C Command line argument parser.
*
* This function takes the argv[argc] command line and a description of
* the program's options in form of an array of UOption structures.
* Each UOption defines a long and a short name (a string and a character)
* for options like "--foo" and "-f".
*
* Each option is marked with whether it does not take an argument,
* requires one, or optionally takes one. The argument may follow in
* the same argv[] entry for short options, or it may always follow
* in the next argv[] entry.
*
* An argument is in the next argv[] entry for both long and short name
* options, except it is taken from directly behind the short name in
* its own argv[] entry if there are characters following the option letter.
* An argument in its own argv[] entry must not begin with a '-'
* unless it is only the '-' itself. There is no restriction of the
* argument format if it is part of the short name options's argv[] entry.
*
* The argument is stored in the value field of the corresponding
* UOption entry, and the doesOccur field is set to 1 if the option
* is found at all.
*
* Short name options without arguments can be collapsed into a single
* argv[] entry. After an option letter takes an argument, following
* letters will be taken as its argument.
*
* If the same option is found several times, then the last
* argument value will be stored in the value field.
*
* For each option, a function can be called. This could be used
* for options that occur multiple times and all arguments are to
* be collected.
*
* All options are removed from the argv[] array itself. If the parser
* is successful, then it returns the number of remaining non-option
* strings (including argv[0]).
* argv[0], the program name, is never read or modified.
*
* An option "--" ends option processing; everything after this
* remains in the argv[] array.
*
* An option string "-" alone is treated as a non-option.
*
* If an option is not recognized or an argument missing, then
* the parser returns with the negative index of the argv[] entry
* where the error was detected.
*
* The OS/400 compiler requires that argv either be "char* argv[]",
* or "const char* const argv[]", and it will not accept,
* "const char* argv[]" as a definition for main().
*
* @param argv This parameter is modified
* @param options This parameter is modified
*/
U_CAPI int U_EXPORT2
u_parseArgs(int argc, char* argv[],
int optionCount, UOption options[]);
#endif
|