Beispiel #1
0
static inline void
lexwhite(fz_stream *f)
{
    int c;
    do
    {
        c = fz_readbyte(f);
    }
    while ((c <= 32) && (iswhite(c)));
    if (c != EOF)
        fz_unreadbyte(f);
}
Beispiel #2
0
static void
closelzwd(fz_stream *stm)
{
	fz_lzwd *lzw = stm->state;
	int i;

	/* if we read any extra bytes, try to put them back */
	i = (32 - lzw->bidx) / 8;
	while (i--)
		fz_unreadbyte(lzw->chain);

	fz_close(lzw->chain);
	fz_free(lzw);
}
Beispiel #3
0
static int
lexnumber(fz_stream *f, char *s, int n, int *tok)
{
    char *buf = s;
    *tok = PDF_TINT;

    /* Initially we might have +, -, . or a digit */
    if (n > 1)
    {
        int c = fz_readbyte(f);
        switch (c)
        {
        case '.':
            *tok = PDF_TREAL;
            *s++ = c;
            n--;
            goto loop_after_dot;
        case '+':
        case '-':
        case RANGE_0_9:
            *s++ = c;
            n--;
            goto loop_after_sign;
        default:
            fz_unreadbyte(f);
            goto end;
        case EOF:
            goto end;
        }
    }

    /* We can't accept a sign from here on in, just . or a digit */
loop_after_sign:
    while (n > 1)
    {
        int c = fz_readbyte(f);
        switch (c)
        {
        case '.':
            *tok = PDF_TREAL;
            *s++ = c;
            n--;
            goto loop_after_dot;
        case RANGE_0_9:
            *s++ = c;
            break;
        default:
            fz_unreadbyte(f);
            goto end;
        case EOF:
            goto end;
        }
        n--;
    }

    /* In here, we've seen a dot, so can accept just digits */
loop_after_dot:
    while (n > 1)
    {
        int c = fz_readbyte(f);
        switch (c)
        {
        case RANGE_0_9:
            *s++ = c;
            break;
        default:
            fz_unreadbyte(f);
            goto end;
        case EOF:
            goto end;
        }
        n--;
    }

end:
    *s = '\0';
    return s-buf;
}
Beispiel #4
0
fz_error
pdf_lex(int *tok, fz_stream *f, char *buf, int n, int *sl)
{
    while (1)
    {
        int c = fz_readbyte(f);
        switch (c)
        {
        case EOF:
            *tok = PDF_TEOF;
            return fz_okay;
        case ISWHITE:
            lexwhite(f);
            break;
        case '%':
            lexcomment(f);
            break;
        case '/':
            lexname(f, buf, n);
            *sl = strlen(buf);
            *tok = PDF_TNAME;
            return fz_okay;
        case '(':
            *sl = lexstring(f, buf, n);
            *tok = PDF_TSTRING;
            return fz_okay;
        case ')':
            *tok = PDF_TERROR;
            goto cleanuperror;
        case '<':
            c = fz_readbyte(f);
            if (c == '<')
            {
                *tok = PDF_TODICT;
            }
            else
            {
                fz_unreadbyte(f);
                *sl = lexhexstring(f, buf, n);
                *tok = PDF_TSTRING;
            }
            return fz_okay;
        case '>':
            c = fz_readbyte(f);
            if (c == '>')
            {
                *tok = PDF_TCDICT;
                return fz_okay;
            }
            *tok = PDF_TERROR;
            goto cleanuperror;
        case '[':
            *tok = PDF_TOARRAY;
            return fz_okay;
        case ']':
            *tok = PDF_TCARRAY;
            return fz_okay;
        case '{':
            *tok = PDF_TOBRACE;
            return fz_okay;
        case '}':
            *tok = PDF_TCBRACE;
            return fz_okay;
        case ISNUMBER:
            fz_unreadbyte(f);
            *sl = lexnumber(f, buf, n, tok);
            return fz_okay;
        default: /* isregular: !isdelim && !iswhite && c != EOF */
            fz_unreadbyte(f);
            lexname(f, buf, n);
            *sl = strlen(buf);
            *tok = pdf_tokenfromkeyword(buf);
            return fz_okay;
        }
    }

cleanuperror:
    *tok = PDF_TERROR;
    return fz_throw("lexical error");
}
Beispiel #5
0
static int
lexstring(fz_stream *f, char *buf, int n)
{
    char *s = buf;
    char *e = buf + n;
    int bal = 1;
    int oct;
    int c;

    while (s < e)
    {
        c = fz_readbyte(f);
        switch (c)
        {
        case EOF:
            goto end;
        case '(':
            bal++;
            *s++ = c;
            break;
        case ')':
            bal --;
            if (bal == 0)
                goto end;
            *s++ = c;
            break;
        case '\\':
            c = fz_readbyte(f);
            switch (c)
            {
            case EOF:
                goto end;
            case 'n':
                *s++ = '\n';
                break;
            case 'r':
                *s++ = '\r';
                break;
            case 't':
                *s++ = '\t';
                break;
            case 'b':
                *s++ = '\b';
                break;
            case 'f':
                *s++ = '\f';
                break;
            case '(':
                *s++ = '(';
                break;
            case ')':
                *s++ = ')';
                break;
            case '\\':
                *s++ = '\\';
                break;
            case RANGE_0_9:
                oct = c - '0';
                c = fz_readbyte(f);
                if (c >= '0' && c <= '9')
                {
                    oct = oct * 8 + (c - '0');
                    c = fz_readbyte(f);
                    if (c >= '0' && c <= '9')
                        oct = oct * 8 + (c - '0');
                    else if (c != EOF)
                        fz_unreadbyte(f);
                }
                else if (c != EOF)
                    fz_unreadbyte(f);
                *s++ = oct;
                break;
            case '\n':
                break;
            case '\r':
                c = fz_readbyte(f);
                if ((c != '\n') && (c != EOF))
                    fz_unreadbyte(f);
                break;
            default:
                *s++ = c;
            }
            break;
        default:
            *s++ = c;
            break;
        }
    }
end:
    return s - buf;
}
Beispiel #6
0
static void
lexname(fz_stream *f, char *s, int n)
{
    while (n > 1)
    {
        int c = fz_readbyte(f);
        switch (c)
        {
        case ISWHITE:
        case ISDELIM:
            fz_unreadbyte(f);
            goto end;
        case EOF:
            goto end;
        case '#':
        {
            int d;
            c = fz_readbyte(f);
            switch (c)
            {
            case RANGE_0_9:
                d = (c - '0') << 4;
                break;
            case RANGE_a_f:
                d = (c - 'a' + 10) << 4;
                break;
            case RANGE_A_F:
                d = (c - 'A' + 10) << 4;
                break;
            default:
                fz_unreadbyte(f);
            /* fallthrough */
            case EOF:
                goto end;
            }
            c = fz_readbyte(f);
            switch (c)
            {
            case RANGE_0_9:
                c -= '0';
                break;
            case RANGE_a_f:
                c -= 'a' - 10;
                break;
            case RANGE_A_F:
                c -= 'A' - 10;
                break;
            default:
                fz_unreadbyte(f);
            /* fallthrough */
            case EOF:
                *s++ = d;
                n--;
                goto end;
            }
            *s++ = d + c;
            n--;
            break;
        }
        default:
            *s++ = c;
            n--;
            break;
        }
    }
end:
    *s = '\0';
}