@
if startString(getMarkupKey(), "switch") {
    @{
    int iHashCode = 0;
    std::string sKey = @coreString(getMarkupKey(), 7, 1)@;
    for (int i = 0; i < sKey.size(); i++) {
        unsigned char c = sKey[i];
        iHashCode = (31*iHashCode + (c%31)) % 64000000;
    }
    bool bDefault = false;
    switch(iHashCode) {
@
    local codes;
    local sData = getMarkupValue();
    while sData {
        local iIndex = sData.findString('\n');
        if $iIndex < 0$ || !sData.startString("//") error("syntax error");
        local sKey = sData.midString(2, $iIndex - 2$);
        if sKey.endString('\r') set sKey = sKey.rsubString(1);
        local iHashCode = 0;
        local i = 0;
        while $i < sKey.length()$ {
            local c = sKey.charAt(i);
            iHashCode = $(31*iHashCode + (c.charToInt()%31)) % 64000000$;
            increment(i);
        }
        pushItem codes[iHashCode].keys = "\"" + composeCLikeString(sKey) + "\"";
        set sData = sData.subString($iIndex + 1$);
    }
    foreach i in codes {
        @        case @key(i)@: // @
        foreach j in i.keys {
            if !first(j) {
                @, @
            }
            @@j@@
        }
        @
@
        foreach j in i.keys {
            @            @
            if !first(j) {
                @} else @
            }
            @if (sKey == @j@) {
@
            setProtectedArea("case " + j + ":");
        }
        @            } else {
                bDefault = true;
            }
            break;
@
    }
    @        default:
            bDefault = true;
    }
    if (bDefault) {
@
    setProtectedArea("default:");
    @    }
}
@
} else if startString(getMarkupKey(), "enum") {
    // extract enums
    local keys;
    local sData = getMarkupValue();
    while sData {
        local iIndex = sData.findString('\n');
        if $iIndex < 0$ || !sData.startString("//") error("syntax error");
        local sKey = sData.midString(2, $iIndex - 2$);
        // just a few code to add for taking into account values on enums
        if sKey.endString('\r') set sKey = sKey.rsubString(1);
        pushItem keys = sKey;
        set sData = sData.subString($iIndex + 1$);
    }

    // declare enums in C++
    local sEnumType = subString(getMarkupKey(), 5);
    @enum @sEnumType@ {
@
    foreach i in keys {
        @    @i@@
        if !last(i) {
            @,@
        }
        @
@
    }
@
};
@
    // write the C++ function to convert to string
    @
std::string @sEnumType@ToString(@sEnumType@ e@sEnumType@) {
    switch(e@sEnumType@) {
@
    foreach i in keys {
        @        case @i@: return "@composeCLikeString(i)@";
@
    }
@    }
    return "Undefined";
}
@
}

Generated by v4.2 from CWscript2HTML.cwp.