Gitweb links:

...log 
http://git.netsurf-browser.org/libcss.git/shortlog/07e70a6e395dde906434995110c93e892b09b585
...commit 
http://git.netsurf-browser.org/libcss.git/commit/07e70a6e395dde906434995110c93e892b09b585
...tree 
http://git.netsurf-browser.org/libcss.git/tree/07e70a6e395dde906434995110c93e892b09b585

The branch, lcneves/units has been updated
       via  07e70a6e395dde906434995110c93e892b09b585 (commit)
      from  467261fe7df209b4b329176051f71e8a546f9829 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/libcss.git/commit/?id=07e70a6e395dde906434995110c93e892b09b585
commit 07e70a6e395dde906434995110c93e892b09b585
Author: Lucas Neves <[email protected]>
Commit: Lucas Neves <[email protected]>

    WIP: Select: autogen for selection properties.

diff --git a/src/select/__pycache__/assets.cpython-36.pyc 
b/src/select/__pycache__/assets.cpython-36.pyc
index f13ccad..b5bf9ca 100644
Binary files a/src/select/__pycache__/assets.cpython-36.pyc and 
b/src/select/__pycache__/assets.cpython-36.pyc differ
diff --git a/src/select/__pycache__/select_config.cpython-36.pyc 
b/src/select/__pycache__/select_config.cpython-36.pyc
index 27faa8b..738f7c8 100644
Binary files a/src/select/__pycache__/select_config.cpython-36.pyc and 
b/src/select/__pycache__/select_config.cpython-36.pyc differ
diff --git a/src/select/autogenerated_computed.h 
b/src/select/autogenerated_computed.h
index a319a58..543785c 100644
--- a/src/select/autogenerated_computed.h
+++ b/src/select/autogenerated_computed.h
@@ -64,15 +64,15 @@ struct css_computed_uncommon_i {
  * 0  bbbbbbbbbbbccccccccoooooooouuuuu
  * border_spacing; column_rule_width; outline_width; cursor
  * 
- * 1  wwwwwwwlllllllcccccccooooooobbbb
- * word_spacing; letter_spacing; column_width; column_gap; break_before
+ * 1  cccccccooooooowwwwwwwlllllllbbbb
+ * column_width; column_gap; word_spacing; letter_spacing; break_before
  * 
  * 2  ccccccccccccccccccccccccccbbbboo
  * clip; break_after; column_fill
  * 
- * 3  ccccbbbboolluuttnner............
- * column_rule_style; break_inside; column_span; column_count;
- * column_rule_color; outline_color; content; counter_increment; counter_reset
+ * 3  ccccbbbboolluuttmmne............
+ * column_rule_style; break_inside; content; column_count; column_rule_color;
+ * outline_color; column_span; counter_increment; counter_reset
  */
        uint32_t bits[4];
        
@@ -125,7 +125,7 @@ typedef struct css_computed_page {
  * Bit allocations:
  * 
  * 0  pppaaaggwo......................
- * page_break_after; page_break_before; page_break_inside; widows; orphans
+ * page_break_before; page_break_after; page_break_inside; widows; orphans
  */
        uint32_t bits[1];
        
@@ -231,45 +231,45 @@ struct css_computed_style_i {
  * Bit allocations:
  * 
  * 0  bbbbbbbboooooooorrrrrrrrdddddddd
- * border_bottom_width; border_left_width; border_top_width; border_right_width
+ * border_right_width; border_top_width; border_bottom_width; border_left_width
  * 
- * 1  mmmmmmmbbbbbbbaaaaaaaiiiiiiioooo
- * max_height; bottom; margin_bottom; min_height; border_left_style
+ * 1  ttttttthhhhhhhmmmmmmmiiiiiiiffff
+ * top; height; max_width; min_height; font_weight
  * 
- * 2  hhhhhhhrrrrrrrmmmmmmmaaaaaaatttt
- * height; right; margin_top; margin_right; text_align
+ * 2  mmmmmmmbbbbbbbaaaaaaarrrrrrroooo
+ * min_width; bottom; margin_top; margin_bottom; border_top_style
  * 
- * 3  mmmmmmmtttttttffffffflllllllbbbb
- * max_width; top; flex_basis; line_height; border_right_style
+ * 3  fffffffwwwwwwwmmmmmmmrrrrrrrbbbb
+ * flex_basis; width; max_height; right; border_right_style
  * 
- * 4  wwwwwwwmmmmmmmiiiiiiilllllllffff
- * width; margin_left; min_width; left; font_weight
+ * 4  lllllllmmmmmmmiiiiiiiaaaaaaabbbb
+ * left; margin_right; line_height; margin_left; border_left_style
  * 
- * 5  bbbbbbbbbbbvvvvvvvvvfffffffffaaa
- * background_position; vertical_align; font_size; align_content
+ * 5  bbbbbbbbbbbfffffffffvvvvvvvvvppp
+ * background_position; font_size; vertical_align; position
  * 
- * 6  dddddtttttoooollllbbbbrrrraaaiii
- * display; text_decoration; outline_style; list_style_type;
- * border_bottom_style; border_top_style; align_items; align_self
+ * 6  tttttdddddllllbbbbooooeeeeaaafff
+ * text_decoration; display; list_style_type; border_bottom_style;
+ * outline_style; text_align; align_content; font_family
  * 
- * 7  ppppppaaaaaaddddddttttttiiiiiicc
- * padding_bottom; padding_left; padding_top; text_indent; padding_right;
- * caption_side
+ * 7  ppppppaaaaaaddddddttttttiiiiiiff
+ * padding_bottom; padding_right; padding_left; text_indent; padding_top;
+ * font_variant
  * 
- * 8  bboorrvvttddffaanniillcczzuueess
- * border_bottom_color; border_collapse; border_left_color; visibility;
- * table_layout; border_top_color; flex_wrap; background_attachment;
- * font_style; font_variant; float; background_color; z_index; unicode_bidi;
- * border_right_color; list_style_position
+ * 8  ttccbbaaffvvooeerrzzkknnddllmmii
+ * table_layout; caption_side; border_right_color; background_attachment;
+ * float; visibility; box_sizing; empty_cells; border_top_color; z_index;
+ * background_color; font_style; direction; border_collapse;
+ * border_bottom_color; list_style_position
  * 
- * 9  wwwbbbcccfffooopppnnnjjjttteexxa
- * white_space; background_repeat; clear; flex_direction; overflow; position;
- * font_family; justify_content; text_transform; empty_cells; box_sizing;
- * opacity
+ * 9  fffbbbaaatttccclllwwwooojjjuueer
+ * flex_direction; background_repeat; align_items; text_transform; clear;
+ * align_self; white_space; overflow; justify_content; unicode_bidi; flex_wrap;
+ * color
  * 
- * 10 ddfbcliqo.......................
- * direction; flex_grow; background_image; color; flex_shrink;
- * list_style_image; quotes; order
+ * 10 bbfaqlior.......................
+ * border_left_color; flex_shrink; background_image; quotes; flex_grow;
+ * list_style_image; opacity; order
  */
        uint32_t bits[11];
        
diff --git a/src/select/autogenerated_propset.h 
b/src/select/autogenerated_propset.h
index 4976929..f959500 100644
--- a/src/select/autogenerated_propset.h
+++ b/src/select/autogenerated_propset.h
@@ -29,32 +29,703 @@ static const css_computed_uncommon default_uncommon = {
                                        CSS_COLUMN_RULE_WIDTH_MEDIUM << 13) | (
                                        CSS_OUTLINE_WIDTH_MEDIUM << 5) |
                                        CSS_CURSOR_INHERIT,
-                       (CSS_WORD_SPACING_NORMAL << 25) | (
-                                       CSS_LETTER_SPACING_NORMAL << 18) | (
-                                       CSS_COLUMN_WIDTH_AUTO << 11) | (
-                                       CSS_COLUMN_GAP_NORMAL << 4) |
-                                       CSS_BREAK_BEFORE_AUTO,
+                       (CSS_COLUMN_WIDTH_AUTO << 25) | (CSS_COLUMN_GAP_NORMAL
+                                       << 18) | (CSS_WORD_SPACING_NORMAL <<
+                                       11) | (CSS_LETTER_SPACING_NORMAL << 4)
+                                       | CSS_BREAK_BEFORE_AUTO,
                        (CSS_CLIP_AUTO << 6) | (CSS_BREAK_AFTER_AUTO << 2) |
                                        CSS_COLUMN_FILL_BALANCE,
                        (CSS_COLUMN_RULE_STYLE_NONE << 28) | (
                                        CSS_BREAK_INSIDE_AUTO << 24) | (
-                                       CSS_COLUMN_SPAN_NONE << 22) | (
+                                       CSS_CONTENT_NORMAL << 22) | (
                                        CSS_COLUMN_COUNT_AUTO << 20) | (
                                        CSS_COLUMN_RULE_CURRENT_COLOR << 18) | (
                                        CSS_OUTLINE_COLOR_INVERT << 16) | (
-                                       CSS_CONTENT_NORMAL << 14) | (
+                                       CSS_COLUMN_SPAN_NONE << 14) | (
                                        CSS_COUNTER_INCREMENT_NONE << 13) | (
                                        CSS_COUNTER_RESET_NONE << 12)
                },
+               .border_spacing_a = 0,
+               .border_spacing_b = 0,
+               .clip_a = 0,
+               .clip_b = 0,
+               .clip_c = 0,
+               .clip_d = 0,
+               .column_count = 0,
+               .column_gap = 0,
+               .column_rule_color = 0,
+               .column_rule_width = 0,
+               .column_width = 0,
+               .letter_spacing = 0,
+               .outline_color = 0,
+               .outline_width = 0,
+               .word_spacing = 0
        },
+       .content = NULL,
+       .counter_increment = NULL,
+       .counter_reset = NULL,
+       .cursor = NULL,
+       .next = NULL,
+       .count = 0,
+       .bin = UINT32_MAX
 };
