2996 lines · 70.9 KB · C
RawDownload
#ifndef test_dump_h_#define test_dump_h_ #include <string.h> #include <libcss/types.h> #include "stylesheet.h"#include "bytecode/bytecode.h"#include "bytecode/opcodes.h"#include "select/font_face.h" #include "testutils.h" static void dump_sheet(css_stylesheet *sheet, char *buf, size_t *len);static void dump_rule_selector(css_rule_selector *s, char **buf,		size_t *buflen, uint32_t depth);static void dump_rule_charset(css_rule_charset *s, char **buf, size_t *buflen);static void dump_rule_import(css_rule_import *s, char **buf, size_t *buflen);static void dump_rule_media(css_rule_media *s, char **buf, size_t *buflen);static void dump_rule_page(css_rule_page *s, char **buf, size_t *buflen);static void dump_rule_font_face(css_rule_font_face *s,		char **buf, size_t *buflen);static void dump_selector_list(css_selector *list, char **ptr);static void dump_selector(css_selector *selector, char **ptr);static void dump_selector_detail(css_selector_detail *detail, char **ptr);static void dump_bytecode(css_style *style, char **ptr, uint32_t depth);static void dump_string(lwc_string *string, char **ptr);static void dump_font_face(css_font_face *font_face, char**ptr); void dump_sheet(css_stylesheet *sheet, char *buf, size_t *buflen){	css_rule *rule; 	for (rule = sheet->rule_list; rule != NULL; rule = rule->next) {		switch (rule->type) {		case CSS_RULE_SELECTOR:			dump_rule_selector((css_rule_selector *) rule,				&buf, buflen, 1);			break;		case CSS_RULE_CHARSET:			dump_rule_charset((css_rule_charset *) rule,				&buf, buflen);			break;		case CSS_RULE_IMPORT:			dump_rule_import((css_rule_import *) rule,				&buf, buflen);			break;		case CSS_RULE_MEDIA:			dump_rule_media((css_rule_media *) rule,				&buf, buflen);			break;		case CSS_RULE_PAGE:			dump_rule_page((css_rule_page *) rule,				&buf, buflen);			break;		case CSS_RULE_FONT_FACE:			dump_rule_font_face((css_rule_font_face *) rule,				&buf, buflen);			break;		default:		{			int written = sprintf(buf, "Unhandled rule type %d\n",				rule->type); 			*buflen -= written;			buf += written;		}			break;		}	}} void dump_rule_selector(css_rule_selector *s, char **buf, size_t *buflen,		uint32_t depth){	uint32_t i;	char *ptr = *buf; 	*ptr++ = '|';	for (i = 0; i < depth; i++)		*ptr++ = ' '; 	/* Build selector string */	for (i = 0; i < s->base.items; i++) {		dump_selector_list(s->selectors[i], &ptr);		if (i != (uint32_t) (s->base.items - 1)) {			memcpy(ptr, ", ", 2);			ptr += 2;		}	}	*ptr++ = '\n'; 	if (s->style != NULL)		dump_bytecode(s->style, &ptr, depth + 1); 	*buflen -= ptr - *buf;	*buf = ptr;} void dump_rule_charset(css_rule_charset *s, char **buf, size_t *buflen){	char *ptr = *buf; 	ptr += sprintf(ptr, "| @charset(");	dump_string(s->encoding, &ptr);	*ptr++ = ')';	*ptr++ = '\n'; 	*buflen -= ptr - *buf;	*buf = ptr;} void dump_rule_import(css_rule_import *s, char **buf, size_t *buflen){	char *ptr = *buf; 	ptr += sprintf(ptr, "| @import url(\"%.*s\")",                       (int) lwc_string_length(s->url), lwc_string_data(s->url)); 	/** \todo media list */ 	*ptr++ = '\n'; 	*buflen -= ptr - *buf;	*buf = ptr;} void dump_rule_media(css_rule_media *s, char **buf, size_t *buflen){	char *ptr = *buf;	css_rule *rule; 	ptr += sprintf(ptr, "| @media %s%03lx",			s->media->negate_type ? "not " : "",			s->media->type); 	/* \todo media list */ 	*ptr++ = '\n'; 	for (rule = s->first_child; rule != NULL; rule = rule->next) {		size_t len = *buflen - (ptr - *buf); 		dump_rule_selector((css_rule_selector *) rule, &ptr, &len, 2);	} 	*buflen -= ptr - *buf;	*buf = ptr;} void dump_rule_page(css_rule_page *s, char **buf, size_t *buflen){	char *ptr = *buf; 	ptr += sprintf(ptr, "| @page "); 	if (s->selector != NULL)		dump_selector_list(s->selector, &ptr); 	*ptr++ = '\n'; 	if (s->style != NULL)		dump_bytecode(s->style, &ptr, 2); 	*buflen -= ptr - *buf;	*buf = ptr;} void dump_rule_font_face(css_rule_font_face *s, char **buf, size_t *buflen){	char *ptr = *buf; 	ptr += sprintf(ptr, "| @font-face "); 	if (s->font_face != NULL) {		dump_font_face(s->font_face, &ptr);	} 	*ptr++ = '\n'; 	*buflen -= ptr - *buf;	*buf = ptr;} void dump_selector_list(css_selector *list, char **ptr){	if (list->combinator != NULL) {		dump_selector_list(list->combinator, ptr);	} 	switch (list->data.comb) {	case CSS_COMBINATOR_NONE:		break;	case CSS_COMBINATOR_ANCESTOR:		(*ptr)[0] = ' ';		*ptr += 1;		break;	case CSS_COMBINATOR_PARENT:		memcpy(*ptr, " > ", 3);		*ptr += 3;		break;	case CSS_COMBINATOR_SIBLING:		memcpy(*ptr, " + ", 3);		*ptr += 3;		break;	case CSS_COMBINATOR_GENERIC_SIBLING:		memcpy(*ptr, " + ", 3);		*ptr += 3;		break;	} 	dump_selector(list, ptr);}  void dump_selector(css_selector *selector, char **ptr){	css_selector_detail *d = &selector->data; 	while (true) {		dump_selector_detail(d, ptr); 		if (d->next == 0)			break; 		d++;	}} void dump_selector_detail(css_selector_detail *detail, char **ptr){	if (detail->negate)		*ptr += sprintf(*ptr, ":not("); 	switch (detail->type) {	case CSS_SELECTOR_ELEMENT:                if (lwc_string_length(detail->qname.name) == 1 &&                    lwc_string_data(detail->qname.name)[0] == '*' &&				detail->next == 0) {			dump_string(detail->qname.name, ptr);		} else if (lwc_string_length(detail->qname.name) != 1 ||                           lwc_string_data(detail->qname.name)[0] != '*') {			dump_string(detail->qname.name, ptr);		}		break;	case CSS_SELECTOR_CLASS:		**ptr = '.';		*ptr += 1;		dump_string(detail->qname.name, ptr);		break;	case CSS_SELECTOR_ID:		**ptr = '#';		*ptr += 1;		dump_string(detail->qname.name, ptr);		break;	case CSS_SELECTOR_PSEUDO_CLASS:	case CSS_SELECTOR_PSEUDO_ELEMENT:		**ptr = ':';		*ptr += 1;		dump_string(detail->qname.name, ptr);		if (detail->value_type == CSS_SELECTOR_DETAIL_VALUE_STRING) {			if (detail->value.string != NULL) {				**ptr = '(';				*ptr += 1;				dump_string(detail->value.string, ptr);				**ptr = ')';				*ptr += 1;			}		} else {			*ptr += sprintf(*ptr, "(%dn+%d)",					detail->value.nth.a,					detail->value.nth.b);		}		break;	case CSS_SELECTOR_ATTRIBUTE:		**ptr = '[';		*ptr += 1;		dump_string(detail->qname.name, ptr);		**ptr = ']';		*ptr += 1;		break;	case CSS_SELECTOR_ATTRIBUTE_EQUAL:		**ptr = '[';		*ptr += 1;		dump_string(detail->qname.name, ptr);		(*ptr)[0] = '=';		(*ptr)[1] = '"';		*ptr += 2;		dump_string(detail->value.string, ptr);		(*ptr)[0] = '"';		(*ptr)[1] = ']';		*ptr += 2;		break;	case CSS_SELECTOR_ATTRIBUTE_DASHMATCH:		**ptr = '[';		*ptr += 1;		dump_string(detail->qname.name, ptr);		(*ptr)[0] = '|';		(*ptr)[1] = '=';		(*ptr)[2] = '"';		*ptr += 3;		dump_string(detail->value.string, ptr);		(*ptr)[0] = '"';		(*ptr)[1] = ']';		*ptr += 2;		break;	case CSS_SELECTOR_ATTRIBUTE_INCLUDES:		**ptr = '[';		*ptr += 1;		dump_string(detail->qname.name, ptr);		(*ptr)[0] = '~';		(*ptr)[1] = '=';		(*ptr)[2] = '"';		*ptr += 3;		dump_string(detail->value.string, ptr);		(*ptr)[0] = '"';		(*ptr)[1] = ']';		*ptr += 2;		break;	case CSS_SELECTOR_ATTRIBUTE_PREFIX:		**ptr = '[';		*ptr += 1;		dump_string(detail->qname.name, ptr);		(*ptr)[0] = '^';		(*ptr)[1] = '=';		(*ptr)[2] = '"';		*ptr += 3;		dump_string(detail->value.string, ptr);		(*ptr)[0] = '"';		(*ptr)[1] = ']';		*ptr += 2;		break;	case CSS_SELECTOR_ATTRIBUTE_SUFFIX:		**ptr = '[';		*ptr += 1;		dump_string(detail->qname.name, ptr);		(*ptr)[0] = '$';		(*ptr)[1] = '=';		(*ptr)[2] = '"';		*ptr += 3;		dump_string(detail->value.string, ptr);		(*ptr)[0] = '"';		(*ptr)[1] = ']';		*ptr += 2;		break;	case CSS_SELECTOR_ATTRIBUTE_SUBSTRING:		**ptr = '[';		*ptr += 1;		dump_string(detail->qname.name, ptr);		(*ptr)[0] = '*';		(*ptr)[1] = '=';		(*ptr)[2] = '"';		*ptr += 3;		dump_string(detail->value.string, ptr);		(*ptr)[0] = '"';		(*ptr)[1] = ']';		*ptr += 2;		break;	} 	if (detail->negate)		*ptr += sprintf(*ptr, ")");} /** * Opcode names, indexed by opcode */static const char *opcode_names[] = {	"azimuth",	"background-attachment",	"background-color",	"background-image",	"background-position",	"background-repeat",	"border-collapse",	"border-spacing",	"border-top-color",	"border-right-color",	"border-bottom-color",	"border-left-color",	"border-top-style",	"border-right-style",	"border-bottom-style",	"border-left-style",	"border-top-width",	"border-right-width",	"border-bottom-width",	"border-left-width",	"bottom",	"caption-side",	"clear",	"clip",	"color",	"content",	"counter-increment",	"counter-reset",	"cue-after",	"cue-before",	"cursor",	"direction",	"display",	"elevation",	"empty-cells",	"float",	"font-family",	"font-size",	"font-style",	"font-variant",	"font-weight",	"height",	"left",	"letter-spacing",	"line-height",	"list-style-image",	"list-style-position",	"list-style-type",	"margin-top",	"margin-right",	"margin-bottom",	"margin-left",	"max-height",	"max-width",	"min-height",	"min-width",	"orphans",	"outline-color",	"outline-style",	"outline-width",	"overflow-x",	"padding-top",	"padding-right",	"padding-bottom",	"padding-left",	"page-break-after",	"page-break-before",	"page-break-inside",	"pause-after",	"pause-before",	"pitch-range",	"pitch",	"play-during",	"position",	"quotes",	"richness",	"right",	"speak-header",	"speak-numeral",	"speak-punctuation",	"speak",	"speech-rate",	"stress",	"table-layout",	"text-align",	"text-decoration",	"text-indent",	"text-transform",	"top",	"unicode-bidi",	"vertical-align",	"visibility",	"voice-family",	"volume",	"white-space",	"widows",	"width",	"word-spacing",	"z-index",	"opacity",	"break-after",	"break-before",	"break-inside",	"column-count",	"column-fill",	"column-gap",	"column-rule-color",	"column-rule-style",	"column-rule-width",	"column-span",	"column-width",	"writing-mode",	"overflow-y",	"box-sizing",	"align-content",	"align-items",	"align-self",	"flex-basis",	"flex-direction",	"flex-grow",	"flex-shrink",	"flex-wrap",	"justify-content",	"order",	"fill-opacity",	"stroke-opacity",}; static void dump_css_fixed(css_fixed f, char **ptr){#define ABS(x) (uint32_t)((x) < 0 ? -(x) : (x))

Lines 1–500 of 2996.