#include <inttypes.h>
#include <stdio.h>
#include <parserutils/charset/utf8.h>
#include <parserutils/input/inputstream.h>
#include <libcss/libcss.h>
#include "charset/detect.h"
#include "utils/utils.h"
#include "lex/lex.h"
#include "testutils.h"
#define ITERATIONS (1)
#define DUMP_TOKENS (0)
static void *myrealloc(void *data, size_t len, void *pw)
{
UNUSED(pw);
}
static void printToken(const css_token *token)
{
#if !DUMP_TOKENS
UNUSED(token);
#else
printf("[%d, %d] : ", token
->line
, token
->col
);
switch (token->type) {
case CSS_TOKEN_IDENT:
(int) token->data.len, token->data.data);
break;
case CSS_TOKEN_ATKEYWORD:
(int) token->data.len, token->data.data);
break;
case CSS_TOKEN_STRING:
(int) token->data.len, token->data.data);
break;
case CSS_TOKEN_INVALID_STRING:
(int) token->data.len, token->data.data);
break;
case CSS_TOKEN_HASH:
(int) token->data.len, token->data.data);
break;
case CSS_TOKEN_NUMBER:
(int) token->data.len, token->data.data);
break;
case CSS_TOKEN_PERCENTAGE:
(int) token->data.len, token->data.data);
break;
case CSS_TOKEN_DIMENSION:
(int) token->data.len, token->data.data);
break;
case CSS_TOKEN_URI:
printf("URI(%.*s)", (int) token
->data.
len, token
->data.
data);
break;
case CSS_TOKEN_UNICODE_RANGE:
(int) token->data.len, token->data.data);
break;
case CSS_TOKEN_CDO:
break;
case CSS_TOKEN_CDC:
break;
case CSS_TOKEN_S:
break;
case CSS_TOKEN_COMMENT:
printf("COMMENT(%.*s)", (int) token
->data.
len, token
->data.
data);
break;
case CSS_TOKEN_FUNCTION:
(int) token->data.len, token->data.data);
break;
case CSS_TOKEN_INCLUDES:
break;
case CSS_TOKEN_DASHMATCH:
break;
case CSS_TOKEN_PREFIXMATCH:
break;
case CSS_TOKEN_SUFFIXMATCH:
break;
case CSS_TOKEN_SUBSTRINGMATCH:
break;
case CSS_TOKEN_CHAR:
printf("CHAR(%.*s)", (int) token
->data.
len, token
->data.
data);
break;
case CSS_TOKEN_EOF:
break;
case CSS_TOKEN_LAST_INTERN_LOWER:
case CSS_TOKEN_LAST_INTERN:
break;
}
#endif
}
int main(int argc, char **argv)
{
parserutils_inputstream *stream;
css_lexer *lexer;
FILE *fp;
size_t len;
#define CHUNK_SIZE (4096)
uint8_t buf[CHUNK_SIZE];
css_token *tok;
css_error error;
int i;
if (argc != 2) {
printf("Usage: %s <filename>\n", argv
[0]);
return 1;
}
for (i = 0; i < ITERATIONS; i++) {
assert(parserutils_inputstream_create
("UTF-8",
CSS_CHARSET_DICTATED,css__charset_extract,
(parserutils_alloc) myrealloc, NULL, &stream) ==
PARSERUTILS_OK);
assert(css__lexer_create
(stream
, myrealloc
, NULL
, &lexer
) ==
CSS_OK);
fp
= fopen(argv
[1], "rb");
if (fp == NULL) {
printf("Failed opening %s\n", argv
[1]);
return 1;
}
while (len >= CHUNK_SIZE) {
size_t read
= fread(buf
, 1, CHUNK_SIZE
, fp
);
assert(parserutils_inputstream_append
(stream
,
buf, CHUNK_SIZE) == PARSERUTILS_OK);
len -= CHUNK_SIZE;
while ((error = css__lexer_get_token(lexer, &tok)) ==
CSS_OK) {
printToken(tok);
if (tok->type == CSS_TOKEN_EOF)
break;
}
}
if (len > 0) {
size_t read
= fread(buf
, 1, len
, fp
);
assert(parserutils_inputstream_append
(stream
,
buf, len) == PARSERUTILS_OK);
len = 0;
}
assert(parserutils_inputstream_append
(stream
, NULL
, 0) ==
PARSERUTILS_OK);
while ((error = css__lexer_get_token(lexer, &tok)) == CSS_OK) {
printToken(tok);
if (tok->type == CSS_TOKEN_EOF)
break;
}
css__lexer_destroy(lexer);
parserutils_inputstream_destroy(stream);
}
return 0;
}