Gitweb links:

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

The branch, tlsa/calc has been updated
       via  e3583052459e8cb7ecabaa25784ce85c5ab7421d (commit)
      from  62dc80851eef3e256ef522dd68346672f30b7375 (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=e3583052459e8cb7ecabaa25784ce85c5ab7421d
commit e3583052459e8cb7ecabaa25784ce85c5ab7421d
Author: Michael Drake <Michael Drake [email protected]>
Commit: Michael Drake <Michael Drake [email protected]>

    parse: Update parser generator to support calc() details.
    
    Co-authored-by: Daniel Silverstone <[email protected]>

diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index 22703f7..2267542 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -66,6 +66,10 @@ typedef enum unit {
        UNIT_DPI  = (1 << 12) + 0,
        UNIT_DPCM = (1 << 12) + 1,
        UNIT_DPPX = (1 << 12) + 2,
+
+       /* These are special only to the CALC bytecodes */
+       UNIT_CALC_ANY = (1 << 20),
+       UNIT_CALC_NUMBER = (1 << 20) + 1,
 } unit;
 
 typedef uint32_t colour;
diff --git a/src/bytecode/opcodes.h b/src/bytecode/opcodes.h
index 82bf75f..d728831 100644
--- a/src/bytecode/opcodes.h
+++ b/src/bytecode/opcodes.h
@@ -119,6 +119,7 @@ enum op_border_style {
 };
 
 enum op_border_width {
+       BORDER_WIDTH_CALC               = 0x007f,
        BORDER_WIDTH_SET                = 0x0080,
        BORDER_WIDTH_THIN               = 0x0000,
        BORDER_WIDTH_MEDIUM             = 0x0001,
@@ -126,6 +127,7 @@ enum op_border_width {
 };
 
 enum op_bottom {
+       BOTTOM_CALC                     = 0x007f,
        BOTTOM_SET                      = 0x0080,
        BOTTOM_AUTO                     = 0x0000
 };
@@ -198,6 +200,7 @@ enum op_color {
 
 enum op_column_count {
        COLUMN_COUNT_AUTO               = 0x0000,
+       COLUMN_COUNT_CALC               = 0x007f,
        COLUMN_COUNT_SET                = 0x0080
 };
 
@@ -208,6 +211,7 @@ enum op_column_fill {
 
 enum op_column_gap {
        COLUMN_GAP_NORMAL               = 0x0000,
+       COLUMN_GAP_CALC                 = 0x007f,
        COLUMN_GAP_SET                  = 0x0080
 };
 
@@ -231,6 +235,7 @@ enum op_column_rule_style {
 };
 
 enum op_column_rule_width {
+       COLUMN_RULE_WIDTH_CALC          = BORDER_WIDTH_CALC,
        COLUMN_RULE_WIDTH_SET           = BORDER_WIDTH_SET,
        COLUMN_RULE_WIDTH_THIN          = BORDER_WIDTH_THIN,
        COLUMN_RULE_WIDTH_MEDIUM        = BORDER_WIDTH_MEDIUM,
@@ -244,6 +249,7 @@ enum op_column_span {
 
 enum op_column_width {
        COLUMN_WIDTH_AUTO               = 0x0000,
+       COLUMN_WIDTH_CALC               = 0x007f,
        COLUMN_WIDTH_SET                = 0x0080
 };
 
@@ -352,6 +358,7 @@ enum op_empty_cells {
 enum op_flex_basis {
        FLEX_BASIS_AUTO                 = 0x0000,
        FLEX_BASIS_CONTENT              = 0x0001,
+       FLEX_BASIS_CALC                 = 0x007f,
        FLEX_BASIS_SET                  = 0x0080
 };
 
@@ -363,10 +370,12 @@ enum op_flex_direction {
 };
 
 enum op_flex_grow {
+       FLEX_GROW_CALC                  = 0x007f,
        FLEX_GROW_SET                   = 0x0080
 };
 
 enum op_flex_shrink {
+       FLEX_SHRINK_CALC                = 0x007f,
        FLEX_SHRINK_SET                 = 0x0080
 };
 
@@ -396,6 +405,7 @@ enum op_font_family {
 };
 
 enum op_font_size {
+       FONT_SIZE_CALC                  = 0x007f,
        FONT_SIZE_DIMENSION             = 0x0080,
 
        FONT_SIZE_XX_SMALL              = 0x0000,
@@ -437,6 +447,7 @@ enum op_font_weight {
 };
 
 enum op_height {
+       HEIGHT_CALC                     = 0x007f,
        HEIGHT_SET                      = 0x0080,
        HEIGHT_AUTO                     = 0x0000
 };
@@ -451,16 +462,19 @@ enum op_justify_content {
 };
 
 enum op_left {
+       LEFT_CALC                       = BOTTOM_CALC,
        LEFT_SET                        = BOTTOM_SET,
        LEFT_AUTO                       = BOTTOM_AUTO
 };
 
 enum op_letter_spacing {
+       LETTER_SPACING_CALC             = 0x007f,
        LETTER_SPACING_SET              = 0x0080,
        LETTER_SPACING_NORMAL           = 0x0000
 };
 
 enum op_line_height {
+       LINE_HEIGHT_CALC                = 0x007f,
        LINE_HEIGHT_NUMBER              = 0x0080,
        LINE_HEIGHT_DIMENSION           = 0x0081,
        LINE_HEIGHT_NORMAL              = 0x0000
@@ -495,26 +509,31 @@ enum op_list_style_type {
 };
 
 enum op_margin {
+       MARGIN_CALC                     = 0x007f,
        MARGIN_SET                      = 0x0080,
        MARGIN_AUTO                     = 0x0000
 };
 
 enum op_max_height {
+       MAX_HEIGHT_CALC                 = 0x007f,
        MAX_HEIGHT_SET                  = 0x0080,
        MAX_HEIGHT_NONE                 = 0x0000
 };
 
 enum op_max_width {
+       MAX_WIDTH_CALC                  = 0x007f,
        MAX_WIDTH_SET                   = 0x0080,
        MAX_WIDTH_NONE                  = 0x0000
 };
 
 enum op_min_height {
+       MIN_HEIGHT_CALC                 = 0x007f,
        MIN_HEIGHT_SET                  = 0x0080,
        MIN_HEIGHT_AUTO                 = 0x0000
 };
 
 enum op_min_width {
+       MIN_WIDTH_CALC                  = 0x007f,
        MIN_WIDTH_SET                   = 0x0080,
        MIN_WIDTH_AUTO                  = 0x0000
 };
@@ -524,10 +543,12 @@ enum op_opacity {
 };
 
 enum op_order {
+       ORDER_CALC                      = 0x007f,
        ORDER_SET                       = 0x0080
 };
 
 enum op_orphans {
+       ORPHANS_CALC                    = 0x007f,
        ORPHANS_SET                     = 0x0080
 };
 
@@ -566,6 +587,7 @@ enum op_overflow {
 };
 
 enum op_padding {
+       PADDING_CALC                    = 0x007f,
        PADDING_SET                     = 0x0080
 };
 
@@ -591,18 +613,22 @@ enum op_page_break_inside {
 };
 
 enum op_pause_after {
+       PAUSE_AFTER_CALC                = 0x007f,
        PAUSE_AFTER_SET                 = 0x0080
 };
 
 enum op_pause_before {
+       PAUSE_BEFORE_CALC               = 0x007f,
        PAUSE_BEFORE_SET                = 0x0080
 };
 
 enum op_pitch_range {
+       PITCH_RANGE_CALC                = 0x007f,
        PITCH_RANGE_SET                 = 0x0080
 };
 
 enum op_pitch {
+       PITCH_CALC                      = 0x007f,
        PITCH_FREQUENCY                 = 0x0080,
 
        PITCH_X_LOW                     = 0x0000,
@@ -636,6 +662,7 @@ enum op_quotes {
 };
 
 enum op_richness {
+       RICHNESS_CALC                   = 0x007f,
        RICHNESS_SET                    = 0x0080
 };
 
@@ -666,6 +693,7 @@ enum op_speak {
 };
 
 enum op_speech_rate {
+       SPEECH_RATE_CALC                = 0x007f,
        SPEECH_RATE_SET                 = 0x0080,
 
        SPEECH_RATE_X_SLOW              = 0x0000,
@@ -678,6 +706,7 @@ enum op_speech_rate {
 };
 
 enum op_stress {
+       STRESS_CALC                     = 0x007f,
        STRESS_SET                      = 0x0080
 };
 
@@ -706,6 +735,7 @@ enum op_text_decoration {
 };
 
 enum op_text_indent {
+       TEXT_INDENT_CALC                = 0x007f,
        TEXT_INDENT_SET                 = 0x0080
 };
 
@@ -717,6 +747,7 @@ enum op_text_transform {
 };
 
 enum op_top {
+       TOP_CALC                        = BOTTOM_CALC,
        TOP_SET                         = BOTTOM_SET,
        TOP_AUTO                        = BOTTOM_AUTO
 };
@@ -728,6 +759,7 @@ enum op_unicode_bidi {
 };
 
 enum op_vertical_align {
+       VERTICAL_ALIGN_CALC             = 0x007f,
        VERTICAL_ALIGN_SET              = 0x0080,
 
        VERTICAL_ALIGN_BASELINE         = 0x0000,
@@ -758,6 +790,7 @@ enum op_voice_family {
 };
 
 enum op_volume {
+       VOLUME_CALC                     = 0x007f,
        VOLUME_NUMBER                   = 0x0080,
        VOLUME_DIMENSION                = 0x0081,
 
@@ -778,16 +811,19 @@ enum op_white_space {
 };
 
 enum op_widows {
+       WIDOWS_CALC                     = 0x007f,
        WIDOWS_SET                      = 0x0080
 };
 
 enum op_width {
+       WIDTH_CALC                      = 0x007f,
        WIDTH_SET                       = 0x0080,
 
        WIDTH_AUTO                      = 0x0000
 };
 
 enum op_word_spacing {
+       WORD_SPACING_CALC               = 0x007f,
        WORD_SPACING_SET                = 0x0080,
 
        WORD_SPACING_NORMAL             = 0x0000
@@ -800,6 +836,7 @@ enum op_writing_mode {
 };
 
 enum op_z_index {
+       Z_INDEX_CALC                    = 0x007f,
        Z_INDEX_SET                     = 0x0080,
 
        Z_INDEX_AUTO                    = 0x0000
diff --git a/src/parse/properties/css_property_parser_gen.c 
b/src/parse/properties/css_property_parser_gen.c
index 838f2b6..36a1daf 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -19,6 +19,12 @@
  * list_style_position:CSS_PROP_LIST_STYLE_POSITION IDENT:( INHERIT: 
INSIDE:0,LIST_STYLE_POSITION_INSIDE OUTSIDE:0,LIST_STYLE_POSITION_OUTSIDE 
IDENT:)
 */
 
+typedef enum {
+       CALC_ANY,
+       CALC_NUMBER,
+       CALC_UNIT,
+} calc_kind;
+
 struct keyval {
        char *key;
        char *val;
@@ -291,21 +297,34 @@ void output_color(FILE *outputf, struct keyval *parseid, 
struct keyval_list *kvl
                parseid->val);
 }
 
-void output_length_unit(FILE *outputf, struct keyval *parseid, struct 
keyval_list *kvlist)
+void output_calc(FILE *outputf, struct keyval *parseid, struct keyval_list 
*kvlist)
 {
        struct keyval *ckv = kvlist->item[0];
-       int ident_count;
+       const char *kind;
+
+       if (strcmp(ckv->key, "NUMBER") == 0)
+               kind = "UNIT_CALC_NUMBER";
+       else if (strcmp(ckv->key, "ANY") == 0)
+               kind = "UNIT_CALC_ANY";
+       else
+               kind = ckv->key;
 
        fprintf(outputf,
                "if ((token->type == CSS_TOKEN_IDENT) && "
                "(lwc_string_caseless_isequal(token->idata, c->strings[CALC], 
&match) == lwc_error_ok && match))"
                " {\n"
-               "\t\terror = css__parse_calc(c, vector, ctx, result, 
buildOPV(%s, 0, %s /* _CALC */), %s);\n"
+               "\t\terror = css__parse_calc(c, vector, ctx, result, 
buildOPV(%s, 0, %s), %s);\n"
                "\t} else ",
                parseid->val,
                ckv->val,
-               ckv->key
+               kind
        );
+}
+
+void output_length_unit(FILE *outputf, struct keyval *parseid, struct 
keyval_list *kvlist)
+{
+       struct keyval *ckv = kvlist->item[0];
+       int ident_count;
 
        fprintf(outputf,
                "{\n"
@@ -494,6 +513,7 @@ int main(int argc, char **argv)
        struct keyval_list WRAP;
        struct keyval_list NUMBER;
        struct keyval_list COLOR;
+       struct keyval_list CALC;
 
 
        if (argc < 2) {
@@ -526,6 +546,7 @@ int main(int argc, char **argv)
        COLOR.count = 0;
        LENGTH_UNIT.count = 0;
        IDENT_LIST.count = 0;
+       CALC.count = 0;
 
        curlist = &base;
 
@@ -541,7 +562,7 @@ int main(int argc, char **argv)
                if (strcmp(rkv->key, "WRAP") == 0) {
                        WRAP.item[WRAP.count++] = rkv;
                        only_ident = false;
-               } else if (strcmp(rkv->key, "NUMBER") == 0) {
+               } else if (curlist == &base && strcmp(rkv->key, "NUMBER") == 0) 
{
                        if (rkv->val[0] == '(') {
                                curlist = &NUMBER;
                        } else if (rkv->val[0] == ')') {
@@ -572,6 +593,14 @@ int main(int argc, char **argv)
                        }
                        only_ident = false;
                        do_token_check = false;
+               } else if (strcmp(rkv->key, "CALC") == 0) {
+                       if (rkv->val[0] == '(') {
+                               curlist = &CALC;
+                       } else if (rkv->val[0] == ')') {
+                               curlist = &base;
+                       }
+                       only_ident = false;
+                       do_token_check = false;
                } else if (strcmp(rkv->key, "COLOR") == 0) {
                        COLOR.item[COLOR.count++] = rkv;
                        do_token_check = false;
@@ -595,7 +624,7 @@ int main(int argc, char **argv)
 
 
        /* header */
-output_header(outputf, descriptor, base.item[0], is_generic);
+       output_header(outputf, descriptor, base.item[0], is_generic);
 
        if (WRAP.count > 0) {
                output_wrap(outputf, base.item[0], &WRAP);
@@ -609,6 +638,10 @@ output_header(outputf, descriptor, base.item[0], 
is_generic);
                if (URI.count > 0)
                        output_uri(outputf, base.item[0], &URI);
 
+               if (CALC.count > 0) {
+                       output_calc(outputf, base.item[0], &CALC);
+               }
+
                if (NUMBER.count > 0)
                        output_number(outputf, base.item[0], &NUMBER);
 
diff --git a/src/parse/properties/properties.gen 
b/src/parse/properties/properties.gen
index 61dcd5e..33df482 100644
--- a/src/parse/properties/properties.gen
+++ b/src/parse/properties/properties.gen
@@ -6,6 +6,13 @@
 #property:CSS_PROP_ENUM IDENT:( INHERIT: IDENT:) LENGTH_UNIT:( 
UNIT_HZ:PITCH_FREQUENCY ALLOW: DISALLOW: RANGE:<0 LENGTH_UNIT:)
 #property:CSS_PROP_ENUM WRAP:
 
+# When a property takes a NUMBER and/or LENGTH_UNIT you may add calc() support:
+# In the below, PROPERTY_FOO_CALC is the opcode enum for the 
set-but-calculated value bytecode.
+# e.g. HEIGHT_SET (for a LENGTH_UNIT) would be HEIGHT_CALC here.
+# CALC:( UNIT_??:PROPERTY_FOO_CALC CALC:)  <-- When a default unit must be 
considered
+# CALC:( NUMBER:PROPERTY_FOO_CALC CALC:)   <-- When a number must be produced 
(not a dimension)
+# CALC:( ANY:PROPERTY_FOO_CALC CALC:)      <-- When a number or dimension is 
valid (e.g. line-height)
+
 background_repeat:CSS_PROP_BACKGROUND_REPEAT IDENT:( INHERIT: 
NO_REPEAT:0,BACKGROUND_REPEAT_NO_REPEAT REPEAT_X:0,BACKGROUND_REPEAT_REPEAT_X 
REPEAT_Y:0,BACKGROUND_REPEAT_REPEAT_Y REPEAT:0,BACKGROUND_REPEAT_REPEAT IDENT:)
 
 border_collapse:CSS_PROP_BORDER_COLLAPSE IDENT:( INHERIT: 
COLLAPSE:0,BORDER_COLLAPSE_COLLAPSE SEPARATE:0,BORDER_COLLAPSE_SEPARATE IDENT:)
@@ -22,35 +29,35 @@ empty_cells:CSS_PROP_EMPTY_CELLS IDENT:( INHERIT: 
SHOW:0,EMPTY_CELLS_SHOW HIDE:0
 
 float:CSS_PROP_FLOAT IDENT:( INHERIT: LEFT:0,FLOAT_LEFT RIGHT:0,FLOAT_RIGHT 
NONE:0,FLOAT_NONE IDENT:)
 
-font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL 
X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM 
LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE 
XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER 
SMALLER:0,FONT_SIZE_SMALLER IDENT:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL 
X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM 
LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE 
XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER 
SMALLER:0,FONT_SIZE_SMALLER IDENT:) CALC:( UNIT_PX:FONT_SIZE_CALC CALC:) 
LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
 font_style:CSS_PROP_FONT_STYLE IDENT:( INHERIT: NORMAL:0,FONT_STYLE_NORMAL 
ITALIC:0,FONT_STYLE_ITALIC OBLIQUE:0,FONT_STYLE_OBLIQUE IDENT:)
 
 font_variant:CSS_PROP_FONT_VARIANT IDENT:( INHERIT: 
NORMAL:0,FONT_VARIANT_NORMAL SMALL_CAPS:0,FONT_VARIANT_SMALL_CAPS IDENT:)
 
-height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) 
LENGTH_UNIT:( UNIT_PX:HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) CALC:( 
UNIT_PX:HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: 
NORMAL:0,LETTER_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
+letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: 
NORMAL:0,LETTER_SPACING_NORMAL IDENT:) CALC:( UNIT_PX:LETTER_SPACING_CALC 
CALC:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
 
-line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL 
IDENT:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( 
UNIT_PX:LINE_HEIGHT_DIMENSION 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL 
IDENT:) CALC:( ANY:LINE_HEIGHT_CALC CALC:) NUMBER:( false:LINE_HEIGHT_NUMBER 
RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
 border_top:BORDER_SIDE_TOP WRAP:css__parse_border_side
 border_bottom:BORDER_SIDE_BOTTOM WRAP:css__parse_border_side
 border_left:BORDER_SIDE_LEFT WRAP:css__parse_border_side
 border_right:BORDER_SIDE_RIGHT WRAP:css__parse_border_side
 
-max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) 
LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) 
CALC:( UNIT_PX:MAX_HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) 
LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) 
CALC:( UNIT_PX:MAX_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) 
LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) 
CALC:( UNIT_PX:MIN_HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) 
LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) 
CALC:( UNIT_PX:MIN_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
 color:CSS_PROP_COLOR IDENT:INHERIT COLOR:COLOR_SET
 
 #generic for padding_{top, bottom, left, right}.c
-padding_side:op GENERIC: IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:PADDING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ  RANGE:<0 LENGTH_UNIT:)
+padding_side:op GENERIC: IDENT:INHERIT CALC:( UNIT_PX:PADDING_CALC CALC:) 
LENGTH_UNIT:( UNIT_PX:PADDING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ  RANGE:<0 LENGTH_UNIT:)
 
 padding_bottom:CSS_PROP_PADDING_BOTTOM WRAP:css__parse_padding_side
 padding_left:CSS_PROP_PADDING_LEFT WRAP:css__parse_padding_side
@@ -59,7 +66,7 @@ padding_right:CSS_PROP_PADDING_RIGHT 
WRAP:css__parse_padding_side
 
 
 #generic for margin_{top, bottom, left, right}.c
-margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) 
LENGTH_UNIT:( UNIT_PX:MARGIN_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) CALC:( 
UNIT_PX:MARGIN_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
 
 margin_top:CSS_PROP_MARGIN_TOP WRAP:css__parse_margin_side
 margin_bottom:CSS_PROP_MARGIN_BOTTOM WRAP:css__parse_margin_side
@@ -67,7 +74,7 @@ margin_left:CSS_PROP_MARGIN_LEFT WRAP:css__parse_margin_side
 margin_right:CSS_PROP_MARGIN_RIGHT WRAP:css__parse_margin_side
 
 #generic for {top, bottom, left, right}.c
-side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) LENGTH_UNIT:( 
UNIT_PX:BOTTOM_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ 
LENGTH_UNIT:)
+side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) CALC:( 
UNIT_PX:BOTTOM_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
 
 top:CSS_PROP_TOP WRAP:css__parse_side
 bottom:CSS_PROP_BOTTOM WRAP:css__parse_side
@@ -76,7 +83,7 @@ right:CSS_PROP_RIGHT WRAP:css__parse_side
 
 
 #generic for border_{top, bottom, left, right}_width.c
-border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN 
MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) LENGTH_UNIT:( 
UNIT_PX:BORDER_WIDTH_SET 
DISALLOW:unit==UNIT_PCT||unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ 
RANGE:<0 LENGTH_UNIT:)
+border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN 
MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) CALC:( 
UNIT_PX:BORDER_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET 
DISALLOW:unit==UNIT_PCT||unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ 
RANGE:<0 LENGTH_UNIT:)
 
 border_top_width:CSS_PROP_BORDER_TOP_WIDTH WRAP:css__parse_border_side_width
 border_bottom_width:CSS_PROP_BORDER_BOTTOM_WIDTH 
WRAP:css__parse_border_side_width
@@ -120,7 +127,7 @@ list_style_image:CSS_PROP_LIST_STYLE_IMAGE IDENT:( INHERIT: 
NONE:0,LIST_STYLE_IM
 
 list_style_position:CSS_PROP_LIST_STYLE_POSITION IDENT:( INHERIT: 
INSIDE:0,LIST_STYLE_POSITION_INSIDE OUTSIDE:0,LIST_STYLE_POSITION_OUTSIDE 
IDENT:)
 
-orphans:CSS_PROP_ORPHANS IDENT:INHERIT NUMBER:( true:ORPHANS_SET RANGE:num<0 
NUMBER:)
+orphans:CSS_PROP_ORPHANS IDENT:INHERIT CALC:( NUMBER:ORPHANS_CALC CALC:) 
NUMBER:( true:ORPHANS_SET RANGE:num<0 NUMBER:)
 
 outline_color:CSS_PROP_OUTLINE_COLOR IDENT:( INHERIT: 
INVERT:0,OUTLINE_COLOR_INVERT IDENT:) COLOR:OUTLINE_COLOR_SET
 
@@ -140,17 +147,17 @@ page_break_before:CSS_PROP_PAGE_BREAK_BEFORE IDENT:( 
INHERIT: AUTO:0,PAGE_BREAK_
 
 page_break_inside:CSS_PROP_PAGE_BREAK_INSIDE IDENT:( INHERIT: 
AUTO:0,PAGE_BREAK_INSIDE_AUTO AVOID:0,PAGE_BREAK_INSIDE_AVOID IDENT:)
 
-pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT LENGTH_UNIT:( 
UNIT_S:PAUSE_AFTER_SET DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false 
RANGE:<0 LENGTH_UNIT:)
+pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT CALC:( UNIT_S:PAUSE_AFTER_CALC 
CALC:) LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET 
DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
 
-pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT LENGTH_UNIT:( 
UNIT_S:PAUSE_BEFORE_SET 
DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
+pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT CALC:( 
UNIT_S:PAUSE_BEFORE_CALC CALC:) LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET 
DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
 
-pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW 
MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) 
LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW:unit&UNIT_FREQ RANGE:<0 
LENGTH_UNIT:)
+pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW 
MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) CALC:( 
UNIT_HZ:PITCH_CALC CALC:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY 
ALLOW:unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-pitch_range:CSS_PROP_PITCH_RANGE IDENT:INHERIT NUMBER:( false:PITCH_RANGE_SET 
RANGE:num<0||num>F_100 NUMBER:)
+pitch_range:CSS_PROP_PITCH_RANGE IDENT:INHERIT CALC:( NUMBER:PITCH_RANGE_CALC 
CALC:) NUMBER:( false:PITCH_RANGE_SET RANGE:num<0||num>F_100 NUMBER:)
 
 position:CSS_PROP_POSITION IDENT:( INHERIT: LIBCSS_STATIC:0,POSITION_STATIC 
RELATIVE:0,POSITION_RELATIVE ABSOLUTE:0,POSITION_ABSOLUTE 
FIXED:0,POSITION_FIXED IDENT:)
 
-richness:CSS_PROP_RICHNESS IDENT:INHERIT NUMBER:( false:RICHNESS_SET 
RANGE:num<0||num>F_100 NUMBER:)
+richness:CSS_PROP_RICHNESS IDENT:INHERIT CALC:( NUMBER:RICHNESS_CALC CALC:) 
NUMBER:( false:RICHNESS_SET RANGE:num<0||num>F_100 NUMBER:)
 
 speak:CSS_PROP_SPEAK IDENT:( INHERIT: NORMAL:0,SPEAK_NORMAL NONE:0,SPEAK_NONE 
SPELL_OUT:0,SPEAK_SPELL_OUT IDENT:)
 
@@ -160,36 +167,36 @@ speak_numeral:CSS_PROP_SPEAK_NUMERAL IDENT:( INHERIT: 
DIGITS:0,SPEAK_NUMERAL_DIG
 
 speak_punctuation:CSS_PROP_SPEAK_PUNCTUATION IDENT:( INHERIT: 
CODE:0,SPEAK_PUNCTUATION_CODE NONE:0,SPEAK_PUNCTUATION_NONE IDENT:)
 
-speech_rate:CSS_PROP_SPEECH_RATE IDENT:( INHERIT: X_SLOW:0,SPEECH_RATE_X_SLOW 
SLOW:0,SPEECH_RATE_SLOW MEDIUM:0,SPEECH_RATE_MEDIUM FAST:0,SPEECH_RATE_FAST 
X_FAST:0,SPEECH_RATE_X_FAST FASTER:0,SPEECH_RATE_FASTER 
SLOWER:0,SPEECH_RATE_SLOWER IDENT:) NUMBER:( false:SPEECH_RATE_SET RANGE:num<0 
NUMBER:)
+speech_rate:CSS_PROP_SPEECH_RATE IDENT:( INHERIT: X_SLOW:0,SPEECH_RATE_X_SLOW 
SLOW:0,SPEECH_RATE_SLOW MEDIUM:0,SPEECH_RATE_MEDIUM FAST:0,SPEECH_RATE_FAST 
X_FAST:0,SPEECH_RATE_X_FAST FASTER:0,SPEECH_RATE_FASTER 
SLOWER:0,SPEECH_RATE_SLOWER IDENT:) CALC:( NUMBER:SPEECH_RATE_CALC CALC:) 
NUMBER:( false:SPEECH_RATE_SET RANGE:num<0 NUMBER:)
 
-stress:CSS_PROP_STRESS IDENT:INHERIT NUMBER:( false:STRESS_SET 
RANGE:num<0||num>INTTOFIX(100) NUMBER:)
+stress:CSS_PROP_STRESS IDENT:INHERIT CALC:( NUMBER:STRESS_CALC CALC:) NUMBER:( 
false:STRESS_SET RANGE:num<0||num>INTTOFIX(100) NUMBER:)
 
 table_layout:CSS_PROP_TABLE_LAYOUT IDENT:( INHERIT: AUTO:0,TABLE_LAYOUT_AUTO 
FIXED:0,TABLE_LAYOUT_FIXED IDENT:)
 
 text_align:CSS_PROP_TEXT_ALIGN IDENT:( INHERIT: LEFT:0,TEXT_ALIGN_LEFT 
RIGHT:0,TEXT_ALIGN_RIGHT CENTER:0,TEXT_ALIGN_CENTER 
JUSTIFY:0,TEXT_ALIGN_JUSTIFY LIBCSS_LEFT:0,TEXT_ALIGN_LIBCSS_LEFT 
LIBCSS_CENTER:0,TEXT_ALIGN_LIBCSS_CENTER LIBCSS_RIGHT:0,TEXT_ALIGN_LIBCSS_RIGHT 
IDENT:)
 
-text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT LENGTH_UNIT:( 
UNIT_PX:TEXT_INDENT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT CALC:( UNIT_PX:TEXT_INDENT_CALC 
CALC:) LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
 
 text_transform:CSS_PROP_TEXT_TRANSFORM IDENT:( INHERIT: 
CAPITALIZE:0,TEXT_TRANSFORM_CAPITALIZE UPPERCASE:0,TEXT_TRANSFORM_UPPERCASE 
LOWERCASE:0,TEXT_TRANSFORM_LOWERCASE NONE:0,TEXT_TRANSFORM_NONE IDENT:)
 
 unicode_bidi:CSS_PROP_UNICODE_BIDI IDENT:( INHERIT: 
NORMAL:0,UNICODE_BIDI_NORMAL EMBED:0,UNICODE_BIDI_EMBED 
BIDI_OVERRIDE:0,UNICODE_BIDI_BIDI_OVERRIDE IDENT:)
 
-vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: 
BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB 
SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP 
TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE 
BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) 
LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: 
BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB 
SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP 
TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE 
BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) 
CALC:( UNIT_PX:VERTICAL_ALIGN_CALC CALC:) LENGTH_UNIT:( 
UNIT_PX:VERTICAL_ALIGN_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
 
 visibility:CSS_PROP_VISIBILITY IDENT:( INHERIT: VISIBLE:0,VISIBILITY_VISIBLE 
HIDDEN:0,VISIBILITY_HIDDEN COLLAPSE:0,VISIBILITY_COLLAPSE IDENT:)
 
-volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT 
X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM 
LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) NUMBER:( false:VOLUME_NUMBER 
RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( UNIT_PX:VOLUME_DIMENSION 
ALLOW:unit&UNIT_PCT RANGE:<0 LENGTH_UNIT:)
+volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT 
X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM 
LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) CALC:( ANY:VOLUME_CALC CALC:) 
NUMBER:( false:VOLUME_NUMBER RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( 
UNIT_PX:VOLUME_DIMENSION ALLOW:unit&UNIT_PCT RANGE:<0 LENGTH_UNIT:)
 
 white_space:CSS_PROP_WHITE_SPACE IDENT:( INHERIT: NORMAL:0,WHITE_SPACE_NORMAL 
PRE:0,WHITE_SPACE_PRE NOWRAP:0,WHITE_SPACE_NOWRAP 
PRE_WRAP:0,WHITE_SPACE_PRE_WRAP PRE_LINE:0,WHITE_SPACE_PRE_LINE  IDENT:)
 
-widows:CSS_PROP_WIDOWS IDENT:INHERIT NUMBER:( true:WIDOWS_SET RANGE:num<0 
NUMBER:)
+widows:CSS_PROP_WIDOWS IDENT:INHERIT CALC:( NUMBER:WIDOWS_CALC CALC:) NUMBER:( 
true:WIDOWS_SET RANGE:num<0 NUMBER:)
 
 
-width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) LENGTH_UNIT:( 
UNIT_PX:WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ 
RANGE:<0 LENGTH_UNIT:)
+width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) CALC:( 
UNIT_PX:WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: 
NORMAL:0,WORD_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
+word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: 
NORMAL:0,WORD_SPACING_NORMAL IDENT:) CALC:( UNIT_PX:WORD_SPACING_CALC CALC:) 
LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
 
-z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) NUMBER:( 
true:Z_INDEX_SET NUMBER:)
+z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) CALC:( 
NUMBER:Z_INDEX_CALC CALC:) NUMBER:( true:Z_INDEX_SET NUMBER:)
 
 
 break_after:CSS_PROP_BREAK_AFTER IDENT:( INHERIT: AUTO:0,BREAK_AFTER_AUTO 
ALWAYS:0,BREAK_AFTER_ALWAYS AVOID:0,BREAK_AFTER_AVOID LEFT:0,BREAK_AFTER_LEFT 
RIGHT:0,BREAK_AFTER_RIGHT PAGE:0,BREAK_AFTER_PAGE COLUMN:0,BREAK_AFTER_COLUMN 
AVOID_PAGE:0,BREAK_AFTER_AVOID_PAGE AVOID_COLUMN:0,BREAK_AFTER_AVOID_COLUMN 
IDENT:)
@@ -198,11 +205,11 @@ break_before:CSS_PROP_BREAK_BEFORE IDENT:( INHERIT: 
AUTO:0,BREAK_BEFORE_AUTO ALW
 
 break_inside:CSS_PROP_BREAK_INSIDE IDENT:( INHERIT: AUTO:0,BREAK_INSIDE_AUTO 
AVOID:0,BREAK_INSIDE_AVOID AVOID_PAGE:0,BREAK_INSIDE_AVOID_PAGE 
AVOID_COLUMN:0,BREAK_INSIDE_AVOID_COLUMN IDENT:)
 
-column_count:CSS_PROP_COLUMN_COUNT IDENT:( INHERIT: AUTO:0,COLUMN_COUNT_AUTO 
IDENT:) NUMBER:( true:COLUMN_COUNT_SET RANGE:num<0 NUMBER:)
+column_count:CSS_PROP_COLUMN_COUNT IDENT:( INHERIT: AUTO:0,COLUMN_COUNT_AUTO 
IDENT: CALC:( NUMBER:COLUMN_COUNT_CALC CALC:)) NUMBER:( true:COLUMN_COUNT_SET 
RANGE:num<0 NUMBER:)
 
 column_fill:CSS_PROP_COLUMN_FILL IDENT:( INHERIT: 
BALANCE:0,COLUMN_FILL_BALANCE AUTO:0,COLUMN_FILL_AUTO IDENT:)
 
-column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL 
IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
+column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL 
IDENT:) CALC:( UNIT_PX:COLUMN_GAP_CALC CALC:) LENGTH_UNIT:( 
UNIT_PX:COLUMN_GAP_SET RANGE:<0 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
 
 column_rule_color:CSS_PROP_COLUMN_RULE_COLOR IDENT:( INHERIT: IDENT:) 
COLOR:COLUMN_RULE_COLOR_SET
 
@@ -212,7 +219,7 @@ column_rule_width:CSS_PROP_COLUMN_RULE_WIDTH 
WRAP:css__parse_border_side_width
 
 column_span:CSS_PROP_COLUMN_SPAN IDENT:( INHERIT: NONE:0,COLUMN_SPAN_NONE 
ALL:0,COLUMN_SPAN_ALL IDENT:)
 
-column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO 
IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
+column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO 
IDENT:) CALC:( UNIT_PX:COLUMN_WIDTH_CALC CALC:) LENGTH_UNIT:( 
UNIT_PX:COLUMN_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
 
 writing_mode:CSS_PROP_WRITING_MODE IDENT:( INHERIT: 
HORIZONTAL_TB:0,WRITING_MODE_HORIZONTAL_TB 
VERTICAL_RL:0,WRITING_MODE_VERTICAL_RL VERTICAL_LR:0,WRITING_MODE_VERTICAL_LR 
IDENT:)
 
@@ -224,16 +231,16 @@ align_items:CSS_PROP_ALIGN_ITEMS IDENT:( INHERIT: 
STRETCH:0,ALIGN_ITEMS_STRETCH
 
 align_self:CSS_PROP_ALIGN_SELF IDENT:( INHERIT: STRETCH:0,ALIGN_SELF_STRETCH 
FLEX_START:0,ALIGN_SELF_FLEX_START FLEX_END:0,ALIGN_SELF_FLEX_END 
CENTER:0,ALIGN_SELF_CENTER BASELINE:0,ALIGN_SELF_BASELINE 
AUTO:0,ALIGN_SELF_AUTO IDENT:)
 
-flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO 
CONTENT:0,FLEX_BASIS_CONTENT IDENT:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO 
CONTENT:0,FLEX_BASIS_CONTENT IDENT:) CALC:( UNIT_PX:FLEX_BASIS_CALC CALC:) 
LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
 flex_direction:CSS_PROP_FLEX_DIRECTION IDENT:( INHERIT: 
ROW:0,FLEX_DIRECTION_ROW ROW_REVERSE:0,FLEX_DIRECTION_ROW_REVERSE 
COLUMN:0,FLEX_DIRECTION_COLUMN COLUMN_REVERSE:0,FLEX_DIRECTION_COLUMN_REVERSE 
IDENT:)
 
-flex_grow:CSS_PROP_FLEX_GROW IDENT:INHERIT NUMBER:( false:FLEX_GROW_SET 
RANGE:num<0 NUMBER:)
+flex_grow:CSS_PROP_FLEX_GROW IDENT:INHERIT CALC:( NUMBER:FLEX_GROW_CALC CALC:) 
NUMBER:( false:FLEX_GROW_SET RANGE:num<0 NUMBER:)
 
-flex_shrink:CSS_PROP_FLEX_SHRINK IDENT:INHERIT NUMBER:( false:FLEX_SHRINK_SET 
RANGE:num<0 NUMBER:)
+flex_shrink:CSS_PROP_FLEX_SHRINK IDENT:INHERIT CALC:( NUMBER:FLEX_SHRINK_CALC 
CALC:) NUMBER:( false:FLEX_SHRINK_SET RANGE:num<0 NUMBER:)
 
 flex_wrap:CSS_PROP_FLEX_WRAP IDENT:( INHERIT: NOWRAP:0,FLEX_WRAP_NOWRAP 
WRAP_STRING:0,FLEX_WRAP_WRAP WRAP_REVERSE:0,FLEX_WRAP_WRAP_REVERSE IDENT:)
 
 justify_content:CSS_PROP_JUSTIFY_CONTENT IDENT:( INHERIT: 
FLEX_START:0,JUSTIFY_CONTENT_FLEX_START FLEX_END:0,JUSTIFY_CONTENT_FLEX_END 
CENTER:0,JUSTIFY_CONTENT_CENTER SPACE_BETWEEN:0,JUSTIFY_CONTENT_SPACE_BETWEEN 
SPACE_AROUND:0,JUSTIFY_CONTENT_SPACE_AROUND 
SPACE_EVENLY:0,JUSTIFY_CONTENT_SPACE_EVENLY IDENT:)
 
-order:CSS_PROP_ORDER IDENT:INHERIT NUMBER:( true:ORDER_SET NUMBER:)
+order:CSS_PROP_ORDER IDENT:INHERIT CALC:( NUMBER:ORDER_CALC CALC:) NUMBER:( 
true:ORDER_SET NUMBER:)
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index b1864cb..11b7f72 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -1351,9 +1351,9 @@ cleanup:
  *
  *
  * calc(10px + (4rem / 2)) =>
- *   U 10 px
- *   U 4 rem
- *   N 2
+ *   V 10 px
+ *   V 4 rem
+ *   V 2 NUMBER
  *   /
  *   +
  *   =
@@ -1362,14 +1362,12 @@ cleanup:
 static css_error
 css__parse_calc_sum(css_language *c,
                const parserutils_vector *vector, int *ctx,
-               css_style *result,
-               uint32_t unit);
+               css_style *result);
 
 static css_error
 css__parse_calc_value(css_language *c,
                const parserutils_vector *vector, int *ctx,
-               css_style *result,
-               uint32_t default_unit)
+               css_style *result)
 {
        css_error error;
        int orig_ctx = *ctx;
@@ -1377,7 +1375,7 @@ css__parse_calc_value(css_language *c,
 
        token = parserutils_vector_iterate(vector, ctx);
        if (tokenIsChar(token, '(')) {
-               error = css__parse_calc_sum(c, vector, ctx, result, 
default_unit);
+               error = css__parse_calc_sum(c, vector, ctx, result);
                if (error != CSS_OK) {
                        return error;
                }
@@ -1396,13 +1394,13 @@ css__parse_calc_value(css_language *c,
                uint32_t unit = 0;
                *ctx = orig_ctx;
 
-               error = css__parse_unit_specifier(c, vector, ctx, default_unit, 
&length, &unit);
+               error = css__parse_unit_specifier(c, vector, ctx, 
UNIT_CALC_NUMBER, &length, &unit);
                if (error != CSS_OK) {
                        *ctx = orig_ctx;
                        return error;
                }
 
-               error = css__stylesheet_style_vappend(result, 3, (css_code_t) 
'U', length, unit);
+               error = css__stylesheet_style_vappend(result, 3, (css_code_t) 
'V', length, unit);
        }
                break;
 
@@ -1422,8 +1420,7 @@ css__parse_calc_value(css_language *c,
 static css_error
 css__parse_calc_product(css_language *c,
                const parserutils_vector *vector, int *ctx,
-               css_style *result,
-               uint32_t unit)
+               css_style *result)
 {
        css_error error = CSS_OK;
        const css_token *token;
@@ -1431,7 +1428,7 @@ css__parse_calc_product(css_language *c,
 
 
        /* First parse a value */
-       error = css__parse_calc_value(c, vector, ctx, result, unit);
+       error = css__parse_calc_value(c, vector, ctx, result);
        if (error != CSS_OK) {
                return error;
        }
@@ -1455,33 +1452,10 @@ css__parse_calc_product(css_language *c,
                /* Consume that * or / now */
                token = parserutils_vector_iterate(vector, ctx);
 
-               if (multiplication) {
-                       /* parse another value */
-                       error = css__parse_calc_value(c, vector, ctx, result, 
unit);
-                       if (error != CSS_OK)
-                               break;
-               } else {
-                       css_fixed num;
-                       size_t consumed;
-
-                       token = parserutils_vector_iterate(vector, ctx);
-                       if (token->type != CSS_TOKEN_NUMBER) {
-                               error = CSS_INVALID;
-                               break;
-                       }
-                       num = css__number_from_lwc_string(token->idata, false, 
&consumed);
-                       if (consumed != lwc_string_length(token->idata)) {
-                               error = CSS_INVALID;
-                               break;
-                       }
-
-                       error = css__stylesheet_style_append(result, 
(css_code_t) 'N');
-                       if (error != CSS_OK)
-                               break;
-                       error = css__stylesheet_style_append(result, 
(css_code_t) num);
-                       if (error != CSS_OK)
-                               break;
-               }
+               /* parse another value */
+               error = css__parse_calc_value(c, vector, ctx, result);
+               if (error != CSS_OK)
+                       break;
 
                /* emit the multiplication/division operator */
                error = css__stylesheet_style_append(result, (css_code_t) 
(multiplication ? '*' : '/'));
@@ -1494,8 +1468,7 @@ css__parse_calc_product(css_language *c,
 css_error
 css__parse_calc_sum(css_language *c,
                const parserutils_vector *vector, int *ctx,
-               css_style *result,
-               uint32_t unit)
+               css_style *result)
 {
        css_error error = CSS_OK;
        const css_token *token;
@@ -1503,7 +1476,7 @@ css__parse_calc_sum(css_language *c,
 
 
        /* First parse a product */
-       error = css__parse_calc_product(c, vector, ctx, result, unit);
+       error = css__parse_calc_product(c, vector, ctx, result);
        if (error != CSS_OK) {
                return error;
        }
@@ -1528,7 +1501,7 @@ css__parse_calc_sum(css_language *c,
                token = parserutils_vector_iterate(vector, ctx);
 
                /* parse another product */
-               error = css__parse_calc_product(c, vector, ctx, result, unit);
+               error = css__parse_calc_product(c, vector, ctx, result);
                if (error != CSS_OK)
                        break;
 
@@ -1570,8 +1543,10 @@ css_error css__parse_calc(css_language *c,
        error = css__stylesheet_style_append(calc_style, property);
        if (error != CSS_OK)
                goto cleanup;
+       
+       error = css__stylesheet_style_append(calc_style, (css_code_t) unit);
 
-       error = css__parse_calc_sum(c, vector, ctx, calc_style, unit);
+       error = css__parse_calc_sum(c, vector, ctx, calc_style);
        if (error != CSS_OK)
                goto cleanup;
 


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

Summary of changes:
 src/bytecode/bytecode.h                        |    4 ++
 src/bytecode/opcodes.h                         |   37 ++++++++++++
 src/parse/properties/css_property_parser_gen.c |   45 ++++++++++++--
 src/parse/properties/properties.gen            |   75 +++++++++++++-----------
 src/parse/properties/utils.c                   |   65 +++++++-------------
 5 files changed, 141 insertions(+), 85 deletions(-)

diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index 22703f7..2267542 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -66,6 +66,10 @@ typedef enum unit {
        UNIT_DPI  = (1 << 12) + 0,
        UNIT_DPCM = (1 << 12) + 1,
        UNIT_DPPX = (1 << 12) + 2,
+
+       /* These are special only to the CALC bytecodes */
+       UNIT_CALC_ANY = (1 << 20),
+       UNIT_CALC_NUMBER = (1 << 20) + 1,
 } unit;
 
 typedef uint32_t colour;
diff --git a/src/bytecode/opcodes.h b/src/bytecode/opcodes.h
index 82bf75f..d728831 100644
--- a/src/bytecode/opcodes.h
+++ b/src/bytecode/opcodes.h
@@ -119,6 +119,7 @@ enum op_border_style {
 };
 
 enum op_border_width {
+       BORDER_WIDTH_CALC               = 0x007f,
        BORDER_WIDTH_SET                = 0x0080,
        BORDER_WIDTH_THIN               = 0x0000,
        BORDER_WIDTH_MEDIUM             = 0x0001,
@@ -126,6 +127,7 @@ enum op_border_width {
 };
 
 enum op_bottom {
+       BOTTOM_CALC                     = 0x007f,
        BOTTOM_SET                      = 0x0080,
        BOTTOM_AUTO                     = 0x0000
 };
@@ -198,6 +200,7 @@ enum op_color {
 
 enum op_column_count {
        COLUMN_COUNT_AUTO               = 0x0000,
+       COLUMN_COUNT_CALC               = 0x007f,
        COLUMN_COUNT_SET                = 0x0080
 };
 
@@ -208,6 +211,7 @@ enum op_column_fill {
 
 enum op_column_gap {
        COLUMN_GAP_NORMAL               = 0x0000,
+       COLUMN_GAP_CALC                 = 0x007f,
        COLUMN_GAP_SET                  = 0x0080
 };
 
@@ -231,6 +235,7 @@ enum op_column_rule_style {
 };
 
 enum op_column_rule_width {
+       COLUMN_RULE_WIDTH_CALC          = BORDER_WIDTH_CALC,
        COLUMN_RULE_WIDTH_SET           = BORDER_WIDTH_SET,
        COLUMN_RULE_WIDTH_THIN          = BORDER_WIDTH_THIN,
        COLUMN_RULE_WIDTH_MEDIUM        = BORDER_WIDTH_MEDIUM,
@@ -244,6 +249,7 @@ enum op_column_span {
 
 enum op_column_width {
        COLUMN_WIDTH_AUTO               = 0x0000,
+       COLUMN_WIDTH_CALC               = 0x007f,
        COLUMN_WIDTH_SET                = 0x0080
 };
 
@@ -352,6 +358,7 @@ enum op_empty_cells {
 enum op_flex_basis {
        FLEX_BASIS_AUTO                 = 0x0000,
        FLEX_BASIS_CONTENT              = 0x0001,
+       FLEX_BASIS_CALC                 = 0x007f,
        FLEX_BASIS_SET                  = 0x0080
 };
 
@@ -363,10 +370,12 @@ enum op_flex_direction {
 };
 
 enum op_flex_grow {
+       FLEX_GROW_CALC                  = 0x007f,
        FLEX_GROW_SET                   = 0x0080
 };
 
 enum op_flex_shrink {
+       FLEX_SHRINK_CALC                = 0x007f,
        FLEX_SHRINK_SET                 = 0x0080
 };
 
@@ -396,6 +405,7 @@ enum op_font_family {
 };
 
 enum op_font_size {
+       FONT_SIZE_CALC                  = 0x007f,
        FONT_SIZE_DIMENSION             = 0x0080,
 
        FONT_SIZE_XX_SMALL              = 0x0000,
@@ -437,6 +447,7 @@ enum op_font_weight {
 };
 
 enum op_height {
+       HEIGHT_CALC                     = 0x007f,
        HEIGHT_SET                      = 0x0080,
        HEIGHT_AUTO                     = 0x0000
 };
@@ -451,16 +462,19 @@ enum op_justify_content {
 };
 
 enum op_left {
+       LEFT_CALC                       = BOTTOM_CALC,
        LEFT_SET                        = BOTTOM_SET,
        LEFT_AUTO                       = BOTTOM_AUTO
 };
 
 enum op_letter_spacing {
+       LETTER_SPACING_CALC             = 0x007f,
        LETTER_SPACING_SET              = 0x0080,
        LETTER_SPACING_NORMAL           = 0x0000
 };
 
 enum op_line_height {
+       LINE_HEIGHT_CALC                = 0x007f,
        LINE_HEIGHT_NUMBER              = 0x0080,
        LINE_HEIGHT_DIMENSION           = 0x0081,
        LINE_HEIGHT_NORMAL              = 0x0000
@@ -495,26 +509,31 @@ enum op_list_style_type {
 };
 
 enum op_margin {
+       MARGIN_CALC                     = 0x007f,
        MARGIN_SET                      = 0x0080,
        MARGIN_AUTO                     = 0x0000
 };
 
 enum op_max_height {
+       MAX_HEIGHT_CALC                 = 0x007f,
        MAX_HEIGHT_SET                  = 0x0080,
        MAX_HEIGHT_NONE                 = 0x0000
 };
 
 enum op_max_width {
+       MAX_WIDTH_CALC                  = 0x007f,
        MAX_WIDTH_SET                   = 0x0080,
        MAX_WIDTH_NONE                  = 0x0000
 };
 
 enum op_min_height {
+       MIN_HEIGHT_CALC                 = 0x007f,
        MIN_HEIGHT_SET                  = 0x0080,
        MIN_HEIGHT_AUTO                 = 0x0000
 };
 
 enum op_min_width {
+       MIN_WIDTH_CALC                  = 0x007f,
        MIN_WIDTH_SET                   = 0x0080,
        MIN_WIDTH_AUTO                  = 0x0000
 };
@@ -524,10 +543,12 @@ enum op_opacity {
 };
 
 enum op_order {
+       ORDER_CALC                      = 0x007f,
        ORDER_SET                       = 0x0080
 };
 
 enum op_orphans {
+       ORPHANS_CALC                    = 0x007f,
        ORPHANS_SET                     = 0x0080
 };
 
@@ -566,6 +587,7 @@ enum op_overflow {
 };
 
 enum op_padding {
+       PADDING_CALC                    = 0x007f,
        PADDING_SET                     = 0x0080
 };
 
@@ -591,18 +613,22 @@ enum op_page_break_inside {
 };
 
 enum op_pause_after {
+       PAUSE_AFTER_CALC                = 0x007f,
        PAUSE_AFTER_SET                 = 0x0080
 };
 
 enum op_pause_before {
+       PAUSE_BEFORE_CALC               = 0x007f,
        PAUSE_BEFORE_SET                = 0x0080
 };
 
 enum op_pitch_range {
+       PITCH_RANGE_CALC                = 0x007f,
        PITCH_RANGE_SET                 = 0x0080
 };
 
 enum op_pitch {
+       PITCH_CALC                      = 0x007f,
        PITCH_FREQUENCY                 = 0x0080,
 
        PITCH_X_LOW                     = 0x0000,
@@ -636,6 +662,7 @@ enum op_quotes {
 };
 
 enum op_richness {
+       RICHNESS_CALC                   = 0x007f,
        RICHNESS_SET                    = 0x0080
 };
 
@@ -666,6 +693,7 @@ enum op_speak {
 };
 
 enum op_speech_rate {
+       SPEECH_RATE_CALC                = 0x007f,
        SPEECH_RATE_SET                 = 0x0080,
 
        SPEECH_RATE_X_SLOW              = 0x0000,
@@ -678,6 +706,7 @@ enum op_speech_rate {
 };
 
 enum op_stress {
+       STRESS_CALC                     = 0x007f,
        STRESS_SET                      = 0x0080
 };
 
@@ -706,6 +735,7 @@ enum op_text_decoration {
 };
 
 enum op_text_indent {
+       TEXT_INDENT_CALC                = 0x007f,
        TEXT_INDENT_SET                 = 0x0080
 };
 
@@ -717,6 +747,7 @@ enum op_text_transform {
 };
 
 enum op_top {
+       TOP_CALC                        = BOTTOM_CALC,
        TOP_SET                         = BOTTOM_SET,
        TOP_AUTO                        = BOTTOM_AUTO
 };
@@ -728,6 +759,7 @@ enum op_unicode_bidi {
 };
 
 enum op_vertical_align {
+       VERTICAL_ALIGN_CALC             = 0x007f,
        VERTICAL_ALIGN_SET              = 0x0080,
 
        VERTICAL_ALIGN_BASELINE         = 0x0000,
@@ -758,6 +790,7 @@ enum op_voice_family {
 };
 
 enum op_volume {
+       VOLUME_CALC                     = 0x007f,
        VOLUME_NUMBER                   = 0x0080,
        VOLUME_DIMENSION                = 0x0081,
 
@@ -778,16 +811,19 @@ enum op_white_space {
 };
 
 enum op_widows {
+       WIDOWS_CALC                     = 0x007f,
        WIDOWS_SET                      = 0x0080
 };
 
 enum op_width {
+       WIDTH_CALC                      = 0x007f,
        WIDTH_SET                       = 0x0080,
 
        WIDTH_AUTO                      = 0x0000
 };
 
 enum op_word_spacing {
+       WORD_SPACING_CALC               = 0x007f,
        WORD_SPACING_SET                = 0x0080,
 
        WORD_SPACING_NORMAL             = 0x0000
@@ -800,6 +836,7 @@ enum op_writing_mode {
 };
 
 enum op_z_index {
+       Z_INDEX_CALC                    = 0x007f,
        Z_INDEX_SET                     = 0x0080,
 
        Z_INDEX_AUTO                    = 0x0000
diff --git a/src/parse/properties/css_property_parser_gen.c 
b/src/parse/properties/css_property_parser_gen.c
index 838f2b6..36a1daf 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -19,6 +19,12 @@
  * list_style_position:CSS_PROP_LIST_STYLE_POSITION IDENT:( INHERIT: 
INSIDE:0,LIST_STYLE_POSITION_INSIDE OUTSIDE:0,LIST_STYLE_POSITION_OUTSIDE 
IDENT:)
 */
 
+typedef enum {
+       CALC_ANY,
+       CALC_NUMBER,
+       CALC_UNIT,
+} calc_kind;
+
 struct keyval {
        char *key;
        char *val;
@@ -291,21 +297,34 @@ void output_color(FILE *outputf, struct keyval *parseid, 
struct keyval_list *kvl
                parseid->val);
 }
 
-void output_length_unit(FILE *outputf, struct keyval *parseid, struct 
keyval_list *kvlist)
+void output_calc(FILE *outputf, struct keyval *parseid, struct keyval_list 
*kvlist)
 {
        struct keyval *ckv = kvlist->item[0];
-       int ident_count;
+       const char *kind;
+
+       if (strcmp(ckv->key, "NUMBER") == 0)
+               kind = "UNIT_CALC_NUMBER";
+       else if (strcmp(ckv->key, "ANY") == 0)
+               kind = "UNIT_CALC_ANY";
+       else
+               kind = ckv->key;
 
        fprintf(outputf,
                "if ((token->type == CSS_TOKEN_IDENT) && "
                "(lwc_string_caseless_isequal(token->idata, c->strings[CALC], 
&match) == lwc_error_ok && match))"
                " {\n"
-               "\t\terror = css__parse_calc(c, vector, ctx, result, 
buildOPV(%s, 0, %s /* _CALC */), %s);\n"
+               "\t\terror = css__parse_calc(c, vector, ctx, result, 
buildOPV(%s, 0, %s), %s);\n"
                "\t} else ",
                parseid->val,
                ckv->val,
-               ckv->key
+               kind
        );
+}
+
+void output_length_unit(FILE *outputf, struct keyval *parseid, struct 
keyval_list *kvlist)
+{
+       struct keyval *ckv = kvlist->item[0];
+       int ident_count;
 
        fprintf(outputf,
                "{\n"
@@ -494,6 +513,7 @@ int main(int argc, char **argv)
        struct keyval_list WRAP;
        struct keyval_list NUMBER;
        struct keyval_list COLOR;
+       struct keyval_list CALC;
 
 
        if (argc < 2) {
@@ -526,6 +546,7 @@ int main(int argc, char **argv)
        COLOR.count = 0;
        LENGTH_UNIT.count = 0;
        IDENT_LIST.count = 0;
+       CALC.count = 0;
 
        curlist = &base;
 
@@ -541,7 +562,7 @@ int main(int argc, char **argv)
                if (strcmp(rkv->key, "WRAP") == 0) {
                        WRAP.item[WRAP.count++] = rkv;
                        only_ident = false;
-               } else if (strcmp(rkv->key, "NUMBER") == 0) {
+               } else if (curlist == &base && strcmp(rkv->key, "NUMBER") == 0) 
{
                        if (rkv->val[0] == '(') {
                                curlist = &NUMBER;
                        } else if (rkv->val[0] == ')') {
@@ -572,6 +593,14 @@ int main(int argc, char **argv)
                        }
                        only_ident = false;
                        do_token_check = false;
+               } else if (strcmp(rkv->key, "CALC") == 0) {
+                       if (rkv->val[0] == '(') {
+                               curlist = &CALC;
+                       } else if (rkv->val[0] == ')') {
+                               curlist = &base;
+                       }
+                       only_ident = false;
+                       do_token_check = false;
                } else if (strcmp(rkv->key, "COLOR") == 0) {
                        COLOR.item[COLOR.count++] = rkv;
                        do_token_check = false;
@@ -595,7 +624,7 @@ int main(int argc, char **argv)
 
 
        /* header */
-output_header(outputf, descriptor, base.item[0], is_generic);
+       output_header(outputf, descriptor, base.item[0], is_generic);
 
        if (WRAP.count > 0) {
                output_wrap(outputf, base.item[0], &WRAP);
@@ -609,6 +638,10 @@ output_header(outputf, descriptor, base.item[0], 
is_generic);
                if (URI.count > 0)
                        output_uri(outputf, base.item[0], &URI);
 
+               if (CALC.count > 0) {
+                       output_calc(outputf, base.item[0], &CALC);
+               }
+
                if (NUMBER.count > 0)
                        output_number(outputf, base.item[0], &NUMBER);
 
diff --git a/src/parse/properties/properties.gen 
b/src/parse/properties/properties.gen
index 61dcd5e..33df482 100644
--- a/src/parse/properties/properties.gen
+++ b/src/parse/properties/properties.gen
@@ -6,6 +6,13 @@
 #property:CSS_PROP_ENUM IDENT:( INHERIT: IDENT:) LENGTH_UNIT:( 
UNIT_HZ:PITCH_FREQUENCY ALLOW: DISALLOW: RANGE:<0 LENGTH_UNIT:)
 #property:CSS_PROP_ENUM WRAP:
 
+# When a property takes a NUMBER and/or LENGTH_UNIT you may add calc() support:
+# In the below, PROPERTY_FOO_CALC is the opcode enum for the 
set-but-calculated value bytecode.
+# e.g. HEIGHT_SET (for a LENGTH_UNIT) would be HEIGHT_CALC here.
+# CALC:( UNIT_??:PROPERTY_FOO_CALC CALC:)  <-- When a default unit must be 
considered
+# CALC:( NUMBER:PROPERTY_FOO_CALC CALC:)   <-- When a number must be produced 
(not a dimension)
+# CALC:( ANY:PROPERTY_FOO_CALC CALC:)      <-- When a number or dimension is 
valid (e.g. line-height)
+
 background_repeat:CSS_PROP_BACKGROUND_REPEAT IDENT:( INHERIT: 
NO_REPEAT:0,BACKGROUND_REPEAT_NO_REPEAT REPEAT_X:0,BACKGROUND_REPEAT_REPEAT_X 
REPEAT_Y:0,BACKGROUND_REPEAT_REPEAT_Y REPEAT:0,BACKGROUND_REPEAT_REPEAT IDENT:)
 
 border_collapse:CSS_PROP_BORDER_COLLAPSE IDENT:( INHERIT: 
COLLAPSE:0,BORDER_COLLAPSE_COLLAPSE SEPARATE:0,BORDER_COLLAPSE_SEPARATE IDENT:)
@@ -22,35 +29,35 @@ empty_cells:CSS_PROP_EMPTY_CELLS IDENT:( INHERIT: 
SHOW:0,EMPTY_CELLS_SHOW HIDE:0
 
 float:CSS_PROP_FLOAT IDENT:( INHERIT: LEFT:0,FLOAT_LEFT RIGHT:0,FLOAT_RIGHT 
NONE:0,FLOAT_NONE IDENT:)
 
-font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL 
X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM 
LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE 
XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER 
SMALLER:0,FONT_SIZE_SMALLER IDENT:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL 
X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM 
LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE 
XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER 
SMALLER:0,FONT_SIZE_SMALLER IDENT:) CALC:( UNIT_PX:FONT_SIZE_CALC CALC:) 
LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
 font_style:CSS_PROP_FONT_STYLE IDENT:( INHERIT: NORMAL:0,FONT_STYLE_NORMAL 
ITALIC:0,FONT_STYLE_ITALIC OBLIQUE:0,FONT_STYLE_OBLIQUE IDENT:)
 
 font_variant:CSS_PROP_FONT_VARIANT IDENT:( INHERIT: 
NORMAL:0,FONT_VARIANT_NORMAL SMALL_CAPS:0,FONT_VARIANT_SMALL_CAPS IDENT:)
 
-height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) 
LENGTH_UNIT:( UNIT_PX:HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) CALC:( 
UNIT_PX:HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: 
NORMAL:0,LETTER_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
+letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: 
NORMAL:0,LETTER_SPACING_NORMAL IDENT:) CALC:( UNIT_PX:LETTER_SPACING_CALC 
CALC:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
 
-line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL 
IDENT:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( 
UNIT_PX:LINE_HEIGHT_DIMENSION 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL 
IDENT:) CALC:( ANY:LINE_HEIGHT_CALC CALC:) NUMBER:( false:LINE_HEIGHT_NUMBER 
RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
 border_top:BORDER_SIDE_TOP WRAP:css__parse_border_side
 border_bottom:BORDER_SIDE_BOTTOM WRAP:css__parse_border_side
 border_left:BORDER_SIDE_LEFT WRAP:css__parse_border_side
 border_right:BORDER_SIDE_RIGHT WRAP:css__parse_border_side
 
-max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) 
LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) 
CALC:( UNIT_PX:MAX_HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) 
LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) 
CALC:( UNIT_PX:MAX_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) 
LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) 
CALC:( UNIT_PX:MIN_HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) 
LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) 
CALC:( UNIT_PX:MIN_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
 color:CSS_PROP_COLOR IDENT:INHERIT COLOR:COLOR_SET
 
 #generic for padding_{top, bottom, left, right}.c
-padding_side:op GENERIC: IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:PADDING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ  RANGE:<0 LENGTH_UNIT:)
+padding_side:op GENERIC: IDENT:INHERIT CALC:( UNIT_PX:PADDING_CALC CALC:) 
LENGTH_UNIT:( UNIT_PX:PADDING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ  RANGE:<0 LENGTH_UNIT:)
 
 padding_bottom:CSS_PROP_PADDING_BOTTOM WRAP:css__parse_padding_side
 padding_left:CSS_PROP_PADDING_LEFT WRAP:css__parse_padding_side
@@ -59,7 +66,7 @@ padding_right:CSS_PROP_PADDING_RIGHT 
WRAP:css__parse_padding_side
 
 
 #generic for margin_{top, bottom, left, right}.c
-margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) 
LENGTH_UNIT:( UNIT_PX:MARGIN_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) CALC:( 
UNIT_PX:MARGIN_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
 
 margin_top:CSS_PROP_MARGIN_TOP WRAP:css__parse_margin_side
 margin_bottom:CSS_PROP_MARGIN_BOTTOM WRAP:css__parse_margin_side
@@ -67,7 +74,7 @@ margin_left:CSS_PROP_MARGIN_LEFT WRAP:css__parse_margin_side
 margin_right:CSS_PROP_MARGIN_RIGHT WRAP:css__parse_margin_side
 
 #generic for {top, bottom, left, right}.c
-side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) LENGTH_UNIT:( 
UNIT_PX:BOTTOM_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ 
LENGTH_UNIT:)
+side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) CALC:( 
UNIT_PX:BOTTOM_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
 
 top:CSS_PROP_TOP WRAP:css__parse_side
 bottom:CSS_PROP_BOTTOM WRAP:css__parse_side
@@ -76,7 +83,7 @@ right:CSS_PROP_RIGHT WRAP:css__parse_side
 
 
 #generic for border_{top, bottom, left, right}_width.c
-border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN 
MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) LENGTH_UNIT:( 
UNIT_PX:BORDER_WIDTH_SET 
DISALLOW:unit==UNIT_PCT||unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ 
RANGE:<0 LENGTH_UNIT:)
+border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN 
MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) CALC:( 
UNIT_PX:BORDER_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET 
DISALLOW:unit==UNIT_PCT||unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ 
RANGE:<0 LENGTH_UNIT:)
 
 border_top_width:CSS_PROP_BORDER_TOP_WIDTH WRAP:css__parse_border_side_width
 border_bottom_width:CSS_PROP_BORDER_BOTTOM_WIDTH 
WRAP:css__parse_border_side_width
@@ -120,7 +127,7 @@ list_style_image:CSS_PROP_LIST_STYLE_IMAGE IDENT:( INHERIT: 
NONE:0,LIST_STYLE_IM
 
 list_style_position:CSS_PROP_LIST_STYLE_POSITION IDENT:( INHERIT: 
INSIDE:0,LIST_STYLE_POSITION_INSIDE OUTSIDE:0,LIST_STYLE_POSITION_OUTSIDE 
IDENT:)
 
-orphans:CSS_PROP_ORPHANS IDENT:INHERIT NUMBER:( true:ORPHANS_SET RANGE:num<0 
NUMBER:)
+orphans:CSS_PROP_ORPHANS IDENT:INHERIT CALC:( NUMBER:ORPHANS_CALC CALC:) 
NUMBER:( true:ORPHANS_SET RANGE:num<0 NUMBER:)
 
 outline_color:CSS_PROP_OUTLINE_COLOR IDENT:( INHERIT: 
INVERT:0,OUTLINE_COLOR_INVERT IDENT:) COLOR:OUTLINE_COLOR_SET
 
@@ -140,17 +147,17 @@ page_break_before:CSS_PROP_PAGE_BREAK_BEFORE IDENT:( 
INHERIT: AUTO:0,PAGE_BREAK_
 
 page_break_inside:CSS_PROP_PAGE_BREAK_INSIDE IDENT:( INHERIT: 
AUTO:0,PAGE_BREAK_INSIDE_AUTO AVOID:0,PAGE_BREAK_INSIDE_AVOID IDENT:)
 
-pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT LENGTH_UNIT:( 
UNIT_S:PAUSE_AFTER_SET DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false 
RANGE:<0 LENGTH_UNIT:)
+pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT CALC:( UNIT_S:PAUSE_AFTER_CALC 
CALC:) LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET 
DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
 
-pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT LENGTH_UNIT:( 
UNIT_S:PAUSE_BEFORE_SET 
DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
+pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT CALC:( 
UNIT_S:PAUSE_BEFORE_CALC CALC:) LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET 
DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
 
-pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW 
MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) 
LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW:unit&UNIT_FREQ RANGE:<0 
LENGTH_UNIT:)
+pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW 
MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) CALC:( 
UNIT_HZ:PITCH_CALC CALC:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY 
ALLOW:unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-pitch_range:CSS_PROP_PITCH_RANGE IDENT:INHERIT NUMBER:( false:PITCH_RANGE_SET 
RANGE:num<0||num>F_100 NUMBER:)
+pitch_range:CSS_PROP_PITCH_RANGE IDENT:INHERIT CALC:( NUMBER:PITCH_RANGE_CALC 
CALC:) NUMBER:( false:PITCH_RANGE_SET RANGE:num<0||num>F_100 NUMBER:)
 
 position:CSS_PROP_POSITION IDENT:( INHERIT: LIBCSS_STATIC:0,POSITION_STATIC 
RELATIVE:0,POSITION_RELATIVE ABSOLUTE:0,POSITION_ABSOLUTE 
FIXED:0,POSITION_FIXED IDENT:)
 
-richness:CSS_PROP_RICHNESS IDENT:INHERIT NUMBER:( false:RICHNESS_SET 
RANGE:num<0||num>F_100 NUMBER:)
+richness:CSS_PROP_RICHNESS IDENT:INHERIT CALC:( NUMBER:RICHNESS_CALC CALC:) 
NUMBER:( false:RICHNESS_SET RANGE:num<0||num>F_100 NUMBER:)
 
 speak:CSS_PROP_SPEAK IDENT:( INHERIT: NORMAL:0,SPEAK_NORMAL NONE:0,SPEAK_NONE 
SPELL_OUT:0,SPEAK_SPELL_OUT IDENT:)
 
@@ -160,36 +167,36 @@ speak_numeral:CSS_PROP_SPEAK_NUMERAL IDENT:( INHERIT: 
DIGITS:0,SPEAK_NUMERAL_DIG
 
 speak_punctuation:CSS_PROP_SPEAK_PUNCTUATION IDENT:( INHERIT: 
CODE:0,SPEAK_PUNCTUATION_CODE NONE:0,SPEAK_PUNCTUATION_NONE IDENT:)
 
-speech_rate:CSS_PROP_SPEECH_RATE IDENT:( INHERIT: X_SLOW:0,SPEECH_RATE_X_SLOW 
SLOW:0,SPEECH_RATE_SLOW MEDIUM:0,SPEECH_RATE_MEDIUM FAST:0,SPEECH_RATE_FAST 
X_FAST:0,SPEECH_RATE_X_FAST FASTER:0,SPEECH_RATE_FASTER 
SLOWER:0,SPEECH_RATE_SLOWER IDENT:) NUMBER:( false:SPEECH_RATE_SET RANGE:num<0 
NUMBER:)
+speech_rate:CSS_PROP_SPEECH_RATE IDENT:( INHERIT: X_SLOW:0,SPEECH_RATE_X_SLOW 
SLOW:0,SPEECH_RATE_SLOW MEDIUM:0,SPEECH_RATE_MEDIUM FAST:0,SPEECH_RATE_FAST 
X_FAST:0,SPEECH_RATE_X_FAST FASTER:0,SPEECH_RATE_FASTER 
SLOWER:0,SPEECH_RATE_SLOWER IDENT:) CALC:( NUMBER:SPEECH_RATE_CALC CALC:) 
NUMBER:( false:SPEECH_RATE_SET RANGE:num<0 NUMBER:)
 
-stress:CSS_PROP_STRESS IDENT:INHERIT NUMBER:( false:STRESS_SET 
RANGE:num<0||num>INTTOFIX(100) NUMBER:)
+stress:CSS_PROP_STRESS IDENT:INHERIT CALC:( NUMBER:STRESS_CALC CALC:) NUMBER:( 
false:STRESS_SET RANGE:num<0||num>INTTOFIX(100) NUMBER:)
 
 table_layout:CSS_PROP_TABLE_LAYOUT IDENT:( INHERIT: AUTO:0,TABLE_LAYOUT_AUTO 
FIXED:0,TABLE_LAYOUT_FIXED IDENT:)
 
 text_align:CSS_PROP_TEXT_ALIGN IDENT:( INHERIT: LEFT:0,TEXT_ALIGN_LEFT 
RIGHT:0,TEXT_ALIGN_RIGHT CENTER:0,TEXT_ALIGN_CENTER 
JUSTIFY:0,TEXT_ALIGN_JUSTIFY LIBCSS_LEFT:0,TEXT_ALIGN_LIBCSS_LEFT 
LIBCSS_CENTER:0,TEXT_ALIGN_LIBCSS_CENTER LIBCSS_RIGHT:0,TEXT_ALIGN_LIBCSS_RIGHT 
IDENT:)
 
-text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT LENGTH_UNIT:( 
UNIT_PX:TEXT_INDENT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT CALC:( UNIT_PX:TEXT_INDENT_CALC 
CALC:) LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
 
 text_transform:CSS_PROP_TEXT_TRANSFORM IDENT:( INHERIT: 
CAPITALIZE:0,TEXT_TRANSFORM_CAPITALIZE UPPERCASE:0,TEXT_TRANSFORM_UPPERCASE 
LOWERCASE:0,TEXT_TRANSFORM_LOWERCASE NONE:0,TEXT_TRANSFORM_NONE IDENT:)
 
 unicode_bidi:CSS_PROP_UNICODE_BIDI IDENT:( INHERIT: 
NORMAL:0,UNICODE_BIDI_NORMAL EMBED:0,UNICODE_BIDI_EMBED 
BIDI_OVERRIDE:0,UNICODE_BIDI_BIDI_OVERRIDE IDENT:)
 
-vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: 
BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB 
SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP 
TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE 
BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) 
LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: 
BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB 
SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP 
TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE 
BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) 
CALC:( UNIT_PX:VERTICAL_ALIGN_CALC CALC:) LENGTH_UNIT:( 
UNIT_PX:VERTICAL_ALIGN_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
 
 visibility:CSS_PROP_VISIBILITY IDENT:( INHERIT: VISIBLE:0,VISIBILITY_VISIBLE 
HIDDEN:0,VISIBILITY_HIDDEN COLLAPSE:0,VISIBILITY_COLLAPSE IDENT:)
 
-volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT 
X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM 
LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) NUMBER:( false:VOLUME_NUMBER 
RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( UNIT_PX:VOLUME_DIMENSION 
ALLOW:unit&UNIT_PCT RANGE:<0 LENGTH_UNIT:)
+volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT 
X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM 
LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) CALC:( ANY:VOLUME_CALC CALC:) 
NUMBER:( false:VOLUME_NUMBER RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( 
UNIT_PX:VOLUME_DIMENSION ALLOW:unit&UNIT_PCT RANGE:<0 LENGTH_UNIT:)
 
 white_space:CSS_PROP_WHITE_SPACE IDENT:( INHERIT: NORMAL:0,WHITE_SPACE_NORMAL 
PRE:0,WHITE_SPACE_PRE NOWRAP:0,WHITE_SPACE_NOWRAP 
PRE_WRAP:0,WHITE_SPACE_PRE_WRAP PRE_LINE:0,WHITE_SPACE_PRE_LINE  IDENT:)
 
-widows:CSS_PROP_WIDOWS IDENT:INHERIT NUMBER:( true:WIDOWS_SET RANGE:num<0 
NUMBER:)
+widows:CSS_PROP_WIDOWS IDENT:INHERIT CALC:( NUMBER:WIDOWS_CALC CALC:) NUMBER:( 
true:WIDOWS_SET RANGE:num<0 NUMBER:)
 
 
-width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) LENGTH_UNIT:( 
UNIT_PX:WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ 
RANGE:<0 LENGTH_UNIT:)
+width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) CALC:( 
UNIT_PX:WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
-word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: 
NORMAL:0,WORD_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
+word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: 
NORMAL:0,WORD_SPACING_NORMAL IDENT:) CALC:( UNIT_PX:WORD_SPACING_CALC CALC:) 
LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
 
-z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) NUMBER:( 
true:Z_INDEX_SET NUMBER:)
+z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) CALC:( 
NUMBER:Z_INDEX_CALC CALC:) NUMBER:( true:Z_INDEX_SET NUMBER:)
 
 
 break_after:CSS_PROP_BREAK_AFTER IDENT:( INHERIT: AUTO:0,BREAK_AFTER_AUTO 
ALWAYS:0,BREAK_AFTER_ALWAYS AVOID:0,BREAK_AFTER_AVOID LEFT:0,BREAK_AFTER_LEFT 
RIGHT:0,BREAK_AFTER_RIGHT PAGE:0,BREAK_AFTER_PAGE COLUMN:0,BREAK_AFTER_COLUMN 
AVOID_PAGE:0,BREAK_AFTER_AVOID_PAGE AVOID_COLUMN:0,BREAK_AFTER_AVOID_COLUMN 
IDENT:)
@@ -198,11 +205,11 @@ break_before:CSS_PROP_BREAK_BEFORE IDENT:( INHERIT: 
AUTO:0,BREAK_BEFORE_AUTO ALW
 
 break_inside:CSS_PROP_BREAK_INSIDE IDENT:( INHERIT: AUTO:0,BREAK_INSIDE_AUTO 
AVOID:0,BREAK_INSIDE_AVOID AVOID_PAGE:0,BREAK_INSIDE_AVOID_PAGE 
AVOID_COLUMN:0,BREAK_INSIDE_AVOID_COLUMN IDENT:)
 
-column_count:CSS_PROP_COLUMN_COUNT IDENT:( INHERIT: AUTO:0,COLUMN_COUNT_AUTO 
IDENT:) NUMBER:( true:COLUMN_COUNT_SET RANGE:num<0 NUMBER:)
+column_count:CSS_PROP_COLUMN_COUNT IDENT:( INHERIT: AUTO:0,COLUMN_COUNT_AUTO 
IDENT: CALC:( NUMBER:COLUMN_COUNT_CALC CALC:)) NUMBER:( true:COLUMN_COUNT_SET 
RANGE:num<0 NUMBER:)
 
 column_fill:CSS_PROP_COLUMN_FILL IDENT:( INHERIT: 
BALANCE:0,COLUMN_FILL_BALANCE AUTO:0,COLUMN_FILL_AUTO IDENT:)
 
-column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL 
IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
+column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL 
IDENT:) CALC:( UNIT_PX:COLUMN_GAP_CALC CALC:) LENGTH_UNIT:( 
UNIT_PX:COLUMN_GAP_SET RANGE:<0 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
 
 column_rule_color:CSS_PROP_COLUMN_RULE_COLOR IDENT:( INHERIT: IDENT:) 
COLOR:COLUMN_RULE_COLOR_SET
 
@@ -212,7 +219,7 @@ column_rule_width:CSS_PROP_COLUMN_RULE_WIDTH 
WRAP:css__parse_border_side_width
 
 column_span:CSS_PROP_COLUMN_SPAN IDENT:( INHERIT: NONE:0,COLUMN_SPAN_NONE 
ALL:0,COLUMN_SPAN_ALL IDENT:)
 
-column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO 
IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
+column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO 
IDENT:) CALC:( UNIT_PX:COLUMN_WIDTH_CALC CALC:) LENGTH_UNIT:( 
UNIT_PX:COLUMN_WIDTH_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT 
LENGTH_UNIT:)
 
 writing_mode:CSS_PROP_WRITING_MODE IDENT:( INHERIT: 
HORIZONTAL_TB:0,WRITING_MODE_HORIZONTAL_TB 
VERTICAL_RL:0,WRITING_MODE_VERTICAL_RL VERTICAL_LR:0,WRITING_MODE_VERTICAL_LR 
IDENT:)
 
@@ -224,16 +231,16 @@ align_items:CSS_PROP_ALIGN_ITEMS IDENT:( INHERIT: 
STRETCH:0,ALIGN_ITEMS_STRETCH
 
 align_self:CSS_PROP_ALIGN_SELF IDENT:( INHERIT: STRETCH:0,ALIGN_SELF_STRETCH 
FLEX_START:0,ALIGN_SELF_FLEX_START FLEX_END:0,ALIGN_SELF_FLEX_END 
CENTER:0,ALIGN_SELF_CENTER BASELINE:0,ALIGN_SELF_BASELINE 
AUTO:0,ALIGN_SELF_AUTO IDENT:)
 
-flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO 
CONTENT:0,FLEX_BASIS_CONTENT IDENT:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO 
CONTENT:0,FLEX_BASIS_CONTENT IDENT:) CALC:( UNIT_PX:FLEX_BASIS_CALC CALC:) 
LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET 
DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
 
 flex_direction:CSS_PROP_FLEX_DIRECTION IDENT:( INHERIT: 
ROW:0,FLEX_DIRECTION_ROW ROW_REVERSE:0,FLEX_DIRECTION_ROW_REVERSE 
COLUMN:0,FLEX_DIRECTION_COLUMN COLUMN_REVERSE:0,FLEX_DIRECTION_COLUMN_REVERSE 
IDENT:)
 
-flex_grow:CSS_PROP_FLEX_GROW IDENT:INHERIT NUMBER:( false:FLEX_GROW_SET 
RANGE:num<0 NUMBER:)
+flex_grow:CSS_PROP_FLEX_GROW IDENT:INHERIT CALC:( NUMBER:FLEX_GROW_CALC CALC:) 
NUMBER:( false:FLEX_GROW_SET RANGE:num<0 NUMBER:)
 
-flex_shrink:CSS_PROP_FLEX_SHRINK IDENT:INHERIT NUMBER:( false:FLEX_SHRINK_SET 
RANGE:num<0 NUMBER:)
+flex_shrink:CSS_PROP_FLEX_SHRINK IDENT:INHERIT CALC:( NUMBER:FLEX_SHRINK_CALC 
CALC:) NUMBER:( false:FLEX_SHRINK_SET RANGE:num<0 NUMBER:)
 
 flex_wrap:CSS_PROP_FLEX_WRAP IDENT:( INHERIT: NOWRAP:0,FLEX_WRAP_NOWRAP 
WRAP_STRING:0,FLEX_WRAP_WRAP WRAP_REVERSE:0,FLEX_WRAP_WRAP_REVERSE IDENT:)
 
 justify_content:CSS_PROP_JUSTIFY_CONTENT IDENT:( INHERIT: 
FLEX_START:0,JUSTIFY_CONTENT_FLEX_START FLEX_END:0,JUSTIFY_CONTENT_FLEX_END 
CENTER:0,JUSTIFY_CONTENT_CENTER SPACE_BETWEEN:0,JUSTIFY_CONTENT_SPACE_BETWEEN 
SPACE_AROUND:0,JUSTIFY_CONTENT_SPACE_AROUND 
SPACE_EVENLY:0,JUSTIFY_CONTENT_SPACE_EVENLY IDENT:)
 
-order:CSS_PROP_ORDER IDENT:INHERIT NUMBER:( true:ORDER_SET NUMBER:)
+order:CSS_PROP_ORDER IDENT:INHERIT CALC:( NUMBER:ORDER_CALC CALC:) NUMBER:( 
true:ORDER_SET NUMBER:)
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index b1864cb..11b7f72 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -1351,9 +1351,9 @@ cleanup:
  *
  *
  * calc(10px + (4rem / 2)) =>
- *   U 10 px
- *   U 4 rem
- *   N 2
+ *   V 10 px
+ *   V 4 rem
+ *   V 2 NUMBER
  *   /
  *   +
  *   =
@@ -1362,14 +1362,12 @@ cleanup:
 static css_error
 css__parse_calc_sum(css_language *c,
                const parserutils_vector *vector, int *ctx,
-               css_style *result,
-               uint32_t unit);
+               css_style *result);
 
 static css_error
 css__parse_calc_value(css_language *c,
                const parserutils_vector *vector, int *ctx,
-               css_style *result,
-               uint32_t default_unit)
+               css_style *result)
 {
        css_error error;
        int orig_ctx = *ctx;
@@ -1377,7 +1375,7 @@ css__parse_calc_value(css_language *c,
 
        token = parserutils_vector_iterate(vector, ctx);
        if (tokenIsChar(token, '(')) {
-               error = css__parse_calc_sum(c, vector, ctx, result, 
default_unit);
+               error = css__parse_calc_sum(c, vector, ctx, result);
                if (error != CSS_OK) {
                        return error;
                }
@@ -1396,13 +1394,13 @@ css__parse_calc_value(css_language *c,
                uint32_t unit = 0;
                *ctx = orig_ctx;
 
-               error = css__parse_unit_specifier(c, vector, ctx, default_unit, 
&length, &unit);
+               error = css__parse_unit_specifier(c, vector, ctx, 
UNIT_CALC_NUMBER, &length, &unit);
                if (error != CSS_OK) {
                        *ctx = orig_ctx;
                        return error;
                }
 
-               error = css__stylesheet_style_vappend(result, 3, (css_code_t) 
'U', length, unit);
+               error = css__stylesheet_style_vappend(result, 3, (css_code_t) 
'V', length, unit);
        }
                break;
 
@@ -1422,8 +1420,7 @@ css__parse_calc_value(css_language *c,
 static css_error
 css__parse_calc_product(css_language *c,
                const parserutils_vector *vector, int *ctx,
-               css_style *result,
-               uint32_t unit)
+               css_style *result)
 {
        css_error error = CSS_OK;
        const css_token *token;
@@ -1431,7 +1428,7 @@ css__parse_calc_product(css_language *c,
 
 
        /* First parse a value */
-       error = css__parse_calc_value(c, vector, ctx, result, unit);
+       error = css__parse_calc_value(c, vector, ctx, result);
        if (error != CSS_OK) {
                return error;
        }
@@ -1455,33 +1452,10 @@ css__parse_calc_product(css_language *c,
                /* Consume that * or / now */
                token = parserutils_vector_iterate(vector, ctx);
 
-               if (multiplication) {
-                       /* parse another value */
-                       error = css__parse_calc_value(c, vector, ctx, result, 
unit);
-                       if (error != CSS_OK)
-                               break;
-               } else {
-                       css_fixed num;
-                       size_t consumed;
-
-                       token = parserutils_vector_iterate(vector, ctx);
-                       if (token->type != CSS_TOKEN_NUMBER) {
-                               error = CSS_INVALID;
-                               break;
-                       }
-                       num = css__number_from_lwc_string(token->idata, false, 
&consumed);
-                       if (consumed != lwc_string_length(token->idata)) {
-                               error = CSS_INVALID;
-                               break;
-                       }
-
-                       error = css__stylesheet_style_append(result, 
(css_code_t) 'N');
-                       if (error != CSS_OK)
-                               break;
-                       error = css__stylesheet_style_append(result, 
(css_code_t) num);
-                       if (error != CSS_OK)
-                               break;
-               }
+               /* parse another value */
+               error = css__parse_calc_value(c, vector, ctx, result);
+               if (error != CSS_OK)
+                       break;
 
                /* emit the multiplication/division operator */
                error = css__stylesheet_style_append(result, (css_code_t) 
(multiplication ? '*' : '/'));
@@ -1494,8 +1468,7 @@ css__parse_calc_product(css_language *c,
 css_error
 css__parse_calc_sum(css_language *c,
                const parserutils_vector *vector, int *ctx,
-               css_style *result,
-               uint32_t unit)
+               css_style *result)
 {
        css_error error = CSS_OK;
        const css_token *token;
@@ -1503,7 +1476,7 @@ css__parse_calc_sum(css_language *c,
 
 
        /* First parse a product */
-       error = css__parse_calc_product(c, vector, ctx, result, unit);
+       error = css__parse_calc_product(c, vector, ctx, result);
        if (error != CSS_OK) {
                return error;
        }
@@ -1528,7 +1501,7 @@ css__parse_calc_sum(css_language *c,
                token = parserutils_vector_iterate(vector, ctx);
 
                /* parse another product */
-               error = css__parse_calc_product(c, vector, ctx, result, unit);
+               error = css__parse_calc_product(c, vector, ctx, result);
                if (error != CSS_OK)
                        break;
 
@@ -1570,8 +1543,10 @@ css_error css__parse_calc(css_language *c,
        error = css__stylesheet_style_append(calc_style, property);
        if (error != CSS_OK)
                goto cleanup;
+       
+       error = css__stylesheet_style_append(calc_style, (css_code_t) unit);
 
-       error = css__parse_calc_sum(c, vector, ctx, calc_style, unit);
+       error = css__parse_calc_sum(c, vector, ctx, calc_style);
        if (error != CSS_OK)
                goto cleanup;
 


-- 
Cascading Style Sheets library
_______________________________________________
netsurf-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to