break & continue command fix

git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@6454 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
Lucas GAUTHERON
2011-05-21 08:29:05 +00:00
parent 2fffcb6f1a
commit e0ab12594b
+8 -3
View File
@@ -13,6 +13,7 @@ bool contextisolated[IEXC_NUM] = { false };
int execcontext;
bool loop_break = false, loop_skip = false; // break or continue (skip) current loop
int loop_level = 0; // avoid bad calls of break & continue
hashtable<const char *, ident> *idents = NULL; // contains ALL vars/commands/aliases
@@ -508,7 +509,7 @@ char *executeret(const char *p) // all evaluation hap
{
for(bool cont = true; cont;) // for each ; seperated statement
{
if(loop_skip) break;
if(loop_level && loop_skip) break;
int numargs = MAXWORDS, infix = 0;
loopi(MAXWORDS) // collect all argument values
{
@@ -959,6 +960,7 @@ void loopa(char *var, char *times, char *body)
if(id->type!=ID_ALIAS) return;
char *buf = newstring("0", 16);
pushident(*id, buf);
loop_level++;
execute(body);
if(loop_skip) loop_skip = false;
if(loop_break) loop_break = false;
@@ -982,9 +984,11 @@ void loopa(char *var, char *times, char *body)
}
}
popident(*id);
loop_level--;
}
void whilea(char *cond, char *body)
{
loop_level++;
while(execute(cond))
{
execute(body);
@@ -995,9 +999,10 @@ void whilea(char *cond, char *body)
break;
}
}
loop_level--;
}
void breaka() { loop_skip = loop_break = true; }
void continuea() { loop_skip = true; }
void breaka() { if(loop_level) loop_skip = loop_break = true; }
void continuea() { if(loop_level) loop_skip = true; }
void concat(char *s) { result(s); }
void concatword(char *s) { result(s); }