158 lines · 3.1 KB · C
RawDownload
#include <inttypes.h>#include <stdio.h> #include <libcss/libcss.h>#include "stylesheet.h" #define ITERATIONS (1)#define DUMP_CSS (1) #if DUMP_CSS#include "dump.h"#endif #include "testutils.h" static css_error resolve_url(void *pw,		const char *base, lwc_string *rel, lwc_string **abs){	UNUSED(pw);	UNUSED(base); 	/* About as useless as possible */	*abs = lwc_string_ref(rel); 	return CSS_OK;} int main(int argc, char **argv){	css_stylesheet_params params;	css_stylesheet *sheet;	FILE *fp;	size_t len, origlen;#define CHUNK_SIZE (4096)	uint8_t buf[CHUNK_SIZE];	css_error error;	int count; 	if (argc != 2) {		printf("Usage: %s <filename>\n", argv[0]);		return 1;	} 	params.params_version = CSS_STYLESHEET_PARAMS_VERSION_1;	params.level = CSS_LEVEL_21;	params.charset = "UTF-8";	params.url = argv[1];	params.title = NULL;	params.allow_quirks = false;	params.inline_style = false;	params.resolve = resolve_url;	params.resolve_pw = NULL;	params.import = NULL;	params.import_pw = NULL;	params.color = NULL;	params.color_pw = NULL;	params.font = NULL;	params.font_pw = NULL; 	for (count = 0; count < ITERATIONS; count++) { 		assert(css_stylesheet_create(&params, &sheet) == CSS_OK); 		fp = fopen(argv[1], "rb");		if (fp == NULL) {			printf("Failed opening %s\n", argv[1]);			return 1;		} 		fseek(fp, 0, SEEK_END);		origlen = 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_stylesheet_append_data(sheet, 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_stylesheet_append_data(sheet, buf, len);			assert(error == CSS_OK || error == CSS_NEEDDATA); 			len = 0;		} 		fclose(fp); 		error = css_stylesheet_data_done(sheet);		assert(error == CSS_OK || error == CSS_IMPORTS_PENDING); 		while (error == CSS_IMPORTS_PENDING) {			lwc_string *url; 			error = css_stylesheet_next_pending_import(sheet, &url);			assert(error == CSS_OK || error == CSS_INVALID); 			if (error == CSS_OK) {				css_stylesheet *import;				char *buf = malloc(lwc_string_length(url) + 1); 				memcpy(buf, lwc_string_data(url),						lwc_string_length(url));				buf[lwc_string_length(url)] = '\0'; 				params.url = buf; 				assert(css_stylesheet_create(&params,					&import) == CSS_OK); 				assert(css_stylesheet_data_done(import) ==					CSS_OK); 				assert(css_stylesheet_register_import(sheet,					import) == CSS_OK); 				css_stylesheet_destroy(import); 				error = CSS_IMPORTS_PENDING; 				free(buf);			}		} #if DUMP_CSS		{#ifndef max#define max(a,b) ((a) > (b) ? (a) : (b))#endif			char *out;			size_t outsize = max(16384, origlen * 8);			size_t outlen = outsize;			size_t written;			out = malloc(outsize);			assert(out != NULL);			dump_sheet(sheet, out, &outlen);			written = fwrite(out, 1, outsize - outlen, stdout);			assert(written == outsize - outlen);			free(out);		}#endif 		css_stylesheet_destroy(sheet);	} 	printf("PASS\n"); 	return 0;}