summaryrefslogtreecommitdiff
path: root/sourcemod/scripting/include/json
diff options
context:
space:
mode:
authoraura <nw@moneybot.cc>2026-02-17 23:42:09 +0100
committeraura <nw@moneybot.cc>2026-02-17 23:42:09 +0100
commit5e2eb7d67ae933b7566f1944d0bb7744da03d586 (patch)
tree054acff1113270a9cd07933df760f3768c1b6853 /sourcemod/scripting/include/json
parent341db13a008dc12bb22ceb50452d93d01476308c (diff)
move source stuff to its own folder
Diffstat (limited to 'sourcemod/scripting/include/json')
-rw-r--r--sourcemod/scripting/include/json/decode_helpers.inc312
-rw-r--r--sourcemod/scripting/include/json/definitions.inc103
-rw-r--r--sourcemod/scripting/include/json/encode_helpers.inc164
-rw-r--r--sourcemod/scripting/include/json/helpers/decode.inc502
-rw-r--r--sourcemod/scripting/include/json/helpers/encode.inc200
-rw-r--r--sourcemod/scripting/include/json/helpers/string.inc133
-rw-r--r--sourcemod/scripting/include/json/object.inc1014
-rw-r--r--sourcemod/scripting/include/json/string_helpers.inc77
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