1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
#include <inttypes.h>
#include <stdio.h>
#include <libcss/libcss.h>
#include "charset/detect.h"
#include "utils/utils.h"
#include "lex/lex.h"
#include "parse/parse.h"
#include "testutils.h"
#define ITERATIONS (1)
#define DUMP_EVENTS (0)
#if DUMP_EVENTS
static const char *event_names[] = {
"START_STYLESHEET",
"END_STYLESHEET",
"START_RULESET",
"END_RULESET",
"START_ATRULE",
"END_ATRULE",
"START_BLOCK",
"END_BLOCK",
"BLOCK_CONTENT",
"DECLARATION"
};
#endif
static css_error event_handler(css_parser_event type,
const parserutils_vector *tokens, void *pw)
{
#if !DUMP_EVENTS
UNUSED(type);
UNUSED(tokens);
UNUSED(pw);
#else
int32_t ctx = 0;
const css_token *token;
UNUSED(pw);
printf("%s%s", tokens != NULL ? " " : "", event_names[type]);
if (tokens == NULL) {
printf("\n");
return CSS_OK;
}
do {
token = parserutils_vector_iterate(tokens, &ctx);
if (token == NULL)
break;
printf("\n %d", token->type);
if (token->data.data != NULL)
printf(" %.*s", (int) token->data.len, token->data.data);
} while (token != NULL);
printf("\n");
#endif
return CSS_OK;
}
int main(int argc, char **argv)
{
css_parser_optparams params;
css_parser *parser;
FILE *fp;
size_t len;
#define CHUNK_SIZE (4096)
uint8_t buf[CHUNK_SIZE];
css_error error;
int i;
if (argc != 2) {
printf("Usage: %s <filename>\n", argv[0]);
return 1;
}
for (i = 0; i < ITERATIONS; i++) {
assert(css__parser_create("UTF-8", CSS_CHARSET_DICTATED,
&parser) == CSS_OK);
params.event_handler.handler = event_handler;
params.event_handler.pw = NULL;
assert(css__parser_setopt(parser, CSS_PARSER_EVENT_HANDLER,
¶ms) == CSS_OK);
fp = fopen(argv[1], "rb");
if (fp == NULL) {
printf("Failed opening %s\n", argv[1]);
return 1;
}
fseek(fp, 0, SEEK_END);
len = ftell(fp);
fseek(fp, 0, SEEK_SET);
while (len >= CHUNK_SIZE) {
size_t read = fread(buf, 1, CHUNK_SIZE, fp);
assert(read == CHUNK_SIZE);
error = css__parser_parse_chunk(parser, buf, CHUNK_SIZE);
assert(error == CSS_OK || error == CSS_NEEDDATA);
len -= CHUNK_SIZE;
}
if (len > 0) {
size_t read = fread(buf, 1, len, fp);
assert(read == len);
error = css__parser_parse_chunk(parser, buf, len);
assert(error == CSS_OK || error == CSS_NEEDDATA);
len = 0;
}
fclose(fp);
assert(css__parser_completed(parser) == CSS_OK);
css__parser_destroy(parser);
}
printf("PASS\n");
return 0;
}
|