mirror of
https://github.com/reactos/reactos.git
synced 2024-09-19 01:00:51 +00:00
c501d8112c
svn path=/branches/aicom-network-fixes/; revision=34994
138 lines
2.7 KiB
C
138 lines
2.7 KiB
C
/* $Id$
|
|
*/
|
|
/*
|
|
tgetopt -- POSIX-compliant implementation of getopt() with string-type-generic
|
|
semantics
|
|
|
|
This is public domain software
|
|
*/
|
|
|
|
#include <tchar.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
#include "tgetopt.h"
|
|
|
|
int _topterr = 1;
|
|
int _toptind = 1;
|
|
int _toptopt;
|
|
_TCHAR * _toptarg;
|
|
|
|
int _tgetopt(int argc, _TCHAR * const argv[], const _TCHAR * optstring)
|
|
{
|
|
static int s_nArgChar = 0;
|
|
_TCHAR * pcOptChar;
|
|
|
|
/* we're done */
|
|
if(_toptind >= argc) return -1;
|
|
|
|
/* last time we reached the end of argv[_toptind] */
|
|
if(s_nArgChar != 0 && argv[_toptind][s_nArgChar] == 0)
|
|
{
|
|
/* scan the next argument */
|
|
++ _toptind;
|
|
|
|
/* we're done */
|
|
if(_toptind >= argc) return -1;
|
|
|
|
s_nArgChar = 0;
|
|
}
|
|
|
|
/* first time we scan argv[_toptind] */
|
|
if(s_nArgChar == 0)
|
|
{
|
|
/* argument is NULL - we're done */
|
|
if(argv[_toptind] == NULL)
|
|
return (int)-1;
|
|
/* argument is empty - we're done */
|
|
else if(argv[_toptind][0] == 0)
|
|
return (int)-1;
|
|
/* argument begins with '-' */
|
|
else if(argv[_toptind][0] == _T('-'))
|
|
{
|
|
/* argument is "--" */
|
|
if(argv[_toptind][1] == _T('-'))
|
|
{
|
|
/* increment optind */
|
|
++ _toptind;
|
|
s_nArgChar = 0;
|
|
|
|
/* we're done */
|
|
return (int)-1;
|
|
}
|
|
/* argument is "-" */
|
|
else if(argv[_toptind][1] == 0)
|
|
{
|
|
/* we're done */
|
|
return (int)-1;
|
|
}
|
|
/* possible option */
|
|
else
|
|
++ s_nArgChar;
|
|
}
|
|
/* argument doesn't begin with a dash - we're done */
|
|
else
|
|
return (int)-1;
|
|
}
|
|
|
|
/* return the current character */
|
|
_toptopt = argv[_toptind][s_nArgChar];
|
|
|
|
/* advance to the next character */
|
|
++ s_nArgChar;
|
|
|
|
/* unrecognized option */
|
|
if(_toptopt == _T(':') || (pcOptChar = _tcschr(optstring, _toptopt)) == NULL)
|
|
{
|
|
/* print an error message */
|
|
if(_topterr && optstring[0] != _T(':'))
|
|
_ftprintf(stderr, _T("%s: illegal option -- %c\n"), argv[0], _toptopt);
|
|
|
|
/* return an error */
|
|
return _T('?');
|
|
}
|
|
|
|
/* the option requires an argument */
|
|
if(pcOptChar[1] == _T(':'))
|
|
{
|
|
/* we are at the end of the argument */
|
|
if(argv[_toptind][s_nArgChar] == 0)
|
|
{
|
|
/* the argument of the option is the next argument */
|
|
++ _toptind;
|
|
s_nArgChar = 0;
|
|
|
|
/* this is the last argument */
|
|
if(_toptind >= argc)
|
|
{
|
|
/* print an error message */
|
|
if(_topterr && optstring[0] != _T(':'))
|
|
{
|
|
_ftprintf
|
|
(
|
|
stderr,
|
|
_T("%s: option requires an argument -- %c\n"),
|
|
argv[0],
|
|
_toptopt
|
|
);
|
|
}
|
|
|
|
/* return an error */
|
|
return ((optstring[0] == _T(':')) ? _T(':') : _T('?'));
|
|
}
|
|
|
|
/* return the argument */
|
|
_toptarg = argv[_toptind];
|
|
++ _toptind;
|
|
}
|
|
/* the rest of the argument is the argument of the option */
|
|
else
|
|
_toptarg = argv[_toptind] + s_nArgChar;
|
|
}
|
|
|
|
/* success */
|
|
return _toptopt;
|
|
}
|
|
|
|
/* EOF */
|