Fixed Strip() bugs

This commit is contained in:
David Anderson 2004-08-09 10:07:33 +00:00
parent 85afb2a823
commit edfb24bcd1
4 changed files with 261 additions and 11 deletions

240
compiler/scasm/adminslots.asm Executable file
View File

@ -0,0 +1,240 @@
;(C)2004 David "BAILOPAN" Anderson
; Assembler version of Anti-Flood
#define VERSION "0.20-A"
#define PLUGIN_HANDLED
#macro ARGN(argc) (12+(argc*CELL))
.CODE
halt 0 ;Return point for end
.NATIVE
register_plugin
register_cvar
random_num
register_clcmd
server_cmd
get_maxplayers
get_playersnum
get_cvar_num
set_cvar_num
get_user_flags
client_cmd
get_user_userid
.DATA
Plugin db "Slots Reservation"
Version db VERSION
Author db "AMXX Dev Team"
Cvar db "amx_reservation"
CvarVal db "1"
Callback db "ackSignal"
loopBack db "amxres0000"
.CODE
PROC plugin_init
push.c Author ;push author
push.c Version ;push version
push.c Plugin ;push name
push.c CELL*3 ;push 3 args
sysreq.c register_plugin ;call register_plugin
stack CELL*4 ;clean-up
push.c CvarVal ;push Cvar initial value
push.c Cvar ;push Cvar
push.c CELL*2 ;push 2 args
sysreq.c register_cvar ;call register_cvar
stack CELL*3 ;clean-up
push.c 90 ;push max range
push.c 65 ;push min range
push.c CELL*2 ;push 2 args
sysreq.c random_num ;call random_num
stack CELL*3 ;clean-up
stor.pri loopBack+CELL*6 ;store pri in loopBack[6]
push.c 90 ;push max range
push.c 65 ;push min range
push.c CELL*2 ;push 2 args
sysreq.c random_num ;call random_num
stack CELL*3 ;clean-up
stor.pri loopBack+CELL*7 ;store pri in loopBack[7]
push.c 90 ;push max range
push.c 65 ;push min range
push.c CELL*2 ;push 2 args
sysreq.c random_num ;call random_num
stack CELL*3 ;clean-up
stor.pri loopBack+CELL*8 ;store pri in loopBack[8]
push.c 90 ;push max range
push.c 65 ;push min range
push.c CELL*2 ;push 2 args
sysreq.c random_num ;call random_num
stack CELL*3 ;clean-up
stor.pri loopBack+CELL*9 ;store pri in loopBack[9]
push.c Callback ;push callback
push.c loopBack ;push loopback
push.c CELL*2
sysreq.c register_clcmd ;call register_clcmd
stack CELL*3 ;clean-up
zero.pri ;return 0
retn ;final cleanup
ENDP
.DATA
KickMsg db "kick #%d \"Dropped due to slot reservation\""
.CODE
PROC ackSignal
push.s ARGN(0) ;push the first argument
push.c CELL*1 ;push one argument
sysreq.c get_user_userid ;call get_user_userid
stack CELL*2 ;clean-up
push.pri ;push the result of the last call
push.c KickMsg ;push the kick message
push.c CELL*2 ;push 2 args
sysreq.c server_cmd ;call server_cmd
stack CELL*3 ;clean-up
zero.pri ;return 0
retn ;final cleanup
ENDP
.DATA
VisCvar db "sv_visiblemaxplayers"
.CODE
;players, maxplayrs, limit
PROC setVisibleSlots
stack -CELL ;new variable
load.s.pri ARGN(0) ;get first parameter into [PRI]
add.c 1 ;[PRI] += 1
stor.s.pri -CELL ;[var] = [PRI]
load.s.pri ARGN(0) ;Reset [PRI] to first param
load.s.alt ARGN(1) ;get second parameter into [ALT]
jeq setMax ;does players == maxplayers?
jump setLimitCheck ; -- no, jump to next check
setMax: ; -- yes
stor.s.alt -CELL ; store the maxplayers into [var]
jump endSetIf ; we're done, jump to the end
setLimitCheck:
load.s.alt ARGN(2) ;load the third param into [ALT]
jless setLimit ;is playres < limit?
jump endSetIf ; -- no, jump to end
setLimit: ; -- yes
stor.s.alt -CELL ;store limit into [var]
endSetIf:
push.s -CELL ;push [var] onto stack
push.c VisCvar ;push cvar onto stack
push.c CELL*2 ;push 2 args
sysreq.c set_cvar_num ;call set_cvar_num
stack CELL*3 ;clean-up
stack CELL ;restore stack
zero.pri ;return 0
retn ;final cleanup
ENDP
PROC client_authorized
push.c 0 ;push 0 args
sysreq.c get_maxplayers ;call get_maxplayers
stack CELL ;clean-up
push.pri ;store the result - maxplayers
push.c 1 ;push 1
push.c CELL ;push 1 args
sysreq.c get_playersnum ;call get_playersnum
stack CELL*2 ;clean-up
push.pri ;store the result - players
push.c Cvar ;push cvar
push.c CELL ;push 1 arg
sysreq.c get_cvar_num ;call get_cvar_num
stack CELL*2 ;clean-up
xchg ;last result is now in alt
load.s.pri -CELL ;load the first result into pri
sub ;pri = maxplayers - cvar
push.pri ;store the result - limit
push.s ARGN(0) ;push the id
push.c CELL ;push 1 arg
sysreq.c get_user_flags ;call get_user_flags
stack CELL*2 ;clean-up
const.alt 2 ;2 = ADMIN_RESERVATION
and ;flags & 2
jeq setVis ;if (flags & 2) == 2, short circuit
;otherwise check this condition
load.s.pri -CELL*2 ;load players into pri
load.s.alt -CELL*3 ;load limit into alt
jleq setVis ;if players <= limit, jump
jump setVisSkip ;otherwise skip
setVis:
push.s -CELL*3 ;push limit
push.s -CELL ;push maxplayers
push.s -CELL*2 ;push players
push.c CELL*3 ;push 3 args
call setVisibleSlots ;call setVisibleSlots
stack CELL*3 ;restore stack
zero.pri ;return 0
retn ;finalize
setVisSkip:
push.c loopBack ;push loopback cmd
push.s ARGN(0) ;push the id passed
push.c CELL*2 ;push 2 args
sysreq.c client_cmd ;call client_cmd
stack CELL*3 ;clean-up
stack CELL*3 ;restore stack
const.pri PLUGIN_HANDLED ;return
retn ;finalize
ENDP
PROC client_disconnect
push.c 0 ;push 0 args
sysreq.c get_maxplayers ;call get_maxplayers
stack CELL ;clean-up
push.pri ;store the result - maxplayers
push.c 1 ;push 1
push.c CELL ;push 1 args
sysreq.c get_playersnum ;call get_playersnum
stack CELL*2 ;clean-up
push.pri ;store the result - players
dec.s -CELL*2 ;players--
push.c Cvar ;push cvar
push.c CELL ;push 1 arg
sysreq.c get_cvar_num ;call get_cvar_num
stack CELL*2 ;clean-up
xchg ;last result is now in alt
load.s.pri -CELL ;[pri] = maxplayers
sub ;[pri] = maxplayers - cvar
push.pri ;store the result - limit
push.s -CELL*3 ;push limit
push.s -CELL ;push maxplayers
push.s -CELL*2 ;push playersnum-1
push.c CELL*3 ;push 3 args
call setVisibleSlots ;call
stack 3*CELL ;clean up 3 vars
zero.pri ;return 0
retn ;finalize
ENDP
.PUBLIC
ackSignal
plugin_init
client_authorized
client_disconnect

