Pyrogenesis trunk
|
This is a simplistic C/C++-like preprocessor. More...
#include <OgreGLSLPreprocessor.h>
Classes | |
class | Macro |
A macro definition. More... | |
class | Token |
A input token. More... | |
Public Types | |
typedef void(* | ErrorHandlerFunc) (int iLine, const char *iError, const Token *iToken) |
Call the error handler. More... | |
Public Member Functions | |
CPreprocessor (const Token &iToken, int iLine) | |
Private constructor to re-parse a single token. More... | |
Token | GetToken (bool iExpand) |
Stateless tokenizer: Parse the input text and return the next token. More... | |
Token | HandleDirective (Token &iToken, int iLine) |
Handle a preprocessor directive. More... | |
bool | HandleDefine (Token &iBody, int iLine) |
Handle a #define directive. More... | |
bool | HandleUnDef (Token &iBody, int iLine) |
Undefine a previously defined macro. More... | |
bool | HandleIfDef (Token &iBody, int iLine) |
Handle an #ifdef directive. More... | |
bool | HandleIf (Token &iBody, int iLine) |
Handle an #if directive. More... | |
bool | HandleIf (bool val, int iLine) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. More... | |
bool | HandleElif (Token &iBody, int iLine) |
Handle an #elif directive. More... | |
bool | HandleElse (Token &iBody, int iLine) |
Handle an #else directive. More... | |
bool | HandleEndIf (Token &iBody, int iLine) |
Handle an #endif directive. More... | |
Token | GetArgument (Token &oArg, bool iExpand, bool shouldAppendArg) |
Get a single function argument until next ',' or ')'. More... | |
Token | GetArguments (std::vector< Token > &oArgs, bool iExpand, bool shouldAppendArg) |
Get all the arguments of a macro: '(' arg1 { ',' arg2 { ',' ... }} ')'. More... | |
Token | GetExpression (Token &oResult, int iLine, int iOpPriority=0) |
Parse an expression, compute it and return the result. More... | |
bool | GetValue (const Token &iToken, long &oValue, int iLine) |
Get the numeric value of a token. More... | |
bool | GetValueDef (const Token &iToken, long &oValue, int iLine) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. same as above, but considers the defined() function. More... | |
Token | ExpandMacro (const Token &iToken) |
Expand the given macro, if it exists. More... | |
Macro * | IsDefined (const Token &iToken) |
Check if a macro is defined, and if so, return it. More... | |
Token | Parse (const Token &iSource) |
Parse the input string and return a token containing the whole output. More... | |
CPreprocessor () | |
Create an empty preprocessor object. More... | |
virtual | ~CPreprocessor () |
Destroy the preprocessor object. More... | |
void | Define (const char *iMacroName, size_t iMacroNameLen, const char *iMacroValue, size_t iMacroValueLen) |
Define a macro without parameters. More... | |
void | Define (const char *iMacroName, size_t iMacroNameLen, long iMacroValue) |
Define a numerical macro. More... | |
bool | Undef (const char *iMacroName, size_t iMacroNameLen) |
Undefine a macro. More... | |
char * | Parse (const char *iSource, size_t iLength, size_t &oLength) |
Parse the input string and return a newly-allocated output string. More... | |
Static Public Member Functions | |
static Token | ExpandDefined (CPreprocessor *iParent, const std::vector< Token > &iArgs) |
The implementation of the defined() preprocessor function. More... | |
static void | Error (int iLine, const char *iError, const Token *iToken=NULL) |
Call the error handler. More... | |
Public Attributes | |
const char * | Source |
The current source text input. More... | |
const char * | SourceEnd |
The end of the source text. More... | |
int | Line |
Current line number. More... | |
bool | BOL |
True if we are at beginning of line. More... | |
unsigned | EnableOutput |
A stack of 32 booleans packed into one value :) More... | |
unsigned | EnableElif |
std::forward_list< Macro > | MacroList |
The list of macros defined so far. More... | |
Static Public Attributes | |
static ErrorHandlerFunc | ErrorHandler = CPreprocessor::Error |
A pointer to the preprocessor's error handler. More... | |
Friends | |
class | CPreprocessor::Macro |
This is a simplistic C/C++-like preprocessor.
It takes an non-zero-terminated string on input and outputs a non-zero-terminated string buffer.
This preprocessor was designed specifically for GLSL shaders, so if you want to use it for other purposes you might want to check if the feature set it provides is enough for you.
Here's a list of supported features:
#define:
Parametrized and non-parametrized macros. Invoking a macro with less arguments than it takes assignes empty values to missing arguments.#undef:
Forget defined macros#ifdef
/ #ifndef
/ #else
/ #endif:
Conditional suppression of parts of code.#if:
Supports numeric expression of any complexity, also supports the defined() pseudo-function. typedef void(* Ogre::CPreprocessor::ErrorHandlerFunc) (int iLine, const char *iError, const Token *iToken) |
Call the error handler.
iLine | The line at which the error happened. |
iError | The error string. |
iToken | If not NULL contains the erroneous token |
Ogre::CPreprocessor::CPreprocessor | ( | const Token & | iToken, |
int | iLine | ||
) |
Private constructor to re-parse a single token.
|
inline |
Create an empty preprocessor object.
|
virtual |
Destroy the preprocessor object.
void Ogre::CPreprocessor::Define | ( | const char * | iMacroName, |
size_t | iMacroNameLen, | ||
const char * | iMacroValue, | ||
size_t | iMacroValueLen | ||
) |
Define a macro without parameters.
iMacroName | The name of the defined macro |
iMacroNameLen | The length of the name of the defined macro |
iMacroValue | The value of the defined macro |
iMacroValueLen | The length of the value of the defined macro |
void Ogre::CPreprocessor::Define | ( | const char * | iMacroName, |
size_t | iMacroNameLen, | ||
long | iMacroValue | ||
) |
Define a numerical macro.
iMacroName | The name of the defined macro |
iMacroNameLen | The length of the name of the defined macro |
iMacroValue | The value of the defined macro |
|
static |
Call the error handler.
iLine | The line at which the error happened. |
iError | The error string. |
iToken | If not NULL contains the erroneous token |
|
static |
The implementation of the defined() preprocessor function.
iParent | The parent preprocessor object |
iArgs | The arguments themselves |
CPreprocessor::Token Ogre::CPreprocessor::ExpandMacro | ( | const Token & | iToken | ) |
Expand the given macro, if it exists.
If macro has arguments, they are collected from source stream.
iToken | A KEYWORD token containing the (possible) macro name. |
CPreprocessor::Token Ogre::CPreprocessor::GetArgument | ( | Token & | oArg, |
bool | iExpand, | ||
bool | shouldAppendArg | ||
) |
Get a single function argument until next ',' or ')'.
oArg | The argument is returned in this variable. |
iExpand | If false, parameters are not expanded and no expressions are allowed; only a single keyword is expected per argument. |
shouldAppendArg | When true, the argument will be appended the word word __arg_ e.g. #define myMacro(x) --> #define myMacro(x__arg_) This workaround a bug where calling myMacro( x ) would cause issues. |
CPreprocessor::Token Ogre::CPreprocessor::GetArguments | ( | std::vector< Token > & | oArgs, |
bool | iExpand, | ||
bool | shouldAppendArg | ||
) |
Get all the arguments of a macro: '(' arg1 { ',' arg2 { ',' ... }} ')'.
oArgs | This is set to a pointer to an array of parsed arguments. |
shouldAppendArg | See GetArgument. |
iExpand | If false, parameters are not expanded and no expressions are allowed; only a single keyword is expected per argument. |
CPreprocessor::Token Ogre::CPreprocessor::GetExpression | ( | Token & | oResult, |
int | iLine, | ||
int | iOpPriority = 0 |
||
) |
Parse an expression, compute it and return the result.
Operator priority: 0: Whole expression 1: '(' ')' 2: || 3: && 4: | 5: ^ 6: & 7: '==' '!=' 8: '<' '<=' '>' '>=' 9: '<<' '>>' 10: '+' '-' 11: '*' '/' '' 12: unary '+' '-' '!' '~'.
oResult | A token containing the result of expression |
iLine | The line at which the expression starts (for error reports) |
iOpPriority | Operator priority (at which operator we will stop if proceeding recursively – used internally. Parser stops when it encounters an operator with higher or equal priority). |
CPreprocessor::Token Ogre::CPreprocessor::GetToken | ( | bool | iExpand | ) |
Stateless tokenizer: Parse the input text and return the next token.
iExpand | If true, macros will be expanded to their values |
bool Ogre::CPreprocessor::GetValue | ( | const Token & | iToken, |
long & | oValue, | ||
int | iLine | ||
) |
Get the numeric value of a token.
If the token was produced by expanding a macro, we will get an TEXT token which can contain a whole expression; in this case we will call GetExpression to parse it. Otherwise we just call the token's GetValue() method.
iToken | The token to get the numeric value of |
oValue | The variable to put the value into |
iLine | The line where the directive begins (for error reports) |
bool Ogre::CPreprocessor::GetValueDef | ( | const Token & | iToken, |
long & | oValue, | ||
int | iLine | ||
) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. same as above, but considers the defined() function.
bool Ogre::CPreprocessor::HandleDefine | ( | Token & | iBody, |
int | iLine | ||
) |
Handle a #define directive.
iBody | The body of the directive (everything after the directive until end of line). |
iLine | The line where the directive begins (for error reports) |
CPreprocessor::Token Ogre::CPreprocessor::HandleDirective | ( | Token & | iToken, |
int | iLine | ||
) |
Handle a preprocessor directive.
iToken | The whole preprocessor directive line (until EOL) |
iLine | The line where the directive begins (for error reports) |
bool Ogre::CPreprocessor::HandleElif | ( | Token & | iBody, |
int | iLine | ||
) |
Handle an #elif directive.
iBody | The body of the directive (everything after the directive until end of line). |
iLine | The line where the directive begins (for error reports) |
bool Ogre::CPreprocessor::HandleElse | ( | Token & | iBody, |
int | iLine | ||
) |
Handle an #else directive.
iBody | The body of the directive (everything after the directive until end of line). |
iLine | The line where the directive begins (for error reports) |
bool Ogre::CPreprocessor::HandleEndIf | ( | Token & | iBody, |
int | iLine | ||
) |
Handle an #endif directive.
iBody | The body of the directive (everything after the directive until end of line). |
iLine | The line where the directive begins (for error reports) |
bool Ogre::CPreprocessor::HandleIf | ( | bool | val, |
int | iLine | ||
) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
bool Ogre::CPreprocessor::HandleIf | ( | Token & | iBody, |
int | iLine | ||
) |
Handle an #if directive.
iBody | The body of the directive (everything after the directive until end of line). |
iLine | The line where the directive begins (for error reports) |
bool Ogre::CPreprocessor::HandleIfDef | ( | Token & | iBody, |
int | iLine | ||
) |
Handle an #ifdef directive.
iBody | The body of the directive (everything after the directive until end of line). |
iLine | The line where the directive begins (for error reports) |
bool Ogre::CPreprocessor::HandleUnDef | ( | Token & | iBody, |
int | iLine | ||
) |
Undefine a previously defined macro.
iBody | The body of the directive (everything after the directive until end of line). |
iLine | The line where the directive begins (for error reports) |
CPreprocessor::Macro * Ogre::CPreprocessor::IsDefined | ( | const Token & | iToken | ) |
Check if a macro is defined, and if so, return it.
iToken | Macro name |
char * Ogre::CPreprocessor::Parse | ( | const char * | iSource, |
size_t | iLength, | ||
size_t & | oLength | ||
) |
Parse the input string and return a newly-allocated output string.
iSource | The source text |
iLength | The length of the source text in characters |
oLength | The length of the output string. |
CPreprocessor::Token Ogre::CPreprocessor::Parse | ( | const Token & | iSource | ) |
Parse the input string and return a token containing the whole output.
iSource | The source text enclosed in a token |
bool Ogre::CPreprocessor::Undef | ( | const char * | iMacroName, |
size_t | iMacroNameLen | ||
) |
Undefine a macro.
iMacroName | The name of the macro to undefine |
iMacroNameLen | The length of the name of the macro to undefine |
|
friend |
bool Ogre::CPreprocessor::BOL |
True if we are at beginning of line.
unsigned Ogre::CPreprocessor::EnableElif |
unsigned Ogre::CPreprocessor::EnableOutput |
A stack of 32 booleans packed into one value :)
|
static |
A pointer to the preprocessor's error handler.
You can assign the address of your own function to this variable and implement your own error handling (e.g. throwing an exception etc).
int Ogre::CPreprocessor::Line |
Current line number.
std::forward_list<Macro> Ogre::CPreprocessor::MacroList |
The list of macros defined so far.
const char* Ogre::CPreprocessor::Source |
The current source text input.
const char* Ogre::CPreprocessor::SourceEnd |
The end of the source text.