| Index: icu46/source/tools/toolutil/uoptions.c
|
| ===================================================================
|
| --- icu46/source/tools/toolutil/uoptions.c (revision 0)
|
| +++ icu46/source/tools/toolutil/uoptions.c (revision 0)
|
| @@ -0,0 +1,122 @@
|
| +/*
|
| +*******************************************************************************
|
| +*
|
| +* Copyright (C) 2000, International Business Machines
|
| +* Corporation and others. All Rights Reserved.
|
| +*
|
| +*******************************************************************************
|
| +* file name: uoptions.c
|
| +* encoding: US-ASCII
|
| +* tab size: 8 (not used)
|
| +* indentation:4
|
| +*
|
| +* created on: 2000apr17
|
| +* created by: Markus W. Scherer
|
| +*
|
| +* This file provides a command line argument parser.
|
| +*/
|
| +
|
| +#include "unicode/utypes.h"
|
| +#include "cstring.h"
|
| +#include "uoptions.h"
|
| +
|
| +U_CAPI int U_EXPORT2
|
| +u_parseArgs(int argc, char* argv[],
|
| + int optionCount, UOption options[]) {
|
| + char *arg;
|
| + int i=1, remaining=1;
|
| + char c, stopOptions=0;
|
| +
|
| + while(i<argc) {
|
| + arg=argv[i];
|
| + if(!stopOptions && *arg=='-' && (c=arg[1])!=0) {
|
| + /* process an option */
|
| + UOption *option=NULL;
|
| + arg+=2;
|
| + if(c=='-') {
|
| + /* process a long option */
|
| + if(*arg==0) {
|
| + /* stop processing options after "--" */
|
| + stopOptions=1;
|
| + } else {
|
| + /* search for the option string */
|
| + int j;
|
| + for(j=0; j<optionCount; ++j) {
|
| + if(options[j].longName && uprv_strcmp(arg, options[j].longName)==0) {
|
| + option=options+j;
|
| + break;
|
| + }
|
| + }
|
| + if(option==NULL) {
|
| + /* no option matches */
|
| + return -i;
|
| + }
|
| + option->doesOccur=1;
|
| +
|
| + if(option->hasArg!=UOPT_NO_ARG) {
|
| + /* parse the argument for the option, if any */
|
| + if(i+1<argc && !(argv[i+1][0]=='-' && argv[i+1][1]!=0)) {
|
| + /* argument in the next argv[], and there is not an option in there */
|
| + option->value=argv[++i];
|
| + } else if(option->hasArg==UOPT_REQUIRES_ARG) {
|
| + /* there is no argument, but one is required: return with error */
|
| + return -i;
|
| + }
|
| + }
|
| + }
|
| + } else {
|
| + /* process one or more short options */
|
| + do {
|
| + /* search for the option letter */
|
| + int j;
|
| + for(j=0; j<optionCount; ++j) {
|
| + if(c==options[j].shortName) {
|
| + option=options+j;
|
| + break;
|
| + }
|
| + }
|
| + if(option==NULL) {
|
| + /* no option matches */
|
| + return -i;
|
| + }
|
| + option->doesOccur=1;
|
| +
|
| + if(option->hasArg!=UOPT_NO_ARG) {
|
| + /* parse the argument for the option, if any */
|
| + if(*arg!=0) {
|
| + /* argument following in the same argv[] */
|
| + option->value=arg;
|
| + /* do not process the rest of this arg as option letters */
|
| + break;
|
| + } else if(i+1<argc && !(argv[i+1][0]=='-' && argv[i+1][1]!=0)) {
|
| + /* argument in the next argv[], and there is not an option in there */
|
| + option->value=argv[++i];
|
| + /* this break is redundant because we know that *arg==0 */
|
| + break;
|
| + } else if(option->hasArg==UOPT_REQUIRES_ARG) {
|
| + /* there is no argument, but one is required: return with error */
|
| + return -i;
|
| + }
|
| + }
|
| +
|
| + /* get the next option letter */
|
| + option=NULL;
|
| + c=*arg++;
|
| + } while(c!=0);
|
| + }
|
| +
|
| + if(option!=0 && option->optionFn!=0 && option->optionFn(option->context, option)<0) {
|
| + /* the option function was called and returned an error */
|
| + return -i;
|
| + }
|
| +
|
| + /* go to next argv[] */
|
| + ++i;
|
| + } else {
|
| + /* move a non-option up in argv[] */
|
| + argv[remaining++]=arg;
|
| + ++i;
|
| + }
|
| + }
|
| + return remaining;
|
| +}
|
|
|
| Property changes on: icu46/source/tools/toolutil/uoptions.c
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|