//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1994 - 1996.
//
//  File:       parse.hxx
//
//  Contents:   Types and prototypes for command line parsing routines.
//
//  History:    04-20-95   DavidMun   Created
//
//----------------------------------------------------------------------------


#ifndef __PARSE_HXX_
#define __PARSE_HXX_

//
// Types
//
// TOKEN - when words are read from the command line and recognized, they're
// assigned a token value.
//

enum TOKEN
{
    //
    // The following tokens have a 1:1 mapping to the strings in g_awszTokens
    //

    //
    // Commands
    //
    // CAUTION: if you insert before the first or after the last command,
    // make sure that you update FIRST_COMMAND and LAST_COMMAND appropriately
    //

    FIRST_COMMAND,
    TKN_ABORTJOB = FIRST_COMMAND,
    TKN_ABORTQUEUE,
    TKN_ADDJOBTOQUEUE,
    TKN_CONVERTSAGETASKSTOJOBS,
    TKN_CREATETRIGGERJOB,
    TKN_CREATETRIGGERQUEUE,
    TKN_DELETETRIGGERJOB,
    TKN_DELETETRIGGERQUEUE,
    TKN_EDITJOB,
    TKN_EDITJOBINQUEUE,
    TKN_ENUMCLONE,
    TKN_ENUMNEXT,
    TKN_ENUMRESET,
    TKN_ENUMSKIP,
    TKN_GETCREDENTIALS,
    TKN_GETMACHINE,
    TKN_LOADJOB,
    TKN_LOADQUEUE,
    TKN_NSGETACCOUNTINFO,
    TKN_NSSETACCOUNTINFO,
    TKN_PRINTJOB,
    TKN_PRINTQUEUE,
    TKN_PRINTRUNTIMEJOB,
    TKN_PRINTRUNTIMEQUEUE,
    TKN_PRINTSTRINGJOB,
    TKN_PRINTSTRINGQUEUE,
    TKN_PRINTTRIGGERJOB,
    TKN_PRINTTRIGGERQUEUE,
    TKN_RUNJOB,
    TKN_RUNQUEUE,
    TKN_REMOVEJOBFROMQUEUE,
    TKN_SCHEDACTIVATE,
    TKN_SCHEDADDJOB,
    TKN_SCHEDADDQUEUE,
    TKN_SETCREDENTIALS,
    TKN_SCHEDCREATEENUM,
    TKN_SCHEDDELETE,
    TKN_SCHEDENUM,
    TKN_SCHEDISJOBORQUEUE,
    TKN_SETJOB,
    TKN_SETMACHINE,
    TKN_SCHEDNEWJOB,
    TKN_SCHEDNEWQUEUE,
    TKN_SETQUEUE,
    TKN_SETTRIGGERJOB,
    TKN_SETTRIGGERQUEUE,
    TKN_SAVEJOB,
    TKN_SAVEQUEUE,
    LAST_COMMAND = TKN_SAVEQUEUE,

    // properties for creating/editing jobs & triggers

    TKN_APPNAME,
    TKN_PARAMS,
    TKN_WORKINGDIRECTORY,
    TKN_COMMENT,
    TKN_CREATOR,
    TKN_PRIORITY,
    TKN_MAXRUNTIME,
    TKN_TASKFLAGS,
    TKN_INTERACTIVE,
    TKN_DELETEWHENDONE,
    TKN_SUSPEND,
    TKN_NETSCHEDULE,
    TKN_DONTRUNONBATTERIES,
    TKN_KILLIFGOINGONBATS,
    TKN_RUNONLYIFLOGGEDON,
    TKN_HIDDEN,
    TKN_STARTDATE,
    TKN_ENDDATE,
    TKN_STARTTIME,
    TKN_MINUTESDURATION,
    TKN_HASENDDATE,
    TKN_KILLATDURATION,
    TKN_ONLYIFIDLE,
    TKN_KILLATIDLEEND,
    TKN_RESTARTONIDLERESUME,
    TKN_SYSTEMREQUIRED,
    TKN_DISABLED,
    TKN_MINUTESINTERVAL,
    TKN_TYPE,
    TKN_TYPEARGUMENTS,
    TKN_IDLE,
    TKN_NORMAL,
    TKN_HIGH,
    TKN_REALTIME,
    TKN_ONEDAY,
    TKN_DAILY,
    TKN_WEEKLY,
    TKN_MONTHLYDATE,
    TKN_MONTHLYDOW,
    TKN_YEARLYDATE,
    TKN_YEARLYDOW,
    TKN_ONIDLE,
    TKN_ATSTARTUP,
    TKN_ATLOGON,

    // misc

    TKN_TODAY,
    TKN_NOW,
    TKN_EQUAL,
    TKN_ATSIGN,
    TKN_QUESTION,
    TKN_COLON,
    TKN_COMMA,
    TKN_BANG,

    //
    // The following tokens map to more than one string and are therefore not
    // represented in g_awszTokens.
    //

    TKN_SWITCH,
    TKN_STRING,
    TKN_NUMBER,

    //
    // The following metatokens do not correspond to any specific string.
    //

    TKN_EOL,
    TKN_INVALID
};

inline BOOL IsCommandToken(TOKEN tkn)
{
    return tkn >= FIRST_COMMAND && tkn <= LAST_COMMAND;
}

HRESULT ProcessCommandLine(WCHAR *pwszCommandLine);
VOID LogSyntaxError(TOKEN tkn, WCHAR *pwszExpected);
TOKEN GetToken(WCHAR **ppwsz);
TOKEN PeekToken(WCHAR **ppwsz);
HRESULT GetFilename(WCHAR **ppwsz, WCHAR *wszExpected);
HRESULT Expect(TOKEN tknExpected, WCHAR **ppwsz, WCHAR *wszExpected);
HRESULT ParseDate(WCHAR **ppwsz, WORD *pwMonth, WORD *pwDay, WORD *pwYear);
HRESULT ParseTime(WCHAR **ppwsz, WORD *pwHour, WORD *pwMinute);
HRESULT ParseDaysOfWeek(WCHAR **ppwsz, WORD *pwDaysOfTheWeek);
HRESULT ParseMonths(WCHAR **ppwsz, WORD *pwMonths);
HRESULT ParseDaysOfMonth(WCHAR **ppwsz, DWORD *pdwDays);
WCHAR *GetTokenStringForLogging(TOKEN tkn);

#endif // __PARSE_HXX_