Example #1
0
File: url.c Project: galdor/libhttp
struct c_vector *
http_query_parameters_parse(const char *string) {
    struct c_vector *parameters;
    const char *ptr;

    parameters = c_vector_new(sizeof(struct http_query_parameter));

    ptr = string;
    while (*ptr != '\0') {
        size_t toklen, name_sz, value_sz;
        const char *name_ptr, *value_ptr;
        struct http_query_parameter param;

        toklen = strcspn(ptr, "&;");

        name_ptr = ptr;
        name_sz = c_memcspn(ptr, toklen, "=");
        if (name_sz == toklen) {
            value_ptr = NULL;
            value_sz = 0;
        } else {
            value_ptr = ptr + name_sz + 1;
            value_sz = toklen - name_sz - 1;
        }

        http_query_parameter_init(&param);

        param.name = http_query_parameter_decode(name_ptr, name_sz);
        if (!param.name) {
            http_query_parameter_free(&param);
            goto error;
        }

        if (value_ptr) {
            param.value = http_query_parameter_decode(value_ptr, value_sz);
            if (!param.value) {
                http_query_parameter_free(&param);
                goto error;
            }
        }

        c_vector_append(parameters, &param);

        ptr += toklen;
        if (*ptr == '&' || *ptr == ';')
            ptr++;
    }

    return parameters;

error:
    for (size_t i = 0; i < c_vector_length(parameters); i++)
        http_query_parameter_free(c_vector_entry(parameters, i));
    c_vector_delete(parameters);

    return NULL;
}
Example #2
0
void
http_response_delete(struct http_response *response) {
    if (!response)
        return;

    c_free(response->reason);

    http_headers_delete(response->headers);

    c_free(response->body);

    c_vector_delete(response->content_codings);

    http_url_delete(response->redirection_location);

    c_free0(response, sizeof(struct http_response));
}
Example #3
0
File: url.c Project: galdor/libhttp
void
http_url_delete(struct http_url *url) {
    if (!url)
        return;

    c_free(url->scheme);
    c_free(url->user);
    c_free(url->password);
    c_free(url->host);
    c_free(url->port);
    c_free(url->path);
    c_free(url->query);
    c_free(url->fragment);

    if (url->query_parameters) {
        for (size_t i = 0; i < c_vector_length(url->query_parameters); i++)
            http_query_parameter_free(c_vector_entry(url->query_parameters, i));
        c_vector_delete(url->query_parameters);
    }

    c_free0(url, sizeof(struct http_url));
}
Example #4
0
int main(int agrc, char **argv)
{
    size_t error;
    c_vector *vector;

    // Пытаемся создать вектор емкостью CAPACITY, который содержит объекты типа object.
    vector = c_vector_create(sizeof(object), CAPACITY, &error);

    // Если вектор создать не удалось, выводим причину ошибки.
    if (vector == NULL)
    {
        printf("create error: %Iu\n", error);
        printf("Program end.\n");
        getchar();
        return -1;
    }

    // Вставляем в конец вектора 11 объектов.
    for (size_t i = 0; i < 11; ++i)
    {
        object *const obj = c_vector_push_back(vector, &error);
        // Если вставить объект не удалось, выводим причину ошибки.
        if (obj == NULL)
        {
            printf("push back error: %Iu\n", error);
            printf("Proogram end.\n");
            getchar();
            return -2;
        }

        // Инициализируем вставленный объект.
        obj->i = i;
        obj->f = i + 3.14f;
    }

    // Покажем размер вектора.
    {
        error = 0;
        const size_t size = c_vector_size(vector, &error);
        // Если size == 0 и error > 0, значит возникла ошибка.
        if ( (size == 0) && (error > 0) )
        {
            printf("size error: %Iu\n", error);
            printf("Program end.\n");
            getchar();
            return -3;
        }
        // Покажем размер.
        printf("size: %Iu\n", size);
    }

    // Покажем емкость вектора.
    {
        error = 0;
        const size_t capacity = c_vector_capacity(vector, &error);
        // Если capacity == 0 и error > 0, значит произошла ошибка.
        if ( (capacity == 0) && (error > 0) )
        {
            printf("capacity error: %Iu\n", error);
            printf("Program end.\n");
            getchar();
            return -4;
        }
        // Покажем емкость.
        printf("capacity: %Iu\n", capacity);
    }

    // Используя функцию обхода, выведем содержимое каждого элемента вектора.
    {
        const ptrdiff_t r_code = c_vector_for_each(vector, print_object);
        // Если произошла ошибка, покажем ее.
        if (r_code < 0)
        {
            printf("for each error, r_code: %Id\n", r_code);
            printf("Program end.\n");
            getchar();
            return -5;
        }
    }

    // Удалим из вектора несколько элементов, используя массив индексов.
    {
        size_t indexes[5] = {0, 2, 1, 3, 99};
        error = 0;
        // Специализированная функция для удаления объекта типа object не нужна.
        const size_t d_count = c_vector_erase_few(vector, indexes, 5, NULL, &error);
        // Если произошла ошибка, покажем ее.
        if ( (d_count == 0) && (error > 0) )
        {
            printf("erase few error: %Iu\n", error);
            printf("Program end.\n");
            getchar();
            return -6;
        }
        // Покажем, сколько элементов было удалено.
        printf("d_count: %Iu\n", d_count);
    }

    // Используя функцию обхода, выведем содержимое каждого элемента вектора.
    {
        const ptrdiff_t r_code = c_vector_for_each(vector, print_object);
        // Если произошла ошибка, покажем ее.
        if (r_code < 0)
        {
            printf("for each error, r_code: %Id\n", r_code);
            printf("Program end.\n");
            getchar();
            return -7;
        }
    }

    // Удалим из вектора все элементы, f которых > 9.
    {
        error = 0;
        const size_t d_count = c_vector_remove_few(vector, pred_object, NULL, &error);
        // Если произошла ошибка, покажем ее.
        if ( (d_count == 0) && (error > 0) )
        {
            printf("remove few error: %Iu\n", error);
            printf("Program end.\n");
            getchar();
            return -8;
        }
        // Покажем, сколько элементов было удалено.
        printf("d_count: %Iu\n", d_count);
    }

    // Используя функцию обхода, выведем содержимое каждого элемента вектора.
    {
        const ptrdiff_t r_code = c_vector_for_each(vector, print_object);
        // Если произошла ошибка, покажем ее.
        if (r_code < 0)
        {
            printf("for each error, r_code: %Id\n", r_code);
            printf("Program end.\n");
            getchar();
            return -9;
        }
    }

    // Удалим вектор.
    {
        const ptrdiff_t r_code = c_vector_delete(vector, NULL);
        // Если возникла ошибка, покажем ее.
        if (r_code < 0)
        {
            printf("delete error, r_code: %Id\n", r_code);
            printf("Program end.\n");
            getchar();
            return -10;
        }
    }

    getchar();
    return 0;
}
Example #5
0
void
sircc_processing_shutdown(void) {
    for (size_t i = 0; i < c_vector_length(sircc.highlighters); i++)
        sircc_highlighter_free(c_vector_entry(sircc.highlighters, i));
    c_vector_delete(sircc.highlighters);
}