#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. Load more
#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))