diff options
-rw-r--r-- | include/libcss/select.h | 36 | ||||
-rw-r--r-- | include/libcss/types.h | 4 | ||||
-rw-r--r-- | src/select/Makefile | 2 | ||||
-rw-r--r-- | src/select/select.c | 220 |
4 files changed, 261 insertions, 1 deletions
diff --git a/include/libcss/select.h b/include/libcss/select.h new file mode 100644 index 0000000..08a9a64 --- /dev/null +++ b/include/libcss/select.h @@ -0,0 +1,36 @@ +/* + * This file is part of LibCSS + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2009 John-Mark Bell <jmb@netsurf-browser.org> + */ + +#ifndef libcss_select_h_ +#define libcss_select_h_ + +#include <libcss/errors.h> +#include <libcss/functypes.h> +#include <libcss/types.h> + +css_error css_select_ctx_create(css_alloc alloc, void *pw, + css_select_ctx **result); +css_error css_select_ctx_destroy(css_select_ctx *ctx); + +css_error css_select_ctx_append_sheet(css_select_ctx *ctx, + const css_stylesheet *sheet); +css_error css_select_ctx_insert_sheet(css_select_ctx *ctx, + const css_stylesheet *sheet, uint32_t index); +css_error css_select_ctx_remove_sheet(css_select_ctx *ctx, + const css_stylesheet *sheet); + +css_error css_select_ctx_count_sheets(css_select_ctx *ctx, uint32_t *count); +css_error css_select_ctx_get_sheet(css_select_ctx *ctx, uint32_t index, + const css_stylesheet **sheet); + +css_error css_select_style(css_select_ctx *ctx, void *node, + uint32_t pseudo_classes, uint32_t media, + css_computed_style **result); + +/* css_error css_computed_style_destroy(css_computed_style *style); */ + +#endif diff --git a/include/libcss/types.h b/include/libcss/types.h index f095f1c..fddbc51 100644 --- a/include/libcss/types.h +++ b/include/libcss/types.h @@ -63,4 +63,8 @@ typedef struct css_string { typedef struct css_stylesheet css_stylesheet; +typedef struct css_select_ctx css_select_ctx; + +typedef struct css_computed_style css_computed_style; + #endif diff --git a/src/select/Makefile b/src/select/Makefile index 645c97e..7a2c25d 100644 --- a/src/select/Makefile +++ b/src/select/Makefile @@ -35,7 +35,7 @@ d := $(DIR) CFLAGS := $(CFLAGS) -I$(d) # Sources -SRCS_$(d) := hash.c +SRCS_$(d) := hash.c select.c # Append to sources for component SOURCES += $(addprefix $(d), $(SRCS_$(d))) diff --git a/src/select/select.c b/src/select/select.c new file mode 100644 index 0000000..a8acd7a --- /dev/null +++ b/src/select/select.c @@ -0,0 +1,220 @@ +/* + * This file is part of LibCSS + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2009 John-Mark Bell <jmb@netsurf-browser.org> + */ + +#include <string.h> + +#include <libcss/select.h> + +#include "stylesheet.h" +#include "select/hash.h" +#include "utils/utils.h" + +/** + * CSS selection context + */ +struct css_select_ctx { + uint32_t n_sheets; /**< Number of sheets */ + + const css_stylesheet **sheets; /**< Array of sheets */ + + css_alloc alloc; /**< Allocation routine */ + void *pw; /**< Client-specific private data */ +}; + +/** + * Create a selection context + * + * \param alloc Memory (de)allocation function + * \param pw Client-specific private data + * \param result Pointer to location to receive created context + * \return CSS_OK on success, appropriate error otherwise. + */ +css_error css_select_ctx_create(css_alloc alloc, void *pw, + css_select_ctx **result) +{ + css_select_ctx *c; + + if (alloc == NULL || result == NULL) + return CSS_BADPARM; + + c = alloc(NULL, sizeof(css_select_ctx), pw); + if (c == NULL) + return CSS_NOMEM; + + c->n_sheets = 0; + c->sheets = NULL; + + c->alloc = alloc; + c->pw = pw; + + *result = c; + + return CSS_OK; +} + +/** + * Destroy a selection context + * + * \param ctx The context to destroy + * \return CSS_OK on success, appropriate error otherwise + */ +css_error css_select_ctx_destroy(css_select_ctx *ctx) +{ + if (ctx == NULL) + return CSS_BADPARM; + + if (ctx->sheets != NULL) + ctx->alloc(ctx->sheets, 0, ctx->pw); + + ctx->alloc(ctx, 0, ctx->pw); + + return CSS_OK; +} + +/** + * Append a stylesheet to a selection context + * + * \param ctx The context to append to + * \param sheet The sheet to append + * \return CSS_OK on success, appropriate error otherwise + */ +css_error css_select_ctx_append_sheet(css_select_ctx *ctx, + const css_stylesheet *sheet) +{ + if (ctx == NULL || sheet == NULL) + return CSS_BADPARM; + + return css_select_ctx_insert_sheet(ctx, sheet, ctx->n_sheets); +} + +/** + * Insert a stylesheet into a selection context + * + * \param ctx The context to insert into + * \param sheet Sheet to insert + * \param index Index in context to insert sheet + * \return CSS_OK on success, appropriate error otherwise + */ +css_error css_select_ctx_insert_sheet(css_select_ctx *ctx, + const css_stylesheet *sheet, uint32_t index) +{ + const css_stylesheet **temp; + + if (ctx == NULL || sheet == NULL) + return CSS_BADPARM; + + /* Index must be in the range [0, n_sheets] + * The latter being equivalent to append */ + if (index > ctx->n_sheets) + return CSS_INVALID; + + temp = ctx->alloc(ctx->sheets, + (ctx->n_sheets + 1) * sizeof(css_stylesheet *), + ctx->pw); + if (temp == NULL) + return CSS_NOMEM; + + ctx->sheets = temp; + + if (index < ctx->n_sheets) { + memmove(&ctx->sheets[index + 1], &ctx->sheets[index], + (ctx->n_sheets - index) * sizeof(css_stylesheet *)); + } + + ctx->sheets[index] = sheet; + + ctx->n_sheets++; + + return CSS_OK; +} + +/** + * Remove a sheet from a selection context + * + * \param ctx The context to remove from + * \param sheet Sheet to remove + * \return CSS_OK on success, appropriate error otherwise + */ +css_error css_select_ctx_remove_sheet(css_select_ctx *ctx, + const css_stylesheet *sheet) +{ + uint32_t index; + + if (ctx == NULL || sheet == NULL) + return CSS_BADPARM; + + for (index = 0; index < ctx->n_sheets; index++) { + if (ctx->sheets[index] == sheet) + break; + } + + if (index == ctx->n_sheets) + return CSS_INVALID; + + memmove(&ctx->sheets[index], &ctx->sheets[index + 1], + (ctx->n_sheets - index) * sizeof(css_stylesheet *)); + + ctx->n_sheets--; + + return CSS_OK; + +} + +/** + * Count the number of top-level sheets in a selection context + * + * \param ctx Context to consider + * \param count Pointer to location to receive count of sheets + * \return CSS_OK on success, appropriate error otherwise + */ +css_error css_select_ctx_count_sheets(css_select_ctx *ctx, uint32_t *count) +{ + if (ctx == NULL || count == NULL) + return CSS_BADPARM; + + *count = ctx->n_sheets; + + return CSS_OK; +} + +/** + * Retrieve a sheet from a selection context + * + * \param ctx Context to look in + * \param index Index in context to look + * \param sheet Pointer to location to receive sheet + * \return CSS_OK on success, appropriate error otherwise + */ +css_error css_select_ctx_get_sheet(css_select_ctx *ctx, uint32_t index, + const css_stylesheet **sheet) +{ + if (ctx == NULL || sheet == NULL) + return CSS_BADPARM; + + if (index > ctx->n_sheets) + return CSS_INVALID; + + *sheet = ctx->sheets[index]; + + return CSS_OK; +} + +css_error css_select_style(css_select_ctx *ctx, void *node, + uint32_t pseudo_classes, uint32_t media, + css_computed_style **result) +{ + UNUSED(ctx); + UNUSED(node); + UNUSED(pseudo_classes); + UNUSED(media); + UNUSED(result); + + /** \todo implement */ + + return CSS_OK; +} + |