C and C++ web framework. http://rapida.vilor.one/docs
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
1.8 KiB

/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Copyright 2022 Ivan Polyakov */
#include "../include/url.h"
#include "utils.h"
#include <stdlib.h>
#include <string.h>
int rpd_url_parse(rpd_url *dest, const char *src)
{
const char *del = "/";
int i = count_char_entries(src, del[0]);
if (!i) {
dest->parts_len = 0;
return 0;
}
dest->parts = (char **) malloc(sizeof(char **) * i);
if (!dest->parts) {
dest->parts_len = 0;
return 2;
}
i = 0;
char *tmp, *token;
tmp = strdup(src);
while ((token = strsep(&tmp, "/"))) {
if (!strlen(token))
continue;
dest->parts[i] = strdup(token);
i++;
}
free(tmp);
dest->parts_len = i;
return 0;
}
void rpd_url_cleanup(rpd_url *url)
{
int i = 0;
while (i < url->parts_len) {
free(url->parts[i]);
i++;
}
free(url->parts);
url->parts = NULL;
url->parts_len = 0;
}
int rpd_url_params_parse_keys(rpd_keyval *dest, const rpd_url *tpl)
{
int len = 0;
for (int i = 0; i < tpl->parts_len; i++) {
if (*tpl->parts[i] == ':') {
len++;
}
}
dest->items = malloc(sizeof(rpd_keyval_item) * len);
if (!dest->items)
return 1;
dest->size = 0;
dest->capacity = len;
for (int i = 0; i < tpl->parts_len; i++) {
if (*tpl->parts[i] == ':') {
dest->items[dest->size].key = strdup(tpl->parts[i] + 1);
dest->size++;
}
}
return 0;
}
int rpd_url_params_parse_vals(rpd_keyval *dest, const rpd_url *url, const rpd_url *tpl)
{
int i = 0, j = 0;
while (i < tpl->parts_len) {
if (*tpl->parts[i] == ':') {
dest->items[j++].val = strdup(url->parts[i]);
}
i++;
}
return 0;
}