diff --git a/amxmodx/textparse.cpp b/amxmodx/textparse.cpp index 588f6a61..7ad389de 100644 --- a/amxmodx/textparse.cpp +++ b/amxmodx/textparse.cpp @@ -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) diff --git a/amxmodx/textparse.h b/amxmodx/textparse.h index 9e5e37c8..58818995 100644 --- a/amxmodx/textparse.h +++ b/amxmodx/textparse.h @@ -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 TextParsersHandles; diff --git a/plugins/include/textparse_ini.inc b/plugins/include/textparse_ini.inc index eb96b532..56171722 100644 --- a/plugins/include/textparse_ini.inc +++ b/plugins/include/textparse_ini.inc @@ -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. diff --git a/plugins/include/textparse_smc.inc b/plugins/include/textparse_smc.inc index 5e54af18..f97f2447 100644 --- a/plugins/include/textparse_smc.inc +++ b/plugins/include/textparse_smc.inc @@ -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.