Re: аналог "GNU getops"
От: Willi  
Дата: 13.08.01 10:37
Оценка:
Здравствуйте ra, вы писали:

ra>Есть ли аналог GNU getops под win?


Вот нашел когда-то где-то вроде как работает :)

int getopt_ex(int argc, char* const argv[], const char* pszValidOpts, char** ppszParam)
{
static int iArg = 1;
char chOpt;
char* psz = NULL;
char* pszParam = NULL;

if (iArg < argc)
{
psz = &(argv[iArg][0]);
if (*psz == '-' || *psz == '/')
{
/* we have an option specifier */
chOpt = argv[iArg][1];
if (isalnum(chOpt) || ispunct(chOpt))
{
/* we have an option character */
psz = strchr(pszValidOpts, chOpt);
if (psz != NULL)
{
/* option is valid, we want to return chOpt */
if (psz[1] == ':')
{
/* option can have a parameter */
psz = &(argv[iArg][2]);
if (*psz == '\0')
{
/* must look at next argv for param */
if (iArg+1 < argc)
{
psz = &(argv[iArg+1][0]);
if (*psz == '-' || *psz == '/')
{
/* next argv is a new option, so param */
/* not given for current option */
}
else
{
/* next argv is the param */
iArg++;
pszParam = psz;
}
}
else
{
/* reached end of args looking for param */
}

}
else
{
/* param is attached to option */
pszParam = psz;
}
}
else
{
/* option is alone, has no parameter */
}
}
else
{
/* option specified is not in list of valid options */
chOpt = -1;
pszParam = &(argv[iArg][0]);
}
}
else
{
/* though option specifier was given, option character */
/* is not alpha or was was not specified */
chOpt = -1;
pszParam = &(argv[iArg][0]);
}
}
else
{
/* standalone arg given with no option specifier */
chOpt = 1;
pszParam = &(argv[iArg][0]);
}
}
else
{
/* end of argument list */
chOpt = 0;
}

iArg++;
*ppszParam = pszParam;
return (chOpt);
}

пример использования

while((cOption = getopt_ex(argc, argv, "s:p:t:i:l:k:bh", &pszParam)) > 0)
{
switch(cOption)
{
case 'h':
print_usage();
return 0;
case 's':
if(!pszParam || sscanf(pszParam, "%d", &nValue) != 1)
{
g_StdLogger.LogError("\nUnexpected option \"-s%s\"\nTry -h for help\n", pszParam ? pszParam : "");
return -1;
}
\/\/i||i
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.