View File

@ -417,6 +417,7 @@ bool Compiler::Parse()
/* Strip the line */ /* Strip the line */
std::string line(buffer); std::string line(buffer);
StripComments(line); StripComments(line);
Strip(line); Strip(line);

View File

@ -120,32 +120,43 @@ void Strip(std::string &text)
} }
} }
if (isspace(text[0]))
{
for (i=0; i<(int)text.size(); i++) for (i=0; i<(int)text.size(); i++)
{ {
if (!isspace(text[i])) if (!isspace(text[i])
{ || (isspace(text[i]) && (i==(int)(text.size()-1))))
if (i!=0)
{ {
text.erase(0, i); text.erase(0, i);
}
break; break;
} }
} }
}
if (text.size() < 1) if (text.size() < 1)
return; return;
if (isspace(text[text.size()-1]))
{
for (i=(int)(text.size()-1); i>=0; i--) for (i=(int)(text.size()-1); i>=0; i--)
{ {
if (!isspace(text[i])) if (!isspace(text[i])
{ || (isspace(text[i]) && (i==0)))
if (i != (int)(text.size() - 1))
{ {
text.erase(i+1, text.size()-1-i); text.erase(i+1, text.size()-1-i);
}
break; break;
} }
} }
}
if (text.size() == 1)
{
if (isspace(text[0]))
{
text.clear();
return;
}
}
} }
/* This is a very simple symbol searcher /* This is a very simple symbol searcher

View File

@ -28,8 +28,6 @@ int main(int argc, char **argv)
{ {
Compiler Program; Compiler Program;
getchar();
get_options(argc, argv, Program); get_options(argc, argv, Program);
if (filename.size() < 1) if (filename.size() < 1)