From ddeadd1c02880367ad786b113d352a519f45ec73 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Thu, 23 Jul 2009 23:05:34 +0000 Subject: Merge LibCSS port to trunk. svn path=/trunk/netsurf/; revision=8752 --- css/internal.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 css/internal.c (limited to 'css/internal.c') diff --git a/css/internal.c b/css/internal.c new file mode 100644 index 000000000..fd22af628 --- /dev/null +++ b/css/internal.c @@ -0,0 +1,82 @@ +/* + * Copyright 2009 John-Mark Bell + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include "css/internal.h" + +#include "utils/url.h" + +/** + * URL resolution callback for libcss + * + * \param pw Resolution context + * \param ctx Dictionary to intern result in + * \param base Base URI + * \param rel Relative URL + * \param abs Pointer to location to receive resolved URL + * \return CSS_OK on success, + * CSS_NOMEM on memory exhaustion, + * CSS_INVALID if resolution failed. + */ +css_error nscss_resolve_url(void *pw, lwc_context *ctx, + const char *base, lwc_string *rel, lwc_string **abs) +{ + lwc_error lerror; + char *rel_url, *abs_url, *norm_url; + url_func_result res; + + /* Copy relative URL and ensure it's NUL terminated */ + rel_url = malloc(lwc_string_length(rel) + 1); + if (rel_url == NULL) + return CSS_NOMEM; + + memcpy(rel_url, lwc_string_data(rel), lwc_string_length(rel)); + rel_url[lwc_string_length(rel)] = '\0'; + + /* Resolve URI */ + res = url_join(rel_url, base, &abs_url); + if (res != URL_FUNC_OK) { + free(rel_url); + return res == URL_FUNC_NOMEM ? CSS_NOMEM : CSS_INVALID; + } + + free(rel_url); + + /* Normalise it */ + res = url_normalize(abs_url, &norm_url); + if (res != URL_FUNC_OK) { + free(abs_url); + return res == URL_FUNC_NOMEM ? CSS_NOMEM : CSS_INVALID; + } + + free(abs_url); + + /* Intern it */ + lerror = lwc_context_intern(ctx, norm_url, strlen(norm_url), abs); + if (lerror != lwc_error_ok) { + *abs = NULL; + free(norm_url); + return lerror == lwc_error_oom ? CSS_NOMEM : CSS_INVALID; + } + + free(norm_url); + + return CSS_OK; +} + -- cgit v1.2.3