/* ******************************************************************************* * * 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, const char *argv[], int optionCount, UOption options[]) { const char *arg; int i=1, remaining=1; char c, stopOptions=0; while(idoesOccur=1; if(option->hasArg!=UOPT_NO_ARG) { /* parse the argument for the option, if any */ if(i+1value=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; jdoesOccur=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+1value=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; }