summaryrefslogtreecommitdiff
path: root/src/parse/properties/text.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-08-21 09:45:13 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-08-21 09:45:13 +0000
commit5c20bde8b544d23fd024dad7ace9b46849336ebf (patch)
tree07dc508d51d281b7553e471a42ba3684018fe512 /src/parse/properties/text.c
parent5bd907c74151d0bbe1859c37cb2bde898ab72e2f (diff)
downloadlibcss-5c20bde8b544d23fd024dad7ace9b46849336ebf.tar.gz
libcss-5c20bde8b544d23fd024dad7ace9b46849336ebf.tar.bz2
-libcss-align
svn path=/trunk/libcss/; revision=9378
Diffstat (limited to 'src/parse/properties/text.c')
-rw-r--r--src/parse/properties/text.c78
1 files changed, 78 insertions, 0 deletions
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;
+}
+