/* * This file is part of LibCSS. * Licensed under the MIT License, * http://www.opensource.org/licenses/mit-license.php * Copyright 2009 John-Mark Bell */ #include #include "bytecode/bytecode.h" #include "bytecode/opcodes.h" #include "parse/properties/properties.h" #include "parse/properties/utils.h" css_error parse_caption_side(css_language *c, const parserutils_vector *vector, int *ctx, css_style **result) { css_error error; const css_token *ident; uint8_t flags = 0; uint16_t value = 0; uint32_t opv; /* IDENT (top, bottom, inherit) */ ident = parserutils_vector_iterate(vector, ctx); if (ident == NULL || ident->type != CSS_TOKEN_IDENT) return CSS_INVALID; error = parse_important(c, vector, ctx, &flags); if (error != CSS_OK) return error; if (ident->ilower == c->strings[INHERIT]) { flags |= FLAG_INHERIT; } else if (ident->ilower == c->strings[TOP]) { value = CAPTION_SIDE_TOP; } else if (ident->ilower == c->strings[BOTTOM]) { value = CAPTION_SIDE_BOTTOM; } else return CSS_INVALID; opv = buildOPV(CSS_PROP_CAPTION_SIDE, flags, value); /* Allocate result */ error = css_stylesheet_style_create(c->sheet, sizeof(opv), result); if (error != CSS_OK) return error; /* Copy the bytecode to it */ memcpy((*result)->bytecode, &opv, sizeof(opv)); return CSS_OK; } css_error parse_empty_cells(css_language *c, const parserutils_vector *vector, int *ctx, css_style **result) { css_error error; const css_token *ident; uint8_t flags = 0; uint16_t value = 0; uint32_t opv; /* IDENT (show, hide, inherit) */ ident = parserutils_vector_iterate(vector, ctx); if (ident == NULL || ident->type != CSS_TOKEN_IDENT) return CSS_INVALID; error = parse_important(c, vector, ctx, &flags); if (error != CSS_OK) return error; if (ident->ilower == c->strings[INHERIT]) { flags |= FLAG_INHERIT; } else if (ident->ilower == c->strings[SHOW]) { value = EMPTY_CELLS_SHOW; } else if (ident->ilower == c->strings[HIDE]) { value = EMPTY_CELLS_HIDE; } else return CSS_INVALID; opv = buildOPV(CSS_PROP_EMPTY_CELLS, flags, value); /* Allocate result */ error = css_stylesheet_style_create(c->sheet, sizeof(opv), result); if (error != CSS_OK) return error; /* Copy the bytecode to it */ memcpy((*result)->bytecode, &opv, sizeof(opv)); return CSS_OK; } css_error parse_table_layout(css_language *c, const parserutils_vector *vector, int *ctx, css_style **result) { css_error error; const css_token *ident; uint8_t flags = 0; uint16_t value = 0; uint32_t opv; /* IDENT (auto, fixed, inherit) */ ident = parserutils_vector_iterate(vector, ctx); if (ident == NULL || ident->type != CSS_TOKEN_IDENT) return CSS_INVALID; error = parse_important(c, vector, ctx, &flags); if (error != CSS_OK) return error; if (ident->ilower == c->strings[INHERIT]) { flags |= FLAG_INHERIT; } else if (ident->ilower == c->strings[AUTO]) { value = TABLE_LAYOUT_AUTO; } else if (ident->ilower == c->strings[FIXED]) { value = TABLE_LAYOUT_FIXED; } else return CSS_INVALID; opv = buildOPV(CSS_PROP_TABLE_LAYOUT, flags, value); /* Allocate result */ error = css_stylesheet_style_create(c->sheet, sizeof(opv), result); if (error != CSS_OK) return error; /* Copy the bytecode to it */ memcpy((*result)->bytecode, &opv, sizeof(opv)); return CSS_OK; }