/*** parsearg.h - Exported definitions for parsearg.c
 *
 *  Copyright (c) 1996,1997 Microsoft Corporation
 *  Author:     Michael Tsang (MikeTs)
 *  Created:    09/05/96
 *
 *  MODIFICATION HISTORY
 */

#ifndef _PARSEARG_H
#define _PARSEARG_H

// Error codes
#define ARGERR_NONE             0
#define ARGERR_UNKNOWN_SWITCH   1
#define ARGERR_NO_SEPARATOR     2
#define ARGERR_INVALID_NUM      3
#define ARGERR_INVALID_TAIL     4

#define DEF_SWITCHCHARS         "/-"
#define DEF_SEPARATORS          ":="

typedef struct argtype_s    ARGTYPE;
typedef ARGTYPE *           PARGTYPE;
typedef int (*PFNARG)(char **, PARGTYPE);

// Argument types
#define AT_STRING       1
#define AT_NUM          2
#define AT_ENABLE       3
#define AT_DISABLE      4
#define AT_ACTION       5

//Parse flags
#define PF_NOI          0x0001  //No-Ignore-Case
#define PF_SEPARATOR    0x0002  //parse for separator

struct argtype_s
{
    char        *pszArgID;      //argument ID string
    unsigned    uArgType;       //see argument types defined above
    unsigned    uParseFlags;    //see parse flags defined above
    VOID        *pvArgData;     //ARG_STRING: (char **) - ptr to string ptr
                                //ARG_NUM: (int *) - ptr to integer number
                                //ARG_ENABLE: (unsigned *) - ptr to flags
                                //ARG_DISABLE: (unsigned *) - ptr to flags
                                //ARG_ACTION: ptr to function
    unsigned    uArgParam;      //ARG_STRING: none
                                //ARG_NUM: base
                                //ARG_ENABLE: flag bit mask
                                //ARG_DISABLE: flag bit mask
                                //ARG_ACTION: none
    PFNARG      pfnArgVerify;   //pointer to argument verification function
                                //this will be ignored for ARG_ACTION
};

typedef struct proginfo_s
{
    char *pszSwitchChars;       //if null, DEF_SWITCHCHARS is used
    char *pszSeparators;        //if null, DEF_SEPARATORS is used
    char *pszProgPath;          //ParseProgInfo set this ptr to prog. path
    char *pszProgName;          //ParseProgInfo set this ptr to prog. name
} PROGINFO;
typedef PROGINFO *PPROGINFO;

//Export function prototypes
VOID EXPORT ParseProgInfo(char *, PPROGINFO);
int  EXPORT ParseSwitches(int *, char ***, PARGTYPE, PPROGINFO);

#endif  //ifndef _PARSEARG_H