1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-07-01 09:10:37 +00:00

Implements EXIT SELECT/CASE.

Allows breaking out of a SELECT CASE block or skip to the next evaluation CASE (for SELECT EVERYCASE) blocks.

In SELECT CASE blocks, EXIT CASE is the same as EXIT SELECT.
This commit is contained in:
FellippeHeitor 2020-09-07 14:40:04 -03:00
parent 9604cacae5
commit f3b92c353a

View file

@ -831,7 +831,7 @@ UDTTYPE = ISUDT + ISPOINTER
DIM SHARED statementn AS LONG
DIM SHARED everycasenewcase AS LONG
@ -853,6 +853,7 @@ DIM controltype(1000) AS INTEGER
'17=SELECT CASE uint32
'18=CASE (awaiting END SELECT/CASE/CASE ELSE)
'19=CASE ELSE (awaiting END SELECT)
'32=SUB/FUNCTION (awaiting END SUB/FUNCTION)
DIM controlid(1000) AS LONG
DIM controlvalue(1000) AS LONG
DIM controlstate(1000) AS INTEGER
@ -1382,6 +1383,7 @@ viLegalCopyright$ = "": viLegalTrademarks$ = "": viOriginalFilename$ = ""
viProductName$ = "": viProductVersion$ = "": viComments$ = "": viWeb$ = ""
DataOffset = 0
statementn = 0
everycasenewcase = 0
qberrorhappened = 0: qberrorcode = 0: qberrorline = 0
FOR i = 1 TO 27: defineaz(i) = "SINGLE": defineextaz(i) = "!": NEXT
controllevel = 0
@ -5792,6 +5794,8 @@ DO
'18=CASE (awaiting END SELECT/CASE/CASE ELSE)
'19=CASE ELSE (awaiting END SELECT)
IF controltype(controllevel) = 18 THEN
everycasenewcase = everycasenewcase + 1
PRINT #12, "sc_ec_" + str2$(everycasenewcase) + "_end:;"
controllevel = controllevel - 1
IF EveryCaseSet(SelectCaseCounter) = 0 THEN PRINT #12, "goto sc_" + str2$(controlid(controllevel)) + "_end;"
PRINT #12, "}"
@ -5832,6 +5836,8 @@ DO
IF controltype(controllevel) = 18 THEN
lhscontrollevel = lhscontrollevel - 1
controllevel = controllevel - 1
everycasenewcase = everycasenewcase + 1
PRINT #12, "sc_ec_" + str2$(everycasenewcase) + "_end:;"
IF EveryCaseSet(SelectCaseCounter) = 0 THEN
PRINT #12, "goto sc_" + str2$(controlid(controllevel)) + "_end;"
ELSE
@ -6350,6 +6356,36 @@ DO
a$ = "EXIT WHILE without WHILE": GOTO errmes
END IF
IF secondelement$ = "SELECT" THEN
'scan backwards until previous control level reached
FOR i = controllevel TO 1 STEP -1
t = controltype(i)
IF t = 18 OR t = 19 THEN 'CASE/CASE ELSE
PRINT #12, "goto sc_" + str2$(controlid(i - 1)) + "_end;"
layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
GOTO finishedline
END IF
NEXT
a$ = "EXIT SELECT without SELECT": GOTO errmes
END IF
IF secondelement$ = "CASE" THEN
'scan backwards until previous control level reached
FOR i = controllevel TO 1 STEP -1
t = controltype(i)
IF t = 18 THEN 'CASE
PRINT #12, "goto sc_ec_" + str2$(everycasenewcase + 1) + "_end;"
layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
GOTO finishedline
ELSEIF t = 19 THEN 'CASE ELSE
PRINT #12, "goto sc_" + str2$(controlid(i - 1)) + "_end;"
layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
GOTO finishedline
END IF
NEXT
a$ = "EXIT CASE without CASE": GOTO errmes
END IF
END IF
END IF