/// <summary>Processes numeric escaped chars to find out if they are a control character.</summary> /// <param name="ch">a char</param> /// <returns>Returns the char directly or as replacement for the escaped sequence.</returns> private char ProcessChar(char ch) { switch (state) { case STATE_START: { if (ch == '&') { state = STATE_AMP; } return(ch); } case STATE_AMP: { if (ch == '#') { state = STATE_HASH; } else { state = STATE_ERROR; } return(ch); } case STATE_HASH: { if (ch == 'x') { control = 0; digits = 0; state = STATE_HEX; } else { if ('0' <= ch && ch <= '9') { control = JavaUtil.CharacterDigit(ch, 10); digits = 1; state = STATE_DIG1; } else { state = STATE_ERROR; } } return(ch); } case STATE_DIG1: { if ('0' <= ch && ch <= '9') { control = control * 10 + JavaUtil.CharacterDigit(ch, 10); digits++; if (digits <= 5) { state = STATE_DIG1; } else { state = STATE_ERROR; } } else { // sequence too long if (ch == ';' && Utils.IsControlChar((char)control)) { state = STATE_START; return((char)control); } else { state = STATE_ERROR; } } return(ch); } case STATE_HEX: { if (('0' <= ch && ch <= '9') || ('a' <= ch && ch <= 'f') || ('A' <= ch && ch <= 'F')) { control = control * 16 + JavaUtil.CharacterDigit(ch, 16); digits++; if (digits <= 4) { state = STATE_HEX; } else { state = STATE_ERROR; } } else { // sequence too long if (ch == ';' && Utils.IsControlChar((char)control)) { state = STATE_START; return((char)control); } else { state = STATE_ERROR; } } return(ch); } case STATE_ERROR: { state = STATE_START; return(ch); } default: { // not reachable return(ch); } } }