SWITCH

SWITCH <expr>

     CASE <constant>{...{<constant>}}

     { CASE <constant>{...{<constant>}} }

          <statements>

          EXIT

 

     ! (any number of case-statement blocks and each statement

     !  block can have multiple case statement headers)

     { { CASE <constant>{...{<constant>}} }

        { CASE <constant>{...{<constant>}} }

          <statements>

          EXIT }

 

     { DEFAULT

          <statements>

          EXIT }

ENDSWITCH

The <expr> is first evaluated, and then the list of CASE statements is scanned from top to bottom until a match is found between the <expr> and the <constant>. At that point, the <statements> below the matching CASE are executed. If there is no EXIT, the flow of control will continue on through the <statements> following the subsequent CASE statements. (In other words, once a match is found with a CASE, then all subsequent CASE and DEFAULT statements will match, which is why you almost always want to terminate the <statements> associated with a particular CASE with an EXIT.)

The optional DEFAULT statement is like a CASE that always matches, so its sub-statements will be executed if none of the above CASE statements match, or if a previous CASE statement matches but had no EXIT statement, so that control continued to flow.

Multiple CASE statements can share the same set of <statements>, and a single CASE statement can contain a range of values. A range consists of two constants separated by three dots (although one of the two ends of the range can be omitted to indicate an open-ended range). For example:

SWITCH dues

    CASE 101...

        free'massages = -1

        EXIT

    CASE 100

    CASE 75

        free'massages = 3

        EXIT

    CASE 50...74

        free'massages = 1

        EXIT

    CASE ...49

        free'massages = 0

        EXIT

ENDSWITCH

 

In the above SWITCH, if DUES>=101, FREE'MASSAGES is set to -1. If DUES=100 or DUES=75 then FREE'MASSAGES = 3. If DUES>=50 and DUES<=74, the FREE'MASSAGES = 1, and if DUES<=49 then FREE'MASSAGES = 0. If DUES>75 and DUES<100, then none of the CASE statements match, and since no DEFAULT was specified, the SWITCH ends up having no effect.

Note that as is typical with numeric expressions in Basic, they can evaluate to integers or floating point values. Although it is somewhat unorthodox to use a SWITCH with non-integers, there is no law against it.

The <expr> given in the SWITCH statement can be any type, but the <constants> in the CASE statements must match that type. In other words, if the <expr> is a string, then the CASE <constants> must be literal (quoted) strings, as shown here:

SWITCH member'type$

    CASE "Platinum"

        free'upgrades = 5

        free'upgrades = 3

        dues = 100

        EXIT

    CASE "G"..."Gold"

        free'upgrades = 3

        free'upgrades = 3

        dues = 75

        EXIT

    DEFAULT

        free'upgrades = 0

        free'upgrades = 1

        dues = 50

        EXIT

ENDSWITCH

 

In the above example, the second CASE statement would match when MEMBER'TYPE$>="G" and MEMBER'TYPE$<="Gold" (using normal Basic string comparison logic). As a reminder, A-BASIC treats trailing blanks the same as nulls in string comparisons, so the second CASE would match even if MEMBER'TYPE$="Gold   ".

See History below regarding length and compatibility limitations on the use of string constants.

For the more common type of SWITCH (numeric), the CASE constants can also be ASCII constants, or hex/octal constants, for example:

SWITCH ASC(A$[B;1])

    CASE 'A'...'Z'

    CASE 'a'...'z'

        TYP$ = "Alpha"

        EXIT

    CASE '0'...'9'

        TYP$ = "Number"

        EXIT

    CASE &h80...

        TYP$ = "8 bit"

        EXIT

    CASE ...&o37

        TYP$ = "Control"

        EXIT

    DEFAULT

        TYP$ = "Punc"

        EXIT

ENDSWITCH

 

Comments

Note that any statements between the SWITCH statement and the first CASE are actually executed in all cases under A-Shell, whereas they may not be in other implementations of SWITCH statements (such as AMOS). Consequently you should avoid putting any statements there, except perhaps for debugging purposes.

Requires /X:2 or /RC.

History

2018 January, A-Shell 6.5.1624:  Eliminate limitation on length of string constants used in CASE statements. Previously the limit was determined by the current STRSIZ.

2006 June, A-Shell 4.8.958:  Function added to A-Shell