summary refs log blame commit diff stats
path: root/yuri.c
blob: 89c2a2fd051b5e4add1fb65d63a78ff0231ddf78 (plain) (tree)


































































































































































































































































                                                                                          






















                               

































                                      
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

#include "yuri.h"

struct uri *
uri_new(void)
{
	struct uri *ret;

	ret = malloc(sizeof(*ret));
	if (ret == NULL)
		return NULL;
	memset(ret, 0, sizeof(*ret));
	return ret;
}

int
uri_set_scheme(struct uri *uri, const char *scheme)
{
	const char *newscheme;

	newscheme = strdup(scheme);
	if (newscheme == NULL)
		return -1;
	free(uri->scheme);
	uri->scheme = newscheme;

	return 0;
}

int
uri_set_authority(struct uri *uri, int type, const char *user, const char *host, int port)
{
	const char *newuser;
	const char *newhost;

	newhost = strdup(host);
	if (newhost == NULL)
		return -1;

	if (user) {
		newuser = strdup(user);
		if (newuser == NULL) {
			free(newhost);
			return -1;
		}
	} else {
		newuser = NULL;
	}

	free(uri->authority.user);
	free(uri->authority.host);

	uri->authority.user = newuser;
	uri->authority.host = newhost;
	uri->authority.port = port;
	uri->authority.type = type;

	return 0;
}

int
uri_set_authority_type(struct uri *u, int type)
{
	u->authority.type = type;
	return 0;
}

int
uri_set_authority_user(struct uri *u, const char *user)
{
	const char *newuser;

	newuser = strdup(user);
	if (newuser == NULL)
		return -1;
	free(u->authority.user);
	u->authority.user = newuser;

	return 0;
}

int
uri_set_authority_host(struct uri *u, const char *host)
{
	const char *newhost;

	newhost = strdup(host);
	if (newhost == NULL)
		return -1;
	free(u->authority.host);
	u->authority.host = newhost;

	return 0;
}

int
uri_set_authority_port(struct uri *u, int port)
{
	u->authority.port = port;
	return 0;
}

int
uri_append_path(struct uri *uri, const char *item)
{
	char **path;
	int npath;

	if (uri->npath == 0)
		npath = 1;
	else
		npath = uri->npath + 1;

	path = realloc(uri->path, sizeof(*uri->path)*npath);
	if (path == NULL)
		return -1;
	uri->path = path;
	uri->path[npath-1] = strdup(item);
	if (uri->path[npath-1] == NULL)
		return -1;
	uri->npath = npath;

	return 0;
}

int
uri_set_query(struct uri *uri, const char *query)
{
	const char *newquery;

	newquery = strdup(query);
	if (newquery == NULL)
		return -1;
	free(uri->query);
	uri->query = newquery;

	return 0;
}

int
uri_set_fragment(struct uri *uri, const char *fragment)
{
	const char *newfragment;

	newfragment = strdup(fragment);
	if (newfragment == NULL)
		return -1;
	free(uri->fragment);
	uri->fragment = newfragment;

	return 0;
}

void
uri_unset_scheme(struct uri *u)
{
	free(u->scheme);
	u->scheme = NULL;
}

void
uri_unset_authority(struct uri *u)
{
	uri_unset_authority_type(u);
	uri_unset_authority_user(u);
	uri_unset_authority_host(u);
	uri_unset_authority_port(u);
}

void
uri_unset_authority_type(struct uri *u)
{
	u->authority.type = 0;
}

void
uri_unset_authority_user(struct uri *u)
{
	free(u->authority.user);
	u->authority.user = NULL;
}

void
uri_unset_authority_host(struct uri *u)
{
	free(u->authority.host);
	u->authority.host = NULL;
}

void
uri_unset_authority_port(struct uri *u)
{
	u->authority.port = 0;
}

void
uri_unset_path(struct uri *u)
{
	int i;
	for (i = 0; i < u->npath; i++)
		free(u->path[i]);
	free(u->path);
	u->path = NULL;
	u->npath = 0;
}

void
uri_unset_query(struct uri *u)
{
	free(u->query);
	u->query = NULL;
}

void
uri_unset_fragment(struct uri *u)
{
	free(u->fragment);
	u->fragment = NULL;
}

const char *
uri_get_scheme(struct uri *u)
{
	return u->scheme;
}

int
uri_get_authority_type(struct uri *u)
{
	return u->authority.type;
}

const char *
uri_get_authority_user(struct uri *u)
{
	return u->authority.user;
}

const char *
uri_get_authority_host(struct uri *u)
{
	return u->authority.host;
}

int
uri_get_authority_port(struct uri *u)
{
	return u->authority.port;
}

const char **
uri_get_path(struct uri *u)
{
	return u->path;
}

/*
 * TODO: cleanup
 */
char *
uri_string_path(struct uri *u)
{
	struct uri *temp;
	char *ret;

	temp = uri_new();
	if (temp == NULL)
		return NULL;
	temp->path = u->path;
	temp->npath = u->npath;

	ret = uri_encode(temp);
	free(temp);
	if (ret == NULL)
		return NULL;

	return ret;
}

int
uri_get_npath(struct uri *u)
{
	return u->npath;
}

const char *
uri_get_query(struct uri *u)
{
	return u->query;
}

const char *
uri_get_fragment(struct uri *u)
{
	return u->fragment;
}

void
uri_free(struct uri *u)
{
	int i;
	if (!u)
		return;
	free(u->scheme);
	free(u->authority.user);
	free(u->authority.host);
	for (i = 0; i < u->npath; i++)
		free(u->path[i]);
	free(u->path);
	free(u->query);
	free(u->fragment);
	free(u);
}