Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
        }
    }

}
Ejemplo n.º 3
0
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;
        }
    }
}