summaryrefslogtreecommitdiff
path: root/src/parse/properties
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse/properties')
-rw-r--r--src/parse/properties/properties.c1
-rw-r--r--src/parse/properties/properties.h3
-rw-r--r--src/parse/properties/text.c78
3 files changed, 82 insertions, 0 deletions
diff --git a/src/parse/properties/properties.c b/src/parse/properties/properties.c
index 0f555e1..0cde6c6 100644
--- a/src/parse/properties/properties.c
+++ b/src/parse/properties/properties.c
@@ -127,5 +127,6 @@ const css_prop_handler property_handlers[LAST_PROP + 1 - FIRST_PROP] =
parse_width,
parse_word_spacing,
parse_z_index,
+ parse_libcss_align
};
diff --git a/src/parse/properties/properties.h b/src/parse/properties/properties.h
index 0dc750a..dd96ac3 100644
--- a/src/parse/properties/properties.h
+++ b/src/parse/properties/properties.h
@@ -367,6 +367,9 @@ css_error parse_word_spacing(css_language *c,
css_error parse_z_index(css_language *c,
const parserutils_vector *vector, int *ctx,
css_style **result);
+css_error parse_libcss_align(css_language *c,
+ const parserutils_vector *vector, int *ctx,
+ css_style **result);
#endif
diff --git a/src/parse/properties/text.c b/src/parse/properties/text.c
index 61ce60b..d3c81b5 100644
--- a/src/parse/properties/text.c
+++ b/src/parse/properties/text.c
@@ -850,3 +850,81 @@ css_error parse_word_spacing(css_language *c,
return CSS_OK;
}
+/**
+ * Parse -libcss-align
+ *
+ * \param c Parsing context
+ * \param vector Vector of tokens to process
+ * \param ctx Pointer to vector iteration context
+ * \param result Pointer to location to receive resulting style
+ * \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 parse_libcss_align(css_language *c,
+ const parserutils_vector *vector, int *ctx,
+ css_style **result)
+{
+ int orig_ctx = *ctx;
+ css_error error;
+ const css_token *ident;
+ uint8_t flags = 0;
+ uint16_t value = 0;
+ uint32_t opv;
+ bool match;
+
+ /* IDENT (left, right, center, justify, inherit) */
+ ident = parserutils_vector_iterate(vector, ctx);
+ if (ident == NULL || ident->type != CSS_TOKEN_IDENT) {
+ *ctx = orig_ctx;
+ return CSS_INVALID;
+ }
+
+ if ((lwc_context_string_caseless_isequal(
+ c->sheet->dictionary,
+ ident->idata, c->strings[INHERIT],
+ &match) == lwc_error_ok && match)) {
+ flags |= FLAG_INHERIT;
+ } else if ((lwc_context_string_caseless_isequal(
+ c->sheet->dictionary,
+ ident->idata, c->strings[LEFT],
+ &match) == lwc_error_ok && match)) {
+ value = LIBCSS_ALIGN_LEFT;
+ } else if ((lwc_context_string_caseless_isequal(
+ c->sheet->dictionary,
+ ident->idata, c->strings[RIGHT],
+ &match) == lwc_error_ok && match)) {
+ value = LIBCSS_ALIGN_RIGHT;
+ } else if ((lwc_context_string_caseless_isequal(
+ c->sheet->dictionary,
+ ident->idata, c->strings[CENTER],
+ &match) == lwc_error_ok && match)) {
+ value = LIBCSS_ALIGN_CENTER;
+ } else if ((lwc_context_string_caseless_isequal(
+ c->sheet->dictionary,
+ ident->idata, c->strings[JUSTIFY],
+ &match) == lwc_error_ok && match)) {
+ value = LIBCSS_ALIGN_JUSTIFY;
+ } else {
+ *ctx = orig_ctx;
+ return CSS_INVALID;
+ }
+
+ opv = buildOPV(CSS_PROP_LIBCSS_ALIGN, flags, value);
+
+ /* Allocate result */
+ error = css_stylesheet_style_create(c->sheet, sizeof(opv), result);
+ if (error != CSS_OK) {
+ *ctx = orig_ctx;
+ return error;
+ }
+
+ /* Copy the bytecode to it */
+ memcpy((*result)->bytecode, &opv, sizeof(opv));
+
+ return CSS_OK;
+}
+