Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3584 sourcerer 1
#include 
2
#include 
3
 
4
#include 
5
#include "stylesheet.h"
6
 
7
#define ITERATIONS (1)
8
#define DUMP_CSS (1)
9
 
10
#if DUMP_CSS
11
#include "dump.h"
12
#endif
13
 
14
#include "testutils.h"
15
 
16
static void *myrealloc(void *ptr, size_t len, void *pw)
17
{
18
	UNUSED(pw);
19
 
20
	return realloc(ptr, len);
21
}
22
 
23
static css_error resolve_url(void *pw,
24
		const char *base, lwc_string *rel, lwc_string **abs)
25
{
26
	UNUSED(pw);
27
	UNUSED(base);
28
 
29
	/* About as useless as possible */
30
	*abs = lwc_string_ref(rel);
31
 
32
	return CSS_OK;
33
}
34
 
35
int main(int argc, char **argv)
36
{
37
	css_stylesheet_params params;
38
	css_stylesheet *sheet;
39
	FILE *fp;
40
	size_t len, origlen;
41
#define CHUNK_SIZE (4096)
42
	uint8_t buf[CHUNK_SIZE];
43
	css_error error;
44
	int count;
45
 
46
	if (argc != 2) {
47
		printf("Usage: %s \n", argv[0]);
48
		return 1;
49
	}
50
 
51
	params.params_version = CSS_STYLESHEET_PARAMS_VERSION_1;
52
	params.level = CSS_LEVEL_21;
53
	params.charset = "UTF-8";
54
	params.url = argv[1];
55
	params.title = NULL;
56
	params.allow_quirks = false;
57
	params.inline_style = false;
58
	params.resolve = resolve_url;
59
	params.resolve_pw = NULL;
60
	params.import = NULL;
61
	params.import_pw = NULL;
62
	params.color = NULL;
63
	params.color_pw = NULL;
64
	params.font = NULL;
65
	params.font_pw = NULL;
66
 
67
	for (count = 0; count < ITERATIONS; count++) {
68
 
69
		assert(css_stylesheet_create(¶ms, myrealloc, NULL,
70
				&sheet) == CSS_OK);
71
 
72
		fp = fopen(argv[1], "rb");
73
		if (fp == NULL) {
74
			printf("Failed opening %s\n", argv[1]);
75
			return 1;
76
		}
77
 
78
		fseek(fp, 0, SEEK_END);
79
		origlen = len = ftell(fp);
80
		fseek(fp, 0, SEEK_SET);
81
 
82
		while (len >= CHUNK_SIZE) {
83
			size_t read = fread(buf, 1, CHUNK_SIZE, fp);
84
			assert(read == CHUNK_SIZE);
85
 
86
			error = css_stylesheet_append_data(sheet, buf,
87
					CHUNK_SIZE);
88
			assert(error == CSS_OK || error == CSS_NEEDDATA);
89
 
90
			len -= CHUNK_SIZE;
91
		}
92
 
93
		if (len > 0) {
94
			size_t read = fread(buf, 1, len, fp);
95
			assert(read == len);
96
 
97
			error = css_stylesheet_append_data(sheet, buf, len);
98
			assert(error == CSS_OK || error == CSS_NEEDDATA);
99
 
100
			len = 0;
101
		}
102
 
103
		fclose(fp);
104
 
105
		error = css_stylesheet_data_done(sheet);
106
		assert(error == CSS_OK || error == CSS_IMPORTS_PENDING);
107
 
108
		while (error == CSS_IMPORTS_PENDING) {
109
			lwc_string *url;
110
			uint64_t media;
111
 
112
			error = css_stylesheet_next_pending_import(sheet,
113
					&url, &media);
114
			assert(error == CSS_OK || error == CSS_INVALID);
115
 
116
			if (error == CSS_OK) {
117
				css_stylesheet *import;
118
				char *buf = alloca(lwc_string_length(url) + 1);
119
 
120
				memcpy(buf, lwc_string_data(url),
121
						lwc_string_length(url));
122
				buf[lwc_string_length(url)] = '\0';
123
 
124
				params.url = buf;
125
 
126
				assert(css_stylesheet_create(¶ms,
127
					myrealloc, NULL, &import) == CSS_OK);
128
 
129
				assert(css_stylesheet_data_done(import) ==
130
					CSS_OK);
131
 
132
				assert(css_stylesheet_register_import(sheet,
133
					import) == CSS_OK);
134
 
135
				css_stylesheet_destroy(import);
136
 
137
				error = CSS_IMPORTS_PENDING;
138
			}
139
		}
140
 
141
#if DUMP_CSS
142
		{
143
#ifndef max
144
#define max(a,b) ((a) > (b) ? (a) : (b))
145
#endif
146
			char *out;
147
			size_t outsize = max(16384, origlen * 8);
148
			size_t outlen = outsize;
149
			size_t written;
150
			out = malloc(outsize);
151
			assert(out != NULL);
152
			dump_sheet(sheet, out, &outlen);
153
			written = fwrite(out, 1, outsize - outlen, stdout);
154
			assert(written == outsize - outlen);
155
			free(out);
156
		}
157
#endif
158
 
159
		css_stylesheet_destroy(sheet);
160
	}
161
 
162
	printf("PASS\n");
163
 
164
	return 0;
165
}
166