Function for adding fragment onto nsurl.

svn path=/trunk/netsurf/; revision=13087
This commit is contained in:
Michael Drake 2011-10-28 19:18:14 +00:00
parent 110ba21d52
commit a112bfb676
2 changed files with 79 additions and 1 deletions

View File

@ -1691,3 +1691,63 @@ nserror nsurl_defragment(const nsurl *url, nsurl **no_frag)
return NSERROR_OK;
}
/* exported interface, documented in nsurl.h */
nserror nsurl_refragment(const nsurl *url, lwc_string *frag, nsurl **new_url)
{
int frag_len;
int base_len;
char *pos;
assert(url != NULL);
assert(frag != NULL);
/* Create NetSurf URL object */
*new_url = malloc(sizeof(nsurl));
if (*new_url == NULL) {
return NSERROR_NOMEM;
}
/* Find the change in length from url to new_url */
base_len = url->length;
if (url->fragment != NULL) {
base_len -= 1 + lwc_string_length(url->fragment);
}
frag_len = lwc_string_length(frag);
/* Set new_url's length */
(*new_url)->length = base_len + 1 /* # */ + frag_len;
/* Create new_url's url string */
(*new_url)->string = malloc((*new_url)->length + 1 /* \0 */);
if ((*new_url)->string == NULL) {
free(*new_url);
*new_url = NULL;
return NSERROR_NOMEM;
}
/* Set string */
pos = (*new_url)->string;
memcpy(pos, url->string, base_len);
pos += base_len;
*pos = '#';
memcpy(++pos, lwc_string_data(frag), frag_len);
pos += frag_len;
*pos = '\0';
/* Copy components */
(*new_url)->scheme = nsurl__component_copy(url->scheme);
(*new_url)->username = nsurl__component_copy(url->username);
(*new_url)->password = nsurl__component_copy(url->password);
(*new_url)->host = nsurl__component_copy(url->host);
(*new_url)->port = nsurl__component_copy(url->port);
(*new_url)->path = nsurl__component_copy(url->path);
(*new_url)->query = nsurl__component_copy(url->query);
(*new_url)->fragment = lwc_string_ref(frag);
/* Give the URL a reference */
(*new_url)->count = 1;
return NSERROR_OK;
}

View File

@ -212,7 +212,7 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined);
/**
* Create a NetSurf URL object without a fragment from a NetSurf URL
*
* \param base NetSurf URL to create new NetSurf URL from
* \param url NetSurf URL to create new NetSurf URL from
* \param no_frag Returns new NetSurf URL without fragment
* \return NSERROR_OK on success, appropriate error otherwise
*
@ -223,4 +223,22 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined);
*/
nserror nsurl_defragment(const nsurl *url, nsurl **no_frag);
/**
* Create a NetSurf URL object, adding a fragment to an existing URL object
*
* \param url NetSurf URL to create new NetSurf URL from
* \param frag Fragment to add
* \param new_url Returns new NetSurf URL without fragment
* \return NSERROR_OK on success, appropriate error otherwise
*
* If return value != NSERROR_OK, nothing will be returned in new_url.
*
* It is up to the client to call nsurl_destroy when they are finished with
* the created object.
*
* Any fragment in url is replaced with frag in new_url.
*/
nserror nsurl_refragment(const nsurl *url, lwc_string *frag, nsurl **new_url);
#endif