157 lines
8.2 KiB
SourcePawn
157 lines
8.2 KiB
SourcePawn
|
// vim: set ts=4 sw=4 tw=99 noet:
|
||
|
//
|
||
|
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
|
||
|
// Copyright (C) The AMX Mod X Development Team.
|
||
|
//
|
||
|
// This software is licensed under the GNU General Public License, version 3 or higher.
|
||
|
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
|
||
|
// https://alliedmods.net/amxmodx-license
|
||
|
|
||
|
//
|
||
|
// String Manipulation Constants
|
||
|
//
|
||
|
|
||
|
#if defined _string_const_included
|
||
|
#endinput
|
||
|
#endif
|
||
|
#define _string_const_included
|
||
|
|
||
|
#define charsmax(%1) (sizeof(%1)-1)
|
||
|
|
||
|
/**
|
||
|
* @global Unless otherwise noted, all string functions which take in a
|
||
|
* writable buffer and maximum length should NOT have the null terminator INCLUDED
|
||
|
* in the length. This means that this is valid:
|
||
|
* copy(string, charsmax(string), ...)
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Buffer size used by fmt().
|
||
|
*/
|
||
|
#define MAX_FMT_LENGTH 256
|
||
|
|
||
|
/**
|
||
|
* Below are the trim flags for strtok2
|
||
|
*
|
||
|
* You can specify how the left and right buffers will
|
||
|
* be trimmed by strtok2. LTRIM trims spaces from the
|
||
|
* left side. RTRIM trims from the right side.
|
||
|
*
|
||
|
* The defines TRIM_INNER, TRIM_OUTER and TRIM_FULL are
|
||
|
* shorthands for commonly used flag combinations.
|
||
|
*
|
||
|
* When the initial string is trimmed, using TRIM_INNER
|
||
|
* for all subsequent strtok2 calls will ensure that left
|
||
|
* and right are always trimmed from both sides.
|
||
|
*
|
||
|
* Examples:
|
||
|
* str1[] = " This is * some text "
|
||
|
* strtok2(str1, left, 24, right, 24, '*', TRIM_FULL)
|
||
|
* left will be "This is", right will be "some text"
|
||
|
*
|
||
|
* str2[] = " Here is | an | example "
|
||
|
* trim(str2)
|
||
|
* strtok2(str2, left, 24, right, 24, '|', TRIM_INNER)
|
||
|
* left will be "Here is", right will be "an | example"
|
||
|
* strtok2(right, left, 24, right, 24, '|', TRIM_INNER)
|
||
|
* left will be "an", right will be "example"
|
||
|
*
|
||
|
* str3[] = " One - more "
|
||
|
* strtok2(str3, left, 24, right, 24, '-', TRIM_OUTER)
|
||
|
* left will be "One ", right will be " more"
|
||
|
*
|
||
|
* str4[] = " Final . example "
|
||
|
* strtok2(str4, left, 24, right, 24, '.', LTRIM_LEFT|LTRIM_RIGHT)
|
||
|
* left will be "Final ", right will be "example "
|
||
|
*/
|
||
|
#define LTRIM_LEFT (1<<0)
|
||
|
#define RTRIM_LEFT (1<<1)
|
||
|
#define LTRIM_RIGHT (1<<2)
|
||
|
#define RTRIM_RIGHT (1<<3)
|
||
|
|
||
|
#define TRIM_INNER RTRIM_LEFT|LTRIM_RIGHT
|
||
|
#define TRIM_OUTER LTRIM_LEFT|RTRIM_RIGHT
|
||
|
#define TRIM_FULL TRIM_OUTER|TRIM_INNER
|
||
|
|
||
|
/**
|
||
|
* Category flags to be used with is_string_category(), to check whether code points in a
|
||
|
* string are part of that category.
|
||
|
*/
|
||
|
#define UTF8C_LETTER_UPPERCASE 0x00000001 // Uppercase letter code points, Lu in the Unicode database.
|
||
|
#define UTF8C_LETTER_LOWERCASE 0x00000002 // Lowercase letter code points, Ll in the Unicode database.
|
||
|
#define UTF8C_LETTER_TITLECASE 0x00000004 // Titlecase letter code points, Lt in the Unicode database.
|
||
|
#define UTF8C_LETTER_MODIFIER 0x00000008 // Modifier letter code points, Lm in the Unicode database.
|
||
|
#define UTF8C_LETTER_OTHER 0x00000010 // Other letter code points, Lo in the Unicode database.
|
||
|
|
||
|
// Combined flag for all letter categories with case mapping
|
||
|
// Combined flag for all letter categories
|
||
|
const UTF8C_LETTER = (UTF8C_LETTER_UPPERCASE | UTF8C_LETTER_LOWERCASE | UTF8C_LETTER_TITLECASE | UTF8C_LETTER_MODIFIER | UTF8C_LETTER_OTHER);
|
||
|
const UTF8C_CASE_MAPPED = (UTF8C_LETTER_UPPERCASE | UTF8C_LETTER_LOWERCASE | UTF8C_LETTER_TITLECASE);
|
||
|
|
||
|
#define UTF8C_MARK_NON_SPACING 0x00000020 // Non-spacing mark code points, Mn in the Unicode database.
|
||
|
#define UTF8C_MARK_SPACING 0x00000040 // Spacing mark code points, Mc in the Unicode database.
|
||
|
#define UTF8C_MARK_ENCLOSING 0x00000080 // Enclosing mark code points, Me in the Unicode database.
|
||
|
|
||
|
// Combined flag for all mark categories.
|
||
|
const UTF8C_MARK = (UTF8C_MARK_NON_SPACING | UTF8C_MARK_SPACING | UTF8C_MARK_ENCLOSING);
|
||
|
|
||
|
#define UTF8C_NUMBER_DECIMAL 0x00000100 // Decimal number code points, Nd in the Unicode database.
|
||
|
#define UTF8C_NUMBER_LETTER 0x00000200 // Letter number code points, Nl in the Unicode database.
|
||
|
#define UTF8C_NUMBER_OTHER 0x00000400 // Other number code points, No in the Unicode database.
|
||
|
|
||
|
// Combined flag for all number categories.
|
||
|
const UTF8C_NUMBER = (UTF8C_NUMBER_DECIMAL | UTF8C_NUMBER_LETTER | UTF8C_NUMBER_OTHER);
|
||
|
|
||
|
#define UTF8C_PUNCTUATION_CONNECTOR 0x00000800 // Connector punctuation category, Pc in the Unicode database.
|
||
|
#define UTF8C_PUNCTUATION_DASH 0x00001000 // Dash punctuation category, Pd in the Unicode database.
|
||
|
#define UTF8C_PUNCTUATION_OPEN 0x00002000 // Open punctuation category, Ps in the Unicode database.
|
||
|
#define UTF8C_PUNCTUATION_CLOSE 0x00004000 // Close punctuation category, Pe in the Unicode database.
|
||
|
#define UTF8C_PUNCTUATION_INITIAL 0x00008000 // Initial punctuation category, Pi in the Unicode database.
|
||
|
#define UTF8C_PUNCTUATION_FINAL 0x00010000 // Final punctuation category, Pf in the Unicode database.
|
||
|
#define UTF8C_PUNCTUATION_OTHER 0x00020000 // Other punctuation category, Po in the Unicode database.
|
||
|
|
||
|
// Combined flag for all punctuation categories.
|
||
|
const UTF8C_PUNCTUATION = (UTF8C_PUNCTUATION_CONNECTOR | UTF8C_PUNCTUATION_DASH | UTF8C_PUNCTUATION_OPEN | \
|
||
|
UTF8C_PUNCTUATION_CLOSE | UTF8C_PUNCTUATION_INITIAL | UTF8C_PUNCTUATION_FINAL | \
|
||
|
UTF8C_PUNCTUATION_OTHER);
|
||
|
|
||
|
#define UTF8C_SYMBOL_MATH 0x00040000 // Math symbol category, Sm in the Unicode database.
|
||
|
#define UTF8C_SYMBOL_CURRENCY 0x00080000 // Currency symbol category, Sc in the Unicode database.
|
||
|
#define UTF8C_SYMBOL_MODIFIER 0x00100000 // Modifier symbol category, Sk in the Unicode database.
|
||
|
#define UTF8C_SYMBOL_OTHER 0x00200000 // Other symbol category, So in the Unicode database.
|
||
|
|
||
|
// Combined flag for all symbol categories.
|
||
|
const UTF8C_SYMBOL = (UTF8C_SYMBOL_MATH | UTF8C_SYMBOL_CURRENCY | UTF8C_SYMBOL_MODIFIER | UTF8C_SYMBOL_OTHER);
|
||
|
|
||
|
#define UTF8C_SEPARATOR_SPACE 0x00400000 // Space separator category, Zs in the Unicode database.
|
||
|
#define UTF8C_SEPARATOR_LINE 0x00800000 // Line separator category, Zl in the Unicode database.
|
||
|
#define UTF8C_SEPARATOR_PARAGRAPH 0x01000000 // Paragraph separator category, Zp in the Unicode database.
|
||
|
|
||
|
// Combined flag for all separator categories.
|
||
|
const UTF8C_SEPARATOR = (UTF8C_SEPARATOR_SPACE | UTF8C_SEPARATOR_LINE | UTF8C_SEPARATOR_PARAGRAPH);
|
||
|
|
||
|
#define UTF8C_CONTROL 0x02000000 // Control category, Cc in the Unicode database.
|
||
|
#define UTF8C_FORMAT 0x04000000 // Format category, Cf in the Unicode database.
|
||
|
#define UTF8C_SURROGATE 0x08000000 // Surrogate category, Cs in the Unicode database.
|
||
|
#define UTF8C_PRIVATE_USE 0x10000000 // Private use category, Co in the Unicode database.
|
||
|
#define UTF8C_UNASSIGNED 0x20000000 // Unassigned category, Cn in the Unicode database.
|
||
|
#define UTF8C_COMPATIBILITY 0x40000000 // Flag used for maintaining backwards compatibility with POSIX
|
||
|
#define UTF8C_IGNORE_GRAPHEME_CLUSTER 0x80000000 // Flag used for checking only the general category of code points at the start of a grapheme cluster.
|
||
|
|
||
|
// Flag used for maintaining backwards compatibility with POSIX function
|
||
|
const UTF8C_ISCNTRL = (UTF8C_COMPATIBILITY | UTF8C_CONTROL);
|
||
|
const UTF8C_ISPRINT = (UTF8C_COMPATIBILITY | UTF8C_LETTER | UTF8C_NUMBER | UTF8C_PUNCTUATION | UTF8C_SYMBOL | UTF8C_SEPARATOR);
|
||
|
const UTF8C_ISSPACE = (UTF8C_COMPATIBILITY | UTF8C_SEPARATOR_SPACE);
|
||
|
const UTF8C_ISBLANK = (UTF8C_COMPATIBILITY | UTF8C_SEPARATOR_SPACE | UTF8C_PRIVATE_USE);
|
||
|
const UTF8C_ISGRAPH = (UTF8C_COMPATIBILITY | UTF8C_LETTER | UTF8C_NUMBER | UTF8C_PUNCTUATION | UTF8C_SYMBOL);
|
||
|
const UTF8C_ISPUNCT = (UTF8C_COMPATIBILITY | UTF8C_PUNCTUATION | UTF8C_SYMBOL);
|
||
|
const UTF8C_ISALNUM = (UTF8C_COMPATIBILITY | UTF8C_LETTER | UTF8C_NUMBER);
|
||
|
const UTF8C_ISALPHA = (UTF8C_COMPATIBILITY | UTF8C_LETTER);
|
||
|
const UTF8C_ISUPPER = (UTF8C_COMPATIBILITY | UTF8C_LETTER_UPPERCASE);
|
||
|
const UTF8C_ISLOWER = (UTF8C_COMPATIBILITY | UTF8C_LETTER_LOWERCASE);
|
||
|
const UTF8C_ISDIGIT = (UTF8C_COMPATIBILITY | UTF8C_NUMBER);
|
||
|
const UTF8C_ISXDIGIT = (UTF8C_COMPATIBILITY | UTF8C_NUMBER | UTF8C_PRIVATE_USE);
|
||
|
|
||
|
// All flags.
|
||
|
const UTF8C_ALL = 0xFFFFFFFF & (~UTF8C_COMPATIBILITY);
|