Merge pull request #272 from Arkshine/feature/textparser-data-param
Add a data argument in INI/SMC_ParseFile() to pass through to callbacks (bug 6228)
This commit is contained in:
commit
8c16331b69
|
@ -63,7 +63,7 @@ static cell AMX_NATIVE_CALL SMC_SetParseStart(AMX *amx, cell *params)
|
|||
|
||||
if ((funcName = get_amxstring(amx, params[2], 0, length)) && length)
|
||||
{
|
||||
p->parse_start = registerSPForwardByName(amx, funcName, FP_CELL, FP_DONE);
|
||||
p->parse_start = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (p->parse_start == -1)
|
||||
|
@ -91,7 +91,7 @@ static cell AMX_NATIVE_CALL SMC_SetParseEnd(AMX *amx, cell *params)
|
|||
|
||||
if ((funcName = get_amxstring(amx, params[2], 0, length)) && length)
|
||||
{
|
||||
p->parse_end = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
p->parse_end = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (p->parse_end == -1)
|
||||
|
@ -119,17 +119,17 @@ static cell AMX_NATIVE_CALL SMC_SetReaders(AMX *amx, cell *params)
|
|||
|
||||
if ((funcName = get_amxstring(amx, params[2], 0, kvLength)) && kvLength)
|
||||
{
|
||||
p->key_value = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_STRING, FP_DONE);
|
||||
p->key_value = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_STRING, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (kvLength && (funcName = get_amxstring(amx, params[3], 1, nsLength)) && nsLength)
|
||||
{
|
||||
p->new_section = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_DONE);
|
||||
p->new_section = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (kvLength && (funcName = get_amxstring(amx, params[4], 2, esLength)) && esLength)
|
||||
{
|
||||
p->end_section = registerSPForwardByName(amx, funcName, FP_CELL, FP_DONE);
|
||||
p->end_section = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (p->key_value == -1 || (nsLength && p->new_section == -1) || (esLength && p->end_section == -1))
|
||||
|
@ -157,7 +157,7 @@ static cell AMX_NATIVE_CALL SMC_SetRawLine(AMX *amx, cell *params)
|
|||
|
||||
if ((funcName = get_amxstring(amx, params[2], 0, length)) && length)
|
||||
{
|
||||
p->raw_line = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_CELL, FP_DONE);
|
||||
p->raw_line = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_CELL, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (p->raw_line == -1)
|
||||
|
@ -169,7 +169,7 @@ static cell AMX_NATIVE_CALL SMC_SetRawLine(AMX *amx, cell *params)
|
|||
return 1;
|
||||
}
|
||||
|
||||
// native SMCError:SMC_ParseFile(SMCParser:handle, const file[], &line = 0, &col = 0);
|
||||
// native SMCError:SMC_ParseFile(SMCParser:handle, const file[], &line = 0, &col = 0, any:data = 0);
|
||||
static cell AMX_NATIVE_CALL SMC_ParseFile(AMX *amx, cell *params)
|
||||
{
|
||||
ParseInfo *p = TextParsersHandles.lookup(params[1]);
|
||||
|
@ -180,6 +180,11 @@ static cell AMX_NATIVE_CALL SMC_ParseFile(AMX *amx, cell *params)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (*params / sizeof(cell) >= 5)
|
||||
{
|
||||
p->data = params[5];
|
||||
}
|
||||
|
||||
int length;
|
||||
const char *file = build_pathname("%s", get_amxstring(amx, params[2], 0, length));
|
||||
|
||||
|
@ -222,7 +227,7 @@ static cell AMX_NATIVE_CALL INI_CreateParser(AMX *amx, cell *params)
|
|||
return createParser();
|
||||
}
|
||||
|
||||
// native bool:INI_ParseFile(INIParser:handle, const file[], &line = 0, &col = 0);
|
||||
// native bool:INI_ParseFile(INIParser:handle, const file[], &line = 0, &col = 0, any:data = 0);
|
||||
static cell AMX_NATIVE_CALL INI_ParseFile(AMX *amx, cell *params)
|
||||
{
|
||||
ParseInfo *p = TextParsersHandles.lookup(params[1]);
|
||||
|
@ -236,6 +241,11 @@ static cell AMX_NATIVE_CALL INI_ParseFile(AMX *amx, cell *params)
|
|||
int length;
|
||||
const char *file = build_pathname("%s", get_amxstring(amx, params[2], 0, length));
|
||||
|
||||
if (*params / sizeof(cell) >= 5)
|
||||
{
|
||||
p->data = params[5];
|
||||
}
|
||||
|
||||
unsigned int line, col;
|
||||
bool result = textparsers->ParseFile_INI(file, p, &line, &col);
|
||||
|
||||
|
@ -261,7 +271,7 @@ static cell AMX_NATIVE_CALL INI_SetParseStart(AMX *amx, cell *params)
|
|||
|
||||
if ((funcName = get_amxstring(amx, params[2], 0, length)) && length)
|
||||
{
|
||||
p->parse_start = registerSPForwardByName(amx, funcName, FP_CELL, FP_DONE);
|
||||
p->parse_start = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (p->parse_start == -1)
|
||||
|
@ -289,7 +299,7 @@ static cell AMX_NATIVE_CALL INI_SetParseEnd(AMX *amx, cell *params)
|
|||
|
||||
if ((funcName = get_amxstring(amx, params[2], 0, length)))
|
||||
{
|
||||
p->parse_end = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
p->parse_end = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (p->parse_end == -1)
|
||||
|
@ -317,12 +327,12 @@ static cell AMX_NATIVE_CALL INI_SetReaders(AMX *amx, cell *params)
|
|||
|
||||
if ((funcName = get_amxstring(amx, params[2], 0, kvLength)) && kvLength)
|
||||
{
|
||||
p->key_value = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_STRING, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
p->key_value = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_STRING, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (kvLength && (funcName = get_amxstring(amx, params[3], 1, nsLength)) && nsLength)
|
||||
{
|
||||
p->new_section = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
p->new_section = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (p->key_value == -1 || (nsLength && p->new_section == -1))
|
||||
|
@ -350,7 +360,7 @@ static cell AMX_NATIVE_CALL INI_SetRawLine(AMX *amx, cell *params)
|
|||
|
||||
if ((funcName = get_amxstring(amx, params[2], 0, length)) && length)
|
||||
{
|
||||
p->raw_line = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_CELL, FP_CELL, FP_DONE);
|
||||
p->raw_line = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
}
|
||||
|
||||
if (p->raw_line == -1)
|
||||
|
|
|
@ -30,6 +30,7 @@ public:
|
|||
end_section = -1;
|
||||
raw_line = -1;
|
||||
handle = -1;
|
||||
data = 0;
|
||||
}
|
||||
|
||||
public:
|
||||
|
@ -41,19 +42,19 @@ public:
|
|||
void ReadSMC_ParseStart()
|
||||
{
|
||||
if (parse_start != -1)
|
||||
executeForwards(parse_start, handle);
|
||||
executeForwards(parse_start, handle, data);
|
||||
}
|
||||
|
||||
void ReadSMC_ParseEnd(bool halted, bool failed)
|
||||
{
|
||||
if (parse_end != -1)
|
||||
executeForwards(parse_end, handle, halted ? 1 : 0, failed ? 1 : 0);
|
||||
executeForwards(parse_end, handle, halted ? 1 : 0, failed ? 1 : 0, data);
|
||||
}
|
||||
|
||||
SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name)
|
||||
{
|
||||
if (new_section != -1)
|
||||
return (SMCResult)executeForwards(new_section, handle, name);
|
||||
return (SMCResult)executeForwards(new_section, handle, name, data);
|
||||
|
||||
return SMCResult_Continue;
|
||||
}
|
||||
|
@ -61,7 +62,7 @@ public:
|
|||
SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value)
|
||||
{
|
||||
if (key_value != -1)
|
||||
return (SMCResult)executeForwards(key_value, handle, key, value);
|
||||
return (SMCResult)executeForwards(key_value, handle, key, value, data);
|
||||
|
||||
return SMCResult_Continue;
|
||||
}
|
||||
|
@ -69,7 +70,7 @@ public:
|
|||
SMCResult ReadSMC_LeavingSection(const SMCStates *states)
|
||||
{
|
||||
if (end_section != -1)
|
||||
return (SMCResult)executeForwards(end_section, handle);
|
||||
return (SMCResult)executeForwards(end_section, handle, data);
|
||||
|
||||
return SMCResult_Continue;
|
||||
}
|
||||
|
@ -77,7 +78,7 @@ public:
|
|||
SMCResult ReadSMC_RawLine(const SMCStates *states, const char *line)
|
||||
{
|
||||
if (raw_line != -1)
|
||||
return (SMCResult)executeForwards(raw_line, handle, line, states->line);
|
||||
return (SMCResult)executeForwards(raw_line, handle, line, states->line, data);
|
||||
|
||||
return SMCResult_Continue;
|
||||
}
|
||||
|
@ -90,19 +91,19 @@ public:
|
|||
void ReadINI_ParseStart()
|
||||
{
|
||||
if (parse_start != -1)
|
||||
executeForwards(parse_start, handle);
|
||||
executeForwards(parse_start, handle, data);
|
||||
}
|
||||
|
||||
void ReadINI_ParseEnd(bool halted)
|
||||
{
|
||||
if (parse_end != -1)
|
||||
executeForwards(parse_end, handle, halted ? 1 : 0);
|
||||
executeForwards(parse_end, handle, halted ? 1 : 0, data);
|
||||
}
|
||||
|
||||
bool ReadINI_NewSection(const char *section, bool invalid_tokens, bool close_bracket, bool extra_tokens, unsigned int *curtok)
|
||||
{
|
||||
if (new_section != -1)
|
||||
return executeForwards(new_section, handle, section, invalid_tokens, close_bracket, extra_tokens, *curtok) > 0 ? true : false;
|
||||
return executeForwards(new_section, handle, section, invalid_tokens, close_bracket, extra_tokens, *curtok, data) > 0 ? true : false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -110,7 +111,7 @@ public:
|
|||
bool ReadINI_KeyValue(const char *key, const char *value, bool invalid_tokens, bool equal_token, bool quotes, unsigned int *curtok)
|
||||
{
|
||||
if (key_value != -1)
|
||||
return executeForwards(key_value, handle, key, value, invalid_tokens, equal_token, quotes, *curtok) > 0 ? true : false;
|
||||
return executeForwards(key_value, handle, key, value, invalid_tokens, equal_token, quotes, *curtok, data) > 0 ? true : false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -118,7 +119,7 @@ public:
|
|||
bool ReadINI_RawLine(const char *line, unsigned int *curtok)
|
||||
{
|
||||
if (raw_line != -1)
|
||||
return executeForwards(raw_line, handle, line, *curtok) > 0 ? true : false;
|
||||
return executeForwards(raw_line, handle, line, *curtok, data) > 0 ? true : false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -130,6 +131,7 @@ public:
|
|||
int end_section;
|
||||
int raw_line;
|
||||
int handle;
|
||||
cell data;
|
||||
};
|
||||
|
||||
extern NativeHandle<ParseInfo> TextParsersHandles;
|
||||
|
|
|
@ -91,11 +91,12 @@ native INI_DestroyParser(&INIParser:handle);
|
|||
* @param file A string containing the file path.
|
||||
* @param line An optional by reference cell to store the last line number read.
|
||||
* @param col An optional by reference cell to store the last column number read.
|
||||
|
||||
* @param data An optional handle or value to pass through to callback functions
|
||||
*
|
||||
* @return An SMCParseError result.
|
||||
* @error Invalid or corrupt handle.
|
||||
*/
|
||||
native bool:INI_ParseFile(INIParser:handle, const file[], &line = 0, &col = 0);
|
||||
native bool:INI_ParseFile(INIParser:handle, const file[], &line = 0, &col = 0, any:data = 0);
|
||||
|
||||
/**
|
||||
* Sets the INI_ParseStart function of a parse handle.
|
||||
|
@ -105,10 +106,11 @@ native bool:INI_ParseFile(INIParser:handle, const file[], &line = 0, &col = 0);
|
|||
* Called when parsing is started.
|
||||
*
|
||||
* @param handle A handle to an INI Parse structure.
|
||||
* @param data Handle or value passed in INI_ParseFile
|
||||
*
|
||||
* @noreturn
|
||||
*
|
||||
* public OnParseStart(INIParser:handle)
|
||||
* public OnParseStart(INIParser:handle, any:data)
|
||||
* -
|
||||
* @param handle Handle to an INI Parse structure.
|
||||
* @param func A ParseStart callback.
|
||||
|
@ -127,10 +129,11 @@ native INI_SetParseStart(INIParser:handle, const func[]);
|
|||
*
|
||||
* @param handle A handle to an INI Parse structure.
|
||||
* @param halted True if abnormally halted, false otherwise.
|
||||
* @param data Handle or value passed in INI_ParseFile
|
||||
*
|
||||
* @noreturn
|
||||
*
|
||||
* public OnParseEnd(INIParser:handle, bool:halted)
|
||||
* public OnParseEnd(INIParser:handle, bool:halted, any:data)
|
||||
* -
|
||||
* @param handle Handle to an INI Parse structure.
|
||||
* @param func A ParseEnd callback.
|
||||
|
@ -155,9 +158,11 @@ native INI_SetParseEnd(INIParser:handle, const func[]);
|
|||
* @param extra_tokens True if extra tokens were detected on the line.
|
||||
* @param curtok Contains current token in the line where the section name starts.
|
||||
* You can add to this offset when failing to point to a token.
|
||||
* @param data Handle or value passed in INI_ParseFile
|
||||
*
|
||||
* @return True to keep parsing, false otherwise.
|
||||
*
|
||||
* public bool:OnNewSection(INIParser:handle, const section[], bool:invalid_tokens, bool:close_bracket, bool:extra_tokens, curtok)
|
||||
* public bool:OnNewSection(INIParser:handle, const section[], bool:invalid_tokens, bool:close_bracket, bool:extra_tokens, curtok, any:data)
|
||||
*
|
||||
* KeyValue:
|
||||
* Called when the parser finds a new key/value pair.
|
||||
|
@ -170,9 +175,11 @@ native INI_SetParseEnd(INIParser:handle, const func[]);
|
|||
* @param quotes Whether value was enclosed in quotes.
|
||||
* @param curtok Contains the token index of the start of the value string.
|
||||
* This can be changed when returning false.
|
||||
* @param data Handle or value passed in INI_ParseFile
|
||||
*
|
||||
* @return True to keep parsing, false otherwise.
|
||||
*
|
||||
* public bool:OnKeyValue(INIParser:handle, const key[], const value[], bool:invalid_tokens, bool:equal_token, bool:quotes, curtok)
|
||||
* public bool:OnKeyValue(INIParser:handle, const key[], const value[], bool:invalid_tokens, bool:equal_token, bool:quotes, curtok, any:data)
|
||||
* -
|
||||
* @param handle Handle to an INI Parse structure.
|
||||
* @param kv A KeyValue callback.
|
||||
|
@ -193,10 +200,11 @@ native INI_SetReaders(INIParser:smc, const kvFunc[], const nsFunc[] = "" );
|
|||
* @param line Contents of line.
|
||||
* @param lineno The line number it occurs on.
|
||||
* @param curtok Pointer to optionally store failed position in string.
|
||||
* @param data Handle or value passed in INI_ParseFile
|
||||
*
|
||||
* @return True to keep parsing, false otherwise.
|
||||
*
|
||||
* public bool:OnRawLine(INIParser:smc, const line[], lineno, curtok)
|
||||
* public bool:OnRawLine(INIParser:smc, const line[], lineno, curtok, any:data)
|
||||
*
|
||||
* @param handle Handle to an INI Parse structure.
|
||||
* @param func A RawLine callback.
|
||||
|
|
|
@ -122,11 +122,12 @@ native SMC_DestroyParser(&SMCParser:handle);
|
|||
* @param file A string containing the file path.
|
||||
* @param line An optional by reference cell to store the last line number read.
|
||||
* @param col An optional by reference cell to store the last column number read.
|
||||
* @param data An optional handle or value to pass through to callback functions
|
||||
*
|
||||
* @return An SMCParseError result.
|
||||
* @error Invalid or corrupt handle.
|
||||
*/
|
||||
native SMCError:SMC_ParseFile(SMCParser:handle, const file[], &line = 0, &col = 0);
|
||||
native SMCError:SMC_ParseFile(SMCParser:handle, const file[], &line = 0, &col = 0, any:data = 0);
|
||||
|
||||
/**
|
||||
* Sets the SMC_ParseStart function of a parse handle.
|
||||
|
@ -136,10 +137,11 @@ native SMCError:SMC_ParseFile(SMCParser:handle, const file[], &line = 0, &col =
|
|||
* Called when parsing is started.
|
||||
*
|
||||
* @param handle Handle to an SMC Parse structure.
|
||||
* @param data Handle or value passed in SMC_ParseFile
|
||||
*
|
||||
* @noreturn
|
||||
*
|
||||
* public OnParseStart(SMCParser:handle)
|
||||
* public OnParseStart(SMCParser:handle, any:data)
|
||||
* -
|
||||
* @param handle Handle to an SMC Parse structure.
|
||||
* @param func A ParseStart callback.
|
||||
|
@ -159,10 +161,11 @@ native SMC_SetParseStart(SMCParser:handle, const func[]);
|
|||
* @param handle Handle to an SMC Parse structure.
|
||||
* @param halted True if abnormally halted, false otherwise.
|
||||
* @param failed True if parsing failed, false otherwise.
|
||||
* @param data Handle or value passed in SMC_ParseFile
|
||||
*
|
||||
* @noreturn
|
||||
*
|
||||
* public OnParseEnd(SMCParser:handle, bool:halted, bool:failed)
|
||||
* public OnParseEnd(SMCParser:handle, bool:halted, bool:failed, any:data)
|
||||
* -
|
||||
* @param handle Handle to an SMC Parse structure.
|
||||
* @param func A ParseEnd callback.
|
||||
|
@ -183,10 +186,11 @@ native SMC_SetParseEnd(SMCParser:handle, const func[]);
|
|||
*
|
||||
* @param handle Handle to an SMC Parse structure.
|
||||
* @param name String containing section name.
|
||||
* @param data Handle or value passed in SMC_ParseFile
|
||||
*
|
||||
* @return An SMCResult action to take.
|
||||
*
|
||||
* public SMCResult:OnNewSection(SMCParser:handle, const name[])
|
||||
* public SMCResult:OnNewSection(SMCParser:handle, const name[], any:data)
|
||||
*
|
||||
* KeyValue:
|
||||
* Called when the parser finds a new key/value pair.
|
||||
|
@ -194,19 +198,21 @@ native SMC_SetParseEnd(SMCParser:handle, const func[]);
|
|||
* @param handle Handle to an SMC Parse structure.
|
||||
* @param key String containing key name.
|
||||
* @param value String containing value name.
|
||||
* @param data Handle or value passed in SMC_ParseFile
|
||||
*
|
||||
* @return An SMCResult action to take.
|
||||
*
|
||||
* public SMCResult:OnKeyValue(SMCParser:handle, const key[], const value[])
|
||||
* public SMCResult:OnKeyValue(SMCParser:handle, const key[], const value[], any:data)
|
||||
*
|
||||
* EndSection:
|
||||
* Called when the parser finds the end of the current section.
|
||||
*
|
||||
* @param handle Handle to an SMC Parse structure.
|
||||
* @param data Handle or value passed in SMC_ParseFile
|
||||
*
|
||||
* @return An SMCResult action to take.
|
||||
*
|
||||
* public SMCResult:OnEndSection(SMCParser:handle)
|
||||
* public SMCResult:OnEndSection(SMCParser:handle, any:data)
|
||||
* -
|
||||
* @param handle Handle to an SMC Parse structure.
|
||||
* @param kv A KeyValue callback.
|
||||
|
@ -227,10 +233,11 @@ native SMC_SetReaders(SMCParser:smc, const kvFunc[], const nsFunc[] = "", const
|
|||
* @param handle Handle to an SMC Parse structure.
|
||||
* @param line A string containing the raw line from the file.
|
||||
* @param lineno The line number it occurs on.
|
||||
* @param data Handle or value passed in SMC_ParseFile
|
||||
*
|
||||
* @return An SMCResult action to take.
|
||||
*
|
||||
* public SMCResult:SMC_RawLine(SMCParser:handle, const line[], lineno)
|
||||
* public SMCResult:SMC_RawLine(SMCParser:handle, const line[], lineno, any:data)
|
||||
* -
|
||||
* @param handle Handle to an SMC Parse structure.
|
||||
* @param func A RawLine callback.
|
||||
|
|
Loading…
Reference in New Issue
Block a user