bool CPLJSonStreamingParser::StartNewToken(const char*& pStr, size_t& nLength) { char ch = *pStr; if( ch == '{' ) { if( m_aState.size() == m_nMaxDepth ) { return EmitException("Too many nested objects and/or arrays"); } StartObject(); m_aeObjectState.push_back(WAITING_KEY); m_aState.push_back(OBJECT); AdvanceChar(pStr, nLength); } else if( ch == '"' ) { m_aState.push_back(STRING); AdvanceChar(pStr, nLength); } else if( ch == '[' ) { if( m_aState.size() == m_nMaxDepth ) { return EmitException("Too many nested objects and/or arrays"); } StartArray(); m_abFirstElement.push_back(true); m_aState.push_back(ARRAY); AdvanceChar(pStr, nLength); } else if( ch == '-' || ch == '.' || isdigit(ch) ) { m_aState.push_back(NUMBER); } else if( ch == 't' ) { m_aState.push_back(STATE_TRUE); } else if( ch == 'f' ) { m_aState.push_back(STATE_FALSE); } else if( ch == 'n' ) { m_aState.push_back(STATE_NULL); } else { assert( false ); } return true; }
void ShuttleGetDefinition::DefineEnum( int&var, const wxChar * key, const int vdefault, wxArrayString strings ) { StartStruct(); AddItem( wxString(key), "key" ); AddItem( "enum", "type" ); if( IsOptional() ) AddItem( "unchanged", "default" ); else AddItem( (double)vdefault, "default" ); StartField( "enum" ); StartArray(); for( size_t i=0;i<strings.Count(); i++ ) AddItem( strings[i] ); EndArray(); EndField(); EndStruct(); }
void CPDF_StreamContentParser::InputData(FX_LPCBYTE src_buf, FX_DWORD src_size) { if (m_Level > _FPDF_MAX_FORM_LEVEL_) { return; } for (FX_DWORD i = 0; i < src_size; i ++) { int ch = src_buf[i]; int type = _PDF_CharType[ch]; start: switch (m_WordState) { case 0: if (type == 'W') { } else if (type == 'N') { m_WordState = 5; m_pWordBuf[0] = ch; m_WordSize = 1; } else if (type == 'R') { m_WordState = 4; m_pWordBuf[0] = ch; m_WordSize = 1; } else switch (ch) { case '/': m_WordState = 2; m_WordSize = 0; break; case '[': StartArray(); break; case ']': EndArray(); break; case '(': m_WordState = 7; m_StringLevel = 1; m_StringState = 0; m_StringBuf.Clear(); break; case '<': m_WordState = 3; break; case '>': m_WordState = 8; break; case '%': m_WordState = 1; break; } break; case 1: if (ch == '\n' || ch == '\r') { m_WordState = 0; } break; case 2: if (type != 'R' && type != 'N') { EndName(); m_WordState = 0; goto start; } if (m_WordSize < 256) { m_pWordBuf[m_WordSize++] = ch; } break; case 3: if (ch == '<') { StartDict(); m_WordState = 0; } else { m_StringBuf.Clear(); m_WordState = 6; goto start; } break; case 4: if (type != 'R' && type != 'N') { m_WordState = 0; EndKeyword(); if (m_bAbort) { return; } goto start; } if (m_WordSize < 256) { m_pWordBuf[m_WordSize++] = ch; } break; case 5: if (type != 'N') { EndNumber(); m_WordState = 0; goto start; } if (m_WordSize < 256) { m_pWordBuf[m_WordSize++] = ch; } break; case 6: if (ch == '>') { EndHexString(); m_WordState = 0; } else { m_StringBuf.AppendByte(ch); } break; case 7: switch (m_StringState) { case 0: if (ch == ')') { m_StringLevel --; if (m_StringLevel == 0) { EndString(); m_WordState = 0; break; } m_StringBuf.AppendByte(')'); } else if (ch == '(') { m_StringLevel ++; m_StringBuf.AppendByte('('); } else if (ch == '\\') { m_StringState = 1; } else { m_StringBuf.AppendByte((char)ch); } break; case 1: if (ch >= '0' && ch <= '7') { m_EscCode = ch - '0'; m_StringState = 2; break; } if (ch == 'n') { m_StringBuf.AppendByte('\n'); } else if (ch == 'r') { m_StringBuf.AppendByte('\r'); } else if (ch == 't') { m_StringBuf.AppendByte('\t'); } else if (ch == 'b') { m_StringBuf.AppendByte('\b'); } else if (ch == 'f') { m_StringBuf.AppendByte('\f'); } else if (ch == '\\') { m_StringBuf.AppendByte('\\'); } else if (ch == '(') { m_StringBuf.AppendByte('('); } else if (ch == ')') { m_StringBuf.AppendByte(')'); } else if (ch == '\r') { m_StringState = 4; break; } else if (ch == '\n') { } else { m_StringBuf.AppendByte(ch); } m_StringState = 0; break; case 2: if (ch >= '0' && ch <= '7') { m_EscCode = m_EscCode * 8 + ch - '0'; m_StringState = 3; } else { m_StringBuf.AppendByte(m_EscCode); m_StringState = 0; goto start; } break; case 3: if (ch >= '0' && ch <= '7') { m_EscCode = m_EscCode * 8 + ch - '0'; m_StringBuf.AppendByte(m_EscCode); m_StringState = 0; } else { m_StringBuf.AppendByte(m_EscCode); m_StringState = 0; goto start; } break; case 4: m_StringState = 0; if (ch != '\n') { goto start; } break; } break; case 8: m_WordState = 0; if (ch == '>') { EndDict(); } else { goto start; } break; case 9: switch (m_InlineImageState) { case 0: if (type == 'W' || type == 'D') { m_InlineImageState = 1; m_InlineWhiteChar = ch; } else { m_StringBuf.AppendByte(ch); } break; case 1: m_StringBuf.AppendByte(m_InlineWhiteChar); if (ch == 'I') { m_InlineImageState = 2; } else { m_InlineImageState = 0; goto start; } break; case 2: if (ch == 'D') { m_InlineImageState = 3; } else { m_StringBuf.AppendByte('I'); m_InlineImageState = 0; goto start; } break; case 3: EndImageDict(); break; } break; case 10: switch (m_InlineImageState) { case 0: if (type == 'W') { m_InlineImageState = 1; m_InlineWhiteChar = ch; } else { m_ImageSrcBuf.AppendByte(ch); } break; case 1: if (ch == 'E') { m_InlineImageState = 2; } else { m_ImageSrcBuf.AppendByte(m_InlineWhiteChar); m_InlineImageState = 0; goto start; } break; case 2: if (ch == 'I') { m_InlineImageState = 3; } else { m_ImageSrcBuf.AppendByte(m_InlineWhiteChar); m_ImageSrcBuf.AppendByte('E'); m_InlineImageState = 0; goto start; } break; case 3: if (type == 'W') { EndInlineImage(); } else { m_ImageSrcBuf.AppendByte(m_InlineWhiteChar); m_ImageSrcBuf.AppendByte('E'); m_ImageSrcBuf.AppendByte('I'); m_InlineImageState = 0; goto start; } break; } break; case 11: if (m_InlineImageState < m_ImageSrcBuf.GetSize()) { m_ImageSrcBuf.GetBuffer()[m_InlineImageState ++] = ch; } else { if (ch == 'I') { EndInlineImage(); } } break; } } }