Files
mars-flaim/flaim/util/flmarg.h
dsandersoremutah f8a758f7f2 Changed _HPP to _H
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@582 0109f412-320b-0410-ab79-c3e0c5ffbbe6
2006-06-16 16:26:55 +00:00

396 lines
8.2 KiB
C++

//-------------------------------------------------------------------------
// Desc: Command line argument parser for utilities - definitions.
// Tabs: 3
//
// Copyright (c) 2001,2003,2005-2006 Novell, Inc. All Rights Reserved.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the GNU General Public
// License as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, contact Novell, Inc.
//
// To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com
//
// $Id: flmarg.h 12329 2006-01-20 17:49:30 -0700 (Fri, 20 Jan 2006) ahodgkinson $
//-------------------------------------------------------------------------
#ifndef FLMARG_H
#define FLMARG_H
#include "sharutil.h"
typedef FLMBOOL (* FLMARG_VALIDATOR) (
const char * pszGivenArg,
const char * pszIdentifier,
FlmStringAcc * pOutputAccumulator,
void * pvUserData);
typedef void (* FLMARG_OUTPUT_CALLBACK) (
const char * pszOutputString,
void * pvUserData);
typedef void (* FLMARG_PRESS_ANY_KEY_CALLBACK) (
const char * pszPressAnyKeyMessage,
void * pvUserData);
typedef enum
{
FLMARG_OPTION = 0,
FLMARG_REQUIRED_ARG,
FLMARG_OPTIONAL_ARG,
FLMARG_REPEATING_ARG
} FLMARG_TYPE;
typedef enum
{
FLMARG_CONTENT_NONE = 0,
FLMARG_CONTENT_BOOL,
FLMARG_CONTENT_VALIDATOR, //use ,validator, userdata for ...
FLMARG_CONTENT_SIGNED_INT, //use ,MIN, MAX) for ...
FLMARG_CONTENT_UNSIGNED_INT, //use ,MIN, MAX) for ...
FLMARG_CONTENT_ALLOWED_STRING_SET, //use ,"foo","bar",NULL) for ...
FLMARG_CONTENT_EXISTING_FILE,
FLMARG_CONTENT_STRING
} FLMARG_CONTENT_TYPE;
class FlmArgSet;
class FlmArg : public F_Object
{
private:
FlmArg(
const char * pszIdentifier,
const char * pszShortHelp,
FLMBOOL bCaseSensitive,
FLMARG_TYPE argType,
FLMARG_CONTENT_TYPE contentType)
{
m_pszIdentifier = pszIdentifier;
m_pszShortHelp = pszShortHelp;
m_bCaseSensitive = bCaseSensitive;
m_argType = argType;
m_contentType = contentType;
m_uiValueCount = 0;
m_bIsPresent = FALSE;
//setting optional values to smart initial values
m_validator = NULL;
m_uiMin = 0xFFFFFFFF;
m_uiMax = 0xFFFFFFFF;
m_iMin = -1;
m_iMax = -1;
m_uiStringSetCount = 0;
}
~FlmArg()
{
FLMUINT uiKill;
char * pszStr;
for ( uiKill = 0; uiKill < m_uiValueCount; uiKill++)
{
pszStr = (char *)(m_valuesVec.getElementAt( uiKill));
if( pszStr)
{
f_free( &pszStr);
}
}
}
const char * getIdentifier()
{
return( m_pszIdentifier);
}
FLMBOOL isPresent()
{
return( m_bIsPresent);
}
FLMUINT getValueCount()
{
return( m_uiValueCount);
}
FLMBOOL getCaseSensitive()
{
return( m_bCaseSensitive);
}
const char * getShortHelp()
{
return( m_pszShortHelp);
}
FLMARG_TYPE getArgType()
{
return( m_argType);
}
FLMARG_CONTENT_TYPE getContentType()
{
return( m_contentType);
}
FLMARG_VALIDATOR getValidator()
{
return( m_validator);
}
void * getValidatorData()
{
return( m_pvValidatorData);
}
FlmVector * getStringSet()
{
return( &m_stringSet);
}
FLMUINT getStringSetLen()
{
return( m_uiStringSetCount);
}
void getMinMax(
FLMUINT * puiMin,
FLMUINT * puiMax);
void getMinMax(
FLMINT * puiMin,
FLMINT * puiMax);
FLMUINT getUINT(
FLMUINT uiIndex);
FLMINT getINT(
FLMUINT uiIndex);
FLMBOOL getBOOL(
FLMUINT uiIndex);
const char * getString(
FLMUINT uiIndex);
void getString(
char * pszDestination,
FLMUINT uiDestinationBufferSize,
FLMUINT uiIndex);
void setPresent()
{
m_bIsPresent = TRUE;
}
RCODE addValue(
const char * pszVal);
const char * getValue(
FLMUINT uiIndex);
void setValidator(
FLMARG_VALIDATOR validator,
void * pvValidatorData)
{
m_validator = validator;
m_pvValidatorData = pvValidatorData;
}
void setMinMax(
FLMUINT uiMin,
FLMUINT uiMax)
{
m_uiMin = uiMin;
m_uiMax = uiMax;
}
void setMinMax( FLMINT iMin, FLMINT iMax)
{
m_iMin = iMin;
m_iMax = iMax;
}
RCODE addToStringSet(
const char * pszStr);
const char * m_pszIdentifier;
const char * m_pszShortHelp;
FLMBOOL m_bCaseSensitive;
FLMARG_TYPE m_argType;
FLMARG_CONTENT_TYPE m_contentType;
FlmVector m_valuesVec;
FLMUINT m_uiValueCount;
FLMBOOL m_bIsPresent;
FLMARG_VALIDATOR m_validator;
void * m_pvValidatorData;
FLMUINT m_uiMin;
FLMUINT m_uiMax;
FLMINT m_iMin;
FLMINT m_iMax;
FlmVector m_stringSet;
FLMUINT m_uiStringSetCount;
friend class FlmArgSet;
};
class FlmArgSet : public F_Object
{
public:
FlmArgSet(
char * pszDescription,
FLMARG_OUTPUT_CALLBACK outputCallback,
void * pvOutputCallbackData,
FLMARG_PRESS_ANY_KEY_CALLBACK pressAnyKeyCallback,
void * pvPressAnyKeyCallbackData,
FLMUINT uiLinesPerScreen);
virtual ~FlmArgSet();
const char * getDescription( void)
{
return m_pszDescription;
}
RCODE addArg(
const char * pszIdentifier,
const char * pszShortHelp,
FLMBOOL bCaseSensitive,
FLMARG_TYPE argType,
FLMARG_CONTENT_TYPE contentType,
...);
RCODE parseCommandLine(
FLMUINT uiArgc,
const char ** ppszArgv,
FLMBOOL * pbPrintedUsage);
FLMBOOL argIsPresent(
const char * pszIdentifier)
{
return this->getFlmArg( pszIdentifier)->isPresent();
}
FLMUINT getValueCount(
const char * pszIdentifier)
{
return this->getFlmArg( pszIdentifier)->getValueCount();
}
FLMUINT getUINT(
const char * pszIdentifier,
FLMUINT uiIndex = 0)
{
return this->getFlmArg( pszIdentifier)->getUINT( uiIndex);
}
FLMINT getINT(
const char * pszIdentifier,
FLMUINT uiIndex = 0)
{
return this->getFlmArg( pszIdentifier)->getINT( uiIndex);
}
/*
will recognize the following formats in the following order:
TRUE FALSE NOTES
---- ----- -----
true false case-insensitive
1 0
on off case-insensitive
yes no case-insensitive
NULL case-insensitive
* anything else is a user error
*/
FLMBOOL getBOOL(
const char * pszIdentifier,
FLMUINT uiIndex = 0)
{
return this->getFlmArg( pszIdentifier)->getBOOL( uiIndex);
}
const char * getString(
const char * pszIdentifier,
FLMUINT uiIndex = 0)
{
return this->getFlmArg( pszIdentifier)->getString( uiIndex);
}
void getString(
const char * pszIdentifier,
char * pszDestination,
FLMUINT uiDestinationBufferSize,
FLMUINT uiIndex = 0)
{
this->getFlmArg( pszIdentifier)->getString( pszDestination,
uiDestinationBufferSize, uiIndex);
}
private:
FlmArg * getFlmArg(
const char * pszIdentifier);
RCODE printUsage( void);
RCODE dump(
FlmVector * pVec,
FLMUINT uiVecLen);
void outputLines(
const char * pszStr);
FLMBOOL needsPreprocessing( void);
RCODE preProcessParams( void);
RCODE processAtParams(
FLMUINT uiInsertionPoint,
char * pszBuffer);
RCODE displayShortHelpLines(
FlmStringAcc * pStringAcc,
const char * pszShortHelp,
FLMUINT uiCharsPerLine);
FLMBOOL needMoreArgs(
FlmVector * pVec,
FLMUINT uiVecLen);
RCODE parseOption(
const char * pszArg,
FLMBOOL * pbPrintedUsage);
char * m_pszDescription;
char m_szExecBaseName[ F_PATH_MAX_SIZE];
FlmVector m_flmArgVec;
FLMUINT m_uiFlmArgVecIndex;
FlmVector m_optionsVec;
FLMUINT m_uiOptionsVecLen;
FlmVector m_requiredArgsVec;
FLMUINT m_uiRequiredArgsVecLen;
FlmVector m_optionalArgsVec;
FLMUINT m_uiOptionalArgsVecLen;
FlmArg * m_pRepeatingArg;
FLMUINT m_uiArgc;
FlmVector * m_pArgv;
FLMARG_OUTPUT_CALLBACK m_outputCallback;
void * m_pvOutputCallbackData;
FLMARG_PRESS_ANY_KEY_CALLBACK m_pressAnyKeyCallback;
void * m_pvPressAnyKeyCallbackData;
FLMUINT m_uiOutputLines;
FLMUINT m_uiLinesPerScreen;
};
#endif