+
+#define ENSURE_UNCOMMON do {                                           \
+       if (style->i.uncommon == NULL) {                                \
+               style->i.uncommon = malloc(sizeof(                      \
+                               css_computed_uncommon));                \
+               if (style->i.uncommon == NULL)                          \
+                       return CSS_NOMEM;                               \
+                                                                       \
+               memcpy(style->i.uncommon, &default_uncommon, sizeof(    \
+                               css_computed_uncommon));                \
+       }                                                               \
+} while(0)                                                             \
+
+#define BORDER_SPACING_INDEX 0
+#define BORDER_SPACING_SHIFT 21
+#define BORDER_SPACING_MASK 0xffe00000
+#undef BORDER_SPACING_INDEX
+#undef BORDER_SPACING_SHIFT
+#undef BORDER_SPACING_MASK
+#define BREAK_AFTER_INDEX 2
+#define BREAK_AFTER_SHIFT 2
+#define BREAK_AFTER_MASK 0x3c
+#undef BREAK_AFTER_INDEX
+#undef BREAK_AFTER_SHIFT
+#undef BREAK_AFTER_MASK
+#define BREAK_BEFORE_INDEX 1
+#define BREAK_BEFORE_SHIFT 0
+#define BREAK_BEFORE_MASK 0xf
+#undef BREAK_BEFORE_INDEX
+#undef BREAK_BEFORE_SHIFT
+#undef BREAK_BEFORE_MASK
+#define BREAK_INSIDE_INDEX 3
+#define BREAK_INSIDE_SHIFT 24
+#define BREAK_INSIDE_MASK 0xf000000
+#undef BREAK_INSIDE_INDEX
+#undef BREAK_INSIDE_SHIFT
+#undef BREAK_INSIDE_MASK
+#define CLIP_INDEX 2
+#define CLIP_SHIFT 6
+#define CLIP_MASK 0xffffffc0
+#undef CLIP_INDEX
+#undef CLIP_SHIFT
+#undef CLIP_MASK
+#define COLUMN_COUNT_INDEX 3
+#define COLUMN_COUNT_SHIFT 20
+#define COLUMN_COUNT_MASK 0x300000
+#undef COLUMN_COUNT_INDEX
+#undef COLUMN_COUNT_SHIFT
+#undef COLUMN_COUNT_MASK
+#define COLUMN_FILL_INDEX 2
+#define COLUMN_FILL_SHIFT 0
+#define COLUMN_FILL_MASK 0x3
+#undef COLUMN_FILL_INDEX
+#undef COLUMN_FILL_SHIFT
+#undef COLUMN_FILL_MASK
+#define COLUMN_GAP_INDEX 1
+#define COLUMN_GAP_SHIFT 18
+#define COLUMN_GAP_MASK 0x1fc0000
+#undef COLUMN_GAP_INDEX
+#undef COLUMN_GAP_SHIFT
+#undef COLUMN_GAP_MASK
+#define COLUMN_RULE_COLOR_INDEX 3
+#define COLUMN_RULE_COLOR_SHIFT 18
+#define COLUMN_RULE_COLOR_MASK 0xc0000
+#undef COLUMN_RULE_COLOR_INDEX
+#undef COLUMN_RULE_COLOR_SHIFT
+#undef COLUMN_RULE_COLOR_MASK
+#define COLUMN_RULE_STYLE_INDEX 3
+#define COLUMN_RULE_STYLE_SHIFT 28
+#define COLUMN_RULE_STYLE_MASK 0xf0000000
+#undef COLUMN_RULE_STYLE_INDEX
+#undef COLUMN_RULE_STYLE_SHIFT
+#undef COLUMN_RULE_STYLE_MASK
+#define COLUMN_RULE_WIDTH_INDEX 0
+#define COLUMN_RULE_WIDTH_SHIFT 13
+#define COLUMN_RULE_WIDTH_MASK 0x1fe000
+#undef COLUMN_RULE_WIDTH_INDEX
+#undef COLUMN_RULE_WIDTH_SHIFT
+#undef COLUMN_RULE_WIDTH_MASK
+#define COLUMN_SPAN_INDEX 3
+#define COLUMN_SPAN_SHIFT 14
+#define COLUMN_SPAN_MASK 0xc000
+#undef COLUMN_SPAN_INDEX
+#undef COLUMN_SPAN_SHIFT
+#undef COLUMN_SPAN_MASK
+#define COLUMN_WIDTH_INDEX 1
+#define COLUMN_WIDTH_SHIFT 25
+#define COLUMN_WIDTH_MASK 0xfe000000
+#undef COLUMN_WIDTH_INDEX
+#undef COLUMN_WIDTH_SHIFT
+#undef COLUMN_WIDTH_MASK
+#define CONTENT_INDEX 3
+#define CONTENT_SHIFT 22
+#define CONTENT_MASK 0xc00000
+#undef CONTENT_INDEX
+#undef CONTENT_SHIFT
+#undef CONTENT_MASK
+#define COUNTER_INCREMENT_INDEX 3
+#define COUNTER_INCREMENT_SHIFT 13
+#define COUNTER_INCREMENT_MASK 0x2000
+#undef COUNTER_INCREMENT_INDEX
+#undef COUNTER_INCREMENT_SHIFT
+#undef COUNTER_INCREMENT_MASK
+#define COUNTER_RESET_INDEX 3
+#define COUNTER_RESET_SHIFT 12
+#define COUNTER_RESET_MASK 0x1000
+#undef COUNTER_RESET_INDEX
+#undef COUNTER_RESET_SHIFT
+#undef COUNTER_RESET_MASK
+#define CURSOR_INDEX 0
+#define CURSOR_SHIFT 0
+#define CURSOR_MASK 0x1f
+#undef CURSOR_INDEX
+#undef CURSOR_SHIFT
+#undef CURSOR_MASK
+#define LETTER_SPACING_INDEX 1
+#define LETTER_SPACING_SHIFT 4
+#define LETTER_SPACING_MASK 0x7f0
+#undef LETTER_SPACING_INDEX
+#undef LETTER_SPACING_SHIFT
+#undef LETTER_SPACING_MASK
+#define OUTLINE_COLOR_INDEX 3
+#define OUTLINE_COLOR_SHIFT 16
+#define OUTLINE_COLOR_MASK 0x30000
+#undef OUTLINE_COLOR_INDEX
+#undef OUTLINE_COLOR_SHIFT
+#undef OUTLINE_COLOR_MASK
+#define OUTLINE_WIDTH_INDEX 0
+#define OUTLINE_WIDTH_SHIFT 5
+#define OUTLINE_WIDTH_MASK 0x1fe0
+#undef OUTLINE_WIDTH_INDEX
+#undef OUTLINE_WIDTH_SHIFT
+#undef OUTLINE_WIDTH_MASK
+#define WORD_SPACING_INDEX 1
+#define WORD_SPACING_SHIFT 11
+#define WORD_SPACING_MASK 0x3f800
+#undef WORD_SPACING_INDEX
+#undef WORD_SPACING_SHIFT
+#undef WORD_SPACING_MASK
 static const css_computed_page default_page = {
        .bits = {
-               (CSS_PAGE_BREAK_AFTER_AUTO << 29) | (CSS_PAGE_BREAK_BEFORE_AUTO
+               (CSS_PAGE_BREAK_BEFORE_AUTO << 29) | (CSS_PAGE_BREAK_AFTER_AUTO
                                << 26) | (CSS_PAGE_BREAK_INSIDE_AUTO << 24) | (
                                CSS_WIDOWS_SET << 23) | (CSS_ORPHANS_SET << 22)
        },
+       .orphans = 2 << CSS_RADIX_POINT,
+       .widows = 2 << CSS_RADIX_POINT
 };
 
+#define ENSURE_PAGE do {                                               \
+       if (style->page == NULL) {                                      \
+               style->page = malloc(sizeof(css_computed_page));        \
+               if (style->page == NULL)                                \
+                       return CSS_NOMEM;                               \
+                                                                       \
+               memcpy(style->page, &default_page, sizeof(              \
+                               css_computed_page));                    \
+       }                                                               \
+} while(0)                                                             \
+
+#define ORPHANS_INDEX 0
+#define ORPHANS_SHIFT 22
+#define ORPHANS_MASK 0x400000
+#undef ORPHANS_INDEX
+#undef ORPHANS_SHIFT
+#undef ORPHANS_MASK
+#define PAGE_BREAK_AFTER_INDEX 0
+#define PAGE_BREAK_AFTER_SHIFT 26
+#define PAGE_BREAK_AFTER_MASK 0x1c000000
+#undef PAGE_BREAK_AFTER_INDEX
+#undef PAGE_BREAK_AFTER_SHIFT
+#undef PAGE_BREAK_AFTER_MASK
+#define PAGE_BREAK_BEFORE_INDEX 0
+#define PAGE_BREAK_BEFORE_SHIFT 29
+#define PAGE_BREAK_BEFORE_MASK 0xe0000000
+#undef PAGE_BREAK_BEFORE_INDEX
+#undef PAGE_BREAK_BEFORE_SHIFT
+#undef PAGE_BREAK_BEFORE_MASK
+#define PAGE_BREAK_INSIDE_INDEX 0
+#define PAGE_BREAK_INSIDE_SHIFT 24
+#define PAGE_BREAK_INSIDE_MASK 0x3000000
+#undef PAGE_BREAK_INSIDE_INDEX
+#undef PAGE_BREAK_INSIDE_SHIFT
+#undef PAGE_BREAK_INSIDE_MASK
+#define WIDOWS_INDEX 0
+#define WIDOWS_SHIFT 23
+#define WIDOWS_MASK 0x800000
+#undef WIDOWS_INDEX
+#undef WIDOWS_SHIFT
+#undef WIDOWS_MASK
+#define ALIGN_CONTENT_INDEX 6
+#define ALIGN_CONTENT_SHIFT 3
+#define ALIGN_CONTENT_MASK 0x38
+#undef ALIGN_CONTENT_INDEX
+#undef ALIGN_CONTENT_SHIFT
+#undef ALIGN_CONTENT_MASK
+#define ALIGN_ITEMS_INDEX 9
+#define ALIGN_ITEMS_SHIFT 23
+#define ALIGN_ITEMS_MASK 0x3800000
+#undef ALIGN_ITEMS_INDEX
+#undef ALIGN_ITEMS_SHIFT
+#undef ALIGN_ITEMS_MASK
+#define ALIGN_SELF_INDEX 9
+#define ALIGN_SELF_SHIFT 14
+#define ALIGN_SELF_MASK 0x1c000
+#undef ALIGN_SELF_INDEX
+#undef ALIGN_SELF_SHIFT
+#undef ALIGN_SELF_MASK
+#define BACKGROUND_ATTACHMENT_INDEX 8
+#define BACKGROUND_ATTACHMENT_SHIFT 24
+#define BACKGROUND_ATTACHMENT_MASK 0x3000000
+#undef BACKGROUND_ATTACHMENT_INDEX
+#undef BACKGROUND_ATTACHMENT_SHIFT
+#undef BACKGROUND_ATTACHMENT_MASK
+#define BACKGROUND_COLOR_INDEX 8
+#define BACKGROUND_COLOR_SHIFT 10
+#define BACKGROUND_COLOR_MASK 0xc00
+#undef BACKGROUND_COLOR_INDEX
+#undef BACKGROUND_COLOR_SHIFT
+#undef BACKGROUND_COLOR_MASK
+#define BACKGROUND_IMAGE_INDEX 10
+#define BACKGROUND_IMAGE_SHIFT 28
+#define BACKGROUND_IMAGE_MASK 0x10000000
+#undef BACKGROUND_IMAGE_INDEX
+#undef BACKGROUND_IMAGE_SHIFT
+#undef BACKGROUND_IMAGE_MASK
+#define BACKGROUND_POSITION_INDEX 5
+#define BACKGROUND_POSITION_SHIFT 21
+#define BACKGROUND_POSITION_MASK 0xffe00000
+#undef BACKGROUND_POSITION_INDEX
+#undef BACKGROUND_POSITION_SHIFT
+#undef BACKGROUND_POSITION_MASK
+#define BACKGROUND_REPEAT_INDEX 9
+#define BACKGROUND_REPEAT_SHIFT 26
+#define BACKGROUND_REPEAT_MASK 0x1c000000
+#undef BACKGROUND_REPEAT_INDEX
+#undef BACKGROUND_REPEAT_SHIFT
+#undef BACKGROUND_REPEAT_MASK
+#define BORDER_BOTTOM_COLOR_INDEX 8
+#define BORDER_BOTTOM_COLOR_SHIFT 2
+#define BORDER_BOTTOM_COLOR_MASK 0xc
+#undef BORDER_BOTTOM_COLOR_INDEX
+#undef BORDER_BOTTOM_COLOR_SHIFT
+#undef BORDER_BOTTOM_COLOR_MASK
+#define BORDER_BOTTOM_STYLE_INDEX 6
+#define BORDER_BOTTOM_STYLE_SHIFT 14
+#define BORDER_BOTTOM_STYLE_MASK 0x3c000
+#undef BORDER_BOTTOM_STYLE_INDEX
+#undef BORDER_BOTTOM_STYLE_SHIFT
+#undef BORDER_BOTTOM_STYLE_MASK
+#define BORDER_BOTTOM_WIDTH_INDEX 0
+#define BORDER_BOTTOM_WIDTH_SHIFT 8
+#define BORDER_BOTTOM_WIDTH_MASK 0xff00
+#undef BORDER_BOTTOM_WIDTH_INDEX
+#undef BORDER_BOTTOM_WIDTH_SHIFT
+#undef BORDER_BOTTOM_WIDTH_MASK
+#define BORDER_COLLAPSE_INDEX 8
+#define BORDER_COLLAPSE_SHIFT 4
+#define BORDER_COLLAPSE_MASK 0x30
+#undef BORDER_COLLAPSE_INDEX
+#undef BORDER_COLLAPSE_SHIFT
+#undef BORDER_COLLAPSE_MASK
+#define BORDER_LEFT_COLOR_INDEX 10
+#define BORDER_LEFT_COLOR_SHIFT 30
+#define BORDER_LEFT_COLOR_MASK 0xc0000000
+#undef BORDER_LEFT_COLOR_INDEX
+#undef BORDER_LEFT_COLOR_SHIFT
+#undef BORDER_LEFT_COLOR_MASK
+#define BORDER_LEFT_STYLE_INDEX 4
+#define BORDER_LEFT_STYLE_SHIFT 0
+#define BORDER_LEFT_STYLE_MASK 0xf
+#undef BORDER_LEFT_STYLE_INDEX
+#undef BORDER_LEFT_STYLE_SHIFT
+#undef BORDER_LEFT_STYLE_MASK
+#define BORDER_LEFT_WIDTH_INDEX 0
+#define BORDER_LEFT_WIDTH_SHIFT 0
+#define BORDER_LEFT_WIDTH_MASK 0xff
+#undef BORDER_LEFT_WIDTH_INDEX
+#undef BORDER_LEFT_WIDTH_SHIFT
+#undef BORDER_LEFT_WIDTH_MASK
+#define BORDER_RIGHT_COLOR_INDEX 8
+#define BORDER_RIGHT_COLOR_SHIFT 26
+#define BORDER_RIGHT_COLOR_MASK 0xc000000
+#undef BORDER_RIGHT_COLOR_INDEX
+#undef BORDER_RIGHT_COLOR_SHIFT
+#undef BORDER_RIGHT_COLOR_MASK
+#define BORDER_RIGHT_STYLE_INDEX 3
+#define BORDER_RIGHT_STYLE_SHIFT 0
+#define BORDER_RIGHT_STYLE_MASK 0xf
+#undef BORDER_RIGHT_STYLE_INDEX
+#undef BORDER_RIGHT_STYLE_SHIFT
+#undef BORDER_RIGHT_STYLE_MASK
+#define BORDER_RIGHT_WIDTH_INDEX 0
+#define BORDER_RIGHT_WIDTH_SHIFT 24
+#define BORDER_RIGHT_WIDTH_MASK 0xff000000
+#undef BORDER_RIGHT_WIDTH_INDEX
+#undef BORDER_RIGHT_WIDTH_SHIFT
+#undef BORDER_RIGHT_WIDTH_MASK
+#define BORDER_TOP_COLOR_INDEX 8
+#define BORDER_TOP_COLOR_SHIFT 14
+#define BORDER_TOP_COLOR_MASK 0xc000
+#undef BORDER_TOP_COLOR_INDEX
+#undef BORDER_TOP_COLOR_SHIFT
+#undef BORDER_TOP_COLOR_MASK
+#define BORDER_TOP_STYLE_INDEX 2
+#define BORDER_TOP_STYLE_SHIFT 0
+#define BORDER_TOP_STYLE_MASK 0xf
+#undef BORDER_TOP_STYLE_INDEX
+#undef BORDER_TOP_STYLE_SHIFT
+#undef BORDER_TOP_STYLE_MASK
+#define BORDER_TOP_WIDTH_INDEX 0
+#define BORDER_TOP_WIDTH_SHIFT 16
+#define BORDER_TOP_WIDTH_MASK 0xff0000
+#undef BORDER_TOP_WIDTH_INDEX
+#undef BORDER_TOP_WIDTH_SHIFT
+#undef BORDER_TOP_WIDTH_MASK
+#define BOTTOM_INDEX 2
+#define BOTTOM_SHIFT 18
+#define BOTTOM_MASK 0x1fc0000
+#undef BOTTOM_INDEX
+#undef BOTTOM_SHIFT
+#undef BOTTOM_MASK
+#define BOX_SIZING_INDEX 8
+#define BOX_SIZING_SHIFT 18
+#define BOX_SIZING_MASK 0xc0000
+#undef BOX_SIZING_INDEX
+#undef BOX_SIZING_SHIFT
+#undef BOX_SIZING_MASK
+#define CAPTION_SIDE_INDEX 8
+#define CAPTION_SIDE_SHIFT 28
+#define CAPTION_SIDE_MASK 0x30000000
+#undef CAPTION_SIDE_INDEX
+#undef CAPTION_SIDE_SHIFT
+#undef CAPTION_SIDE_MASK
+#define CLEAR_INDEX 9
+#define CLEAR_SHIFT 17
+#define CLEAR_MASK 0xe0000
+#undef CLEAR_INDEX
+#undef CLEAR_SHIFT
+#undef CLEAR_MASK
+#define COLOR_INDEX 9
+#define COLOR_SHIFT 0
+#define COLOR_MASK 0x1
+#undef COLOR_INDEX
+#undef COLOR_SHIFT
+#undef COLOR_MASK
+#define DIRECTION_INDEX 8
+#define DIRECTION_SHIFT 6
+#define DIRECTION_MASK 0xc0
+#undef DIRECTION_INDEX
+#undef DIRECTION_SHIFT
+#undef DIRECTION_MASK
+#define DISPLAY_INDEX 6
+#define DISPLAY_SHIFT 22
+#define DISPLAY_MASK 0x7c00000
+#undef DISPLAY_INDEX
+#undef DISPLAY_SHIFT
+#undef DISPLAY_MASK
+#define EMPTY_CELLS_INDEX 8
+#define EMPTY_CELLS_SHIFT 16
+#define EMPTY_CELLS_MASK 0x30000
+#undef EMPTY_CELLS_INDEX
+#undef EMPTY_CELLS_SHIFT
+#undef EMPTY_CELLS_MASK
+#define FLEX_BASIS_INDEX 3
+#define FLEX_BASIS_SHIFT 25
+#define FLEX_BASIS_MASK 0xfe000000
+#undef FLEX_BASIS_INDEX
+#undef FLEX_BASIS_SHIFT
+#undef FLEX_BASIS_MASK
+#define FLEX_DIRECTION_INDEX 9
+#define FLEX_DIRECTION_SHIFT 29
+#define FLEX_DIRECTION_MASK 0xe0000000
+#undef FLEX_DIRECTION_INDEX
+#undef FLEX_DIRECTION_SHIFT
+#undef FLEX_DIRECTION_MASK
+#define FLEX_GROW_INDEX 10
+#define FLEX_GROW_SHIFT 26
+#define FLEX_GROW_MASK 0x4000000
+#undef FLEX_GROW_INDEX
+#undef FLEX_GROW_SHIFT
+#undef FLEX_GROW_MASK
+#define FLEX_SHRINK_INDEX 10
+#define FLEX_SHRINK_SHIFT 29
+#define FLEX_SHRINK_MASK 0x20000000
+#undef FLEX_SHRINK_INDEX
+#undef FLEX_SHRINK_SHIFT
+#undef FLEX_SHRINK_MASK
+#define FLEX_WRAP_INDEX 9
+#define FLEX_WRAP_SHIFT 1
+#define FLEX_WRAP_MASK 0x6
+#undef FLEX_WRAP_INDEX
+#undef FLEX_WRAP_SHIFT
+#undef FLEX_WRAP_MASK
+#define FLOAT_INDEX 8
+#define FLOAT_SHIFT 22
+#define FLOAT_MASK 0xc00000
+#undef FLOAT_INDEX
+#undef FLOAT_SHIFT
+#undef FLOAT_MASK
+#define FONT_FAMILY_INDEX 6
+#define FONT_FAMILY_SHIFT 0
+#define FONT_FAMILY_MASK 0x7
+#undef FONT_FAMILY_INDEX
+#undef FONT_FAMILY_SHIFT
+#undef FONT_FAMILY_MASK
+#define FONT_SIZE_INDEX 5
+#define FONT_SIZE_SHIFT 12
+#define FONT_SIZE_MASK 0x1ff000
+#undef FONT_SIZE_INDEX
+#undef FONT_SIZE_SHIFT
+#undef FONT_SIZE_MASK
+#define FONT_STYLE_INDEX 8
+#define FONT_STYLE_SHIFT 8
+#define FONT_STYLE_MASK 0x300
+#undef FONT_STYLE_INDEX
+#undef FONT_STYLE_SHIFT
+#undef FONT_STYLE_MASK
+#define FONT_VARIANT_INDEX 7
+#define FONT_VARIANT_SHIFT 0
+#define FONT_VARIANT_MASK 0x3
+#undef FONT_VARIANT_INDEX
+#undef FONT_VARIANT_SHIFT
+#undef FONT_VARIANT_MASK
+#define FONT_WEIGHT_INDEX 1
+#define FONT_WEIGHT_SHIFT 0
+#define FONT_WEIGHT_MASK 0xf
+#undef FONT_WEIGHT_INDEX
+#undef FONT_WEIGHT_SHIFT
+#undef FONT_WEIGHT_MASK
+#define HEIGHT_INDEX 1
+#define HEIGHT_SHIFT 18
+#define HEIGHT_MASK 0x1fc0000
+#undef HEIGHT_INDEX
+#undef HEIGHT_SHIFT
+#undef HEIGHT_MASK
+#define JUSTIFY_CONTENT_INDEX 9
+#define JUSTIFY_CONTENT_SHIFT 5
+#define JUSTIFY_CONTENT_MASK 0xe0
+#undef JUSTIFY_CONTENT_INDEX
+#undef JUSTIFY_CONTENT_SHIFT
+#undef JUSTIFY_CONTENT_MASK
+#define LEFT_INDEX 4
+#define LEFT_SHIFT 25
+#define LEFT_MASK 0xfe000000
+#undef LEFT_INDEX
+#undef LEFT_SHIFT
+#undef LEFT_MASK
+#define LINE_HEIGHT_INDEX 4
+#define LINE_HEIGHT_SHIFT 11
+#define LINE_HEIGHT_MASK 0x3f800
+#undef LINE_HEIGHT_INDEX
+#undef LINE_HEIGHT_SHIFT
+#undef LINE_HEIGHT_MASK
+#define LIST_STYLE_IMAGE_INDEX 10
+#define LIST_STYLE_IMAGE_SHIFT 25
+#define LIST_STYLE_IMAGE_MASK 0x2000000
+#undef LIST_STYLE_IMAGE_INDEX
+#undef LIST_STYLE_IMAGE_SHIFT
+#undef LIST_STYLE_IMAGE_MASK
+#define LIST_STYLE_POSITION_INDEX 8
+#define LIST_STYLE_POSITION_SHIFT 0
+#define LIST_STYLE_POSITION_MASK 0x3
+#undef LIST_STYLE_POSITION_INDEX
+#undef LIST_STYLE_POSITION_SHIFT
+#undef LIST_STYLE_POSITION_MASK
+#define LIST_STYLE_TYPE_INDEX 6
+#define LIST_STYLE_TYPE_SHIFT 18
+#define LIST_STYLE_TYPE_MASK 0x3c0000
+#undef LIST_STYLE_TYPE_INDEX
+#undef LIST_STYLE_TYPE_SHIFT
+#undef LIST_STYLE_TYPE_MASK
+#define MARGIN_BOTTOM_INDEX 2
+#define MARGIN_BOTTOM_SHIFT 4
+#define MARGIN_BOTTOM_MASK 0x7f0
+#undef MARGIN_BOTTOM_INDEX
+#undef MARGIN_BOTTOM_SHIFT
+#undef MARGIN_BOTTOM_MASK
+#define MARGIN_LEFT_INDEX 4
+#define MARGIN_LEFT_SHIFT 4
+#define MARGIN_LEFT_MASK 0x7f0
+#undef MARGIN_LEFT_INDEX
+#undef MARGIN_LEFT_SHIFT
+#undef MARGIN_LEFT_MASK
+#define MARGIN_RIGHT_INDEX 4
+#define MARGIN_RIGHT_SHIFT 18
+#define MARGIN_RIGHT_MASK 0x1fc0000
+#undef MARGIN_RIGHT_INDEX
+#undef MARGIN_RIGHT_SHIFT
+#undef MARGIN_RIGHT_MASK
+#define MARGIN_TOP_INDEX 2
+#define MARGIN_TOP_SHIFT 11
+#define MARGIN_TOP_MASK 0x3f800
+#undef MARGIN_TOP_INDEX
+#undef MARGIN_TOP_SHIFT
+#undef MARGIN_TOP_MASK
+#define MAX_HEIGHT_INDEX 3
+#define MAX_HEIGHT_SHIFT 11
+#define MAX_HEIGHT_MASK 0x3f800
+#undef MAX_HEIGHT_INDEX
+#undef MAX_HEIGHT_SHIFT
+#undef MAX_HEIGHT_MASK
+#define MAX_WIDTH_INDEX 1
+#define MAX_WIDTH_SHIFT 11
+#define MAX_WIDTH_MASK 0x3f800
+#undef MAX_WIDTH_INDEX
+#undef MAX_WIDTH_SHIFT
+#undef MAX_WIDTH_MASK
+#define MIN_HEIGHT_INDEX 1
+#define MIN_HEIGHT_SHIFT 4
+#define MIN_HEIGHT_MASK 0x7f0
+#undef MIN_HEIGHT_INDEX
+#undef MIN_HEIGHT_SHIFT
+#undef MIN_HEIGHT_MASK
+#define MIN_WIDTH_INDEX 2
+#define MIN_WIDTH_SHIFT 25
+#define MIN_WIDTH_MASK 0xfe000000
+#undef MIN_WIDTH_INDEX
+#undef MIN_WIDTH_SHIFT
+#undef MIN_WIDTH_MASK
+#define OPACITY_INDEX 10
+#define OPACITY_SHIFT 24
+#define OPACITY_MASK 0x1000000
+#undef OPACITY_INDEX
+#undef OPACITY_SHIFT
+#undef OPACITY_MASK
+#define ORDER_INDEX 10
+#define ORDER_SHIFT 23
+#define ORDER_MASK 0x800000
+#undef ORDER_INDEX
+#undef ORDER_SHIFT
+#undef ORDER_MASK
+#define OUTLINE_STYLE_INDEX 6
+#define OUTLINE_STYLE_SHIFT 10
+#define OUTLINE_STYLE_MASK 0x3c00
+#undef OUTLINE_STYLE_INDEX
+#undef OUTLINE_STYLE_SHIFT
+#undef OUTLINE_STYLE_MASK
+#define OVERFLOW_INDEX 9
+#define OVERFLOW_SHIFT 8
+#define OVERFLOW_MASK 0x700
+#undef OVERFLOW_INDEX
+#undef OVERFLOW_SHIFT
+#undef OVERFLOW_MASK
+#define PADDING_BOTTOM_INDEX 7
+#define PADDING_BOTTOM_SHIFT 26
+#define PADDING_BOTTOM_MASK 0xfc000000
+#undef PADDING_BOTTOM_INDEX
+#undef PADDING_BOTTOM_SHIFT
+#undef PADDING_BOTTOM_MASK
+#define PADDING_LEFT_INDEX 7
+#define PADDING_LEFT_SHIFT 14
+#define PADDING_LEFT_MASK 0xfc000
+#undef PADDING_LEFT_INDEX
+#undef PADDING_LEFT_SHIFT
+#undef PADDING_LEFT_MASK
+#define PADDING_RIGHT_INDEX 7
+#define PADDING_RIGHT_SHIFT 20
+#define PADDING_RIGHT_MASK 0x3f00000
+#undef PADDING_RIGHT_INDEX
+#undef PADDING_RIGHT_SHIFT
+#undef PADDING_RIGHT_MASK
+#define PADDING_TOP_INDEX 7
+#define PADDING_TOP_SHIFT 2
+#define PADDING_TOP_MASK 0xfc
+#undef PADDING_TOP_INDEX
+#undef PADDING_TOP_SHIFT
+#undef PADDING_TOP_MASK
+#define POSITION_INDEX 5
+#define POSITION_SHIFT 0
+#define POSITION_MASK 0x7
+#undef POSITION_INDEX
+#undef POSITION_SHIFT
+#undef POSITION_MASK
+#define QUOTES_INDEX 10
+#define QUOTES_SHIFT 27
+#define QUOTES_MASK 0x8000000
+#undef QUOTES_INDEX
+#undef QUOTES_SHIFT
+#undef QUOTES_MASK
+#define RIGHT_INDEX 3
+#define RIGHT_SHIFT 4
+#define RIGHT_MASK 0x7f0
+#undef RIGHT_INDEX
+#undef RIGHT_SHIFT
+#undef RIGHT_MASK
+#define TABLE_LAYOUT_INDEX 8
+#define TABLE_LAYOUT_SHIFT 30
+#define TABLE_LAYOUT_MASK 0xc0000000
+#undef TABLE_LAYOUT_INDEX
+#undef TABLE_LAYOUT_SHIFT
+#undef TABLE_LAYOUT_MASK
+#define TEXT_ALIGN_INDEX 6
+#define TEXT_ALIGN_SHIFT 6
+#define TEXT_ALIGN_MASK 0x3c0
+#undef TEXT_ALIGN_INDEX
+#undef TEXT_ALIGN_SHIFT
+#undef TEXT_ALIGN_MASK
+#define TEXT_DECORATION_INDEX 6
+#define TEXT_DECORATION_SHIFT 27
+#define TEXT_DECORATION_MASK 0xf8000000
+#undef TEXT_DECORATION_INDEX
+#undef TEXT_DECORATION_SHIFT
+#undef TEXT_DECORATION_MASK
+#define TEXT_INDENT_INDEX 7
+#define TEXT_INDENT_SHIFT 8
+#define TEXT_INDENT_MASK 0x3f00
+#undef TEXT_INDENT_INDEX
+#undef TEXT_INDENT_SHIFT
+#undef TEXT_INDENT_MASK
+#define TEXT_TRANSFORM_INDEX 9
+#define TEXT_TRANSFORM_SHIFT 20
+#define TEXT_TRANSFORM_MASK 0x700000
+#undef TEXT_TRANSFORM_INDEX
+#undef TEXT_TRANSFORM_SHIFT
+#undef TEXT_TRANSFORM_MASK
+#define TOP_INDEX 1
+#define TOP_SHIFT 25
+#define TOP_MASK 0xfe000000
+#undef TOP_INDEX
+#undef TOP_SHIFT
+#undef TOP_MASK
+#define UNICODE_BIDI_INDEX 9
+#define UNICODE_BIDI_SHIFT 3
+#define UNICODE_BIDI_MASK 0x18
+#undef UNICODE_BIDI_INDEX
+#undef UNICODE_BIDI_SHIFT
+#undef UNICODE_BIDI_MASK
+#define VERTICAL_ALIGN_INDEX 5
+#define VERTICAL_ALIGN_SHIFT 3
+#define VERTICAL_ALIGN_MASK 0xff8
+#undef VERTICAL_ALIGN_INDEX
+#undef VERTICAL_ALIGN_SHIFT
+#undef VERTICAL_ALIGN_MASK
+#define VISIBILITY_INDEX 8
+#define VISIBILITY_SHIFT 20
+#define VISIBILITY_MASK 0x300000
+#undef VISIBILITY_INDEX
+#undef VISIBILITY_SHIFT
+#undef VISIBILITY_MASK
+#define WHITE_SPACE_INDEX 9
+#define WHITE_SPACE_SHIFT 11
+#define WHITE_SPACE_MASK 0x3800
+#undef WHITE_SPACE_INDEX
+#undef WHITE_SPACE_SHIFT
+#undef WHITE_SPACE_MASK
+#define WIDTH_INDEX 3
+#define WIDTH_SHIFT 18
+#define WIDTH_MASK 0x1fc0000
+#undef WIDTH_INDEX
+#undef WIDTH_SHIFT
+#undef WIDTH_MASK
+#define Z_INDEX_INDEX 8
+#define Z_INDEX_SHIFT 12
+#define Z_INDEX_MASK 0x3000
+#undef Z_INDEX_INDEX
+#undef Z_INDEX_SHIFT
+#undef Z_INDEX_MASK
 
 #endif
