Esempio n. 1
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");
}
Esempio n. 2
0
fz_error
pdf_lex(pdf_token_e *tok, fz_stream *f, char *buf, int n, int *sl)
{
	fz_error error;
	int c;

	while (1)
	{
		c = fz_peekbyte(f);

		if (c == EOF)
		{
			*tok = PDF_TEOF;
			goto cleanupokay;
		}

		else if (iswhite(c))
			lexwhite(f);

		else if (c == '%')
			lexcomment(f);

		else if (c == '/')
		{
			fz_readbyte(f);
			lexname(f, buf, n);
			*sl = strlen(buf);
			*tok = PDF_TNAME;
			goto cleanupokay;
		}

		else if (c == '(')
		{
			fz_readbyte(f);
			*sl = lexstring(f, buf, n);
			*tok = PDF_TSTRING;
			goto cleanupokay;
		}

		else if (c == '<')
		{
			fz_readbyte(f);
			c = fz_peekbyte(f);
			if (c == '<')
			{
				fz_readbyte(f);
				*tok = PDF_TODICT;
				goto cleanupokay;
			}
			else
			{
				*sl = lexhexstring(f, buf, n);
				*tok = PDF_TSTRING;
				goto cleanupokay;
			}
		}

		else if (c == '>')
		{
			fz_readbyte(f);
			c = fz_readbyte(f);
			if (c == '>')
			{
				*tok = PDF_TCDICT;
				goto cleanupokay;
			}
			*tok = PDF_TERROR;
			goto cleanuperror;
		}

		else if (c == '[')
		{
			fz_readbyte(f);
			*tok = PDF_TOARRAY;
			goto cleanupokay;
		}

		else if (c == ']')
		{
			fz_readbyte(f);
			*tok = PDF_TCARRAY;
			goto cleanupokay;
		}

		else if (c == '{')
		{
			fz_readbyte(f);
			*tok = PDF_TOBRACE;
			goto cleanupokay;
		}

		else if (c == '}')
		{
			fz_readbyte(f);
			*tok = PDF_TCBRACE;
			goto cleanupokay;
		}

		else if (isnumber(c))
		{
			lexnumber(f, buf, n);
			*sl = strlen(buf);
			if (strchr(buf, '.'))
			{
				*tok = PDF_TREAL;
				goto cleanupokay;
			}
			*tok = PDF_TINT;
			goto cleanupokay;
		}

		else if (isregular(c))
		{
			lexname(f, buf, n);
			*sl = strlen(buf);
			*tok = pdf_tokenfromkeyword(buf);
			goto cleanupokay;
		}

		else
		{
			*tok = PDF_TERROR;
			goto cleanuperror;
		}
	}

cleanupokay:
	error = fz_readerror(f);
	if (error)
	{
		*tok = PDF_TERROR;
		return fz_rethrow(error, "cannot read token");
	}
	return fz_okay;

cleanuperror:
	error = fz_readerror(f);
	if (error)
	{
		*tok = PDF_TERROR;
		return fz_rethrow(error, "cannot read token");
	}
	*tok = PDF_TERROR;
	return fz_throw("lexical error");
}