const PROFILER_ITERATIONS_MAJOR = 1_000;
const PROFILER_ITERATIONS_MINOR = 5_000;
new const code_snippets_names[][] =
{
{"IsRPNick"},
{"IsRPNickEmitOld"},
{"IsRPNickEmit"}
};
stock bool:IsRPNick(const name[])
{ // http://pro-pawn.ru/showthread.php?7528
static i, __;
if (('A' <= name[0] <= 'Z' && ('a' <= name[1] <= 'z')))
{
for (i = 1, __ = 0;;)
{
switch (name[++i])
{
case 'a'..'z':
continue;
case '_':
if (__++, 'A' <= name[++i] <= 'Z' && 'a' <= name[++i] <= 'z')
continue;
else
break;
case '\0':
return (i >= 4 && __ == 1);
default:
return false;
}
}
}
return false;
}
stock bool:IsRPNickEmitOld(const name[])
{ // http://pro-pawn.ru/showthread.php?7528
static num_underscores, ptr;
emit
{
load.s.pri name
load.i
const.alt 'A'
jsless ret_false
const.alt 'Z'
jsgrtr ret_false
load.s.pri name
add.c (cellbits / charbits)
stor.pri ptr
load.i
const.alt 'a'
jsless ret_false
const.alt 'z'
jsgrtr ret_false
zero num_underscores
loop:
load.pri ptr
add.c (cellbits / charbits)
stor.pri ptr
load.i
const.alt 'a'
jsless is_underscore
const.alt 'z'
jsleq loop
is_underscore:
const.alt '_'
jneq is_term
inc num_underscores
load.pri ptr
add.c (cellbits / charbits)
stor.pri ptr
load.i
const.alt 'A'
jsless ret_false
const.alt 'Z'
jsgrtr ret_false
load.pri ptr
add.c (cellbits / charbits)
stor.pri ptr
load.i
const.alt 'a'
jsless ret_false
const.alt 'z'
jsleq loop
jump ret_false
is_term:
jnz ret_false
load.pri ptr
load.s.alt name
sub
const.alt (cellbits / charbits * 4)
jsless ret_false
load.pri num_underscores
const.alt 1
jsless ret_false
const.pri 1
retn
ret_false:
}
return false;
}
stock bool:IsRPNickEmit(const name[])
{ // http://pro-pawn.ru/showthread.php?7528
static num_underscores, ptr;
emit
{
load.s.pri name
load.i
const.alt 'A'
jsless ret_false
const.alt 'Z'
jsgrtr ret_false
load.s.pri name
add.c (cellbits / charbits)
load.i
const.alt 'a'
jsless ret_false
const.alt 'z'
jsgrtr ret_false
zero num_underscores
load.s.pri name
add.c (cellbits / charbits * 2)
jump loop_entry
loop:
load.pri ptr
add.c (cellbits / charbits)
loop_entry:
stor.pri ptr
load.i
const.alt 'a'
jsless is_underscore
const.alt 'z'
jsleq loop
is_underscore:
const.alt '_'
jneq is_term
inc num_underscores
load.pri ptr
add.c (cellbits / charbits)
load.i
const.alt 'A'
jsless ret_false
const.alt 'Z'
jsgrtr ret_false
load.pri ptr
add.c (cellbits / charbits * 2)
stor.pri ptr
load.i
const.alt 'a'
jsless ret_false
const.alt 'z'
jsleq loop
jump ret_false
is_term:
jnz ret_false
load.pri ptr
load.s.alt name
sub
const.alt (cellbits / charbits * 4)
jsless ret_false
load.pri num_underscores
const.alt 1
eq
retn
ret_false:
}
return false;
}
static const nicks[][] =
{
/* 50 valid nicks */
"Maurice_Young",
"Leonard_Cooper",
"Norman_Allen",
"Charles_Lopez",
"Larry_Martin",
"Vince_Stewart",
"Leonard_Clark",
"Matthew_Morgan",
"Hunter_Rodriguez",
"Charles_Wright",
"Tobias_Nelson",
"Vince_Harris",
"Aaron_Wright",
"Charles_Morris",
"Alex_Young",
"Robert_Hill",
"Vince_Hernandez",
"Colin_Edwards",
"Jack_Lee",
"Leonard_Johnson",
"Justin_Taylor",
"Aaron_Allen",
"James_Jackson",
"Ronald_Howard",
"Richard_Campbell",
"Daniel_Brown",
"Zachary_Cooper",
"James_Cooper",
"Chad_Sanchez",
"Miles_Martin",
"Zachary_Anderson",
"Daniel_Cooper",
"James_Lopez",
"Samuel_Lopez",
"Brendan_Roberts",
"James_Thompson",
"Maurice_Harris",
"Brendan_Allen",
"Todd_Smith",
"John_Collins",
"Norman_Jones",
"Eric_Murphy",
"Alex_Garcia",
"Dan_Stewart",
"Mark_Bailey",
"Frank_Garcia",
"Barry_Wilson",
"Barry_Williams",
"Walter_Davis",
"Zachary_Taylor",
/* invalid nicks */
"JonhDoe",
"Johndoe",
"johnDoe",
"John__Doe",
"John_Richard_Doe",
"john_Doe",
"John_doe",
"_",
"J_D",
"_D",
"J_",
"Richard_D",
"R_Doe"
};
#define Prerequisites(); \
static i;
#define CodeSnippet0(); \
for (i = 0; i < sizeof(nicks); ++i) \
IsRPNick(nicks[i]);
#define CodeSnippet1(); \
for (i = 0; i < sizeof(nicks); ++i) \
IsRPNickEmitOld(nicks[i]);
#define CodeSnippet2(); \
for (i = 0; i < sizeof(nicks); ++i) \
IsRPNickEmit(nicks[i]);