void CPDF_StreamContentParser::Finish() { switch (m_WordState) { case 0: break; case 1: break; case 2: EndName(); break; case 3: break; case 4: EndKeyword(); break; case 5: EndNumber(); break; case 6: EndHexString(); break; case 7: EndString(); break; case 8: break; case 9: break; case 10: EndInlineImage(); break; } m_WordState = 0; }
/* Version 2 */ void Parse_Specifics_File_v2(FILE *fp) { char line[1024], *lp; FrameSpecList *current, *newf; char typ; int fnum, snum, bnum, qs, newqs; int num_scanned, fx=0, fy=0, sx=0, sy=0; char kind[100]; Block_Specifics *new_blk; boolean relative; fsl = MakeFslEntry(); current = fsl; while ((fgets(line,1023,fp))!=NULL) { lp = &line[0]; while ((*lp == ' ') || (*lp == '\t')) lp++; if (( *lp == '#' ) || (*lp=='\n')) { continue; } switch (my_upper(*lp)) { case 'F': lp += 6; sscanf(lp,"%d %c %d", &fnum, &typ, &qs); newf = MakeFslEntry(); if (current->framenum != -1) { current->next = newf; current = newf; } current->framenum = fnum; current->frametype = CvtType(typ); if (qs <= 0) qs = -1; current->qscale = qs; break; case 'S': lp += 6; sscanf(lp,"%d %d", &snum, &newqs); if (qs == newqs) break; qs = newqs; AddSlc(current, snum, qs); break; case 'B': lp += 6; num_scanned = 0; bnum = atoi(lp); SkipToSpace(lp); while ((*lp != '-') && (*lp != '+') && ((*lp < '0') || (*lp > '9'))) lp++; relative = ((*lp == '-') || (*lp == '+')); newqs = atoi(lp); SkipToSpace(lp); if (EndString(lp)) { num_scanned = 2; } else { num_scanned = 2+sscanf(lp, "%s %d %d %d %d", kind, &fx, &fy, &sx, &sy); } qs = newqs; new_blk = AddBs(current, bnum, relative, qs); if (num_scanned > 2) { BlockMV *tmp; tmp = (BlockMV *) malloc(sizeof(BlockMV)); switch (num_scanned) { case 7: tmp->typ = TYP_BOTH; tmp->fx = fx; tmp->fy = fy; tmp->bx = sx; tmp->by = sy; new_blk->mv = tmp; break; case 3: tmp->typ = TYP_SKIP; new_blk->mv = tmp; break; case 5: if (my_upper(kind[0]) == 'B') { tmp->typ = TYP_BACK; tmp->bx = fx; tmp->by = fy; } else { tmp->typ = TYP_FORW; tmp->fx = fx; tmp->fy = fy; } new_blk->mv = tmp; break; default: fprintf(stderr, "Bug in specifics file! Skipping short/long entry: %s\n",line); break; } } else { new_blk->mv = (BlockMV *) NULL; } break; case 'V': fprintf(stderr, "Cannot specify version twice! Taking first (%d).\n", version); break; default: printf("What? *%s*\n",line); break; } } }
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; } } }