diff options
| author | aura <nw@moneybot.cc> | 2026-02-17 23:42:09 +0100 |
|---|---|---|
| committer | aura <nw@moneybot.cc> | 2026-02-17 23:42:09 +0100 |
| commit | 5e2eb7d67ae933b7566f1944d0bb7744da03d586 (patch) | |
| tree | 054acff1113270a9cd07933df760f3768c1b6853 /sourcemod/scripting/include/json | |
| parent | 341db13a008dc12bb22ceb50452d93d01476308c (diff) | |
move source stuff to its own folder
Diffstat (limited to 'sourcemod/scripting/include/json')
| -rw-r--r-- | sourcemod/scripting/include/json/decode_helpers.inc | 312 | ||||
| -rw-r--r-- | sourcemod/scripting/include/json/definitions.inc | 103 | ||||
| -rw-r--r-- | sourcemod/scripting/include/json/encode_helpers.inc | 164 | ||||
| -rw-r--r-- | sourcemod/scripting/include/json/helpers/decode.inc | 502 | ||||
| -rw-r--r-- | sourcemod/scripting/include/json/helpers/encode.inc | 200 | ||||
| -rw-r--r-- | sourcemod/scripting/include/json/helpers/string.inc | 133 | ||||
| -rw-r--r-- | sourcemod/scripting/include/json/object.inc | 1014 | ||||
| -rw-r--r-- | sourcemod/scripting/include/json/string_helpers.inc | 77 |
8 files changed, 0 insertions, 2505 deletions
diff --git a/sourcemod/scripting/include/json/decode_helpers.inc b/sourcemod/scripting/include/json/decode_helpers.inc deleted file mode 100644 index 0032cc3..0000000 --- a/sourcemod/scripting/include/json/decode_helpers.inc +++ /dev/null @@ -1,312 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * sm-json - * Provides a pure SourcePawn implementation of JSON encoding and decoding. - * https://github.com/clugg/sm-json - * - * sm-json (C)2018 James D. (clug) - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, 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, see <http://www.gnu.org/licenses/>. - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or <http://www.sourcemod.net/license.php>. - */ - -#if defined _json_decode_helpers_included - #endinput -#endif -#define _json_decode_helpers_included - -#include <string> - -/** - * @section Analysing format of incoming JSON cells. - */ - -/** - * Checks whether the character at the given - * position in the buffer is whitespace. - * - * @param buffer String buffer of data. - * @param pos Position to check in buffer. - * @return True if buffer[pos] is whitespace, false otherwise. - */ -stock bool json_is_whitespace(const char[] buffer, int &pos) { - return buffer[pos] == ' ' || buffer[pos] == '\t' || - buffer[pos] == '\r' || buffer[pos] == '\n'; -} - -/** - * Checks whether the character at the beginning - * of the buffer is the start of a string. - * - * @param buffer String buffer of data. - * @return True if buffer[0] is the start of a string, false otherwise. - */ -stock bool json_is_string(const char[] buffer) { - return buffer[0] == '"'; -} - -/** - * Checks whether the buffer provided contains an int. - * - * @param buffer String buffer of data. - * @return True if buffer contains an int, false otherwise. - */ -stock bool json_is_int(const char[] buffer) { - int length = strlen(buffer); - if (buffer[0] != '+' && buffer[0] != '-' && !IsCharNumeric(buffer[0])) { - return false; - } - - for (int i = 0; i < length; ++i) { - if (!IsCharNumeric(buffer[i])) return false; - } - - return true; -} - -/** - * Checks whether the buffer provided contains a float. - * - * @param buffer String buffer of data. - * @return True if buffer contains a float, false otherwise. - */ -stock bool json_is_float(const char[] buffer) { - bool has_decimal = false; - int length = strlen(buffer); - if (buffer[0] != '+' && buffer[0] != '-' && buffer[0] != '.' && !IsCharNumeric(buffer[0])) { - return false; - } - - for (int i = 0; i < length; ++i) { - if (buffer[i] == '.') { - if (has_decimal) { - return false; - } - - has_decimal = true; - } else if (!IsCharNumeric(buffer[i])) { - return false; - } - } - - return true; -} - -/** - * Checks whether the buffer provided contains a bool. - * - * @param buffer String buffer of data. - * @return True if buffer contains a bool, false otherwise. - */ -stock bool json_is_bool(const char[] buffer) { - return StrEqual(buffer, "true") || - StrEqual(buffer, "false"); -} - -/** - * Checks whether the buffer provided contains null. - * - * @param buffer String buffer of data. - * @return True if buffer contains null, false otherwise. - */ -stock bool json_is_null(const char[] buffer) { - return StrEqual(buffer, "null"); -} - -/** - * Checks whether the character at the beginning - * of the buffer is the start of an object. - * - * @param buffer String buffer of data. - * @return True if buffer[0] is the start of an object, false otherwise. - */ -stock bool json_is_object(const char[] buffer) { - return buffer[0] == '{'; -} - -/** - * Checks whether the character at the beginning - * of the buffer is the end of an object. - * - * @param buffer String buffer of data. - * @return True if buffer[0] is the end of an object, false otherwise. - */ -stock bool json_is_object_end(const char[] buffer) { - return buffer[0] == '}'; -} - -/** - * Checks whether the character at the beginning - * of the buffer is the start of an array. - * - * @param buffer String buffer of data. - * @return True if buffer[0] is the start of an array, false otherwise. - */ -stock bool json_is_array(const char[] buffer) { - return buffer[0] == '['; -} - -/** - * Checks whether the character at the beginning - * of the buffer is the start of an array. - * - * @param buffer String buffer of data. - * @return True if buffer[0] is the start of an array, false otherwise. - */ -stock bool json_is_array_end(const char[] buffer) { - return buffer[0] == ']'; -} - -/** - * Checks whether the character at the given position in the buffer - * is considered a valid 'end point' for some data, such as a - * colon (indicating a key), a comma (indicating a new element), - * or the end of an object or array. - * - * @param buffer String buffer of data. - * @param pos Position to check in buffer. - * @return True if buffer[pos] is a valid data end point, false otherwise. - */ -stock bool json_is_at_end(const char[] buffer, int &pos, bool is_array) { - return buffer[pos] == ',' || - (!is_array && buffer[pos] == ':') || - json_is_object_end(buffer[pos]) || - json_is_array_end(buffer[pos]); -} - -/** - * Moves the position until it reaches a non-whitespace - * character or the end of the buffer's maximum size. - * - * @param buffer String buffer of data. - * @param maxlen Maximum size of string buffer. - * @param pos Position to increment. - * @return True if pos is not at the end of the buffer, false otherwise. - */ -stock bool json_skip_whitespace(const char[] buffer, int maxlen, int &pos) { - while (json_is_whitespace(buffer, pos) && pos < maxlen) { - ++pos; - } - - return pos < maxlen; -} - -/** - * Extracts a JSON cell from the buffer until - * a valid end point is reached. - * - * @param buffer String buffer of data. - * @param maxlen Maximum size of string buffer. - * @param pos Position to increment. - * @param output String buffer to store output. - * @param output_maxlen Maximum size of output string buffer. - * @param is_array Whether the decoder is currently processing an array. - * @return True if pos is not at the end of the buffer, false otherwise. - */ -stock bool json_extract_until_end(const char[] buffer, int maxlen, int &pos, char[] output, int output_maxlen, bool is_array) { - // extracts a string from current pos until a valid 'end point' - strcopy(output, output_maxlen, ""); - - int start = pos; - while (!json_is_whitespace(buffer, pos) && !json_is_at_end(buffer, pos, is_array) && pos < maxlen) { - ++pos; - } - int end = pos - 1; - - // skip trailing whitespace - json_skip_whitespace(buffer, maxlen, pos); - - if (!json_is_at_end(buffer, pos, is_array)) return false; - strcopy(output, end - start + 2, buffer[start]); - - return pos < maxlen; -} - - -/** - * Extracts a JSON string from the buffer until - * a valid end point is reached. - * - * @param buffer String buffer of data. - * @param maxlen Maximum size of string buffer. - * @param pos Position to increment. - * @param output String buffer to store output. - * @param output_maxlen Maximum size of output string buffer. - * @param is_array Whether the decoder is currently processing an array. - * @return True if pos is not at the end of the buffer, false otherwise. - */ -stock bool json_extract_string(const char[] buffer, int maxlen, int &pos, char[] output, int output_maxlen, bool is_array) { - // extracts a string which needs to be quote-escaped - strcopy(output, output_maxlen, ""); - - ++pos; - int start = pos; - while (!(buffer[pos] == '"' && buffer[pos - 1] != '\\') && pos < maxlen) { - ++pos; - } - int end = pos - 1; - - // jump 1 ahead since we ended on " instead of an ending char - ++pos; - - // skip trailing whitespace - json_skip_whitespace(buffer, maxlen, pos); - - if (!json_is_at_end(buffer, pos, is_array)) return false; - // copy only from start with length end - start + 2 (+2 for NULL terminator and something else) - strcopy(output, end - start + 2, buffer[start]); - json_unescape_string(output, maxlen); - - return pos < maxlen; -} - -/** - * Extracts an int from the buffer. - * - * @param buffer String buffer of data. - * @return Int value of the buffer. - */ -stock int json_extract_int(const char[] buffer) { - return StringToInt(buffer); -} - -/** - * Extracts a float from the buffer. - * - * @param buffer String buffer of data. - * @return Float value of the buffer. - */ -stock float json_extract_float(const char[] buffer) { - return StringToFloat(buffer); -} - -/** - * Extracts a bool from the buffer. - * - * @param buffer String buffer of data. - * @return Bool value of the buffer. - */ -stock bool json_extract_bool(const char[] buffer) { - return StrEqual(buffer, "true"); -} diff --git a/sourcemod/scripting/include/json/definitions.inc b/sourcemod/scripting/include/json/definitions.inc deleted file mode 100644 index 63063d3..0000000 --- a/sourcemod/scripting/include/json/definitions.inc +++ /dev/null @@ -1,103 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * sm-json - * Provides a pure SourcePawn implementation of JSON encoding and decoding. - * https://github.com/clugg/sm-json - * - * sm-json (C)2019 James Dickens. (clug) - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, 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, see <http://www.gnu.org/licenses/>. - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or <http://www.sourcemod.net/license.php>. - */ - -#if defined _json_definitions_included - #endinput -#endif -#define _json_definitions_included - -#include <string> -#include <json/helpers/string> - -/** - * @section Pretty Print Constants - * - * Used to determine how pretty printed JSON should be formatted when encoded. - * You can modify these if you prefer your JSON formatted differently. - */ - -#define JSON_PP_AFTER_COLON " " -#define JSON_PP_INDENT " " -#define JSON_PP_NEWLINE "\n" - -/** - * @section Buffer Size Constants - * - * You may need to change these if you are working with very large arrays or floating point numbers. - */ - -#define JSON_FLOAT_BUFFER_SIZE 32 -#define JSON_INDEX_BUFFER_SIZE 16 - -/** - * @section Meta-key Constants - * - * Used to store metadata for each key in an object. - * You shouldn't need to change these unless working with keys that may clash with them. - */ - -#define JSON_ARRAY_INDEX_KEY "__array_index" -#define JSON_META_TYPE_KEY ":type" -#define JSON_META_LENGTH_KEY ":length" -#define JSON_META_HIDDEN_KEY ":hidden" - -/** - * @section General - */ - -/** - * Types of cells within a JSON object - */ -enum JSON_CELL_TYPE { - Type_Invalid = -1, - Type_String = 0, - Type_Int, - Type_Float, - Type_Bool, - Type_Null, - Type_Object -}; - -/** - * Checks whether the key provided is a meta-key that should only be used internally. - * - * @param key Key to check. - * @returns True when it is a meta-key, false otherwise. - */ -stock bool json_is_meta_key(char[] key) -{ - return json_string_endswith(key, JSON_META_TYPE_KEY) - || json_string_endswith(key, JSON_META_LENGTH_KEY) - || json_string_endswith(key, JSON_META_HIDDEN_KEY) - || StrEqual(key, JSON_ARRAY_INDEX_KEY); -} diff --git a/sourcemod/scripting/include/json/encode_helpers.inc b/sourcemod/scripting/include/json/encode_helpers.inc deleted file mode 100644 index 37cb83d..0000000 --- a/sourcemod/scripting/include/json/encode_helpers.inc +++ /dev/null @@ -1,164 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * sm-json - * Provides a pure SourcePawn implementation of JSON encoding and decoding. - * https://github.com/clugg/sm-json - * - * sm-json (C)2018 James D. (clug) - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, 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, see <http://www.gnu.org/licenses/>. - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or <http://www.sourcemod.net/license.php>. - */ - -#if defined _json_encode_helpers_included - #endinput -#endif -#define _json_encode_helpers_included - -#include <string> - -/** - * @section Calculating buffer sizes for JSON cells. - */ - -/** - * Calculates the maximum buffer length required to - * store the JSON cell representation of a string. - * - * @param maxlen The string's current length or buffer size. - * @return Maximum buffer length. - */ -stock int json_cell_string_size(int maxlen) { - return (maxlen * 2) + 3; // * 2 for potential escaping, + 2 for surrounding quotes + NULL -} - -/** - * Calculates the maximum buffer length required to - * store the JSON cell representation of an int. - * - * @param input The int. - * @return Maximum buffer length. - */ -stock int json_cell_int_size(int input) { - if (input == 0) { - return 2; // "0" + NULL - } - - return ((input < 0) ? 1 : 0) + RoundToFloor(Logarithm(FloatAbs(float(input)), 10.0)) + 2; // neg sign + number of digits + NULL -} - -/** - * Calculates the maximum buffer length required to - * store the JSON cell representation of a float. - * - * @return Maximum buffer length. - */ -stock int json_cell_float_size() { - return JSON_FLOAT_BUFFER_SIZE; // fixed-length -} - -/** - * Calculates the maximum buffer length required to - * store the JSON cell representation of a bool. - * - * @return Maximum buffer length. - */ -stock int json_cell_bool_size() { - return 6; // "true|false" + NULL -} - -/** - * Calculates the maximum buffer length required to - * store the JSON cell representation of null. - * - * @return Maximum buffer length. - */ -stock int json_cell_null_size() { - return 5; // "null" + NULL -} - -/** - * @section Generating JSON cells. - */ - -/** - * Generates the JSON cell representation of a string. - * - * @param input Value to generate output for. - * @param output String buffer to store output. - * @param maxlen Maximum size of string buffer. - */ -stock void json_cell_string(const char[] input, char[] output, int maxlen) { - strcopy(output, maxlen, "_"); // add dummy char at start so first quotation isn't escaped - StrCat(output, maxlen, input); // add input string to output - // escape everything according to JSON spec - json_escape_string(output, maxlen); - - // surround string with quotations - output[0] = '"'; - StrCat(output, maxlen, "\""); -} - -/** - * Generates the JSON cell representation of an int. - * - * @param input Value to generate output for. - * @param output String buffer to store output. - * @param maxlen Maximum size of string buffer. - */ -stock void json_cell_int(int input, char[] output, int maxlen) { - IntToString(input, output, maxlen); -} - -/** - * Generates the JSON cell representation of a float. - * - * @param input Value to generate output for. - * @param output String buffer to store output. - * @param maxlen Maximum size of string buffer. - */ -stock void json_cell_float(float input, char[] output, int maxlen) { - FloatToString(input, output, maxlen); -} - -/** - * Generates the JSON cell representation of a bool. - * - * @param input Value to generate output for. - * @param output String buffer to store output. - * @param maxlen Maximum size of string buffer. - */ -stock void json_cell_bool(bool input, char[] output, int maxlen) { - strcopy(output, maxlen, (input) ? "true" : "false"); -} - -/** - * Generates the JSON cell representation of null. - * - * @param output String buffer to store output. - * @param maxlen Maximum size of string buffer. - */ -stock void json_cell_null(char[] output, int maxlen) { - strcopy(output, maxlen, "null"); -} diff --git a/sourcemod/scripting/include/json/helpers/decode.inc b/sourcemod/scripting/include/json/helpers/decode.inc deleted file mode 100644 index f420222..0000000 --- a/sourcemod/scripting/include/json/helpers/decode.inc +++ /dev/null @@ -1,502 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * sm-json - * Provides a pure SourcePawn implementation of JSON encoding and decoding. - * https://github.com/clugg/sm-json - * - * sm-json (C)2019 James Dickens. (clug) - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, 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, see <http://www.gnu.org/licenses/>. - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or <http://www.sourcemod.net/license.php>. - */ - -#if defined _json_helpers_decode_included - #endinput -#endif -#define _json_helpers_decode_included - -#include <string> - -/** - * @section Determine Buffer Contents - */ - -/** - * Checks whether the character at the beginning - * of the buffer is whitespace. - * - * @param buffer String buffer of data. - * @returns True if the first character in the buffer - * is whitespace, false otherwise. - */ -stock bool json_is_whitespace(const char[] buffer) -{ - return buffer[0] == ' ' - || buffer[0] == '\t' - || buffer[0] == '\r' - || buffer[0] == '\n'; -} - -/** - * Checks whether the character at the beginning - * of the buffer is the start of a string. - * - * @param buffer String buffer of data. - * @returns True if the first character in the buffer - * is the start of a string, false otherwise. - */ -stock bool json_is_string(const char[] buffer) -{ - return buffer[0] == '"'; -} - -/** - * Checks whether the buffer provided contains an int. - * - * @param buffer String buffer of data. - * @returns True if buffer contains an int, false otherwise. - */ -stock bool json_is_int(const char[] buffer) -{ - bool starts_with_zero = false; - bool has_digit_gt_zero = false; - - int length = strlen(buffer); - for (int i = 0; i < length; ++i) { - // allow minus as first character only - if (i == 0 && buffer[i] == '-') { - continue; - } - - if (IsCharNumeric(buffer[i])) { - if (buffer[i] == '0') { - if (starts_with_zero) { - // detect repeating leading zeros - return false; - } else if (! has_digit_gt_zero) { - starts_with_zero = true; - } - } else { - has_digit_gt_zero = true; - } - } else { - return false; - } - } - - // buffer must start with zero and have no other numerics before decimal - // OR not start with zero and have other numerics - return (starts_with_zero && ! has_digit_gt_zero) - || (! starts_with_zero && has_digit_gt_zero); -} - -/** - * Checks whether the buffer provided contains a float. - * - * @param buffer String buffer of data. - * @returns True if buffer contains a float, false otherwise. - */ -stock bool json_is_float(const char[] buffer) -{ - bool starts_with_zero = false; - bool has_digit_gt_zero = false; - bool after_decimal = false; - bool has_digit_after_decimal = false; - bool after_exponent = false; - bool has_digit_after_exponent = false; - - int length = strlen(buffer); - for (int i = 0; i < length; ++i) { - // allow minus as first character only - if (i == 0 && buffer[i] == '-') { - continue; - } - - // if we haven't encountered a decimal or exponent yet - if (! after_decimal && ! after_exponent) { - if (buffer[i] == '.') { - // if we encounter a decimal before any digits - if (! starts_with_zero && ! has_digit_gt_zero) { - return false; - } - - after_decimal = true; - } else if (buffer[i] == 'e' || buffer[i] == 'E') { - // if we encounter an exponent before any non-zero digits - if (starts_with_zero && ! has_digit_gt_zero) { - return false; - } - - after_exponent = true; - } else if (IsCharNumeric(buffer[i])) { - if (buffer[i] == '0') { - if (starts_with_zero) { - // detect repeating leading zeros - return false; - } else if (! has_digit_gt_zero) { - starts_with_zero = true; - } - } else { - has_digit_gt_zero = true; - } - } else { - return false; - } - } else if (after_decimal && ! after_exponent) { - // after decimal has been encountered, allow any numerics - if (IsCharNumeric(buffer[i])) { - has_digit_after_decimal = true; - } else if (buffer[i] == 'e' || buffer[i] == 'E') { - if (! has_digit_after_decimal) { - // detect exponents directly after decimal - return false; - } - - after_exponent = true; - } else { - return false; - } - } else if (after_exponent) { - if ( - (buffer[i] == '+' || buffer[i] == '-') - && (buffer[i - 1] == 'e' || buffer[i - 1] == 'E') - ) { - // allow + or - directly after exponent - continue; - } else if (IsCharNumeric(buffer[i])) { - has_digit_after_exponent = true; - } else { - return false; - } - } - } - - if (starts_with_zero && has_digit_gt_zero) { - /* if buffer starts with zero, there should - be no other digits before the decimal */ - return false; - } - - // if we have a decimal, there should be digit(s) after it - if (after_decimal) { - if (! has_digit_after_decimal) { - return false; - } - } - - // if we have an exponent, there should be digit(s) after it - if (after_exponent) { - if (! has_digit_after_exponent) { - return false; - } - } - - /* we should have reached an exponent, decimal, or both. - otherwise, this number can be handled by the int parser */ - return after_decimal || after_exponent; -} - -/** - * Checks whether the buffer provided contains a bool. - * - * @param buffer String buffer of data. - * @returns True if buffer contains a bool, false otherwise. - */ -stock bool json_is_bool(const char[] buffer) -{ - return StrEqual(buffer, "true") || StrEqual(buffer, "false"); -} - -/** - * Checks whether the buffer provided contains null. - * - * @param buffer String buffer of data. - * @returns True if buffer contains null, false otherwise. - */ -stock bool json_is_null(const char[] buffer) -{ - return StrEqual(buffer, "null"); -} - -/** - * Checks whether the character at the beginning - * of the buffer is the start of an object. - * - * @param buffer String buffer of data. - * @returns True if the first character in the buffer is - * the start of an object, false otherwise. - */ -stock bool json_is_object(const char[] buffer) -{ - return buffer[0] == '{'; -} - -/** - * Checks whether the character at the beginning - * of the buffer is the end of an object. - * - * @param buffer String buffer of data. - * @returns True if the first character in the buffer is - * the end of an object, false otherwise. - */ -stock bool json_is_object_end(const char[] buffer) -{ - return buffer[0] == '}'; -} - -/** - * Checks whether the character at the beginning - * of the buffer is the start of an array. - * - * @param buffer String buffer of data. - * @returns True if the first character in the buffer is - * the start of an array, false otherwise. - */ -stock bool json_is_array(const char[] buffer) -{ - return buffer[0] == '['; -} - -/** - * Checks whether the character at the beginning - * of the buffer is the end of an array. - * - * @param buffer String buffer of data. - * @returns True if the first character in the buffer is - * the end of an array, false otherwise. - */ -stock bool json_is_array_end(const char[] buffer) -{ - return buffer[0] == ']'; -} - -/** - * Checks whether the character at the beginning of the buffer - * is considered a valid 'end point' for some data, such as a - * colon (indicating a key), a comma (indicating a new element), - * or the end of an object or array. - * - * @param buffer String buffer of data. - * @returns True if the first character in the buffer - * is a valid data end point, false otherwise. - */ -stock bool json_is_at_end(const char[] buffer, bool is_array) -{ - return buffer[0] == ',' - || (! is_array && buffer[0] == ':') - || json_is_object_end(buffer[0]) - || json_is_array_end(buffer[0]); -} - -/** - * @section Extract Contents from Buffer - */ - -/** - * Moves the position until it reaches a non-whitespace - * character or the end of the buffer's maximum size. - * - * @param buffer String buffer of data. - * @param max_size Maximum size of string buffer. - * @param pos Position to increment. - * @returns True if pos has not reached the end - * of the buffer, false otherwise. - */ -stock bool json_skip_whitespace(const char[] buffer, int max_size, int &pos) -{ - while (json_is_whitespace(buffer[pos]) && pos < max_size) { - ++pos; - } - - return pos < max_size; -} - -/** - * Extracts a JSON cell from the buffer until - * a valid end point is reached. - * - * @param buffer String buffer of data. - * @param max_size Maximum size of string buffer. - * @param pos Position to increment. - * @param output String buffer to store output. - * @param output_max_size Maximum size of output string buffer. - * @param is_array Whether the decoder is processing an array. - * @returns True if pos has not reached the end - * of the buffer, false otherwise. - */ -stock bool json_extract_until_end( - const char[] buffer, - int max_size, - int &pos, - char[] output, - int output_max_size, - bool is_array -) { - strcopy(output, output_max_size, ""); - - // set start to position of first character in cell - int start = pos; - - // while we haven't hit whitespace, an end point or the end of the buffer - while ( - ! json_is_whitespace(buffer[pos]) - && ! json_is_at_end(buffer[pos], is_array) - && pos < max_size - ) { - ++pos; - } - - // set end to the current position - int end = pos; - - // skip any following whitespace - json_skip_whitespace(buffer, max_size, pos); - - // if we aren't at a valid endpoint, extraction has failed - if (! json_is_at_end(buffer[pos], is_array)) { - return false; - } - - // copy only from start with length end - start + NULL terminator - strcopy(output, end - start + 1, buffer[start]); - - return pos < max_size; -} - -/** - * Extracts a JSON string from the buffer until - * a valid end point is reached. - * - * @param buffer String buffer of data. - * @param max_size Maximum size of string buffer. - * @param pos Position to increment. - * @param output String buffer to store output. - * @param output_max_size Maximum size of output string buffer. - * @param is_array Whether the decoder is processing an array. - * @returns True if pos has not reached the end - * of the buffer, false otherwise. - */ -stock bool json_extract_string( - const char[] buffer, - int max_size, - int &pos, - char[] output, - int output_max_size, - bool is_array -) { - strcopy(output, output_max_size, ""); - - // increment past opening quote - ++pos; - - // set start to position of first character in string - int start = pos; - - // while we haven't hit the end of the buffer - while (pos < max_size) { - // check for unescaped control characters - if ( - buffer[pos] == '\b' - || buffer[pos] == '\f' - || buffer[pos] == '\n' - || buffer[pos] == '\r' - || buffer[pos] == '\t' - ) { - return false; - } - - if (buffer[pos] == '"') { - // count preceding backslashes to check if quote is escaped - int search_pos = pos; - int preceding_backslashes = 0; - while (search_pos > 0 && buffer[--search_pos] == '\\') { - ++preceding_backslashes; - } - - // if we have an even number of backslashes, the quote is not escaped - if (preceding_backslashes % 2 == 0) { - break; - } - } - - // pass over the character as it is part of the string - ++pos; - } - - // set end to the current position - int end = pos; - - // increment past closing quote - ++pos; - - // skip trailing whitespace - if (! json_skip_whitespace(buffer, max_size, pos)) { - return false; - } - - // if we haven't reached an ending character at the end of the cell, - // there is likely junk data not encapsulated by a string - if (! json_is_at_end(buffer[pos], is_array)) { - return false; - } - - // copy only from start with length end - start + NULL terminator - strcopy(output, end - start + 1, buffer[start]); - json_unescape_string(output, max_size); - - return pos < max_size; -} - -/** - * Extracts an int from the buffer. - * - * @param buffer String buffer of data. - * @returns Int value of the buffer. - */ -stock int json_extract_int(const char[] buffer) -{ - return StringToInt(buffer); -} - -/** - * Extracts a float from the buffer. - * - * @param buffer String buffer of data. - * @returns Float value of the buffer. - */ -stock float json_extract_float(const char[] buffer) -{ - return StringToFloat(buffer); -} - -/** - * Extracts a bool from the buffer. - * - * @param buffer String buffer of data. - * @returns Bool value of the buffer. - */ -stock bool json_extract_bool(const char[] buffer) -{ - return StrEqual(buffer, "true"); -} diff --git a/sourcemod/scripting/include/json/helpers/encode.inc b/sourcemod/scripting/include/json/helpers/encode.inc deleted file mode 100644 index ceae54d..0000000 --- a/sourcemod/scripting/include/json/helpers/encode.inc +++ /dev/null @@ -1,200 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * sm-json - * Provides a pure SourcePawn implementation of JSON encoding and decoding. - * https://github.com/clugg/sm-json - * - * sm-json (C)2019 James Dickens. (clug) - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, 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, see <http://www.gnu.org/licenses/>. - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or <http://www.sourcemod.net/license.php>. - */ - -#if defined _json_helpers_encode_included - #endinput -#endif -#define _json_helpers_encode_included - -#include <string> - -/** - * @section Calculate Buffer Size for Value - */ - -/** - * Calculates the maximum buffer length required to - * store the JSON cell representation of a string. - * - * @param length The length of the string. - * @returns Maximum buffer length. - */ -stock int json_cell_string_size(int length) -{ - // double for potential escaping, + 2 for outside quotes + NULL terminator - return (length * 2) + 3; -} - -/** - * Calculates the maximum buffer length required to - * store the JSON cell representation of an int. - * - * @param input Value to calculate maximum buffer length for. - * @returns Maximum buffer length. - */ -stock int json_cell_int_size(int input) -{ - if (input == 0) { - // "0" + NULL terminator - return 2; - } - - int result = 0; - if (input < 0) { - // negative sign - result += 1; - } - - // calculate number of digits in number - result += RoundToFloor(Logarithm(FloatAbs(float(input)), 10.0)) + 1; - - // NULL terminator - result += 1; - - return result; -} - -/** - * Calculates the maximum buffer length required to - * store the JSON cell representation of a float. - * - * @returns Maximum buffer length. - */ -stock int json_cell_float_size() -{ - return JSON_FLOAT_BUFFER_SIZE; -} - -/** - * Calculates the maximum buffer length required to - * store the JSON cell representation of a bool. - * - * @returns Maximum buffer length. - */ -stock int json_cell_bool_size() -{ - // "true"|"false" + NULL terminator - return 6; -} - -/** - * Calculates the maximum buffer length required to - * store the JSON cell representation of null. - * - * @returns Maximum buffer length. - */ -stock int json_cell_null_size() -{ - // "null" + NULL terminator - return 5; -} - -/** - * @section Convert Values to JSON Cells - */ - -/** - * Generates the JSON cell representation of a string. - * - * @param input Value to generate output for. - * @param output String buffer to store output. - * @param max_size Maximum size of string buffer. - */ -stock void json_cell_string(const char[] input, char[] output, int max_size) -{ - // add dummy char that won't be escaped to replace with a quote later - strcopy(output, max_size, "?"); - - // add input string to output - StrCat(output, max_size, input); - - // escape the output string - json_escape_string(output, max_size); - - // surround string with quotations - output[0] = '"'; - StrCat(output, max_size, "\""); -} - -/** - * Generates the JSON cell representation of an int. - * - * @param input Value to generate output for. - * @param output String buffer to store output. - * @param max_size Maximum size of string buffer. - */ -stock void json_cell_int(int input, char[] output, int max_size) -{ - IntToString(input, output, max_size); -} - -/** - * Generates the JSON cell representation of a float. - * - * @param input Value to generate output for. - * @param output String buffer to store output. - * @param max_size Maximum size of string buffer. - */ -stock void json_cell_float(float input, char[] output, int max_size) -{ - FloatToString(input, output, max_size); - - // trim trailing 0s from float output up until decimal point - int last_char = strlen(output) - 1; - while (output[last_char] == '0' && output[last_char - 1] != '.') { - output[last_char--] = '\0'; - } -} - -/** - * Generates the JSON cell representation of a bool. - * - * @param input Value to generate output for. - * @param output String buffer to store output. - * @param max_size Maximum size of string buffer. - */ -stock void json_cell_bool(bool input, char[] output, int max_size) -{ - strcopy(output, max_size, (input) ? "true" : "false"); -} - -/** - * Generates the JSON cell representation of null. - * - * @param output String buffer to store output. - * @param max_size Maximum size of string buffer. - */ -stock void json_cell_null(char[] output, int max_size) -{ - strcopy(output, max_size, "null"); -} diff --git a/sourcemod/scripting/include/json/helpers/string.inc b/sourcemod/scripting/include/json/helpers/string.inc deleted file mode 100644 index 14fe38a..0000000 --- a/sourcemod/scripting/include/json/helpers/string.inc +++ /dev/null @@ -1,133 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * sm-json - * Provides a pure SourcePawn implementation of JSON encoding and decoding. - * https://github.com/clugg/sm-json - * - * sm-json (C)2019 James Dickens. (clug) - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, 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, see <http://www.gnu.org/licenses/>. - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or <http://www.sourcemod.net/license.php>. - */ - -#if defined _json_helpers_string_included - #endinput -#endif -#define _json_helpers_string_included - -/** - * Mapping characters to their escaped form. - */ -char JSON_STRING_NORMAL[][] = { - "\\", "\"", "/", "\b", "\f", "\n", "\r", "\t" -}; -char JSON_STRING_ESCAPED[][] = { - "\\\\", "\\\"", "\\/", "\\b", "\\f", "\\n", "\\r", "\\t" -}; - -/** - * Escapes a string in-place in a buffer. - * - * @param buffer String buffer. - * @param max_size Maximum size of string buffer. - */ -stock void json_escape_string(char[] buffer, int max_size) -{ - for (int i = 0; i < sizeof(JSON_STRING_NORMAL); ++i) { - ReplaceString( - buffer, - max_size, - JSON_STRING_NORMAL[i], - JSON_STRING_ESCAPED[i] - ); - } -} - -/** - * Unescapes a string in-place in a buffer. - * - * @param buffer String buffer. - * @param max_size Maximum size of string buffer. - */ -stock void json_unescape_string(char[] buffer, int max_size) -{ - for (int i = 0; i < sizeof(JSON_STRING_NORMAL); ++i) { - ReplaceString( - buffer, - max_size, - JSON_STRING_ESCAPED[i], - JSON_STRING_NORMAL[i] - ); - } -} - -/** - * Checks if a string starts with another string. - * - * @param haystack String to check that starts with needle. - * @param max_size Maximum size of string buffer. - * @param needle String to check that haystack starts with. - * @returns True if haystack begins with needle, false otherwise. - */ -stock bool json_string_startswith(const char[] haystack, const char[] needle) -{ - int haystack_length = strlen(haystack); - int needle_length = strlen(needle); - if (needle_length > haystack_length) { - return false; - } - - for (int i = 0; i < needle_length; ++i) { - if (haystack[i] != needle[i]) { - return false; - } - } - - return true; -} - -/** - * Checks if a string ends with another string. - * - * @param haystack String to check that ends with needle. - * @param max_size Maximum size of string buffer. - * @param needle String to check that haystack ends with. - * @returns True if haystack ends with needle, false otherwise. - */ -stock bool json_string_endswith(const char[] haystack, const char[] needle) -{ - int haystack_length = strlen(haystack); - int needle_length = strlen(needle); - if (needle_length > haystack_length) { - return false; - } - - for (int i = 0; i < needle_length; ++i) { - if (haystack[haystack_length - needle_length + i] != needle[i]) { - return false; - } - } - - return true; -} diff --git a/sourcemod/scripting/include/json/object.inc b/sourcemod/scripting/include/json/object.inc deleted file mode 100644 index 8d17568..0000000 --- a/sourcemod/scripting/include/json/object.inc +++ /dev/null @@ -1,1014 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * sm-json - * Provides a pure SourcePawn implementation of JSON encoding and decoding. - * https://github.com/clugg/sm-json - * - * sm-json (C)2019 James Dickens. (clug) - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, 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, see <http://www.gnu.org/licenses/>. - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or <http://www.sourcemod.net/license.php>. - */ - -#if defined _json_object_included - #endinput -#endif -#define _json_object_included - -#include <string> -#include <json/definitions> -#include <json/helpers/encode> -#include <json> - -methodmap JSON_Object < StringMap -{ - /** - * Creates a new JSON_Object. - * - * @param is_array Should the object created be an array? [default: false] - * @returns A new JSON_Object. - */ - public JSON_Object(bool is_array = false) - { - StringMap self = CreateTrie(); - if (is_array) { - self.SetValue(JSON_ARRAY_INDEX_KEY, 0); - } - - return view_as<JSON_Object>(self); - } - - /** - * Checks whether the object has a key. - * - * @param key Key to check existence of. - * @returns True if the key exists, false otherwise. - */ - public bool HasKey(const char[] key) - { - int dummy_int; - char dummy_str[1]; - - return this.GetValue(key, dummy_int) - || this.GetString(key, dummy_str, sizeof(dummy_str)); - } - - /** - * @section Array helpers. - */ - - /** - * Whether the current object is an array. - */ - property bool IsArray { - public get() - { - return this.HasKey(JSON_ARRAY_INDEX_KEY); - } - } - - /** - * The current index of the object if it is an array, or -1 otherwise. - */ - property int CurrentIndex { - public get() - { - if (! this.IsArray) { - return -1; - } - - int result; - return (this.GetValue(JSON_ARRAY_INDEX_KEY, result)) ? result : -1; - } - - public set(int value) - { - this.SetValue(JSON_ARRAY_INDEX_KEY, value); - } - } - - /** - * The number of items in the object if it is an array, - * or the number of keys (including meta-keys) otherwise. - */ - property int Length { - public get() - { - StringMapSnapshot snap = this.Snapshot(); - int length = (this.IsArray) ? this.CurrentIndex : snap.Length; - delete snap; - - return length; - } - } - - /** - * Increments the current index of the object. - * - * @returns True on success, false if the current object is not an array. - */ - public bool IncrementIndex() - { - if (! this.HasKey(JSON_ARRAY_INDEX_KEY)) { - return false; - } - - this.CurrentIndex += 1; - - return true; - } - - /** - * Checks whether the object has an index. - * - * @param index Index to check existence of. - * @returns True if the index exists, false otherwise. - */ - public bool HasIndex(int index) - { - return index >= 0 && index < this.Length; - } - - /** - * Gets the string representation of an array index. - * - * @param output String buffer to store output. - * @param max_size Maximum size of string buffer. - * @param key Key to get string for. [default: current index] - * @returns True on success, false otherwise. - */ - public int GetIndexString(char[] output, int max_size, int key = -1) - { - key = (key == -1) ? this.CurrentIndex : key; - if (key == -1) { - return false; - } - - return IntToString(key, output, max_size); - } - - /** - * @section Internal Getters - */ - - /** - * Gets the cell type stored at a key. - * - * @param key Key to get value type for. - * @returns Value type for key provided, - * or Type_Invalid if it does not exist. - */ - public JSON_CELL_TYPE GetKeyType(const char[] key) - { - int max_size = strlen(key) + strlen(JSON_META_TYPE_KEY) + 1; - char[] type_key = new char[max_size]; - Format(type_key, max_size, "%s%s", key, JSON_META_TYPE_KEY); - - JSON_CELL_TYPE type; - return (this.GetValue(type_key, type)) ? type : Type_Invalid; - } - - /** - * Gets the cell type stored at an index. - * - * @param index Index to get value type for. - * @returns Value type for index provided, or Type_Invalid if it does not exist. - */ - public JSON_CELL_TYPE GetKeyTypeIndexed(int index) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return Type_Invalid; - } - - return this.GetKeyType(key); - } - - /** - * Gets the length of the string stored at a key. - * - * @param key Key to get string length for. - * @returns Length of string at key provided, - * or -1 if it is not a string/does not exist. - */ - public int GetKeyLength(const char[] key) - { - int max_size = strlen(key) + strlen(JSON_META_LENGTH_KEY) + 1; - char[] length_key = new char[max_size]; - Format(length_key, max_size, "%s%s", key, JSON_META_LENGTH_KEY); - - int length; - return (this.GetValue(length_key, length)) ? length : -1; - } - - /** - * Gets the length of the string stored at an index. - * - * @param index Index to get string length for. - * @returns Length of string at index provided, or -1 if it is not a string/does not exist. - */ - public int GetKeyLengthIndexed(int index) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return -1; - } - - return this.GetKeyLength(key); - } - - /** - * Gets whether the key should be hidden from encoding. - * - * @param key Key to get hidden state for. - * @returns Whether or not the key should be hidden. - */ - public bool GetKeyHidden(const char[] key) - { - int max_size = strlen(key) + strlen(JSON_META_HIDDEN_KEY) + 1; - char[] length_key = new char[max_size]; - Format(length_key, max_size, "%s%s", key, JSON_META_HIDDEN_KEY); - - bool hidden; - return (this.GetValue(length_key, hidden)) ? hidden : false; - } - - /** - * Gets whether the index should be hidden from encoding. - * - * @param index Index to get hidden state for. - * @returns Whether or not the index should be hidden. - */ - public bool GetKeyHiddenIndexed(int index) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.GetKeyHidden(key); - } - - /** - * @section Internal Setters - */ - - /** - * Sets the cell type stored at a key. - * - * @param key Key to set value type for. - * @param type Type to set key to. - * @returns True on success, false otherwise. - */ - public bool SetKeyType(const char[] key, JSON_CELL_TYPE type) - { - int max_size = strlen(key) + strlen(JSON_META_TYPE_KEY) + 1; - char[] type_key = new char[max_size]; - Format(type_key, max_size, "%s%s", key, JSON_META_TYPE_KEY); - - return this.SetValue(type_key, type); - } - - /** - * Sets the cell type stored at an index. - * - * @param index Index to set value type for. - * @param type Type to set index to. - * @returns True on success, false otherwise. - */ - public bool SetKeyTypeIndexed(int index, JSON_CELL_TYPE value) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.SetKeyType(key, value); - } - - /** - * Sets the length of the string stored at a key. - * - * @param key Key to set string length for. - * @param length Length to set string to. - * @returns True on success, false otherwise. - */ - public bool SetKeyLength(const char[] key, int length) - { - int max_size = strlen(key) + strlen(JSON_META_LENGTH_KEY) + 1; - char[] length_key = new char[max_size]; - Format(length_key, max_size, "%s%s", key, JSON_META_LENGTH_KEY); - - return this.SetValue(length_key, length); - } - - /** - * Sets the length of the string stored at an index. - * - * @param index Index to set string length for. - * @param length Length to set string to. - * @returns True on success, false otherwise. - */ - public bool SetKeyLengthIndexed(int index, int length) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.SetKeyLength(key, length); - } - - /** - * Sets whether the key should be hidden from encoding. - * - * @param key Key to set hidden state for. - * @param hidden Wheter or not the key should be hidden. - * @returns True on success, false otherwise. - */ - public bool SetKeyHidden(const char[] key, bool hidden) - { - int max_size = strlen(key) + strlen(JSON_META_HIDDEN_KEY) + 1; - char[] hidden_key = new char[max_size]; - Format(hidden_key, max_size, "%s%s", key, JSON_META_HIDDEN_KEY); - - return this.SetValue(hidden_key, hidden); - } - - /** - * Sets whether the index should be hidden from encoding. - * - * @param index Index to set hidden state for. - * @param hidden Wheter or not the index should be hidden. - * @returns True on success, false otherwise. - */ - public bool SetKeyHiddenIndexed(int index, bool hidden) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.SetKeyHidden(key, hidden); - } - - /** - * @section Getters - */ - - // GetValue is implemented natively by StringMap - - /** - * Retrieves the value stored at an index. - * - * @param index Index to retrieve value for. - * @param value Variable to store value. - * @returns Value stored at index. - */ - public bool GetValueIndexed(int index, any &value) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.GetValue(key, value); - } - - // GetString is implemented natively by StringMap - - /** - * Retrieves the string stored at an index. - * - * @param index Index to retrieve string value for. - * @param value String buffer to store output. - * @param max_size Maximum size of string buffer. - * @returns True on success. False if the key is not set, or the key is set as a value or array (not a string). - */ - public bool GetStringIndexed(int index, char[] value, int max_size) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.GetString(key, value, max_size); - } - - /** - * Retrieves the int stored at a key. - * - * @param key Key to retrieve int value for. - * @returns Value stored at key. - */ - public int GetInt(const char[] key) - { - int value; - return (this.GetValue(key, value)) ? value : -1; - } - - /** - * Retrieves the int stored at an index. - * - * @param index Index to retrieve int value for. - * @returns Value stored at index. - */ - public int GetIntIndexed(int index) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return -1; - } - - return this.GetInt(key); - } - - /** - * Retrieves the float stored at a key. - * - * @param key Key to retrieve float value for. - * @returns Value stored at key. - */ - public float GetFloat(const char[] key) - { - float value; - return (this.GetValue(key, value)) ? value : -1.0; - } - - /** - * Retrieves the float stored at an index. - * - * @param index Index to retrieve float value for. - * @returns Value stored at index. - */ - public float GetFloatIndexed(int index) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return -1.0; - } - - return this.GetFloat(key); - } - - /** - * Retrieves the bool stored at a key. - * - * @param key Key to retrieve bool value for. - * @returns Value stored at key. - */ - public bool GetBool(const char[] key) - { - bool value; - return (this.GetValue(key, value)) ? value : false; - } - - /** - * Retrieves the bool stored at an index. - * - * @param index Index to retrieve bool value for. - * @returns Value stored at index. - */ - public bool GetBoolIndexed(int index) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.GetBool(key); - } - - /** - * Retrieves the handle stored at a key. - * - * @param key Key to retrieve handle value for. - * @returns Value stored at key. - */ - public Handle GetHandle(const char[] key) - { - Handle value; - return (this.GetValue(key, value)) ? value : null; - } - - /** - * Retrieves the handle stored at an index. - * - * @param index Index to retrieve handle value for. - * @returns Value stored at index. - */ - public Handle GetHandleIndexed(int index) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return null; - } - - return this.GetHandle(key); - } - - /** - * Retrieves the JSON object stored at a key. - * - * @param key Key to retrieve object value for. - * @returns Value stored at key. - */ - public JSON_Object GetObject(const char[] key) - { - return view_as<JSON_Object>(this.GetHandle(key)); - } - - /** - * Retrieves the object stored at an index. - * - * @param index Index to retrieve object value for. - * @returns Value stored at index. - */ - public JSON_Object GetObjectIndexed(int index) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return null; - } - - return this.GetObject(key); - } - - /** - * @section Setters - */ - - /** - * Sets the string stored at a key. - * - * @param key Key to set to string value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetString(const char[] key, const char[] value, bool replace = true) - { - return this.SetString(key, value, replace) - && this.SetKeyType(key, Type_String) - && this.SetKeyLength(key, strlen(value)); - } - - /** - * Sets the string stored at an index. - * - * @param index Index to set to string value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetStringIndexed(int index, const char[] value, bool replace = true) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.SetString(key, value, replace); - } - - /** - * Sets the int stored at a key. - * - * @param key Key to set to int value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetInt(const char[] key, int value, bool replace = true) - { - return this.SetValue(key, value, replace) - && this.SetKeyType(key, Type_Int); - } - - /** - * Sets the int stored at an index. - * - * @param index Index to set to int value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetIntIndexed(int index, int value, bool replace = true) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.SetInt(key, value, replace); - } - - /** - * Sets the float stored at a key. - * - * @param key Key to set to float value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetFloat(const char[] key, float value, bool replace = true) - { - return this.SetValue(key, value, replace) - && this.SetKeyType(key, Type_Float); - } - - /** - * Sets the float stored at an index. - * - * @param index Index to set to float value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetFloatIndexed(int index, float value, bool replace = true) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.SetFloat(key, value, replace); - } - - /** - * Sets the bool stored at a key. - * - * @param key Key to set to bool value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetBool(const char[] key, bool value, bool replace = true) - { - return this.SetValue(key, value, replace) - && this.SetKeyType(key, Type_Bool); - } - - /** - * Sets the bool stored at an index. - * - * @param index Index to set to bool value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetBoolIndexed(int index, bool value, bool replace = true) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.SetBool(key, value, replace); - } - - /** - * Sets the handle stored at a key. - * - * @param key Key to set to handle value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetHandle(const char[] key, Handle value = null, bool replace = true) - { - return this.SetValue(key, value, replace) - && this.SetKeyType(key, Type_Null); - } - - /** - * Sets the handle stored at an index. - * - * @param index Index to set to handle value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetHandleIndexed(int index, Handle value = null, bool replace = true) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.SetHandle(key, value, replace); - } - - /** - * Sets the object stored at a key. - * - * @param key Key to set to object value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetObject(const char[] key, JSON_Object value, bool replace = true) - { - return this.SetValue(key, value, replace) - && this.SetKeyType(key, Type_Object); - } - - /** - * Sets the object stored at an index. - * - * @param index Index to set to object value. - * @param value Value to set. - * @returns True on success, false otherwise. - */ - public bool SetObjectIndexed(int index, JSON_Object value, bool replace = true) - { - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - return this.SetObject(key, value, replace); - } - - /** - * @section Array setters. - */ - - /** - * Pushes a string to the end of the array. - * - * @param value Value to push. - * @returns True on success, false otherwise. - */ - public bool PushString(const char[] value) - { - return this.SetStringIndexed(this.CurrentIndex, value) - && this.IncrementIndex(); - } - - /** - * Pushes an int to the end of the array. - * - * @param value Value to push. - * @returns True on success, false otherwise. - */ - public bool PushInt(int value) - { - return this.SetIntIndexed(this.CurrentIndex, value) - && this.IncrementIndex(); - } - - /** - * Pushes a float to the end of the array. - * - * @param value Value to push. - * @returns True on success, false otherwise. - */ - public bool PushFloat(float value) - { - return this.SetFloatIndexed(this.CurrentIndex, value) - && this.IncrementIndex(); - } - - /** - * Pushes a bool to the end of the array. - * - * @param value Value to push. - * @returns True on success, false otherwise. - */ - public bool PushBool(bool value) - { - return this.SetBoolIndexed(this.CurrentIndex, value) - && this.IncrementIndex(); - } - - /** - * Pushes a handle to the end of the array. - * - * @param value Value to push. - * @returns True on success, false otherwise. - */ - public bool PushHandle(Handle value = null) - { - return this.SetHandleIndexed(this.CurrentIndex, value) - && this.IncrementIndex(); - } - - /** - * Pushes an object to the end of the array. - * - * @param value Value to push. - * @returns True on success, false otherwise. - */ - public bool PushObject(JSON_Object value) - { - return this.SetObjectIndexed(this.CurrentIndex, value) - && this.IncrementIndex(); - } - - /** - * @section Generic. - */ - - /** - * Finds the index of a value in the array. - * - * @param value Value to search for. - * @returns The index of the value if it is found, -1 otherwise. - */ - public int IndexOf(any value) - { - any current; - for (int i = 0; i < this.CurrentIndex; ++i) { - if (this.GetValueIndexed(i, current) && value == current) { - return i; - } - } - - return -1; - } - - /** - * Finds the index of a string in the array. - * - * @param value String to search for. - * @returns The index of the string if it is found, -1 otherwise. - */ - public int IndexOfString(const char[] value) - { - for (int i = 0; i < this.CurrentIndex; ++i) { - if (this.GetKeyTypeIndexed(i) != Type_String) { - continue; - } - - int current_size = this.GetKeyLengthIndexed(i) + 1; - char[] current = new char[current_size]; - this.GetStringIndexed(i, current, current_size); - if (StrEqual(value, current)) { - return i; - } - } - - return -1; - } - - /** - * Determines whether the array contains a value. - * - * @param value Value to search for. - * @returns True if the value is found, false otherwise. - */ - public bool Contains(any value) - { - return this.IndexOf(value) != -1; - } - - /** - * Determines whether the array contains a string. - * - * @param value String to search for. - * @returns True if the string is found, false otherwise. - */ - public bool ContainsString(const char[] value) - { - return this.IndexOfString(value) != -1; - } - - /** - * Removes an item from the object by key. - * - * @param key Key of object to remove. - * @returns True on success, false if the value was never set. - */ - public bool Remove(const char[] key) { - static char meta_keys[][] = { - JSON_META_TYPE_KEY, JSON_META_LENGTH_KEY, JSON_META_HIDDEN_KEY - }; - - // create a new char[] which will fit the longest meta-key - int meta_key_size = strlen(key) + 8; - char[] meta_key = new char[meta_key_size]; - - // view ourselves as a StringMap so we can call underlying Remove() method - StringMap self = view_as<StringMap>(this); - - bool success = true; - for (int i = 0; i < sizeof(meta_keys); ++i) { - Format(meta_key, meta_key_size, "%s%s", key, meta_keys[i]); - - if (this.HasKey(meta_key)) { - success = success && self.Remove(meta_key); - } - } - - return success && self.Remove(key); - } - - /** - * Removes a key and its related meta-keys from the object. - * - * @param key Key to remove. - * @returns True on success, false if the value was never set. - */ - public bool RemoveIndexed(int index) - { - if (! this.HasIndex(index)) { - return false; - } - - char key[JSON_INDEX_BUFFER_SIZE]; - if (! this.GetIndexString(key, sizeof(key), index)) { - return false; - } - - if (! this.Remove(key)) { - return false; - } - - for (int i = index + 1; i < this.CurrentIndex; ++i) { - if (! this.GetIndexString(key, sizeof(key), i)) { - return false; - } - - int target = i - 1; - - JSON_CELL_TYPE type = this.GetKeyTypeIndexed(i); - - switch (type) { - case Type_String: { - int str_length = this.GetKeyLengthIndexed(i); - char[] str_value = new char[str_length]; - - this.GetStringIndexed(i, str_value, str_length + 1); - this.SetStringIndexed(target, str_value); - } - case Type_Int: { - this.SetIntIndexed(target, this.GetIntIndexed(i)); - } - case Type_Float: { - this.SetFloatIndexed(target, this.GetFloatIndexed(i)); - } - case Type_Bool: { - this.SetBoolIndexed(target, this.GetBoolIndexed(i)); - } - case Type_Null: { - this.SetHandleIndexed(target, this.GetHandleIndexed(i)); - } - case Type_Object: { - this.SetObjectIndexed(target, this.GetObjectIndexed(i)); - } - } - - if (this.GetKeyHiddenIndexed(i)) { - this.SetKeyHiddenIndexed(target, true); - } - - this.Remove(key); - } - - this.CurrentIndex -= 1; - - return true; - } - - /** - * Encodes the instance into its string representation. - * - * @param output String buffer to store output. - * @param max_size Maximum size of string buffer. - * @param pretty_print Should the output be pretty printed (newlines and spaces)? [default: false] - * @param depth The current depth of the encoder. [default: 0] - */ - public void Encode(char[] output, int max_size, bool pretty_print = false, int depth = 0) - { - json_encode(this, output, max_size, pretty_print, depth); - } - - /** - * Decodes a JSON string into this object. - * - * @param buffer Buffer to decode. - */ - public void Decode(const char[] buffer) - { - json_decode(buffer, this); - } - - /** - * Recursively cleans up the object and any objects referenced within. - */ - public void Cleanup() - { - json_cleanup(this); - } -}; diff --git a/sourcemod/scripting/include/json/string_helpers.inc b/sourcemod/scripting/include/json/string_helpers.inc deleted file mode 100644 index 6063d47..0000000 --- a/sourcemod/scripting/include/json/string_helpers.inc +++ /dev/null @@ -1,77 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * sm-json - * Provides a pure SourcePawn implementation of JSON encoding and decoding. - * https://github.com/clugg/sm-json - * - * sm-json (C)2018 James D. (clug) - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, 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, see <http://www.gnu.org/licenses/>. - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or <http://www.sourcemod.net/license.php>. - */ - -#if defined _json_string_helpers_included - #endinput -#endif -#define _json_string_helpers_included - -/** - * Checks if a string starts with another string. - * - * @param haystack String to check that starts with needle. - * @param maxlen Maximum size of string buffer. - * @param needle String to check that haystack starts with. - * @return True if haystack begins with needle, false otherwise. - */ -stock bool json_string_startswith(const char[] haystack, const char[] needle) { - int haystack_length = strlen(haystack); - int needle_length = strlen(needle); - if (needle_length > haystack_length) return false; - - for (int i = 0; i < needle_length; ++i) { - if (haystack[i] != needle[i]) return false; - } - - return true; -} - -/** - * Checks if a string ends with another string. - * - * @param haystack String to check that ends with needle. - * @param maxlen Maximum size of string buffer. - * @param needle String to check that haystack ends with. - * @return True if haystack ends with needle, false otherwise. - */ -stock bool json_string_endswith(const char[] haystack, const char[] needle) { - int haystack_length = strlen(haystack); - int needle_length = strlen(needle); - if (needle_length > haystack_length) return false; - - for (int i = 0; i < needle_length; ++i) { - if (haystack[haystack_length - needle_length + i] != needle[i]) return false; - } - - return true; -}
\ No newline at end of file |
