@
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";
}
@
}