\ No newline at end of file
diff --git a/src/select/select_config.py b/src/select/select_config.py
index 748dc43..8167401 100644
--- a/src/select/select_config.py
+++ b/src/select/select_config.py
@@ -57,7 +57,7 @@ style = {
     # Style group, with additional value
     ('background_color', 2, 'color'),
     ('background_image', 1, 'string'),
-    ('background_position', 1, ('length', 'length'),
+    ('background_position', 1, (('length',), ('length',)),
         'CSS_BACKGROUND_POSITION_SET'),
     ('border_top_color', 2, 'color'),
     ('border_right_color', 2, 'color'),
@@ -111,18 +111,20 @@ page = {
     ('page_break_after', 3, None, None, 'CSS_PAGE_BREAK_AFTER_AUTO'),
     ('page_break_before', 3, None, None, 'CSS_PAGE_BREAK_BEFORE_AUTO'),
     ('page_break_inside', 2, None, None, 'CSS_PAGE_BREAK_INSIDE_AUTO'),
-    ('widows', 1, ('integer', '2 << CSS_RADIX_POINT'), None, 'CSS_WIDOWS_SET'),
-    ('orphans', 1, ('integer', '2 << CSS_RADIX_POINT'), None, 
'CSS_ORPHANS_SET')
+    ('widows', 1, (('integer', '2 << CSS_RADIX_POINT'),), None,
+        'CSS_WIDOWS_SET'),
+    ('orphans', 1, (('integer', '2 << CSS_RADIX_POINT'),), None,
+        'CSS_ORPHANS_SET')
 }
 
 uncommon = {
     # Uncommon group
-    ('border_spacing', 1, ('length', 'length'), 'CSS_BORDER_SPACING_SET',
+    ('border_spacing', 1, (('length',), ('length',)), 'CSS_BORDER_SPACING_SET',
         'CSS_BORDER_SPACING_SET'),
     ('break_after', 4, None, None, 'CSS_BREAK_AFTER_AUTO'),
     ('break_before', 4, None, None, 'CSS_BREAK_BEFORE_AUTO'),
     ('break_inside', 4, None, None, 'CSS_BREAK_INSIDE_AUTO'),
-    ('clip', 6, ('length', 'length', 'length', 'length'),
+    ('clip', 6, (('length',), ('length',), ('length',), ('length',)),
         'CSS_CLIP_RECT', 'CSS_CLIP_AUTO', None, ('get', 'set')),
     ('column_count', 2, 'integer', None, 'CSS_COLUMN_COUNT_AUTO'),
     ('column_fill', 2, None, None, 'CSS_COLUMN_FILL_BALANCE'),
diff --git a/src/select/select_generator.py b/src/select/select_generator.py
index b913efe..966fa53 100644
--- a/src/select/select_generator.py
+++ b/src/select/select_generator.py
@@ -8,7 +8,7 @@ import string
 from select_config import values, groups
 from assets import assets
 
-def get_tuple(self, from_var):
+def get_tuple(from_var):
     'Accepts tuples, strings and None; returns a tuple.'
     if type(from_var) is tuple:
         return from_var
@@ -88,7 +88,8 @@ class Text:
                 line += text[:break_index].rstrip()
                 text = text[break_index:].lstrip()
             if self._esc_nl:
-                line += '\t' * (9 - math.floor(len(line) / 8)) + '\\'
+                n_tabs = 9 - self._indent - math.floor(len(line.lstrip()) / 8)
+                line += '\t' * n_tabs + '\\'
             self._lines.append(line)
             if text and not self._comment and not multiline:
                 self.indent(2)
@@ -139,25 +140,29 @@ class CSSProperty:
         self.condition = condition
         self.override = get_tuple(override)
         self.comments = comments
+        self.__index = None
         self.__shift = None
+        self.__mask = None
 
     def make_values(self, vals, for_list=False):
-        if type(vals) is None:
+        if vals is None:
             return []
         elif type(vals) is str:
             val_list = [ CSSValue(*x) for x in values if x[0] == vals ]
             return val_list[0] if for_list else val_list
         elif type(vals) is tuple:
-            if len(vals) is 2 and type(vals[0]) is type(vals[1]) is str:
-                for v in values:
-                    if v[0] == val[0]:
-                        value = CSSValue(v)
-                        value.defaults = get_tuple(vals[1])
-                        return value if for_list else [ value ]
+            val_list = []
+            for val in vals:
+                for x in values:
+                    if x[0] == val[0]:
+                        value = CSSValue(*x)
+                        if len(val) is 2:
+                            value.defaults = get_tuple(val[1])
+                        val_list.append(value)
+                        break
                 else:
                     raise ValueError('Value ' + val[0] + ' not found!')
-            else:
-                return [ self.make_values(x, True) for x in vals ]
+            return val_list
         else:
             raise TypeError('Expected None, str or tuple, got ' +
                             type(vals).__name__)
@@ -168,7 +173,6 @@ class CSSProperty:
             raise ValueError('Property has empty defaults!')
         return self.defaults[0]
 
-    @property
     def default_value(self, index):
         # First default of property is the opcode
         if len(self.defaults) < index + 2:
@@ -210,6 +214,20 @@ class CSSProperty:
                 (' + ' if vars_size and ptr else '') + ptr)
 
     @property
+    def index(self):
+        if self.__index is None:
+            raise NameError('Attribute `index` not set yet!')
+        return self.__index
+
+    @index.setter
+    def index(self, val):
+        if type(val) is not int:
+            raise TypeError('Value of `index` must be an integer!')
+        if val < 0:
+            raise ValueError('Value of `index` must be zero or positive!')
+        self.__index = val
+
+    @property
     def shift(self):
         if self.__shift is None:
             raise NameError('Attribute `shift` not set yet!')
@@ -223,6 +241,21 @@ class CSSProperty:
             raise ValueError('Value of `shift` must be zero or positive!')
         self.__shift = val
 
+    @property
+    def mask(self):
+        if self.__mask is None:
+            raise NameError('Attribute `mask` not set yet!')
+        return '0x{:x}'.format(self.__mask).lower()
+
+    @mask.setter
+    def mask(self, val):
+        if type(val) is not int:
+            raise TypeError('Value of `mask` must be an integer!')
+        if val < 0:
+            raise ValueError('Value of `mask` must be zero or positive!')
+        self.__mask = val
+
+
 class Bin:
     def __init__(self, first_object):
         self.contents = [ first_object ]
@@ -274,8 +307,14 @@ class CSSGroup:
                 p.shift = 32 - p.bits_size
                 self.__bits_array.append(Bin(p))
 
+            p.mask = (sum([ 2 ** x for x in range(p.bits_size) ]) *
+                      2 ** p.shift)
             self.__bits_array.sort(key=(lambda x: x.size), reverse=True)
 
+        for i, b in enumerate(self.__bits_array):
+            for p in b.contents:
+                p.index = i
+
         return self.__bits_array
 
     def make_computed_h(self):
@@ -380,18 +419,52 @@ class CSSGroup:
             t.append(',\n'.join(bits_ops).split('\n'))
             t.indent(-1)
             t.append('},')
-
-            for p in self.props:
-                t.append(make_value_declaration(False, True))
+            t.append(',\n'.join(
+                self.make_value_declaration(False, True)).split('\n'))
 
             if self.name is not 'page':
                 t.indent(-1)
                 t.append('},')
-                for p in self.props:
-                    t.append(make_value_declaration(True, True))
+                t.append(',\n'.join(
+                    self.make_value_declaration(True, True) +
+                    [ '.next = NULL', '.count = 0', '.bin = UINT32_MAX' ]
+                    ).split('\n'))
 
             t.indent(-1)
             t.append('};')
+            t.append()
+
+            t.escape_newline()
+            i_dot = '' if self.name is 'page' else 'i.'
+            t.append('#define ENSURE_{} do {{'.format(self.name.upper()))
+            t.indent(1)
+            t.append('if (style->{}{} == NULL) {{'.format(i_dot, self.name))
+            t.indent(1)
+            t.append('style->{}{n} = malloc(sizeof(css_computed_{n}));'.format(
+                i_dot, n=self.name))
+            t.append('if (style->{}{} == NULL)'.format(i_dot, self.name))
+            t.indent(1)
+            t.append('return CSS_NOMEM;')
+            t.indent(-1)
+            t.append()
+            t.append('memcpy(style->{}{n}, &default_{n}, '
+                     'sizeof(css_computed_{n}));'.format(i_dot, n=self.name))
+            t.indent(-1)
+            t.append('}')
+            t.indent(-1)
+            t.append('} while(0)')
+            t.escape_newline()
+            t.append()
+
+        for p in sorted(self.props, key=(lambda x: x.name)):
+            t.append('#define {}_INDEX {}'.format(p.name.upper(), p.index))
+            t.append('#define {}_SHIFT {}'.format(p.name.upper(), p.shift))
+            t.append('#define {}_MASK {}'.format(p.name.upper(), p.mask))
+            t.append('#undef {}_INDEX'.format(p.name.upper()))
+            t.append('#undef {}_SHIFT'.format(p.name.upper()))
+            t.append('#undef {}_MASK'.format(p.name.upper()))
+
+
 
         return t.to_string()
 
@@ -402,11 +475,11 @@ class CSSGroup:
                 for i, v in enumerate(p.values):
                     v_suffix = ('' if len(p.values) is 1 else
                                 '_' + string.ascii_lowercase[i])
-                    v_type, v_name = shift_star(v.type, p.name)
                     if defaults:
-                        r.append('.{} = {},'.format(v_name,
+                        r.append('.{}{} = {}'.format(p.name, v_suffix,
                                                     p.default_value(i)[0]))
                     else:
+                        v_type, v_name = shift_star(v.type, p.name)
                         r.append('{} {}{};'.format(v_type, v_name, v_suffix))
         return r
 


-----------------------------------------------------------------------

Summary of changes:
 src/select/__pycache__/assets.cpython-36.pyc       |  Bin 1911 -> 1913 bytes
 .../__pycache__/select_config.cpython-36.pyc       |  Bin 6514 -> 6594 bytes
 src/select/autogenerated_computed.h                |   70 +-
 src/select/autogenerated_propset.h                 |  687 +++++++++++++++++++-
 src/select/select_config.py                        |   12 +-
 src/select/select_generator.py                     |  111 +++-
 6 files changed, 813 insertions(+), 67 deletions(-)

diff --git a/src/select/__pycache__/assets.cpython-36.pyc 
b/src/select/__pycache__/assets.cpython-36.pyc
index f13ccad..b5bf9ca 100644
Binary files a/src/select/__pycache__/assets.cpython-36.pyc and 
b/src/select/__pycache__/assets.cpython-36.pyc differ
diff --git a/src/select/__pycache__/select_config.cpython-36.pyc 
b/src/select/__pycache__/select_config.cpython-36.pyc
index 27faa8b..738f7c8 100644
Binary files a/src/select/__pycache__/select_config.cpython-36.pyc and 
b/src/select/__pycache__/select_config.cpython-36.pyc differ
diff --git a/src/select/autogenerated_computed.h 
b/src/select/autogenerated_computed.h
index a319a58..543785c 100644
--- a/src/select/autogenerated_computed.h
+++ b/src/select/autogenerated_computed.h
@@ -64,15 +64,15 @@ struct css_computed_uncommon_i {
  * 0  bbbbbbbbbbbccccccccoooooooouuuuu
  * border_spacing; column_rule_width; outline_width; cursor
  * 
- * 1  wwwwwwwlllllllcccccccooooooobbbb
- * word_spacing; letter_spacing; column_width; column_gap; break_before
+ * 1  cccccccooooooowwwwwwwlllllllbbbb
+ * column_width; column_gap; word_spacing; letter_spacing; break_before
  * 
  * 2  ccccccccccccccccccccccccccbbbboo
  * clip; break_after; column_fill
  * 
- * 3  ccccbbbboolluuttnner............
- * column_rule_style; break_inside; column_span; column_count;
- * column_rule_color; outline_color; content; counter_increment; counter_reset
+ * 3  ccccbbbboolluuttmmne............
+ * column_rule_style; break_inside; content; column_count; column_rule_color;
+ * outline_color; column_span; counter_increment; counter_reset
  */
        uint32_t bits[4];
        
@@ -125,7 +125,7 @@ typedef struct css_computed_page {
  * Bit allocations:
  * 
  * 0  pppaaaggwo......................
- * page_break_after; page_break_before; page_break_inside; widows; orphans
+ * page_break_before; page_break_after; page_break_inside; widows; orphans
  */
        uint32_t bits[1];
        
@@ -231,45 +231,45 @@ struct css_computed_style_i {
  * Bit allocations:
  * 
  * 0  bbbbbbbboooooooorrrrrrrrdddddddd
- * border_bottom_width; border_left_width; border_top_width; border_right_width
+ * border_right_width; border_top_width; border_bottom_width; border_left_width
  * 
- * 1  mmmmmmmbbbbbbbaaaaaaaiiiiiiioooo
- * max_height; bottom; margin_bottom; min_height; border_left_style
+ * 1  ttttttthhhhhhhmmmmmmmiiiiiiiffff
+ * top; height; max_width; min_height; font_weight
  * 
- * 2  hhhhhhhrrrrrrrmmmmmmmaaaaaaatttt
- * height; right; margin_top; margin_right; text_align
+ * 2  mmmmmmmbbbbbbbaaaaaaarrrrrrroooo
+ * min_width; bottom; margin_top; margin_bottom; border_top_style
  * 
- * 3  mmmmmmmtttttttffffffflllllllbbbb
- * max_width; top; flex_basis; line_height; border_right_style
+ * 3  fffffffwwwwwwwmmmmmmmrrrrrrrbbbb
+ * flex_basis; width; max_height; right; border_right_style
  * 
- * 4  wwwwwwwmmmmmmmiiiiiiilllllllffff
- * width; margin_left; min_width; left; font_weight
+ * 4  lllllllmmmmmmmiiiiiiiaaaaaaabbbb
+ * left; margin_right; line_height; margin_left; border_left_style
  * 
- * 5  bbbbbbbbbbbvvvvvvvvvfffffffffaaa
- * background_position; vertical_align; font_size; align_content
+ * 5  bbbbbbbbbbbfffffffffvvvvvvvvvppp
+ * background_position; font_size; vertical_align; position
  * 
- * 6  dddddtttttoooollllbbbbrrrraaaiii
- * display; text_decoration; outline_style; list_style_type;
- * border_bottom_style; border_top_style; align_items; align_self
+ * 6  tttttdddddllllbbbbooooeeeeaaafff
+ * text_decoration; display; list_style_type; border_bottom_style;
+ * outline_style; text_align; align_content; font_family
  * 
- * 7  ppppppaaaaaaddddddttttttiiiiiicc
- * padding_bottom; padding_left; padding_top; text_indent; padding_right;
- * caption_side
+ * 7  ppppppaaaaaaddddddttttttiiiiiiff
+ * padding_bottom; padding_right; padding_left; text_indent; padding_top;
+ * font_variant
  * 
- * 8  bboorrvvttddffaanniillcczzuueess
- * border_bottom_color; border_collapse; border_left_color; visibility;
- * table_layout; border_top_color; flex_wrap; background_attachment;
- * font_style; font_variant; float; background_color; z_index; unicode_bidi;
- * border_right_color; list_style_position
+ * 8  ttccbbaaffvvooeerrzzkknnddllmmii
+ * table_layout; caption_side; border_right_color; background_attachment;
+ * float; visibility; box_sizing; empty_cells; border_top_color; z_index;
+ * background_color; font_style; direction; border_collapse;
+ * border_bottom_color; list_style_position
  * 
- * 9  wwwbbbcccfffooopppnnnjjjttteexxa
- * white_space; background_repeat; clear; flex_direction; overflow; position;
- * font_family; justify_content; text_transform; empty_cells; box_sizing;
- * opacity
+ * 9  fffbbbaaatttccclllwwwooojjjuueer
+ * flex_direction; background_repeat; align_items; text_transform; clear;
+ * align_self; white_space; overflow; justify_content; unicode_bidi; flex_wrap;
+ * color
  * 
- * 10 ddfbcliqo.......................
- * direction; flex_grow; background_image; color; flex_shrink;
- * list_style_image; quotes; order
+ * 10 bbfaqlior.......................
+ * border_left_color; flex_shrink; background_image; quotes; flex_grow;
+ * list_style_image; opacity; order
  */
        uint32_t bits[11];
        
diff --git a/src/select/autogenerated_propset.h 
b/src/select/autogenerated_propset.h
index 4976929..f959500 100644
--- a/src/select/autogenerated_propset.h
+++ b/src/select/autogenerated_propset.h
@@ -29,32 +29,703 @@ static const css_computed_uncommon default_uncommon = {
                                        CSS_COLUMN_RULE_WIDTH_MEDIUM << 13) | (
                                        CSS_OUTLINE_WIDTH_MEDIUM << 5) |
                                        CSS_CURSOR_INHERIT,
-                       (CSS_WORD_SPACING_NORMAL << 25) | (
-                                       CSS_LETTER_SPACING_NORMAL << 18) | (
-                                       CSS_COLUMN_WIDTH_AUTO << 11) | (
-                                       CSS_COLUMN_GAP_NORMAL << 4) |
-                                       CSS_BREAK_BEFORE_AUTO,
+                       (CSS_COLUMN_WIDTH_AUTO << 25) | (CSS_COLUMN_GAP_NORMAL
+                                       << 18) | (CSS_WORD_SPACING_NORMAL <<
+                                       11) | (CSS_LETTER_SPACING_NORMAL << 4)
+                                       | CSS_BREAK_BEFORE_AUTO,
                        (CSS_CLIP_AUTO << 6) | (CSS_BREAK_AFTER_AUTO << 2) |
                                        CSS_COLUMN_FILL_BALANCE,
                        (CSS_COLUMN_RULE_STYLE_NONE << 28) | (
                                        CSS_BREAK_INSIDE_AUTO << 24) | (
-                                       CSS_COLUMN_SPAN_NONE << 22) | (
+                                       CSS_CONTENT_NORMAL << 22) | (
                                        CSS_COLUMN_COUNT_AUTO << 20) | (
                                        CSS_COLUMN_RULE_CURRENT_COLOR << 18) | (
                                        CSS_OUTLINE_COLOR_INVERT << 16) | (
-                                       CSS_CONTENT_NORMAL << 14) | (
+                                       CSS_COLUMN_SPAN_NONE << 14) | (
                                        CSS_COUNTER_INCREMENT_NONE << 13) | (
                                        CSS_COUNTER_RESET_NONE << 12)
                },
+               .border_spacing_a = 0,
+               .border_spacing_b = 0,
+               .clip_a = 0,
+               .clip_b = 0,
+               .clip_c = 0,
+               .clip_d = 0,
+               .column_count = 0,
+               .column_gap = 0,
+               .column_rule_color = 0,
+               .column_rule_width = 0,
+               .column_width = 0,
+               .letter_spacing = 0,
+               .outline_color = 0,
+               .outline_width = 0,
+               .word_spacing = 0
        },
+       .content = NULL,
+       .counter_increment = NULL,
+       .counter_reset = NULL,
+       .cursor = NULL,
+       .next = NULL,
+       .count = 0,
+       .bin = UINT32_MAX
 };
+
+#define ENSURE_UNCOMMON do {                                           \
+       if (style->i.uncommon == NULL) {                                \
+               style->i.uncommon = malloc(sizeof(                      \
+                               css_computed_uncommon));                \
+               if (style->i.uncommon == NULL)                          \
+                       return CSS_NOMEM;                               \
+                                                                       \
+               memcpy(style->i.uncommon, &default_uncommon, sizeof(    \
+                               css_computed_uncommon));                \
+       }                                                               \
+} while(0)                                                             \
+
+#define BORDER_SPACING_INDEX 0
+#define BORDER_SPACING_SHIFT 21
+#define BORDER_SPACING_MASK 0xffe00000
+#undef BORDER_SPACING_INDEX
+#undef BORDER_SPACING_SHIFT
+#undef BORDER_SPACING_MASK
+#define BREAK_AFTER_INDEX 2
+#define BREAK_AFTER_SHIFT 2
+#define BREAK_AFTER_MASK 0x3c
+#undef BREAK_AFTER_INDEX
+#undef BREAK_AFTER_SHIFT
+#undef BREAK_AFTER_MASK
+#define BREAK_BEFORE_INDEX 1
+#define BREAK_BEFORE_SHIFT 0
+#define BREAK_BEFORE_MASK 0xf
+#undef BREAK_BEFORE_INDEX
+#undef BREAK_BEFORE_SHIFT
+#undef BREAK_BEFORE_MASK
+#define BREAK_INSIDE_INDEX 3
+#define BREAK_INSIDE_SHIFT 24
+#define BREAK_INSIDE_MASK 0xf000000
+#undef BREAK_INSIDE_INDEX
+#undef BREAK_INSIDE_SHIFT
+#undef BREAK_INSIDE_MASK
+#define CLIP_INDEX 2
+#define CLIP_SHIFT 6
+#define CLIP_MASK 0xffffffc0
+#undef CLIP_INDEX
+#undef CLIP_SHIFT
+#undef CLIP_MASK
+#define COLUMN_COUNT_INDEX 3
+#define COLUMN_COUNT_SHIFT 20
+#define COLUMN_COUNT_MASK 0x300000
+#undef COLUMN_COUNT_INDEX
+#undef COLUMN_COUNT_SHIFT
+#undef COLUMN_COUNT_MASK
+#define COLUMN_FILL_INDEX 2
+#define COLUMN_FILL_SHIFT 0
+#define COLUMN_FILL_MASK 0x3
+#undef COLUMN_FILL_INDEX
+#undef COLUMN_FILL_SHIFT
+#undef COLUMN_FILL_MASK
+#define COLUMN_GAP_INDEX 1
+#define COLUMN_GAP_SHIFT 18
+#define COLUMN_GAP_MASK 0x1fc0000
+#undef COLUMN_GAP_INDEX
+#undef COLUMN_GAP_SHIFT
+#undef COLUMN_GAP_MASK
+#define COLUMN_RULE_COLOR_INDEX 3
+#define COLUMN_RULE_COLOR_SHIFT 18
+#define COLUMN_RULE_COLOR_MASK 0xc0000
+#undef COLUMN_RULE_COLOR_INDEX
+#undef COLUMN_RULE_COLOR_SHIFT
+#undef COLUMN_RULE_COLOR_MASK
+#define COLUMN_RULE_STYLE_INDEX 3
+#define COLUMN_RULE_STYLE_SHIFT 28
+#define COLUMN_RULE_STYLE_MASK 0xf0000000
+#undef COLUMN_RULE_STYLE_INDEX
+#undef COLUMN_RULE_STYLE_SHIFT
+#undef COLUMN_RULE_STYLE_MASK
+#define COLUMN_RULE_WIDTH_INDEX 0
+#define COLUMN_RULE_WIDTH_SHIFT 13
+#define COLUMN_RULE_WIDTH_MASK 0x1fe000
+#undef COLUMN_RULE_WIDTH_INDEX
+#undef COLUMN_RULE_WIDTH_SHIFT
+#undef COLUMN_RULE_WIDTH_MASK
+#define COLUMN_SPAN_INDEX 3
+#define COLUMN_SPAN_SHIFT 14
+#define COLUMN_SPAN_MASK 0xc000
+#undef COLUMN_SPAN_INDEX
+#undef COLUMN_SPAN_SHIFT
+#undef COLUMN_SPAN_MASK
+#define COLUMN_WIDTH_INDEX 1
+#define COLUMN_WIDTH_SHIFT 25
+#define COLUMN_WIDTH_MASK 0xfe000000
+#undef COLUMN_WIDTH_INDEX
+#undef COLUMN_WIDTH_SHIFT
+#undef COLUMN_WIDTH_MASK
+#define CONTENT_INDEX 3
+#define CONTENT_SHIFT 22
+#define CONTENT_MASK 0xc00000
+#undef CONTENT_INDEX
+#undef CONTENT_SHIFT
+#undef CONTENT_MASK
+#define COUNTER_INCREMENT_INDEX 3
+#define COUNTER_INCREMENT_SHIFT 13
+#define COUNTER_INCREMENT_MASK 0x2000
+#undef COUNTER_INCREMENT_INDEX
+#undef COUNTER_INCREMENT_SHIFT
+#undef COUNTER_INCREMENT_MASK
+#define COUNTER_RESET_INDEX 3
+#define COUNTER_RESET_SHIFT 12
+#define COUNTER_RESET_MASK 0x1000
+#undef COUNTER_RESET_INDEX
+#undef COUNTER_RESET_SHIFT
+#undef COUNTER_RESET_MASK
+#define CURSOR_INDEX 0
+#define CURSOR_SHIFT 0
+#define CURSOR_MASK 0x1f
+#undef CURSOR_INDEX
+#undef CURSOR_SHIFT
+#undef CURSOR_MASK
+#define LETTER_SPACING_INDEX 1
+#define LETTER_SPACING_SHIFT 4
+#define LETTER_SPACING_MASK 0x7f0
+#undef LETTER_SPACING_INDEX
+#undef LETTER_SPACING_SHIFT
+#undef LETTER_SPACING_MASK
+#define OUTLINE_COLOR_INDEX 3
+#define OUTLINE_COLOR_SHIFT 16
+#define OUTLINE_COLOR_MASK 0x30000
+#undef OUTLINE_COLOR_INDEX
+#undef OUTLINE_COLOR_SHIFT
+#undef OUTLINE_COLOR_MASK
+#define OUTLINE_WIDTH_INDEX 0
+#define OUTLINE_WIDTH_SHIFT 5
+#define OUTLINE_WIDTH_MASK 0x1fe0
+#undef OUTLINE_WIDTH_INDEX
+#undef OUTLINE_WIDTH_SHIFT
+#undef OUTLINE_WIDTH_MASK
+#define WORD_SPACING_INDEX 1
+#define WORD_SPACING_SHIFT 11
+#define WORD_SPACING_MASK 0x3f800
+#undef WORD_SPACING_INDEX
+#undef WORD_SPACING_SHIFT
+#undef WORD_SPACING_MASK
 static const css_computed_page default_page = {
        .bits = {
-               (CSS_PAGE_BREAK_AFTER_AUTO << 29) | (CSS_PAGE_BREAK_BEFORE_AUTO
+               (CSS_PAGE_BREAK_BEFORE_AUTO << 29) | (CSS_PAGE_BREAK_AFTER_AUTO
                                << 26) | (CSS_PAGE_BREAK_INSIDE_AUTO << 24) | (
                                CSS_WIDOWS_SET << 23) | (CSS_ORPHANS_SET << 22)
        },
+       .orphans = 2 << CSS_RADIX_POINT,
+       .widows = 2 << CSS_RADIX_POINT
 };
 
+#define ENSURE_PAGE do {                                               \
+       if (style->page == NULL) {                                      \
+               style->page = malloc(sizeof(css_computed_page));        \
+               if (style->page == NULL)                                \
+                       return CSS_NOMEM;                               \
+                                                                       \
+               memcpy(style->page, &default_page, sizeof(              \
+                               css_computed_page));                    \
+       }                                                               \
+} while(0)                                                             \
+
+#define ORPHANS_INDEX 0
+#define ORPHANS_SHIFT 22
+#define ORPHANS_MASK 0x400000
+#undef ORPHANS_INDEX
+#undef ORPHANS_SHIFT
+#undef ORPHANS_MASK
+#define PAGE_BREAK_AFTER_INDEX 0
+#define PAGE_BREAK_AFTER_SHIFT 26
+#define PAGE_BREAK_AFTER_MASK 0x1c000000
+#undef PAGE_BREAK_AFTER_INDEX
+#undef PAGE_BREAK_AFTER_SHIFT
+#undef PAGE_BREAK_AFTER_MASK
+#define PAGE_BREAK_BEFORE_INDEX 0
+#define PAGE_BREAK_BEFORE_SHIFT 29
+#define PAGE_BREAK_BEFORE_MASK 0xe0000000
+#undef PAGE_BREAK_BEFORE_INDEX
+#undef PAGE_BREAK_BEFORE_SHIFT
+#undef PAGE_BREAK_BEFORE_MASK
+#define PAGE_BREAK_INSIDE_INDEX 0
+#define PAGE_BREAK_INSIDE_SHIFT 24
+#define PAGE_BREAK_INSIDE_MASK 0x3000000
+#undef PAGE_BREAK_INSIDE_INDEX
+#undef PAGE_BREAK_INSIDE_SHIFT
+#undef PAGE_BREAK_INSIDE_MASK
+#define WIDOWS_INDEX 0
+#define WIDOWS_SHIFT 23
+#define WIDOWS_MASK 0x800000
+#undef WIDOWS_INDEX
+#undef WIDOWS_SHIFT
+#undef WIDOWS_MASK
+#define ALIGN_CONTENT_INDEX 6
+#define ALIGN_CONTENT_SHIFT 3
+#define ALIGN_CONTENT_MASK 0x38
+#undef ALIGN_CONTENT_INDEX
+#undef ALIGN_CONTENT_SHIFT
+#undef ALIGN_CONTENT_MASK
+#define ALIGN_ITEMS_INDEX 9
+#define ALIGN_ITEMS_SHIFT 23
+#define ALIGN_ITEMS_MASK 0x3800000
+#undef ALIGN_ITEMS_INDEX
+#undef ALIGN_ITEMS_SHIFT
+#undef ALIGN_ITEMS_MASK
+#define ALIGN_SELF_INDEX 9
+#define ALIGN_SELF_SHIFT 14
+#define ALIGN_SELF_MASK 0x1c000
+#undef ALIGN_SELF_INDEX
+#undef ALIGN_SELF_SHIFT
+#undef ALIGN_SELF_MASK
+#define BACKGROUND_ATTACHMENT_INDEX 8
+#define BACKGROUND_ATTACHMENT_SHIFT 24
+#define BACKGROUND_ATTACHMENT_MASK 0x3000000
+#undef BACKGROUND_ATTACHMENT_INDEX
+#undef BACKGROUND_ATTACHMENT_SHIFT
+#undef BACKGROUND_ATTACHMENT_MASK
+#define BACKGROUND_COLOR_INDEX 8
+#define BACKGROUND_COLOR_SHIFT 10
+#define BACKGROUND_COLOR_MASK 0xc00
+#undef BACKGROUND_COLOR_INDEX
+#undef BACKGROUND_COLOR_SHIFT
+#undef BACKGROUND_COLOR_MASK
+#define BACKGROUND_IMAGE_INDEX 10
+#define BACKGROUND_IMAGE_SHIFT 28
+#define BACKGROUND_IMAGE_MASK 0x10000000
+#undef BACKGROUND_IMAGE_INDEX
+#undef BACKGROUND_IMAGE_SHIFT
+#undef BACKGROUND_IMAGE_MASK
+#define BACKGROUND_POSITION_INDEX 5
+#define BACKGROUND_POSITION_SHIFT 21
+#define BACKGROUND_POSITION_MASK 0xffe00000
+#undef BACKGROUND_POSITION_INDEX
+#undef BACKGROUND_POSITION_SHIFT
+#undef BACKGROUND_POSITION_MASK
+#define BACKGROUND_REPEAT_INDEX 9
+#define BACKGROUND_REPEAT_SHIFT 26
+#define BACKGROUND_REPEAT_MASK 0x1c000000
+#undef BACKGROUND_REPEAT_INDEX
+#undef BACKGROUND_REPEAT_SHIFT
+#undef BACKGROUND_REPEAT_MASK
+#define BORDER_BOTTOM_COLOR_INDEX 8
+#define BORDER_BOTTOM_COLOR_SHIFT 2
+#define BORDER_BOTTOM_COLOR_MASK 0xc
+#undef BORDER_BOTTOM_COLOR_INDEX
+#undef BORDER_BOTTOM_COLOR_SHIFT
+#undef BORDER_BOTTOM_COLOR_MASK
+#define BORDER_BOTTOM_STYLE_INDEX 6
+#define BORDER_BOTTOM_STYLE_SHIFT 14
+#define BORDER_BOTTOM_STYLE_MASK 0x3c000
+#undef BORDER_BOTTOM_STYLE_INDEX
+#undef BORDER_BOTTOM_STYLE_SHIFT
+#undef BORDER_BOTTOM_STYLE_MASK
+#define BORDER_BOTTOM_WIDTH_INDEX 0
+#define BORDER_BOTTOM_WIDTH_SHIFT 8
+#define BORDER_BOTTOM_WIDTH_MASK 0xff00
+#undef BORDER_BOTTOM_WIDTH_INDEX
+#undef BORDER_BOTTOM_WIDTH_SHIFT
+#undef BORDER_BOTTOM_WIDTH_MASK
+#define BORDER_COLLAPSE_INDEX 8
+#define BORDER_COLLAPSE_SHIFT 4
+#define BORDER_COLLAPSE_MASK 0x30
+#undef BORDER_COLLAPSE_INDEX
+#undef BORDER_COLLAPSE_SHIFT
+#undef BORDER_COLLAPSE_MASK
+#define BORDER_LEFT_COLOR_INDEX 10
+#define BORDER_LEFT_COLOR_SHIFT 30
+#define BORDER_LEFT_COLOR_MASK 0xc0000000
+#undef BORDER_LEFT_COLOR_INDEX
+#undef BORDER_LEFT_COLOR_SHIFT
+#undef BORDER_LEFT_COLOR_MASK
+#define BORDER_LEFT_STYLE_INDEX 4
+#define BORDER_LEFT_STYLE_SHIFT 0
+#define BORDER_LEFT_STYLE_MASK 0xf
+#undef BORDER_LEFT_STYLE_INDEX
+#undef BORDER_LEFT_STYLE_SHIFT
+#undef BORDER_LEFT_STYLE_MASK
+#define BORDER_LEFT_WIDTH_INDEX 0
+#define BORDER_LEFT_WIDTH_SHIFT 0
+#define BORDER_LEFT_WIDTH_MASK 0xff
+#undef BORDER_LEFT_WIDTH_INDEX
+#undef BORDER_LEFT_WIDTH_SHIFT
+#undef BORDER_LEFT_WIDTH_MASK
+#define BORDER_RIGHT_COLOR_INDEX 8
+#define BORDER_RIGHT_COLOR_SHIFT 26
+#define BORDER_RIGHT_COLOR_MASK 0xc000000
+#undef BORDER_RIGHT_COLOR_INDEX
+#undef BORDER_RIGHT_COLOR_SHIFT
+#undef BORDER_RIGHT_COLOR_MASK
+#define BORDER_RIGHT_STYLE_INDEX 3
+#define BORDER_RIGHT_STYLE_SHIFT 0
+#define BORDER_RIGHT_STYLE_MASK 0xf
+#undef BORDER_RIGHT_STYLE_INDEX
+#undef BORDER_RIGHT_STYLE_SHIFT
+#undef BORDER_RIGHT_STYLE_MASK
+#define BORDER_RIGHT_WIDTH_INDEX 0
+#define BORDER_RIGHT_WIDTH_SHIFT 24
+#define BORDER_RIGHT_WIDTH_MASK 0xff000000
+#undef BORDER_RIGHT_WIDTH_INDEX
+#undef BORDER_RIGHT_WIDTH_SHIFT
+#undef BORDER_RIGHT_WIDTH_MASK
+#define BORDER_TOP_COLOR_INDEX 8
+#define BORDER_TOP_COLOR_SHIFT 14
+#define BORDER_TOP_COLOR_MASK 0xc000
+#undef BORDER_TOP_COLOR_INDEX
+#undef BORDER_TOP_COLOR_SHIFT
+#undef BORDER_TOP_COLOR_MASK
+#define BORDER_TOP_STYLE_INDEX 2
+#define BORDER_TOP_STYLE_SHIFT 0
+#define BORDER_TOP_STYLE_MASK 0xf
+#undef BORDER_TOP_STYLE_INDEX
+#undef BORDER_TOP_STYLE_SHIFT
+#undef BORDER_TOP_STYLE_MASK
+#define BORDER_TOP_WIDTH_INDEX 0
+#define BORDER_TOP_WIDTH_SHIFT 16
+#define BORDER_TOP_WIDTH_MASK 0xff0000
+#undef BORDER_TOP_WIDTH_INDEX
+#undef BORDER_TOP_WIDTH_SHIFT
+#undef BORDER_TOP_WIDTH_MASK
+#define BOTTOM_INDEX 2
+#define BOTTOM_SHIFT 18
+#define BOTTOM_MASK 0x1fc0000
+#undef BOTTOM_INDEX
+#undef BOTTOM_SHIFT
+#undef BOTTOM_MASK
+#define BOX_SIZING_INDEX 8
+#define BOX_SIZING_SHIFT 18
+#define BOX_SIZING_MASK 0xc0000
+#undef BOX_SIZING_INDEX
+#undef BOX_SIZING_SHIFT
+#undef BOX_SIZING_MASK
+#define CAPTION_SIDE_INDEX 8
+#define CAPTION_SIDE_SHIFT 28
+#define CAPTION_SIDE_MASK 0x30000000
+#undef CAPTION_SIDE_INDEX
+#undef CAPTION_SIDE_SHIFT
+#undef CAPTION_SIDE_MASK
+#define CLEAR_INDEX 9
+#define CLEAR_SHIFT 17
+#define CLEAR_MASK 0xe0000
+#undef CLEAR_INDEX
+#undef CLEAR_SHIFT
+#undef CLEAR_MASK
+#define COLOR_INDEX 9
+#define COLOR_SHIFT 0
+#define COLOR_MASK 0x1
+#undef COLOR_INDEX
+#undef COLOR_SHIFT
+#undef COLOR_MASK
+#define DIRECTION_INDEX 8
+#define DIRECTION_SHIFT 6
+#define DIRECTION_MASK 0xc0
+#undef DIRECTION_INDEX
+#undef DIRECTION_SHIFT
+#undef DIRECTION_MASK
+#define DISPLAY_INDEX 6
+#define DISPLAY_SHIFT 22
+#define DISPLAY_MASK 0x7c00000
+#undef DISPLAY_INDEX
+#undef DISPLAY_SHIFT
+#undef DISPLAY_MASK
+#define EMPTY_CELLS_INDEX 8
+#define EMPTY_CELLS_SHIFT 16
+#define EMPTY_CELLS_MASK 0x30000
+#undef EMPTY_CELLS_INDEX
+#undef EMPTY_CELLS_SHIFT
+#undef EMPTY_CELLS_MASK
+#define FLEX_BASIS_INDEX 3
+#define FLEX_BASIS_SHIFT 25
+#define FLEX_BASIS_MASK 0xfe000000
+#undef FLEX_BASIS_INDEX
+#undef FLEX_BASIS_SHIFT
+#undef FLEX_BASIS_MASK
+#define FLEX_DIRECTION_INDEX 9
+#define FLEX_DIRECTION_SHIFT 29
+#define FLEX_DIRECTION_MASK 0xe0000000
+#undef FLEX_DIRECTION_INDEX
+#undef FLEX_DIRECTION_SHIFT
+#undef FLEX_DIRECTION_MASK
+#define FLEX_GROW_INDEX 10
+#define FLEX_GROW_SHIFT 26
+#define FLEX_GROW_MASK 0x4000000
+#undef FLEX_GROW_INDEX
+#undef FLEX_GROW_SHIFT
+#undef FLEX_GROW_MASK
+#define FLEX_SHRINK_INDEX 10
+#define FLEX_SHRINK_SHIFT 29
+#define FLEX_SHRINK_MASK 0x20000000
+#undef FLEX_SHRINK_INDEX
+#undef FLEX_SHRINK_SHIFT
+#undef FLEX_SHRINK_MASK
+#define FLEX_WRAP_INDEX 9
+#define FLEX_WRAP_SHIFT 1
+#define FLEX_WRAP_MASK 0x6
+#undef FLEX_WRAP_INDEX
+#undef FLEX_WRAP_SHIFT
+#undef FLEX_WRAP_MASK
+#define FLOAT_INDEX 8
+#define FLOAT_SHIFT 22
+#define FLOAT_MASK 0xc00000
+#undef FLOAT_INDEX
+#undef FLOAT_SHIFT
+#undef FLOAT_MASK
+#define FONT_FAMILY_INDEX 6
+#define FONT_FAMILY_SHIFT 0
+#define FONT_FAMILY_MASK 0x7
+#undef FONT_FAMILY_INDEX
+#undef FONT_FAMILY_SHIFT
+#undef FONT_FAMILY_MASK
+#define FONT_SIZE_INDEX 5
+#define FONT_SIZE_SHIFT 12
+#define FONT_SIZE_MASK 0x1ff000
+#undef FONT_SIZE_INDEX
+#undef FONT_SIZE_SHIFT
+#undef FONT_SIZE_MASK
+#define FONT_STYLE_INDEX 8
+#define FONT_STYLE_SHIFT 8
+#define FONT_STYLE_MASK 0x300
+#undef FONT_STYLE_INDEX
+#undef FONT_STYLE_SHIFT
+#undef FONT_STYLE_MASK
+#define FONT_VARIANT_INDEX 7
+#define FONT_VARIANT_SHIFT 0
+#define FONT_VARIANT_MASK 0x3
+#undef FONT_VARIANT_INDEX
+#undef FONT_VARIANT_SHIFT
+#undef FONT_VARIANT_MASK
+#define FONT_WEIGHT_INDEX 1
+#define FONT_WEIGHT_SHIFT 0
+#define FONT_WEIGHT_MASK 0xf
+#undef FONT_WEIGHT_INDEX
+#undef FONT_WEIGHT_SHIFT
+#undef FONT_WEIGHT_MASK
+#define HEIGHT_INDEX 1
+#define HEIGHT_SHIFT 18
+#define HEIGHT_MASK 0x1fc0000
+#undef HEIGHT_INDEX
+#undef HEIGHT_SHIFT
+#undef HEIGHT_MASK
+#define JUSTIFY_CONTENT_INDEX 9
+#define JUSTIFY_CONTENT_SHIFT 5
+#define JUSTIFY_CONTENT_MASK 0xe0
+#undef JUSTIFY_CONTENT_INDEX
+#undef JUSTIFY_CONTENT_SHIFT
+#undef JUSTIFY_CONTENT_MASK
+#define LEFT_INDEX 4
+#define LEFT_SHIFT 25
+#define LEFT_MASK 0xfe000000
+#undef LEFT_INDEX
+#undef LEFT_SHIFT
+#undef LEFT_MASK
+#define LINE_HEIGHT_INDEX 4
+#define LINE_HEIGHT_SHIFT 11
+#define LINE_HEIGHT_MASK 0x3f800
+#undef LINE_HEIGHT_INDEX
+#undef LINE_HEIGHT_SHIFT
+#undef LINE_HEIGHT_MASK
+#define LIST_STYLE_IMAGE_INDEX 10
+#define LIST_STYLE_IMAGE_SHIFT 25
+#define LIST_STYLE_IMAGE_MASK 0x2000000
+#undef LIST_STYLE_IMAGE_INDEX
+#undef LIST_STYLE_IMAGE_SHIFT
+#undef LIST_STYLE_IMAGE_MASK
+#define LIST_STYLE_POSITION_INDEX 8
+#define LIST_STYLE_POSITION_SHIFT 0
+#define LIST_STYLE_POSITION_MASK 0x3
+#undef LIST_STYLE_POSITION_INDEX
+#undef LIST_STYLE_POSITION_SHIFT
+#undef LIST_STYLE_POSITION_MASK
+#define LIST_STYLE_TYPE_INDEX 6
+#define LIST_STYLE_TYPE_SHIFT 18
+#define LIST_STYLE_TYPE_MASK 0x3c0000
+#undef LIST_STYLE_TYPE_INDEX
+#undef LIST_STYLE_TYPE_SHIFT
+#undef LIST_STYLE_TYPE_MASK
+#define MARGIN_BOTTOM_INDEX 2
+#define MARGIN_BOTTOM_SHIFT 4
+#define MARGIN_BOTTOM_MASK 0x7f0
+#undef MARGIN_BOTTOM_INDEX
+#undef MARGIN_BOTTOM_SHIFT
+#undef MARGIN_BOTTOM_MASK
+#define MARGIN_LEFT_INDEX 4
+#define MARGIN_LEFT_SHIFT 4
+#define MARGIN_LEFT_MASK 0x7f0
+#undef MARGIN_LEFT_INDEX
+#undef MARGIN_LEFT_SHIFT
+#undef MARGIN_LEFT_MASK
+#define MARGIN_RIGHT_INDEX 4
+#define MARGIN_RIGHT_SHIFT 18
+#define MARGIN_RIGHT_MASK 0x1fc0000
+#undef MARGIN_RIGHT_INDEX
+#undef MARGIN_RIGHT_SHIFT
+#undef MARGIN_RIGHT_MASK
+#define MARGIN_TOP_INDEX 2
+#define MARGIN_TOP_SHIFT 11
+#define MARGIN_TOP_MASK 0x3f800
+#undef MARGIN_TOP_INDEX
+#undef MARGIN_TOP_SHIFT
+#undef MARGIN_TOP_MASK
+#define MAX_HEIGHT_INDEX 3
+#define MAX_HEIGHT_SHIFT 11
+#define MAX_HEIGHT_MASK 0x3f800
+#undef MAX_HEIGHT_INDEX
+#undef MAX_HEIGHT_SHIFT
+#undef MAX_HEIGHT_MASK
+#define MAX_WIDTH_INDEX 1
+#define MAX_WIDTH_SHIFT 11
+#define MAX_WIDTH_MASK 0x3f800
+#undef MAX_WIDTH_INDEX
+#undef MAX_WIDTH_SHIFT
+#undef MAX_WIDTH_MASK
+#define MIN_HEIGHT_INDEX 1
+#define MIN_HEIGHT_SHIFT 4
+#define MIN_HEIGHT_MASK 0x7f0
+#undef MIN_HEIGHT_INDEX
+#undef MIN_HEIGHT_SHIFT
+#undef MIN_HEIGHT_MASK
+#define MIN_WIDTH_INDEX 2
+#define MIN_WIDTH_SHIFT 25
+#define MIN_WIDTH_MASK 0xfe000000
+#undef MIN_WIDTH_INDEX
+#undef MIN_WIDTH_SHIFT
+#undef MIN_WIDTH_MASK
+#define OPACITY_INDEX 10
+#define OPACITY_SHIFT 24
+#define OPACITY_MASK 0x1000000
+#undef OPACITY_INDEX
+#undef OPACITY_SHIFT
+#undef OPACITY_MASK
+#define ORDER_INDEX 10
+#define ORDER_SHIFT 23
+#define ORDER_MASK 0x800000
+#undef ORDER_INDEX
+#undef ORDER_SHIFT
+#undef ORDER_MASK
+#define OUTLINE_STYLE_INDEX 6
+#define OUTLINE_STYLE_SHIFT 10
+#define OUTLINE_STYLE_MASK 0x3c00
+#undef OUTLINE_STYLE_INDEX
+#undef OUTLINE_STYLE_SHIFT
+#undef OUTLINE_STYLE_MASK
+#define OVERFLOW_INDEX 9
+#define OVERFLOW_SHIFT 8
+#define OVERFLOW_MASK 0x700
+#undef OVERFLOW_INDEX
+#undef OVERFLOW_SHIFT
+#undef OVERFLOW_MASK
+#define PADDING_BOTTOM_INDEX 7
+#define PADDING_BOTTOM_SHIFT 26
+#define PADDING_BOTTOM_MASK 0xfc000000
+#undef PADDING_BOTTOM_INDEX
+#undef PADDING_BOTTOM_SHIFT
+#undef PADDING_BOTTOM_MASK
+#define PADDING_LEFT_INDEX 7
+#define PADDING_LEFT_SHIFT 14
+#define PADDING_LEFT_MASK 0xfc000
+#undef PADDING_LEFT_INDEX
+#undef PADDING_LEFT_SHIFT
+#undef PADDING_LEFT_MASK
+#define PADDING_RIGHT_INDEX 7
+#define PADDING_RIGHT_SHIFT 20
+#define PADDING_RIGHT_MASK 0x3f00000
+#undef PADDING_RIGHT_INDEX
+#undef PADDING_RIGHT_SHIFT
+#undef PADDING_RIGHT_MASK
+#define PADDING_TOP_INDEX 7
+#define PADDING_TOP_SHIFT 2
+#define PADDING_TOP_MASK 0xfc
+#undef PADDING_TOP_INDEX
+#undef PADDING_TOP_SHIFT
+#undef PADDING_TOP_MASK
+#define POSITION_INDEX 5
+#define POSITION_SHIFT 0
+#define POSITION_MASK 0x7
+#undef POSITION_INDEX
+#undef POSITION_SHIFT
+#undef POSITION_MASK
+#define QUOTES_INDEX 10
+#define QUOTES_SHIFT 27
+#define QUOTES_MASK 0x8000000
+#undef QUOTES_INDEX
+#undef QUOTES_SHIFT
+#undef QUOTES_MASK
+#define RIGHT_INDEX 3
+#define RIGHT_SHIFT 4
+#define RIGHT_MASK 0x7f0
+#undef RIGHT_INDEX
+#undef RIGHT_SHIFT
+#undef RIGHT_MASK
+#define TABLE_LAYOUT_INDEX 8
+#define TABLE_LAYOUT_SHIFT 30
+#define TABLE_LAYOUT_MASK 0xc0000000
+#undef TABLE_LAYOUT_INDEX
+#undef TABLE_LAYOUT_SHIFT
+#undef TABLE_LAYOUT_MASK
+#define TEXT_ALIGN_INDEX 6
+#define TEXT_ALIGN_SHIFT 6
+#define TEXT_ALIGN_MASK 0x3c0
+#undef TEXT_ALIGN_INDEX
+#undef TEXT_ALIGN_SHIFT
+#undef TEXT_ALIGN_MASK
+#define TEXT_DECORATION_INDEX 6
+#define TEXT_DECORATION_SHIFT 27
+#define TEXT_DECORATION_MASK 0xf8000000
+#undef TEXT_DECORATION_INDEX
+#undef TEXT_DECORATION_SHIFT
+#undef TEXT_DECORATION_MASK
+#define TEXT_INDENT_INDEX 7
+#define TEXT_INDENT_SHIFT 8
+#define TEXT_INDENT_MASK 0x3f00
+#undef TEXT_INDENT_INDEX
+#undef TEXT_INDENT_SHIFT
+#undef TEXT_INDENT_MASK
+#define TEXT_TRANSFORM_INDEX 9
+#define TEXT_TRANSFORM_SHIFT 20
+#define TEXT_TRANSFORM_MASK 0x700000
+#undef TEXT_TRANSFORM_INDEX
+#undef TEXT_TRANSFORM_SHIFT
+#undef TEXT_TRANSFORM_MASK
+#define TOP_INDEX 1
+#define TOP_SHIFT 25
+#define TOP_MASK 0xfe000000
+#undef TOP_INDEX
+#undef TOP_SHIFT
+#undef TOP_MASK
+#define UNICODE_BIDI_INDEX 9
+#define UNICODE_BIDI_SHIFT 3
+#define UNICODE_BIDI_MASK 0x18
+#undef UNICODE_BIDI_INDEX
+#undef UNICODE_BIDI_SHIFT
+#undef UNICODE_BIDI_MASK
+#define VERTICAL_ALIGN_INDEX 5
+#define VERTICAL_ALIGN_SHIFT 3
+#define VERTICAL_ALIGN_MASK 0xff8
+#undef VERTICAL_ALIGN_INDEX
+#undef VERTICAL_ALIGN_SHIFT
+#undef VERTICAL_ALIGN_MASK
+#define VISIBILITY_INDEX 8
+#define VISIBILITY_SHIFT 20
+#define VISIBILITY_MASK 0x300000
+#undef VISIBILITY_INDEX
+#undef VISIBILITY_SHIFT
+#undef VISIBILITY_MASK
+#define WHITE_SPACE_INDEX 9
+#define WHITE_SPACE_SHIFT 11
+#define WHITE_SPACE_MASK 0x3800
+#undef WHITE_SPACE_INDEX
+#undef WHITE_SPACE_SHIFT
+#undef WHITE_SPACE_MASK
+#define WIDTH_INDEX 3
+#define WIDTH_SHIFT 18
+#define WIDTH_MASK 0x1fc0000
+#undef WIDTH_INDEX
+#undef WIDTH_SHIFT
+#undef WIDTH_MASK
+#define Z_INDEX_INDEX 8
+#define Z_INDEX_SHIFT 12
+#define Z_INDEX_MASK 0x3000
+#undef Z_INDEX_INDEX
+#undef Z_INDEX_SHIFT
+#undef Z_INDEX_MASK
 
 #endif
\ No newline at end of file
diff --git a/src/select/select_config.py b/src/select/select_config.py
index 748dc43..8167401 100644
--- a/src/select/select_config.py
+++ b/src/select/select_config.py
@@ -57,7 +57,7 @@ style = {
     # Style group, with additional value
     ('background_color', 2, 'color'),
     ('background_image', 1, 'string'),
-    ('background_position', 1, ('length', 'length'),
+    ('background_position', 1, (('length',), ('length',)),
         'CSS_BACKGROUND_POSITION_SET'),
     ('border_top_color', 2, 'color'),
     ('border_right_color', 2, 'color'),
@@ -111,18 +111,20 @@ page = {
     ('page_break_after', 3, None, None, 'CSS_PAGE_BREAK_AFTER_AUTO'),
     ('page_break_before', 3, None, None, 'CSS_PAGE_BREAK_BEFORE_AUTO'),
     ('page_break_inside', 2, None, None, 'CSS_PAGE_BREAK_INSIDE_AUTO'),
-    ('widows', 1, ('integer', '2 << CSS_RADIX_POINT'), None, 'CSS_WIDOWS_SET'),
-    ('orphans', 1, ('integer', '2 << CSS_RADIX_POINT'), None, 
'CSS_ORPHANS_SET')
+    ('widows', 1, (('integer', '2 << CSS_RADIX_POINT'),), None,
+        'CSS_WIDOWS_SET'),
+    ('orphans', 1, (('integer', '2 << CSS_RADIX_POINT'),), None,
+        'CSS_ORPHANS_SET')
 }
 
 uncommon = {
     # Uncommon group
-    ('border_spacing', 1, ('length', 'length'), 'CSS_BORDER_SPACING_SET',
+    ('border_spacing', 1, (('length',), ('length',)), 'CSS_BORDER_SPACING_SET',
         'CSS_BORDER_SPACING_SET'),
     ('break_after', 4, None, None, 'CSS_BREAK_AFTER_AUTO'),
     ('break_before', 4, None, None, 'CSS_BREAK_BEFORE_AUTO'),
     ('break_inside', 4, None, None, 'CSS_BREAK_INSIDE_AUTO'),
-    ('clip', 6, ('length', 'length', 'length', 'length'),
+    ('clip', 6, (('length',), ('length',), ('length',), ('length',)),
         'CSS_CLIP_RECT', 'CSS_CLIP_AUTO', None, ('get', 'set')),
     ('column_count', 2, 'integer', None, 'CSS_COLUMN_COUNT_AUTO'),
     ('column_fill', 2, None, None, 'CSS_COLUMN_FILL_BALANCE'),
diff --git a/src/select/select_generator.py b/src/select/select_generator.py
index b913efe..966fa53 100644
--- a/src/select/select_generator.py
+++ b/src/select/select_generator.py
@@ -8,7 +8,7 @@ import string
 from select_config import values, groups
 from assets import assets
 
-def get_tuple(self, from_var):
+def get_tuple(from_var):
     'Accepts tuples, strings and None; returns a tuple.'
     if type(from_var) is tuple:
         return from_var
@@ -88,7 +88,8 @@ class Text:
                 line += text[:break_index].rstrip()
                 text = text[break_index:].lstrip()
             if self._esc_nl:
-                line += '\t' * (9 - math.floor(len(line) / 8)) + '\\'
+                n_tabs = 9 - self._indent - math.floor(len(line.lstrip()) / 8)
+                line += '\t' * n_tabs + '\\'
             self._lines.append(line)
             if text and not self._comment and not multiline:
                 self.indent(2)
@@ -139,25 +140,29 @@ class CSSProperty:
         self.condition = condition
         self.override = get_tuple(override)
         self.comments = comments
+        self.__index = None
         self.__shift = None
+        self.__mask = None
 
     def make_values(self, vals, for_list=False):
-        if type(vals) is None:
+        if vals is None:
             return []
         elif type(vals) is str:
             val_list = [ CSSValue(*x) for x in values if x[0] == vals ]
             return val_list[0] if for_list else val_list
         elif type(vals) is tuple:
-            if len(vals) is 2 and type(vals[0]) is type(vals[1]) is str:
-                for v in values:
-                    if v[0] == val[0]:
-                        value = CSSValue(v)
-                        value.defaults = get_tuple(vals[1])
-                        return value if for_list else [ value ]
+            val_list = []
+            for val in vals:
+                for x in values:
+                    if x[0] == val[0]:
+                        value = CSSValue(*x)
+                        if len(val) is 2:
+                            value.defaults = get_tuple(val[1])
+                        val_list.append(value)
+                        break
                 else:
                     raise ValueError('Value ' + val[0] + ' not found!')
-            else:
-                return [ self.make_values(x, True) for x in vals ]
+            return val_list
         else:
             raise TypeError('Expected None, str or tuple, got ' +
                             type(vals).__name__)
@@ -168,7 +173,6 @@ class CSSProperty:
             raise ValueError('Property has empty defaults!')
         return self.defaults[0]
 
-    @property
     def default_value(self, index):
         # First default of property is the opcode
         if len(self.defaults) < index + 2:
@@ -210,6 +214,20 @@ class CSSProperty:
                 (' + ' if vars_size and ptr else '') + ptr)
 
     @property
+    def index(self):
+        if self.__index is None:
+            raise NameError('Attribute `index` not set yet!')
+        return self.__index
+
+    @index.setter
+    def index(self, val):
+        if type(val) is not int:
+            raise TypeError('Value of `index` must be an integer!')
+        if val < 0:
+            raise ValueError('Value of `index` must be zero or positive!')
+        self.__index = val
+
+    @property
     def shift(self):
         if self.__shift is None:
             raise NameError('Attribute `shift` not set yet!')
@@ -223,6 +241,21 @@ class CSSProperty:
             raise ValueError('Value of `shift` must be zero or positive!')
         self.__shift = val
 
+    @property
+    def mask(self):
+        if self.__mask is None:
+            raise NameError('Attribute `mask` not set yet!')
+        return '0x{:x}'.format(self.__mask).lower()
+
+    @mask.setter
+    def mask(self, val):
+        if type(val) is not int:
+            raise TypeError('Value of `mask` must be an integer!')
+        if val < 0:
+            raise ValueError('Value of `mask` must be zero or positive!')
+        self.__mask = val
+
+
 class Bin:
     def __init__(self, first_object):
         self.contents = [ first_object ]
@@ -274,8 +307,14 @@ class CSSGroup:
                 p.shift = 32 - p.bits_size
                 self.__bits_array.append(Bin(p))
 
+            p.mask = (sum([ 2 ** x for x in range(p.bits_size) ]) *
+                      2 ** p.shift)
             self.__bits_array.sort(key=(lambda x: x.size), reverse=True)
 
+        for i, b in enumerate(self.__bits_array):
+            for p in b.contents:
+                p.index = i
+
         return self.__bits_array
 
     def make_computed_h(self):
@@ -380,18 +419,52 @@ class CSSGroup:
             t.append(',\n'.join(bits_ops).split('\n'))
             t.indent(-1)
             t.append('},')
-
-            for p in self.props:
-                t.append(make_value_declaration(False, True))
+            t.append(',\n'.join(
+                self.make_value_declaration(False, True)).split('\n'))
 
             if self.name is not 'page':
                 t.indent(-1)
                 t.append('},')
-                for p in self.props:
-                    t.append(make_value_declaration(True, True))
+                t.append(',\n'.join(
+                    self.make_value_declaration(True, True) +
+                    [ '.next = NULL', '.count = 0', '.bin = UINT32_MAX' ]
+                    ).split('\n'))
 
             t.indent(-1)
             t.append('};')
+            t.append()
+
+            t.escape_newline()
+            i_dot = '' if self.name is 'page' else 'i.'
+            t.append('#define ENSURE_{} do {{'.format(self.name.upper()))
+            t.indent(1)
+            t.append('if (style->{}{} == NULL) {{'.format(i_dot, self.name))
+            t.indent(1)
+            t.append('style->{}{n} = malloc(sizeof(css_computed_{n}));'.format(
+                i_dot, n=self.name))
+            t.append('if (style->{}{} == NULL)'.format(i_dot, self.name))
+            t.indent(1)
+            t.append('return CSS_NOMEM;')
+            t.indent(-1)
+            t.append()
+            t.append('memcpy(style->{}{n}, &default_{n}, '
+                     'sizeof(css_computed_{n}));'.format(i_dot, n=self.name))
+            t.indent(-1)
+            t.append('}')
+            t.indent(-1)
+            t.append('} while(0)')
+            t.escape_newline()
+            t.append()
+
+        for p in sorted(self.props, key=(lambda x: x.name)):
+            t.append('#define {}_INDEX {}'.format(p.name.upper(), p.index))
+            t.append('#define {}_SHIFT {}'.format(p.name.upper(), p.shift))
+            t.append('#define {}_MASK {}'.format(p.name.upper(), p.mask))
+            t.append('#undef {}_INDEX'.format(p.name.upper()))
+            t.append('#undef {}_SHIFT'.format(p.name.upper()))
+            t.append('#undef {}_MASK'.format(p.name.upper()))
+
+
 
         return t.to_string()
 
@@ -402,11 +475,11 @@ class CSSGroup:
                 for i, v in enumerate(p.values):
                     v_suffix = ('' if len(p.values) is 1 else
                                 '_' + string.ascii_lowercase[i])
-                    v_type, v_name = shift_star(v.type, p.name)
                     if defaults:
-                        r.append('.{} = {},'.format(v_name,
+                        r.append('.{}{} = {}'.format(p.name, v_suffix,
                                                     p.default_value(i)[0]))
                     else:
+                        v_type, v_name = shift_star(v.type, p.name)
                         r.append('{} {}{};'.format(v_type, v_name, v_suffix))
         return r
 


-- 
Cascading Style Sheets library

_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org

Reply via email to