- string-type-generic getopt() (hacked together in half a hour - seems to work fine, though). Very simple - only implements the POSIX standard (no long options, etc.)

- modified tlist to use getopt() to parse the command line, just for fun. Seems to work

svn path=/trunk/; revision=4560
This commit is contained in:
KJK::Hyperion 2003-04-22 03:20:25 +00:00
parent aac3b7cd7b
commit c1ce9a4b84
7 changed files with 195 additions and 80 deletions

View file

@ -1,53 +1,3 @@
/* temporary header for getopt. Please remove this file when MingW ships with #include <tgetopt.h>
its own */
#ifndef __GETOPT_H_INCLUDED
#define __GETOPT_H_INCLUDED
#ifdef __cplusplus
extern "C"
{
#endif
extern char *optarg;
extern int optind, opterr, optopt;
#define no_argument (0)
#define required_argument (1)
#define optional_argument (2)
struct option
{
const char *name;
int has_arg;
int *flag;
int val;
};
extern int getopt(int, char * const [], const char *);
extern int getopt_long
(
int,
char * const [],
const char *,
const struct option *,
int *
);
extern int getopt_long_only
(
int,
char * const [],
const char *,
const struct option *,
int *
);
#ifdef __cplusplus
}
#endif
#endif /* __GETOPT_H_INCLUDED */
/* EOF */ /* EOF */

View file

@ -29,9 +29,9 @@
* DISCLAIMED. This includes but is not limited to warranties of * DISCLAIMED. This includes but is not limited to warranties of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* *
* $Revision: 1.7 $ * $Revision: 1.8 $
* $Author: hyperion $ * $Author: hyperion $
* $Date: 2003/02/09 21:15:29 $ * $Date: 2003/04/22 03:20:25 $
* *
*/ */
@ -52,8 +52,8 @@
#ifndef _TCHAR_DEFINED #ifndef _TCHAR_DEFINED
#ifndef RC_INVOKED #ifndef RC_INVOKED
typedef wchar_t _TCHAR; typedef wchar_t _TCHAR;
typedef signed wchar_t _TSCHAR; typedef wchar_t _TSCHAR;
typedef unsigned wchar_t _TUCHAR; typedef wchar_t _TUCHAR;
typedef wchar_t _TXCHAR; typedef wchar_t _TXCHAR;
/* #if !__STDC__ */ /* #if !__STDC__ */
typedef wchar_t TCHAR; typedef wchar_t TCHAR;

View file

@ -0,0 +1,19 @@
# $Id: Makefile,v 1.1 2003/04/22 03:20:25 hyperion Exp $
PATH_TO_TOP = ../..
TARGET_TYPE = library
TARGET_NAME = tgetopt
TARGET_OBJECTS = getopt.o _wgetopt.o
DEP_OBJECTS = $(TARGET_OBJECTS)
include $(PATH_TO_TOP)/rules.mak
include $(TOOLS_PATH)/helper.mk
include $(TOOLS_PATH)/depend.mk
# EOF

View file

@ -0,0 +1,15 @@
/* $Id: _wgetopt.c,v 1.1 2003/04/22 03:20:25 hyperion Exp $
*/
/*
tgetopt -- POSIX-compliant implementation of getopt() with string-type-generic
semantics
This is public domain software
*/
#include <wchar.h>
#define _UNICODE
#include "getopt.c"
/* EOF */

View file

@ -0,0 +1,135 @@
/* $Id: getopt.c,v 1.1 2003/04/22 03:20:25 hyperion Exp $
*/
/*
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(_toptopt >= 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];
}
/* the rest of the argument is the argument of the option */
else
_toptarg = argv[_toptind] + s_nArgChar;
}
/* success */
return _toptopt;
}
/* EOF */

View file

@ -12,7 +12,7 @@ TARGET_APPTYPE = console
TARGET_NAME = tlist TARGET_NAME = tlist
TARGET_SDKLIBS = epsapi.a kernel32.a user32.a ntdll.a TARGET_SDKLIBS = epsapi.a tgetopt.a kernel32.a user32.a ntdll.a
TARGET_OBJECTS = $(TARGET_NAME).o TARGET_OBJECTS = $(TARGET_NAME).o

View file

@ -1,4 +1,4 @@
/* $Id: tlist.c,v 1.4 2003/04/14 01:19:08 hyperion Exp $ /* $Id: tlist.c,v 1.5 2003/04/22 03:20:25 hyperion Exp $
* *
* ReactOS Project * ReactOS Project
* TList * TList
@ -15,6 +15,7 @@
#include <ctype.h> #include <ctype.h>
#include <epsapi.h> #include <epsapi.h>
#include <getopt.h>
#ifndef PAGE_SIZE #ifndef PAGE_SIZE
#define PAGE_SIZE 4096 #define PAGE_SIZE 4096
@ -68,14 +69,14 @@ int STDCALL PrintBanner (VOID)
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
int STDCALL PrintSynopsys (VOID) int STDCALL PrintSynopsys (int nRetVal)
{ {
PrintBanner (); PrintBanner ();
printf ("Usage: tlist [-t | PID | -l]\n\n" printf ("Usage: tlist [-t | PID | -l]\n\n"
" -t print the task list tree\n" " -t print the task list tree\n"
" PID print module information for this ID\n" " PID print module information for this ID\n"
" -l print license information\n"); " -l print license information\n");
return EXIT_SUCCESS; return nRetVal;
} }
int STDCALL PrintLicense (VOID) int STDCALL PrintLicense (VOID)
@ -441,29 +442,24 @@ int STDCALL PrintProcess (char * PidStr)
int main (int argc, char * argv []) int main (int argc, char * argv [])
{ {
if (1 == argc) int c;
if(1 == argc) return PrintProcessList(FALSE);
while((c = getopt(argc, argv, "tl")) != -1)
{ {
return PrintProcessList (FALSE); switch(c)
}
if (2 == argc)
{ {
if (('-' == argv [1][0]) && ('\0' == argv [1][2])) case 't': return PrintProcessList(TRUE);
{ case 'l': return PrintLicense();
if ('t' == argv [1][1]) default: return PrintSynopsys(EXIT_FAILURE);
{
return PrintProcessList (TRUE);
}
if ('l' == argv [1][1])
{
return PrintLicense ();
} }
} }
if (isdigit(argv[1][0]))
{ if(isdigit(argv[optind][0]))
return PrintProcess (argv[1]); return PrintProcess (argv[1]);
}
} return PrintSynopsys(EXIT_SUCCESS);
return PrintSynopsys ();
} }
/* EOF */ /* EOF */