Gitweb links:

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

The branch, tlsa/calc has been updated
  discards  7805a9ee0c89cca40097aefb5cbc8ec98a7c927a (commit)
  discards  684726f5189e29f9d610766365a17f754368b80b (commit)
  discards  9a541ac916223694238bafd262b067a0a59a41e7 (commit)
  discards  817b43a06afc93e459ff09afdb0e007f76ba6cbe (commit)
  discards  05a064fc07a4cea3dd8307c10b8a2aad3a670211 (commit)
  discards  ce2155ea14a93327bd320d90f434da2fdb1ab66d (commit)
  discards  307b71ec3001bcd8cacc875ddd09138744eb7ee1 (commit)
  discards  e7a7b547c370d0fa51e8e55282aceb2fe9f19039 (commit)
       via  dd8090b7223322c6f80990327e88e574fa3885ce (commit)
       via  db28a2dba7e411e4959152c3cf0e394cde94c57b (commit)
       via  314d4ded8a89e891c191792894b660a853e0b8fe (commit)
       via  0933e7f8717bdbac3b91debff44ec86afaf1ec84 (commit)
       via  ecf42afc3329b03ee642ede84f9ba224d2aff1e1 (commit)
       via  65d4fd6e83d421e7fa7a8c7df44d01797e3c69ae (commit)
       via  6cd205329373efe5a1629518c2875724cc79dce3 (commit)
       via  0cf10a040aea028c7dc81cf353da7a7af5331076 (commit)

This update added new revisions after undoing existing revisions.  That is
to say, the old revision is not a strict subset of the new revision.  This
situation occurs when you --force push a change and generate a repository
containing something like this:

 * -- * -- B -- O -- O -- O (7805a9ee0c89cca40097aefb5cbc8ec98a7c927a)
            \
             N -- N -- N (dd8090b7223322c6f80990327e88e574fa3885ce)

When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.

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=dd8090b7223322c6f80990327e88e574fa3885ce
commit dd8090b7223322c6f80990327e88e574fa3885ce
Author: Daniel Silverstone <[email protected]>
Commit: Michael Drake <[email protected]>

    parse: Tests and fixes for calc() parser.
    
    Co-authored-by: Michael Drake <[email protected]>

diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index be163b1..70c8b01 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -24,12 +24,13 @@ enum flag {
 };
 
 enum calc_opcodes {
-       CALC_PUSH_VALUE = 'V',
-       CALC_ADD        = '+',
-       CALC_SUBTRACT   = '-',
-       CALC_MULTIPLY   = '*',
-       CALC_DIVIDE     = '/',
-       CALC_FINISH     = '=',
+       CALC_PUSH_NUMBER = 'N',
+       CALC_PUSH_VALUE  = 'V',
+       CALC_ADD         = '+',
+       CALC_SUBTRACT    = '-',
+       CALC_MULTIPLY    = '*',
+       CALC_DIVIDE      = '/',
+       CALC_FINISH      = '=',
 };
 
 typedef enum unit {
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index 7f9d9d2..fe5ee6b 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -1365,6 +1365,31 @@ css__parse_calc_sum(css_language *c,
                css_style *result);
 
 static css_error
+css__parse_calc_number(
+               const parserutils_vector *vector, int *ctx,
+               css_style *result)
+{
+       const css_token *token;
+       css_fixed num;
+       size_t consumed;
+
+       /* Consume the number token */
+       token = parserutils_vector_iterate(vector, ctx);
+       if (token == NULL || token->type != CSS_TOKEN_NUMBER) {
+               return CSS_INVALID;
+       }
+
+       num = css__number_from_string((const uint8_t 
*)lwc_string_data(token->idata),
+                               lwc_string_length(token->idata), false, 
&consumed);
+
+       if (consumed != lwc_string_length(token->idata)) {
+               return CSS_INVALID;
+       }
+
+       return css__stylesheet_style_vappend(result, 2, (css_code_t) 
CALC_PUSH_NUMBER, (css_code_t)num);
+}
+
+static css_error
 css__parse_calc_value(css_language *c,
                const parserutils_vector *vector, int *ctx,
                css_style *result)
@@ -1377,6 +1402,7 @@ css__parse_calc_value(css_language *c,
        token = parserutils_vector_peek(vector, *ctx);
        if (tokenIsChar(token, '(')) {
                parserutils_vector_iterate(vector, ctx);
+               consumeWhitespace(vector, ctx);
                error = css__parse_calc_sum(c, vector, ctx, result);
                if (error != CSS_OK) {
                        return error;
@@ -1389,7 +1415,12 @@ css__parse_calc_value(css_language *c,
                /* Consume the close-paren to complete this value */
                parserutils_vector_iterate(vector, ctx);
        } else switch (token->type) {
-       case CSS_TOKEN_NUMBER:    /* Fall through */
+       case CSS_TOKEN_NUMBER:
+               error = css__parse_calc_number(vector, ctx, result);
+               if (error != CSS_OK) {
+                       return error;
+               }
+               break;
        case CSS_TOKEN_DIMENSION: /* Fall through */
        case CSS_TOKEN_PERCENTAGE:
        {
@@ -1412,11 +1443,7 @@ css__parse_calc_value(css_language *c,
                break;
        }
 
-       token = parserutils_vector_peek(vector, *ctx);
-       while (token->type == CSS_TOKEN_S) {
-               parserutils_vector_iterate(vector, ctx);
-               token = parserutils_vector_peek(vector, *ctx);
-       }
+       consumeWhitespace(vector, ctx);
        return error;
 }
 
@@ -1462,14 +1489,15 @@ css__parse_calc_product(css_language *c,
                }
                /* Consume that * or / now */
                parserutils_vector_iterate(vector, ctx);
-               token = parserutils_vector_peek(vector, *ctx);
 
-               while (token->type == CSS_TOKEN_S) {
-                       parserutils_vector_iterate(vector, ctx);
-                       token = parserutils_vector_peek(vector, *ctx);
+               consumeWhitespace(vector, ctx);
+
+               if (multiplication) {
+                       /* parse another value */
+                       error = css__parse_calc_value(c, vector, ctx, result);
+               } else {
+                       error = css__parse_calc_number(vector, ctx, result);
                }
-               /* parse another value */
-               error = css__parse_calc_value(c, vector, ctx, result);
                if (error != CSS_OK)
                        break;
 
@@ -1516,12 +1544,7 @@ css__parse_calc_sum(css_language *c,
                }
                /* Consume that + or - now */
                parserutils_vector_iterate(vector, ctx);
-               token = parserutils_vector_peek(vector, *ctx);
-
-               while (token->type == CSS_TOKEN_S) {
-                       parserutils_vector_iterate(vector, ctx);
-                       token = parserutils_vector_peek(vector, *ctx);
-               }
+               consumeWhitespace(vector, ctx);
 
                /* parse another product */
                error = css__parse_calc_product(c, vector, ctx, result);
@@ -1547,17 +1570,14 @@ css_error css__parse_calc(css_language *c,
        css_error error = CSS_OK;
        css_style *calc_style = NULL;
 
+       consumeWhitespace(vector, ctx);
+
        token = parserutils_vector_peek(vector, *ctx);
        if (token == NULL) {
                *ctx = orig_ctx;
                return CSS_INVALID;
        }
 
-       while (token->type == CSS_TOKEN_S) {
-               parserutils_vector_iterate(vector, ctx);
-               token = parserutils_vector_peek(vector, *ctx);
-       }
-
        error = css__stylesheet_style_create(c->sheet, &calc_style);
        if (error != CSS_OK)
                goto cleanup;
@@ -1574,11 +1594,8 @@ css_error css__parse_calc(css_language *c,
        if (error != CSS_OK)
                goto cleanup;
 
+       consumeWhitespace(vector, ctx);
        token = parserutils_vector_peek(vector, *ctx);
-       while (token->type == CSS_TOKEN_S) {
-               parserutils_vector_iterate(vector, ctx);
-               token = parserutils_vector_peek(vector, *ctx);
-       }
        if (!tokenIsChar(token, ')')) {
                /* If we don't get a close-paren, give up now */
                error = CSS_INVALID;
diff --git a/test/data/parse2/calc.dat b/test/data/parse2/calc.dat
index 95abf6c..e9d176d 100644
--- a/test/data/parse2/calc.dat
+++ b/test/data/parse2/calc.dat
@@ -4,4 +4,154 @@
 #expected
 | *
 |  height: /* -> 0px */ calc(50vh 10px + =)
-#reset
\ No newline at end of file
+#reset
+
+#data
+* { line-height: calc(50vh + 10px)}
+#errors
+#expected
+| *
+|  line-height: /* -> 0any */ calc(50vh 10px + =)
+#reset
+
+#data
+* { line-height: calc( / 2)}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { line-height: calc( + 2)}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { line-height: calc(2 / 2px)}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc(50vh + 10px)}
+#errors
+#expected
+| *
+|  z-index: /* -> 0number */ calc(50vh 10px + =)
+#reset
+
+#data
+* { z-index: calc(2 * 3)}
+#errors
+#expected
+| *
+|  z-index: /* -> 0number */ calc(2 3 * =)
+#reset
+
+#data
+* { z-index: calc(50vh + 10px / 9)}
+#errors
+#expected
+| *
+|  z-index: /* -> 0number */ calc(50vh 10px 9 / + =)
+#reset
+
+#data
+* { z-index: calc(1 + 2 + 3 + 4)}
+#errors
+#expected
+| *
+|  z-index: /* -> 0number */ calc(1 2 + 3 + 4 + =)
+#reset
+
+#data
+* { z-index: calc(1 + 2 * 3 + 4)}
+#errors
+#expected
+| *
+|  z-index: /* -> 0number */ calc(1 2 3 * + 4 + =)
+#reset
+
+#data
+* { z-index: calc((1 + 2) * (3 + 4))}
+#errors
+#expected
+| *
+|  z-index: /* -> 0number */ calc(1 2 + 3 4 + * =)
+#reset
+
+#data
+* { z-index: calc(1 + 2}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc(}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc (1 + 2)}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc(1)}
+#errors
+#expected
+| *
+|  z-index: /* -> 0number */ calc(1 =)
+#reset
+
+#data
+* { z-index: calc()}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc((1 + 2)}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc(((1 + 2)))}
+#errors
+#expected
+| *
+|  z-index: /* -> 0number */ calc(1 2 + =)
+#reset
+
+#data
+* { z-index: calc( ( ( 1 + 2 ) ) )}
+#errors
+#expected
+| *
+|  z-index: /* -> 0number */ calc(1 2 + =)
+#reset
+
+#data
+* { z-index: calc( ( 3 / ( 1 + 2 ) ) )}
+#errors
+#expected
+| *
+#reset
diff --git a/test/dump.h b/test/dump.h
index 852de84..f320e67 100644
--- a/test/dump.h
+++ b/test/dump.h
@@ -825,6 +825,13 @@ void dump_bytecode(css_style *style, char **ptr, uint32_t 
depth)
                                        dump_unit(num, unit, ptr);
                                        *ptr += sprintf(*ptr, " ");
                                        break;
+                               case CALC_PUSH_NUMBER: {
+                                       css_fixed num = *((css_fixed 
*)bytecode);
+                                       ADVANCE(sizeof(num));
+                                       dump_number(num, ptr);
+                                       *ptr += sprintf(*ptr, " ");
+                                       break;
+                               }
                                }
                                default:
                                        *ptr += sprintf(*ptr, "??%d ", 
calc_opcode);


commitdiff 
http://git.netsurf-browser.org/libcss.git/commit/?id=db28a2dba7e411e4959152c3cf0e394cde94c57b
commit db28a2dba7e411e4959152c3cf0e394cde94c57b
Author: Daniel Silverstone <[email protected]>
Commit: Michael Drake <[email protected]>

    parse: calc() test and fixup.

diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index 041050f..be163b1 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -23,6 +23,14 @@ enum flag {
        FLAG_INHERIT                    = (1<<1)
 };
 
+enum calc_opcodes {
+       CALC_PUSH_VALUE = 'V',
+       CALC_ADD        = '+',
+       CALC_SUBTRACT   = '-',
+       CALC_MULTIPLY   = '*',
+       CALC_DIVIDE     = '/',
+       CALC_FINISH     = '=',
+};
 
 typedef enum unit {
        UNIT_LENGTH = (1u << 8),
@@ -107,6 +115,12 @@ static inline bool isInherit(css_code_t OPV)
        return getFlags(OPV) & 0x2;
 }
 
+static inline bool isCalc(css_code_t OPV)
+{
+       /* Note, this relies on all _CALC values being the same ultimately */
+       return getValue(OPV) == 0x7f;
+}
+
 #endif
 
 
diff --git a/src/parse/properties/css_property_parser_gen.c 
b/src/parse/properties/css_property_parser_gen.c
index 1cdb27f..08f3f12 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -310,7 +310,7 @@ void output_calc(FILE *outputf, struct keyval *parseid, 
struct keyval_list *kvli
                kind = ckv->key;
 
        fprintf(outputf,
-               "if ((token->type == CSS_TOKEN_IDENT) && "
+               "if ((token->type == CSS_TOKEN_FUNCTION) && "
                "(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), %s);\n"
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index cce9717..7f9d9d2 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -1373,8 +1373,10 @@ css__parse_calc_value(css_language *c,
        int orig_ctx = *ctx;
        const css_token *token;
 
-       token = parserutils_vector_iterate(vector, ctx);
+       /* On entry, we are already pointing at the value to parse, so peek it 
*/
+       token = parserutils_vector_peek(vector, *ctx);
        if (tokenIsChar(token, '(')) {
+               parserutils_vector_iterate(vector, ctx);
                error = css__parse_calc_sum(c, vector, ctx, result);
                if (error != CSS_OK) {
                        return error;
@@ -1384,7 +1386,8 @@ css__parse_calc_value(css_language *c,
                if (!tokenIsChar(token, ')')) {
                        return CSS_INVALID;
                }
-
+               /* Consume the close-paren to complete this value */
+               parserutils_vector_iterate(vector, ctx);
        } else switch (token->type) {
        case CSS_TOKEN_NUMBER:    /* Fall through */
        case CSS_TOKEN_DIMENSION: /* Fall through */
@@ -1400,7 +1403,7 @@ css__parse_calc_value(css_language *c,
                        return error;
                }
 
-               error = css__stylesheet_style_vappend(result, 3, (css_code_t) 
'V', length, unit);
+               error = css__stylesheet_style_vappend(result, 3, (css_code_t) 
CALC_PUSH_VALUE, length, unit);
        }
                break;
 
@@ -1409,6 +1412,11 @@ css__parse_calc_value(css_language *c,
                break;
        }
 
+       token = parserutils_vector_peek(vector, *ctx);
+       while (token->type == CSS_TOKEN_S) {
+               parserutils_vector_iterate(vector, ctx);
+               token = parserutils_vector_peek(vector, *ctx);
+       }
        return error;
 }
 
@@ -1439,7 +1447,10 @@ css__parse_calc_product(css_language *c,
                if (token == NULL) {
                        error = CSS_INVALID;
                        break;
-               } else if (tokenIsChar(token, ')'))
+               } else if (
+                               tokenIsChar(token, ')') ||
+                               tokenIsChar(token, '+') ||
+                               tokenIsChar(token, '-'))
                        break;
                else if (tokenIsChar(token, '*'))
                        multiplication = true;
@@ -1450,15 +1461,21 @@ css__parse_calc_product(css_language *c,
                        break;
                }
                /* Consume that * or / now */
-               token = parserutils_vector_iterate(vector, ctx);
+               parserutils_vector_iterate(vector, ctx);
+               token = parserutils_vector_peek(vector, *ctx);
 
+               while (token->type == CSS_TOKEN_S) {
+                       parserutils_vector_iterate(vector, ctx);
+                       token = parserutils_vector_peek(vector, *ctx);
+               }
                /* 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 ? '*' : '/'));
+               error = css__stylesheet_style_append(result,
+                                       (css_code_t) (multiplication ? 
CALC_MULTIPLY : CALC_DIVIDE));
        } while (1);
        /* We've fallen off, either we had an error or we're left with ')' */
        return error;
@@ -1498,7 +1515,13 @@ css__parse_calc_sum(css_language *c,
                        break;
                }
                /* Consume that + or - now */
-               token = parserutils_vector_iterate(vector, ctx);
+               parserutils_vector_iterate(vector, ctx);
+               token = parserutils_vector_peek(vector, *ctx);
+
+               while (token->type == CSS_TOKEN_S) {
+                       parserutils_vector_iterate(vector, ctx);
+                       token = parserutils_vector_peek(vector, *ctx);
+               }
 
                /* parse another product */
                error = css__parse_calc_product(c, vector, ctx, result);
@@ -1506,7 +1529,7 @@ css__parse_calc_sum(css_language *c,
                        break;
 
                /* emit the addition/subtraction operator */
-               error = css__stylesheet_style_append(result, (css_code_t) 
(addition ? '+' : '-'));
+               error = css__stylesheet_style_append(result, (css_code_t) 
(addition ? CALC_ADD : CALC_SUBTRACT));
        } while (1);
        /* We've fallen off, either we had an error or we're left with ')' */
        return error;
@@ -1524,16 +1547,15 @@ css_error css__parse_calc(css_language *c,
        css_error error = CSS_OK;
        css_style *calc_style = NULL;
 
-       token = parserutils_vector_iterate(vector, ctx);
+       token = parserutils_vector_peek(vector, *ctx);
        if (token == NULL) {
                *ctx = orig_ctx;
                return CSS_INVALID;
        }
 
-       if (!tokenIsChar(token, '(')) {
-               /* If we don't get an open-paren, give up now */
-               *ctx = orig_ctx;
-               return CSS_INVALID;
+       while (token->type == CSS_TOKEN_S) {
+               parserutils_vector_iterate(vector, ctx);
+               token = parserutils_vector_peek(vector, *ctx);
        }
 
        error = css__stylesheet_style_create(c->sheet, &calc_style);
@@ -1545,27 +1567,33 @@ css_error css__parse_calc(css_language *c,
                goto cleanup;
        
        error = css__stylesheet_style_append(calc_style, (css_code_t) unit);
+       if (error != CSS_OK)
+               goto cleanup;
 
        error = css__parse_calc_sum(c, vector, ctx, calc_style);
        if (error != CSS_OK)
                goto cleanup;
 
-       token = parserutils_vector_iterate(vector, ctx);
+       token = parserutils_vector_peek(vector, *ctx);
+       while (token->type == CSS_TOKEN_S) {
+               parserutils_vector_iterate(vector, ctx);
+               token = parserutils_vector_peek(vector, *ctx);
+       }
        if (!tokenIsChar(token, ')')) {
                /* If we don't get a close-paren, give up now */
                error = CSS_INVALID;
                goto cleanup;
        }
 
+       /* Swallow that close paren */
+       parserutils_vector_iterate(vector, ctx);
+
        /* Append the indicator that the calc is finished */
-       error = css__stylesheet_style_append(calc_style, (css_code_t) '=');
+       error = css__stylesheet_style_append(calc_style, (css_code_t) 
CALC_FINISH);
        if (error != CSS_OK)
                goto cleanup;
 
-       /* TODO: Once we're OK to do so, merge the style */
-       (void)result;
-       /* error = css__stylesheet_style_merge_style(result, calc_style); */
-
+       error = css__stylesheet_merge_style(result, calc_style);
 cleanup:
        css__stylesheet_style_destroy(calc_style);
        if (error != CSS_OK) {
diff --git a/test/data/parse2/INDEX b/test/data/parse2/INDEX
index 331cf5c..bb2a79b 100644
--- a/test/data/parse2/INDEX
+++ b/test/data/parse2/INDEX
@@ -23,3 +23,4 @@ multicol.dat                  Multi-column layout property 
tests
 flexbox.dat                    Flexbox properties and shorthands tests
 units.dat                      Length unit tests
 dodgy-media-block.dat          Media block with incomplete ruleset
+calc.dat                       calc() tests
diff --git a/test/data/parse2/calc.dat b/test/data/parse2/calc.dat
new file mode 100644
index 0000000..95abf6c
--- /dev/null
+++ b/test/data/parse2/calc.dat
@@ -0,0 +1,7 @@
+#data
+* { height: calc(50vh + 10px)}
+#errors
+#expected
+| *
+|  height: /* -> 0px */ calc(50vh 10px + =)
+#reset
\ No newline at end of file
diff --git a/test/dump.h b/test/dump.h
index 79819e0..852de84 100644
--- a/test/dump.h
+++ b/test/dump.h
@@ -638,6 +638,12 @@ static void dump_unit(css_fixed val, uint32_t unit, char 
**ptr)
        case UNIT_KHZ:
                *ptr += sprintf(*ptr, "kHz");
                break;
+       case UNIT_CALC_ANY:
+               *ptr += sprintf(*ptr, "any");
+               break;
+       case UNIT_CALC_NUMBER:
+               *ptr += sprintf(*ptr, "number");
+               break;
        }
 }
 
@@ -788,6 +794,45 @@ void dump_bytecode(css_style *style, char **ptr, uint32_t 
depth)
 
                if (isInherit(opv)) {
                        *ptr += sprintf(*ptr, "inherit");
+               } else if (isCalc(opv)) {
+                       /* First entry is a unit */
+                       uint32_t unit = *((uint32_t *)bytecode);
+                       ADVANCE(sizeof(unit));
+                       *ptr += sprintf(*ptr, "/* -> ");
+                       dump_unit(0, unit, ptr);
+                       *ptr += sprintf(*ptr, " */ calc(");
+                       css_code_t calc_opcode;
+                       while ((calc_opcode = *((css_code_t *)bytecode)) != 
CALC_FINISH) {
+                               ADVANCE(sizeof(calc_opcode));
+                               switch (calc_opcode) {
+                               case CALC_ADD:
+                                       *ptr += sprintf(*ptr, "+ ");
+                                       break;
+                               case CALC_SUBTRACT:
+                                       *ptr += sprintf(*ptr, "- ");
+                                       break;
+                               case CALC_MULTIPLY:
+                                       *ptr += sprintf(*ptr, "* ");
+                                       break;
+                               case CALC_DIVIDE:
+                                       *ptr += sprintf(*ptr, "/ ");
+                                       break;
+                               case CALC_PUSH_VALUE: {
+                                       css_fixed num = *((css_fixed 
*)bytecode);
+                                       ADVANCE(sizeof(num));
+                                       uint32_t unit = *((uint32_t *)bytecode);
+                                       ADVANCE(sizeof(unit));
+                                       dump_unit(num, unit, ptr);
+                                       *ptr += sprintf(*ptr, " ");
+                                       break;
+                               }
+                               default:
+                                       *ptr += sprintf(*ptr, "??%d ", 
calc_opcode);
+                                       break;
+                               }
+                       }
+                       ADVANCE(sizeof(calc_opcode));
+                       *ptr += sprintf(*ptr, "=)");
                } else {
                        value = getValue(opv);
 


commitdiff 
http://git.netsurf-browser.org/libcss.git/commit/?id=314d4ded8a89e891c191792894b660a853e0b8fe
commit 314d4ded8a89e891c191792894b660a853e0b8fe
Author: Michael Drake <Michael Drake [email protected]>
Commit: 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 7f5ea9d..041050f 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -65,6 +65,10 @@ typedef enum unit {
        UNIT_DPI  = (1 << 13) + 0,
        UNIT_DPCM = (1 << 13) + 1,
        UNIT_DPPX = (1 << 13) + 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 01ea25a..607c87b 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
@@ -532,26 +546,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
 };
@@ -561,10 +580,12 @@ enum op_opacity {
 };
 
 enum op_order {
+       ORDER_CALC                      = 0x007f,
        ORDER_SET                       = 0x0080
 };
 
 enum op_orphans {
+       ORPHANS_CALC                    = 0x007f,
        ORPHANS_SET                     = 0x0080
 };
 
@@ -603,6 +624,7 @@ enum op_overflow {
 };
 
 enum op_padding {
+       PADDING_CALC                    = 0x007f,
        PADDING_SET                     = 0x0080
 };
 
@@ -628,18 +650,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,
@@ -673,6 +699,7 @@ enum op_quotes {
 };
 
 enum op_richness {
+       RICHNESS_CALC                   = 0x007f,
        RICHNESS_SET                    = 0x0080
 };
 
@@ -703,6 +730,7 @@ enum op_speak {
 };
 
 enum op_speech_rate {
+       SPEECH_RATE_CALC                = 0x007f,
        SPEECH_RATE_SET                 = 0x0080,
 
        SPEECH_RATE_X_SLOW              = 0x0000,
@@ -715,6 +743,7 @@ enum op_speech_rate {
 };
 
 enum op_stress {
+       STRESS_CALC                     = 0x007f,
        STRESS_SET                      = 0x0080
 };
 
@@ -743,6 +772,7 @@ enum op_text_decoration {
 };
 
 enum op_text_indent {
+       TEXT_INDENT_CALC                = 0x007f,
        TEXT_INDENT_SET                 = 0x0080
 };
 
@@ -754,6 +784,7 @@ enum op_text_transform {
 };
 
 enum op_top {
+       TOP_CALC                        = BOTTOM_CALC,
        TOP_SET                         = BOTTOM_SET,
        TOP_AUTO                        = BOTTOM_AUTO
 };
@@ -765,6 +796,7 @@ enum op_unicode_bidi {
 };
 
 enum op_vertical_align {
+       VERTICAL_ALIGN_CALC             = 0x007f,
        VERTICAL_ALIGN_SET              = 0x0080,
 
        VERTICAL_ALIGN_BASELINE         = 0x0000,
@@ -795,6 +827,7 @@ enum op_voice_family {
 };
 
 enum op_volume {
+       VOLUME_CALC                     = 0x007f,
        VOLUME_NUMBER                   = 0x0080,
        VOLUME_DIMENSION                = 0x0081,
 
@@ -815,16 +848,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
@@ -837,6 +873,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 3d88cef..1cdb27f 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"
@@ -501,6 +520,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) {
@@ -533,6 +553,7 @@ int main(int argc, char **argv)
        COLOR.count = 0;
        LENGTH_UNIT.count = 0;
        IDENT_LIST.count = 0;
+       CALC.count = 0;
 
        curlist = &base;
 
@@ -548,7 +569,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] == ')') {
@@ -579,6 +600,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;
@@ -602,7 +631,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);
@@ -616,6 +645,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 e729285..9830ce4 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 
MASK:UNIT_MASK_FONT_SIZE 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 MASK:UNIT_MASK_FONT_SIZE 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 MASK:UNIT_MASK_HEIGHT 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 
MASK:UNIT_MASK_HEIGHT 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 
MASK:UNIT_MASK_LETTER_SPACING 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 MASK:UNIT_MASK_LETTER_SPACING 
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 MASK:UNIT_MASK_LINE_HEIGHT 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 
MASK:UNIT_MASK_LINE_HEIGHT 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 MASK:UNIT_MASK_MAX_HEIGHT 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 
MASK:UNIT_MASK_MAX_HEIGHT 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 MASK:UNIT_MASK_MAX_WIDTH 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 
MASK:UNIT_MASK_MAX_WIDTH 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 MASK:UNIT_MASK_MIN_HEIGHT 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 
MASK:UNIT_MASK_MIN_HEIGHT 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 MASK:UNIT_MASK_MIN_WIDTH 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 
MASK:UNIT_MASK_MIN_WIDTH 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 
MASK:UNIT_MASK_PADDING_SIDE RANGE:<0 LENGTH_UNIT:)
+padding_side:op GENERIC: IDENT:INHERIT CALC:( UNIT_PX:PADDING_CALC CALC:) 
LENGTH_UNIT:( UNIT_PX:PADDING_SET MASK:UNIT_MASK_PADDING_SIDE 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 MASK:UNIT_MASK_MARGIN_SIDE 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 
MASK:UNIT_MASK_MARGIN_SIDE 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 ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
+side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) CALC:( 
UNIT_PX:BOTTOM_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET 
ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) 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 MASK:UNIT_MASK_BORDER_SIDE_WIDTH 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 
MASK:UNIT_MASK_BORDER_SIDE_WIDTH 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 MASK:UNIT_MASK_PAUSE_AFTER 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 MASK:UNIT_MASK_PAUSE_AFTER RANGE:<0 
LENGTH_UNIT:)
 
-pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT LENGTH_UNIT:( 
UNIT_S:PAUSE_BEFORE_SET MASK:UNIT_MASK_PAUSE_BEFORE 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 
MASK:UNIT_MASK_PAUSE_BEFORE 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 MASK:UNIT_MASK_PITCH 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 
MASK:UNIT_MASK_PITCH 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,37 +167,35 @@ 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 MASK:UNIT_MASK_TEXT_INDENT LENGTH_UNIT:)
+text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT CALC:( UNIT_PX:TEXT_INDENT_CALC 
CALC:) LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET MASK:UNIT_MASK_TEXT_INDENT 
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 MASK:UNIT_MASK_VERTICAL_ALIGN 
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 MASK:UNIT_MASK_VERTICAL_ALIGN 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 
MASK:UNIT_MASK_VOLUME 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 MASK:UNIT_MASK_VOLUME 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:)
-
-
-width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) LENGTH_UNIT:( 
UNIT_PX:WIDTH_SET MASK:UNIT_MASK_WIDTH RANGE:<0 LENGTH_UNIT:)
+widows:CSS_PROP_WIDOWS IDENT:INHERIT CALC:( NUMBER:WIDOWS_CALC CALC:) NUMBER:( 
true:WIDOWS_SET RANGE:num<0 NUMBER:)
 
-word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: 
NORMAL:0,WORD_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET 
MASK:UNIT_MASK_WORD_SPACING 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 MASK:UNIT_MASK_WIDTH 
RANGE:<0 LENGTH_UNIT:)
 
-z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) NUMBER:( 
true:Z_INDEX_SET NUMBER:)
+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 MASK:UNIT_MASK_WORD_SPACING LENGTH_UNIT:)
 
+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 +203,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 MASK:UNIT_MASK_COLUMN_GAP 
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 MASK:UNIT_MASK_COLUMN_GAP LENGTH_UNIT:)
 
 column_rule_color:CSS_PROP_COLUMN_RULE_COLOR IDENT:( INHERIT: IDENT:) 
COLOR:COLUMN_RULE_COLOR_SET
 
@@ -212,7 +217,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 MASK:UNIT_MASK_COLUMN_WIDTH 
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 MASK:UNIT_MASK_COLUMN_WIDTH 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 +229,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 
MASK:UNIT_MASK_FLEX_BASIS 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 MASK:UNIT_MASK_FLEX_BASIS 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 4739486..cce9717 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;
 


commitdiff 
http://git.netsurf-browser.org/libcss.git/commit/?id=0933e7f8717bdbac3b91debff44ec86afaf1ec84
commit 0933e7f8717bdbac3b91debff44ec86afaf1ec84
Author: Daniel Silverstone <[email protected]>
Commit: Michael Drake <[email protected]>

    parse: Add calc() parser.
    
    Co-authored-by: Michael Drake <[email protected]>

diff --git a/src/parse/properties/css_property_parser_gen.c 
b/src/parse/properties/css_property_parser_gen.c
index 24cc536..3d88cef 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -296,6 +296,16 @@ void output_length_unit(FILE *outputf, struct keyval 
*parseid, struct keyval_lis
        struct keyval *ckv = kvlist->item[0];
        int ident_count;
 
+       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} else ",
+               parseid->val,
+               ckv->val,
+               ckv->key
+       );
 
        fprintf(outputf,
                "{\n"
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index 1e184f8..4739486 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -1333,3 +1333,269 @@ cleanup:
 
        return error;
 }
+
+/******************************************************************************/
+
+/* CALC
+ *
+ * calc( <calc-sum> )
+ *
+ * where
+ * <calc-sum> = <calc-product> [ [ '+' | '-' ] <calc-product> ]*
+ *
+ * where
+ * <calc-product> = <calc-value> [ '*' <calc-value> | '/' <number> ]*
+ *
+ * where
+ * <calc-value> = <number> | <dimension> | <percentage> | ( <calc-sum> )
+ *
+ *
+ * calc(10px + (4rem / 2)) =>
+ *   U 10 px
+ *   U 4 rem
+ *   N 2
+ *   /
+ *   +
+ *   =
+ */
+
+static css_error
+css__parse_calc_sum(css_language *c,
+               const parserutils_vector *vector, int *ctx,
+               css_style *result,
+               uint32_t unit);
+
+static css_error
+css__parse_calc_value(css_language *c,
+               const parserutils_vector *vector, int *ctx,
+               css_style *result,
+               uint32_t default_unit)
+{
+       css_error error;
+       int orig_ctx = *ctx;
+       const css_token *token;
+
+       token = parserutils_vector_iterate(vector, ctx);
+       if (tokenIsChar(token, '(')) {
+               error = css__parse_calc_sum(c, vector, ctx, result, 
default_unit);
+               if (error != CSS_OK) {
+                       return error;
+               }
+
+               token = parserutils_vector_peek(vector, *ctx);
+               if (!tokenIsChar(token, ')')) {
+                       return CSS_INVALID;
+               }
+
+       } else switch (token->type) {
+       case CSS_TOKEN_NUMBER:    /* Fall through */
+       case CSS_TOKEN_DIMENSION: /* Fall through */
+       case CSS_TOKEN_PERCENTAGE:
+       {
+               css_fixed length = 0;
+               uint32_t unit = 0;
+               *ctx = orig_ctx;
+
+               error = css__parse_unit_specifier(c, vector, ctx, default_unit, 
&length, &unit);
+               if (error != CSS_OK) {
+                       *ctx = orig_ctx;
+                       return error;
+               }
+
+               error = css__stylesheet_style_vappend(result, 3, (css_code_t) 
'U', length, unit);
+       }
+               break;
+
+       default:
+               error = CSS_INVALID;
+               break;
+       }
+
+       return error;
+}
+
+/* Both this, and css_parse_calc_sum must stop when it encounters a 
close-paren.
+ * If it hasn't had any useful tokens before that, it's an error.  It does not
+ * need to restore ctx before returning an error but it does need to ensure 
that
+ * the close paren has not been consumed
+ */
+static css_error
+css__parse_calc_product(css_language *c,
+               const parserutils_vector *vector, int *ctx,
+               css_style *result,
+               uint32_t unit)
+{
+       css_error error = CSS_OK;
+       const css_token *token;
+       bool multiplication;
+
+
+       /* First parse a value */
+       error = css__parse_calc_value(c, vector, ctx, result, unit);
+       if (error != CSS_OK) {
+               return error;
+       }
+
+       do {
+               /* What is our next token? */
+               token = parserutils_vector_peek(vector, *ctx);
+               if (token == NULL) {
+                       error = CSS_INVALID;
+                       break;
+               } else if (tokenIsChar(token, ')'))
+                       break;
+               else if (tokenIsChar(token, '*'))
+                       multiplication = true;
+               else if (tokenIsChar(token, '/'))
+                       multiplication = false;
+               else {
+                       error = CSS_INVALID;
+                       break;
+               }
+               /* 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;
+               }
+
+               /* emit the multiplication/division operator */
+               error = css__stylesheet_style_append(result, (css_code_t) 
(multiplication ? '*' : '/'));
+       } while (1);
+       /* We've fallen off, either we had an error or we're left with ')' */
+       return error;
+}
+
+
+css_error
+css__parse_calc_sum(css_language *c,
+               const parserutils_vector *vector, int *ctx,
+               css_style *result,
+               uint32_t unit)
+{
+       css_error error = CSS_OK;
+       const css_token *token;
+       bool addition;
+
+
+       /* First parse a product */
+       error = css__parse_calc_product(c, vector, ctx, result, unit);
+       if (error != CSS_OK) {
+               return error;
+       }
+
+       do {
+               /* What is our next token? */
+               token = parserutils_vector_peek(vector, *ctx);
+               if (token == NULL) {
+                       error = CSS_INVALID;
+                       break;
+               } else if (tokenIsChar(token, ')'))
+                       break;
+               else if (tokenIsChar(token, '+'))
+                       addition = true;
+               else if (tokenIsChar(token, '-'))
+                       addition = false;
+               else {
+                       error = CSS_INVALID;
+                       break;
+               }
+               /* Consume that + or - now */
+               token = parserutils_vector_iterate(vector, ctx);
+
+               /* parse another product */
+               error = css__parse_calc_product(c, vector, ctx, result, unit);
+               if (error != CSS_OK)
+                       break;
+
+               /* emit the addition/subtraction operator */
+               error = css__stylesheet_style_append(result, (css_code_t) 
(addition ? '+' : '-'));
+       } while (1);
+       /* We've fallen off, either we had an error or we're left with ')' */
+       return error;
+}
+
+/* Documented in utils.h */
+css_error css__parse_calc(css_language *c,
+               const parserutils_vector *vector, int *ctx,
+               css_style *result,
+               css_code_t property,
+               uint32_t unit)
+{
+       int orig_ctx = *ctx;
+       const css_token *token;
+       css_error error = CSS_OK;
+       css_style *calc_style = NULL;
+
+       token = parserutils_vector_iterate(vector, ctx);
+       if (token == NULL) {
+               *ctx = orig_ctx;
+               return CSS_INVALID;
+       }
+
+       if (!tokenIsChar(token, '(')) {
+               /* If we don't get an open-paren, give up now */
+               *ctx = orig_ctx;
+               return CSS_INVALID;
+       }
+
+       error = css__stylesheet_style_create(c->sheet, &calc_style);
+       if (error != CSS_OK)
+               goto cleanup;
+
+       error = css__stylesheet_style_append(calc_style, property);
+       if (error != CSS_OK)
+               goto cleanup;
+
+       error = css__parse_calc_sum(c, vector, ctx, calc_style, unit);
+       if (error != CSS_OK)
+               goto cleanup;
+
+       token = parserutils_vector_iterate(vector, ctx);
+       if (!tokenIsChar(token, ')')) {
+               /* If we don't get a close-paren, give up now */
+               error = CSS_INVALID;
+               goto cleanup;
+       }
+
+       /* Append the indicator that the calc is finished */
+       error = css__stylesheet_style_append(calc_style, (css_code_t) '=');
+       if (error != CSS_OK)
+               goto cleanup;
+
+       /* TODO: Once we're OK to do so, merge the style */
+       (void)result;
+       /* error = css__stylesheet_style_merge_style(result, calc_style); */
+
+cleanup:
+       css__stylesheet_style_destroy(calc_style);
+       if (error != CSS_OK) {
+               *ctx = orig_ctx;
+       }
+
+       return error;
+}
diff --git a/src/parse/properties/utils.h b/src/parse/properties/utils.h
index e4c97c7..e5331d2 100644
--- a/src/parse/properties/utils.h
+++ b/src/parse/properties/utils.h
@@ -199,4 +199,28 @@ css_error css__comma_list_to_style(css_language *c,
                                bool first),
                css_style *result);
 
+/**
+ * Parse a CSS calc() invocation
+ *
+ * Calc can generate a number of kinds of units, so we have to tell the
+ * parser the kind of unit we're aiming for (e.g. UNIT_PX, UNIT_ANGLE, etc.)
+ *
+ * \param[in] c        Parsing context
+ * \param[in] vector   Vector of tokens to process
+ * \param[in] ctx      Pointer to vector iteration context
+ * \param[in] result   Pointer to location to receive resulting style
+ * \param[in] property The CSS property we are calculating for
+ * \param[in] unit     The kind of unit which we want to come out of this 
calc()
+ * \return CSS_OK on success,
+ *         CSS_NOMEM on memory exhaustion,
+           CSS_INVALID if the input is not valid
+ *
+ * Post condition: \a *ctx is updated with the next token to process
+ *                 If the input is invalid, then \a *ctx remains unchanged.
+ */
+css_error css__parse_calc(css_language *c,
+               const parserutils_vector *vector, int *ctx,
+               css_style *result,
+               css_code_t property,
+               uint32_t unit);
 #endif
diff --git a/src/parse/propstrings.c b/src/parse/propstrings.c
index 7d723e1..b102be9 100644
--- a/src/parse/propstrings.c
+++ b/src/parse/propstrings.c
@@ -484,6 +484,7 @@ const stringmap_entry stringmap[LAST_KNOWN] = {
        SMAP("or"),
        SMAP("only"),
        SMAP("infinite"),
+       SMAP("calc"),
 
        SMAP("aliceblue"),
        SMAP("antiquewhite"),
diff --git a/src/parse/propstrings.h b/src/parse/propstrings.h
index fd24a47..a098202 100644
--- a/src/parse/propstrings.h
+++ b/src/parse/propstrings.h
@@ -108,7 +108,7 @@ enum {
        AVOID_PAGE, AVOID_COLUMN, BALANCE, HORIZONTAL_TB, VERTICAL_RL,
        VERTICAL_LR, CONTENT_BOX, BORDER_BOX, STRETCH, INLINE_FLEX, FLEX_START,
        FLEX_END, SPACE_BETWEEN, SPACE_AROUND, SPACE_EVENLY, ROW, ROW_REVERSE,
-       COLUMN_REVERSE, WRAP_STRING, WRAP_REVERSE, AND, OR, ONLY, INFINITE,
+       COLUMN_REVERSE, WRAP_STRING, WRAP_REVERSE, AND, OR, ONLY, INFINITE, 
CALC,
 
        /* Named colours */
        FIRST_COLOUR,


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

Summary of changes:


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

Reply via email to