Commit 5bb01fa1 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-5357 REGEXP word boundaries don't work

Applied a patch from Philip Hazel implementing the non-standard
syntax for word boundaries in PCRE, for compatibility with the
old Henry Spencer's regex library.
parent d25d7ec5
#
# Bug #3928 regexp [[:>:]] and UTF-8
#
SELECT @@character_set_client, @@collation_connection;
# This should return TRUE
select 'вася' rlike '\\bвася\\b';
select 'вася ' rlike '\\bвася\\b';
select ' вася' rlike '\\bвася\\b';
select ' вася ' rlike '\\bвася\\b';
select 'вася' rlike '[[:<:]]вася[[:>:]]';
select 'вася ' rlike '[[:<:]]вася[[:>:]]';
select ' вася' rlike '[[:<:]]вася[[:>:]]';
select ' вася ' rlike '[[:<:]]вася[[:>:]]';
# This should return FALSE
select 'васяz' rlike '\\bвася\\b';
select 'zвася' rlike '\\bвася\\b';
select 'zвасяz' rlike '\\bвася\\b';
select 'васяz' rlike '[[:<:]]вася[[:>:]]';
select 'zвася' rlike '[[:<:]]вася[[:>:]]';
select 'zвасяz' rlike '[[:<:]]вася[[:>:]]';
...@@ -224,25 +224,9 @@ drop table t1; ...@@ -224,25 +224,9 @@ drop table t1;
# #
# Testing regexp # Testing regexp
# #
set collation_connection=utf8mb4_general_ci;
--source include/ctype_regex.inc
set names utf8mb4;
#
# Bug #3928 regexp [[:>:]] and UTF-8
#
set names utf8mb4; set names utf8mb4;
--source include/ctype_regex.inc
# This should return TRUE --source include/ctype_regex_utf8.inc
select 'вася' rlike '\\bвася\\b';
select 'вася ' rlike '\\bвася\\b';
select ' вася' rlike '\\bвася\\b';
select ' вася ' rlike '\\bвася\\b';
# This should return FALSE
select 'васяz' rlike '\\bвася\\b';
select 'zвася' rlike '\\bвася\\b';
select 'zвасяz' rlike '\\bвася\\b';
# #
# Bug #4555 # Bug #4555
......
...@@ -270,7 +270,7 @@ b ...@@ -270,7 +270,7 @@ b
select * from t1 where a = 'b' and a != 'b'; select * from t1 where a = 'b' and a != 'b';
a a
drop table t1; drop table t1;
set collation_connection=utf8_general_ci; set names utf8;
drop table if exists t1; drop table if exists t1;
create table t1 as create table t1 as
select repeat(' ', 64) as s1, repeat(' ',64) as s2 select repeat(' ', 64) as s1, repeat(' ',64) as s2
...@@ -314,8 +314,9 @@ NULL ...@@ -314,8 +314,9 @@ NULL
NULL NULL
NULL NULL
drop table t1; drop table t1;
set names utf8; SELECT @@character_set_client, @@collation_connection;
set names utf8; @@character_set_client @@collation_connection
utf8 utf8_general_ci
select 'вася' rlike '\\bвася\\b'; select 'вася' rlike '\\bвася\\b';
'вася' rlike '\\bвася\\b' 'вася' rlike '\\bвася\\b'
1 1
...@@ -328,6 +329,18 @@ select ' вася' rlike '\\bвася\\b'; ...@@ -328,6 +329,18 @@ select ' вася' rlike '\\bвася\\b';
select ' вася ' rlike '\\bвася\\b'; select ' вася ' rlike '\\bвася\\b';
' вася ' rlike '\\bвася\\b' ' вася ' rlike '\\bвася\\b'
1 1
select 'вася' rlike '[[:<:]]вася[[:>:]]';
'вася' rlike '[[:<:]]вася[[:>:]]'
1
select 'вася ' rlike '[[:<:]]вася[[:>:]]';
'вася ' rlike '[[:<:]]вася[[:>:]]'
1
select ' вася' rlike '[[:<:]]вася[[:>:]]';
' вася' rlike '[[:<:]]вася[[:>:]]'
1
select ' вася ' rlike '[[:<:]]вася[[:>:]]';
' вася ' rlike '[[:<:]]вася[[:>:]]'
1
select 'васяz' rlike '\\bвася\\b'; select 'васяz' rlike '\\bвася\\b';
'васяz' rlike '\\bвася\\b' 'васяz' rlike '\\bвася\\b'
0 0
...@@ -337,6 +350,15 @@ select 'zвася' rlike '\\bвася\\b'; ...@@ -337,6 +350,15 @@ select 'zвася' rlike '\\bвася\\b';
select 'zвасяz' rlike '\\bвася\\b'; select 'zвасяz' rlike '\\bвася\\b';
'zвасяz' rlike '\\bвася\\b' 'zвасяz' rlike '\\bвася\\b'
0 0
select 'васяz' rlike '[[:<:]]вася[[:>:]]';
'васяz' rlike '[[:<:]]вася[[:>:]]'
0
select 'zвася' rlike '[[:<:]]вася[[:>:]]';
'zвася' rlike '[[:<:]]вася[[:>:]]'
0
select 'zвасяz' rlike '[[:<:]]вася[[:>:]]';
'zвасяz' rlike '[[:<:]]вася[[:>:]]'
0
CREATE TABLE t1 (a enum ('Y', 'N') DEFAULT 'N' COLLATE utf8_unicode_ci); CREATE TABLE t1 (a enum ('Y', 'N') DEFAULT 'N' COLLATE utf8_unicode_ci);
ALTER TABLE t1 ADD COLUMN b CHAR(20); ALTER TABLE t1 ADD COLUMN b CHAR(20);
DROP TABLE t1; DROP TABLE t1;
......
...@@ -270,7 +270,7 @@ b ...@@ -270,7 +270,7 @@ b
select * from t1 where a = 'b' and a != 'b'; select * from t1 where a = 'b' and a != 'b';
a a
drop table t1; drop table t1;
set collation_connection=utf8mb4_general_ci; set names utf8mb4;
drop table if exists t1; drop table if exists t1;
create table t1 as create table t1 as
select repeat(' ', 64) as s1, repeat(' ',64) as s2 select repeat(' ', 64) as s1, repeat(' ',64) as s2
...@@ -314,8 +314,9 @@ NULL ...@@ -314,8 +314,9 @@ NULL
NULL NULL
NULL NULL
drop table t1; drop table t1;
set names utf8mb4; SELECT @@character_set_client, @@collation_connection;
set names utf8mb4; @@character_set_client @@collation_connection
utf8mb4 utf8mb4_general_ci
select 'вася' rlike '\\bвася\\b'; select 'вася' rlike '\\bвася\\b';
'вася' rlike '\\bвася\\b' 'вася' rlike '\\bвася\\b'
1 1
...@@ -328,6 +329,18 @@ select ' вася' rlike '\\bвася\\b'; ...@@ -328,6 +329,18 @@ select ' вася' rlike '\\bвася\\b';
select ' вася ' rlike '\\bвася\\b'; select ' вася ' rlike '\\bвася\\b';
' вася ' rlike '\\bвася\\b' ' вася ' rlike '\\bвася\\b'
1 1
select 'вася' rlike '[[:<:]]вася[[:>:]]';
'вася' rlike '[[:<:]]вася[[:>:]]'
1
select 'вася ' rlike '[[:<:]]вася[[:>:]]';
'вася ' rlike '[[:<:]]вася[[:>:]]'
1
select ' вася' rlike '[[:<:]]вася[[:>:]]';
' вася' rlike '[[:<:]]вася[[:>:]]'
1
select ' вася ' rlike '[[:<:]]вася[[:>:]]';
' вася ' rlike '[[:<:]]вася[[:>:]]'
1
select 'васяz' rlike '\\bвася\\b'; select 'васяz' rlike '\\bвася\\b';
'васяz' rlike '\\bвася\\b' 'васяz' rlike '\\bвася\\b'
0 0
...@@ -337,6 +350,15 @@ select 'zвася' rlike '\\bвася\\b'; ...@@ -337,6 +350,15 @@ select 'zвася' rlike '\\bвася\\b';
select 'zвасяz' rlike '\\bвася\\b'; select 'zвасяz' rlike '\\bвася\\b';
'zвасяz' rlike '\\bвася\\b' 'zвасяz' rlike '\\bвася\\b'
0 0
select 'васяz' rlike '[[:<:]]вася[[:>:]]';
'васяz' rlike '[[:<:]]вася[[:>:]]'
0
select 'zвася' rlike '[[:<:]]вася[[:>:]]';
'zвася' rlike '[[:<:]]вася[[:>:]]'
0
select 'zвасяz' rlike '[[:<:]]вася[[:>:]]';
'zвасяz' rlike '[[:<:]]вася[[:>:]]'
0
CREATE TABLE t1 (a enum ('Y', 'N') DEFAULT 'N' COLLATE utf8mb4_unicode_ci); CREATE TABLE t1 (a enum ('Y', 'N') DEFAULT 'N' COLLATE utf8mb4_unicode_ci);
ALTER TABLE t1 ADD COLUMN b CHAR(20); ALTER TABLE t1 ADD COLUMN b CHAR(20);
DROP TABLE t1; DROP TABLE t1;
......
...@@ -260,7 +260,7 @@ b ...@@ -260,7 +260,7 @@ b
select * from t1 where a = 'b' and a != 'b'; select * from t1 where a = 'b' and a != 'b';
a a
drop table t1; drop table t1;
set collation_connection=utf8mb4_general_ci; set names utf8mb4;
drop table if exists t1; drop table if exists t1;
create table t1 as create table t1 as
select repeat(' ', 64) as s1, repeat(' ',64) as s2 select repeat(' ', 64) as s1, repeat(' ',64) as s2
...@@ -304,8 +304,9 @@ NULL ...@@ -304,8 +304,9 @@ NULL
NULL NULL
NULL NULL
drop table t1; drop table t1;
set names utf8mb4; SELECT @@character_set_client, @@collation_connection;
set names utf8mb4; @@character_set_client @@collation_connection
utf8mb4 utf8mb4_general_ci
select 'вася' rlike '\\bвася\\b'; select 'вася' rlike '\\bвася\\b';
'вася' rlike '\\bвася\\b' 'вася' rlike '\\bвася\\b'
1 1
...@@ -318,6 +319,18 @@ select ' вася' rlike '\\bвася\\b'; ...@@ -318,6 +319,18 @@ select ' вася' rlike '\\bвася\\b';
select ' вася ' rlike '\\bвася\\b'; select ' вася ' rlike '\\bвася\\b';
' вася ' rlike '\\bвася\\b' ' вася ' rlike '\\bвася\\b'
1 1
select 'вася' rlike '[[:<:]]вася[[:>:]]';
'вася' rlike '[[:<:]]вася[[:>:]]'
1
select 'вася ' rlike '[[:<:]]вася[[:>:]]';
'вася ' rlike '[[:<:]]вася[[:>:]]'
1
select ' вася' rlike '[[:<:]]вася[[:>:]]';
' вася' rlike '[[:<:]]вася[[:>:]]'
1
select ' вася ' rlike '[[:<:]]вася[[:>:]]';
' вася ' rlike '[[:<:]]вася[[:>:]]'
1
select 'васяz' rlike '\\bвася\\b'; select 'васяz' rlike '\\bвася\\b';
'васяz' rlike '\\bвася\\b' 'васяz' rlike '\\bвася\\b'
0 0
...@@ -327,6 +340,15 @@ select 'zвася' rlike '\\bвася\\b'; ...@@ -327,6 +340,15 @@ select 'zвася' rlike '\\bвася\\b';
select 'zвасяz' rlike '\\bвася\\b'; select 'zвасяz' rlike '\\bвася\\b';
'zвасяz' rlike '\\bвася\\b' 'zвасяz' rlike '\\bвася\\b'
0 0
select 'васяz' rlike '[[:<:]]вася[[:>:]]';
'васяz' rlike '[[:<:]]вася[[:>:]]'
0
select 'zвася' rlike '[[:<:]]вася[[:>:]]';
'zвася' rlike '[[:<:]]вася[[:>:]]'
0
select 'zвасяz' rlike '[[:<:]]вася[[:>:]]';
'zвасяz' rlike '[[:<:]]вася[[:>:]]'
0
CREATE TABLE t1 (a enum ('Y', 'N') DEFAULT 'N' COLLATE utf8mb4_unicode_ci) ENGINE heap; CREATE TABLE t1 (a enum ('Y', 'N') DEFAULT 'N' COLLATE utf8mb4_unicode_ci) ENGINE heap;
ALTER TABLE t1 ADD COLUMN b CHAR(20); ALTER TABLE t1 ADD COLUMN b CHAR(20);
DROP TABLE t1; DROP TABLE t1;
......
...@@ -270,7 +270,7 @@ b ...@@ -270,7 +270,7 @@ b
select * from t1 where a = 'b' and a != 'b'; select * from t1 where a = 'b' and a != 'b';
a a
drop table t1; drop table t1;
set collation_connection=utf8mb4_general_ci; set names utf8mb4;
drop table if exists t1; drop table if exists t1;
create table t1 as create table t1 as
select repeat(' ', 64) as s1, repeat(' ',64) as s2 select repeat(' ', 64) as s1, repeat(' ',64) as s2
...@@ -314,8 +314,9 @@ NULL ...@@ -314,8 +314,9 @@ NULL
NULL NULL
NULL NULL
drop table t1; drop table t1;
set names utf8mb4; SELECT @@character_set_client, @@collation_connection;
set names utf8mb4; @@character_set_client @@collation_connection
utf8mb4 utf8mb4_general_ci
select 'вася' rlike '\\bвася\\b'; select 'вася' rlike '\\bвася\\b';
'вася' rlike '\\bвася\\b' 'вася' rlike '\\bвася\\b'
1 1
...@@ -328,6 +329,18 @@ select ' вася' rlike '\\bвася\\b'; ...@@ -328,6 +329,18 @@ select ' вася' rlike '\\bвася\\b';
select ' вася ' rlike '\\bвася\\b'; select ' вася ' rlike '\\bвася\\b';
' вася ' rlike '\\bвася\\b' ' вася ' rlike '\\bвася\\b'
1 1
select 'вася' rlike '[[:<:]]вася[[:>:]]';
'вася' rlike '[[:<:]]вася[[:>:]]'
1
select 'вася ' rlike '[[:<:]]вася[[:>:]]';
'вася ' rlike '[[:<:]]вася[[:>:]]'
1
select ' вася' rlike '[[:<:]]вася[[:>:]]';
' вася' rlike '[[:<:]]вася[[:>:]]'
1
select ' вася ' rlike '[[:<:]]вася[[:>:]]';
' вася ' rlike '[[:<:]]вася[[:>:]]'
1
select 'васяz' rlike '\\bвася\\b'; select 'васяz' rlike '\\bвася\\b';
'васяz' rlike '\\bвася\\b' 'васяz' rlike '\\bвася\\b'
0 0
...@@ -337,6 +350,15 @@ select 'zвася' rlike '\\bвася\\b'; ...@@ -337,6 +350,15 @@ select 'zвася' rlike '\\bвася\\b';
select 'zвасяz' rlike '\\bвася\\b'; select 'zвасяz' rlike '\\bвася\\b';
'zвасяz' rlike '\\bвася\\b' 'zвасяz' rlike '\\bвася\\b'
0 0
select 'васяz' rlike '[[:<:]]вася[[:>:]]';
'васяz' rlike '[[:<:]]вася[[:>:]]'
0
select 'zвася' rlike '[[:<:]]вася[[:>:]]';
'zвася' rlike '[[:<:]]вася[[:>:]]'
0
select 'zвасяz' rlike '[[:<:]]вася[[:>:]]';
'zвасяz' rlike '[[:<:]]вася[[:>:]]'
0
CREATE TABLE t1 (a enum ('Y', 'N') DEFAULT 'N' COLLATE utf8mb4_unicode_ci) ENGINE InnoDB; CREATE TABLE t1 (a enum ('Y', 'N') DEFAULT 'N' COLLATE utf8mb4_unicode_ci) ENGINE InnoDB;
ALTER TABLE t1 ADD COLUMN b CHAR(20); ALTER TABLE t1 ADD COLUMN b CHAR(20);
DROP TABLE t1; DROP TABLE t1;
......
...@@ -270,7 +270,7 @@ b ...@@ -270,7 +270,7 @@ b
select * from t1 where a = 'b' and a != 'b'; select * from t1 where a = 'b' and a != 'b';
a a
drop table t1; drop table t1;
set collation_connection=utf8mb4_general_ci; set names utf8mb4;
drop table if exists t1; drop table if exists t1;
create table t1 as create table t1 as
select repeat(' ', 64) as s1, repeat(' ',64) as s2 select repeat(' ', 64) as s1, repeat(' ',64) as s2
...@@ -314,8 +314,9 @@ NULL ...@@ -314,8 +314,9 @@ NULL
NULL NULL
NULL NULL
drop table t1; drop table t1;
set names utf8mb4; SELECT @@character_set_client, @@collation_connection;
set names utf8mb4; @@character_set_client @@collation_connection
utf8mb4 utf8mb4_general_ci
select 'вася' rlike '\\bвася\\b'; select 'вася' rlike '\\bвася\\b';
'вася' rlike '\\bвася\\b' 'вася' rlike '\\bвася\\b'
1 1
...@@ -328,6 +329,18 @@ select ' вася' rlike '\\bвася\\b'; ...@@ -328,6 +329,18 @@ select ' вася' rlike '\\bвася\\b';
select ' вася ' rlike '\\bвася\\b'; select ' вася ' rlike '\\bвася\\b';
' вася ' rlike '\\bвася\\b' ' вася ' rlike '\\bвася\\b'
1 1
select 'вася' rlike '[[:<:]]вася[[:>:]]';
'вася' rlike '[[:<:]]вася[[:>:]]'
1
select 'вася ' rlike '[[:<:]]вася[[:>:]]';
'вася ' rlike '[[:<:]]вася[[:>:]]'
1
select ' вася' rlike '[[:<:]]вася[[:>:]]';
' вася' rlike '[[:<:]]вася[[:>:]]'
1
select ' вася ' rlike '[[:<:]]вася[[:>:]]';
' вася ' rlike '[[:<:]]вася[[:>:]]'
1
select 'васяz' rlike '\\bвася\\b'; select 'васяz' rlike '\\bвася\\b';
'васяz' rlike '\\bвася\\b' 'васяz' rlike '\\bвася\\b'
0 0
...@@ -337,6 +350,15 @@ select 'zвася' rlike '\\bвася\\b'; ...@@ -337,6 +350,15 @@ select 'zвася' rlike '\\bвася\\b';
select 'zвасяz' rlike '\\bвася\\b'; select 'zвасяz' rlike '\\bвася\\b';
'zвасяz' rlike '\\bвася\\b' 'zвасяz' rlike '\\bвася\\b'
0 0
select 'васяz' rlike '[[:<:]]вася[[:>:]]';
'васяz' rlike '[[:<:]]вася[[:>:]]'
0
select 'zвася' rlike '[[:<:]]вася[[:>:]]';
'zвася' rlike '[[:<:]]вася[[:>:]]'
0
select 'zвасяz' rlike '[[:<:]]вася[[:>:]]';
'zвасяz' rlike '[[:<:]]вася[[:>:]]'
0
CREATE TABLE t1 (a enum ('Y', 'N') DEFAULT 'N' COLLATE utf8mb4_unicode_ci) ENGINE MyISAM; CREATE TABLE t1 (a enum ('Y', 'N') DEFAULT 'N' COLLATE utf8mb4_unicode_ci) ENGINE MyISAM;
ALTER TABLE t1 ADD COLUMN b CHAR(20); ALTER TABLE t1 ADD COLUMN b CHAR(20);
DROP TABLE t1; DROP TABLE t1;
......
...@@ -199,25 +199,9 @@ drop table t1; ...@@ -199,25 +199,9 @@ drop table t1;
# #
# Testing regexp # Testing regexp
# #
set collation_connection=utf8_general_ci;
--source include/ctype_regex.inc
set names utf8;
#
# Bug #3928 regexp [[:>:]] and UTF-8
#
set names utf8; set names utf8;
--source include/ctype_regex.inc
# This should return TRUE --source include/ctype_regex_utf8.inc
select 'вася' rlike '\\bвася\\b';
select 'вася ' rlike '\\bвася\\b';
select ' вася' rlike '\\bвася\\b';
select ' вася ' rlike '\\bвася\\b';
# This should return FALSE
select 'васяz' rlike '\\bвася\\b';
select 'zвася' rlike '\\bвася\\b';
select 'zвасяz' rlike '\\bвася\\b';
# #
# Bug #4555 # Bug #4555
......
...@@ -197,25 +197,9 @@ drop table t1; ...@@ -197,25 +197,9 @@ drop table t1;
# #
# Testing regexp # Testing regexp
# #
set collation_connection=utf8mb4_general_ci;
--source include/ctype_regex.inc
set names utf8mb4;
#
# Bug #3928 regexp [[:>:]] and UTF-8
#
set names utf8mb4; set names utf8mb4;
--source include/ctype_regex.inc
# This should return TRUE --source include/ctype_regex_utf8.inc
select 'вася' rlike '\\bвася\\b';
select 'вася ' rlike '\\bвася\\b';
select ' вася' rlike '\\bвася\\b';
select ' вася ' rlike '\\bвася\\b';
# This should return FALSE
select 'васяz' rlike '\\bвася\\b';
select 'zвася' rlike '\\bвася\\b';
select 'zвасяz' rlike '\\bвася\\b';
# #
# Bug #4555 # Bug #4555
......
...@@ -253,6 +253,19 @@ static const verbitem verbs[] = { ...@@ -253,6 +253,19 @@ static const verbitem verbs[] = {
static const int verbcount = sizeof(verbs)/sizeof(verbitem); static const int verbcount = sizeof(verbs)/sizeof(verbitem);
/* Substitutes for [[:<:]] and [[:>:]], which mean start and end of word in
another regex library. */
static const pcre_uchar sub_start_of_word[] = {
CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK,
CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w, CHAR_RIGHT_PARENTHESIS, '\0' };
static const pcre_uchar sub_end_of_word[] = {
CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK,
CHAR_LESS_THAN_SIGN, CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w,
CHAR_RIGHT_PARENTHESIS, '\0' };
/* Tables of names of POSIX character classes and their lengths. The names are /* Tables of names of POSIX character classes and their lengths. The names are
now all in a single string, to reduce the number of relocations when a shared now all in a single string, to reduce the number of relocations when a shared
library is dynamically loaded. The list of lengths is terminated by a zero library is dynamically loaded. The list of lengths is terminated by a zero
...@@ -4037,7 +4050,29 @@ for (;; ptr++) ...@@ -4037,7 +4050,29 @@ for (;; ptr++)
} }
goto NORMAL_CHAR; goto NORMAL_CHAR;
/* In another (POSIX) regex library, the ugly syntax [[:<:]] and [[:>:]] is
used for "start of word" and "end of word". As these are otherwise illegal
sequences, we don't break anything by recognizing them. They are replaced
by \b(?=\w) and \b(?<=\w) respectively. Sequences like [a[:<:]] are
erroneous and are handled by the normal code below. */
case CHAR_LEFT_SQUARE_BRACKET: case CHAR_LEFT_SQUARE_BRACKET:
if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_STARTWORD, 6) == 0)
{
nestptr = ptr + 7;
ptr = sub_start_of_word - 1;
continue;
}
if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_ENDWORD, 6) == 0)
{
nestptr = ptr + 7;
ptr = sub_end_of_word - 1;
continue;
}
/* Handle a real character class. */
previous = code; previous = code;
/* PCRE supports POSIX class stuff inside a class. Perl gives an error if /* PCRE supports POSIX class stuff inside a class. Perl gives an error if
......
...@@ -1794,6 +1794,8 @@ only. */ ...@@ -1794,6 +1794,8 @@ only. */
#define STRING_xdigit STR_x STR_d STR_i STR_g STR_i STR_t #define STRING_xdigit STR_x STR_d STR_i STR_g STR_i STR_t
#define STRING_DEFINE STR_D STR_E STR_F STR_I STR_N STR_E #define STRING_DEFINE STR_D STR_E STR_F STR_I STR_N STR_E
#define STRING_WEIRD_STARTWORD STR_LEFT_SQUARE_BRACKET STR_COLON STR_LESS_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET
#define STRING_WEIRD_ENDWORD STR_LEFT_SQUARE_BRACKET STR_COLON STR_GREATER_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET
#define STRING_CR_RIGHTPAR STR_C STR_R STR_RIGHT_PARENTHESIS #define STRING_CR_RIGHTPAR STR_C STR_R STR_RIGHT_PARENTHESIS
#define STRING_LF_RIGHTPAR STR_L STR_F STR_RIGHT_PARENTHESIS #define STRING_LF_RIGHTPAR STR_L STR_F STR_RIGHT_PARENTHESIS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment