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(¶m); param.name = http_query_parameter_decode(name_ptr, name_sz); if (!param.name) { http_query_parameter_free(¶m); goto error; } if (value_ptr) { param.value = http_query_parameter_decode(value_ptr, value_sz); if (!param.value) { http_query_parameter_free(¶m); goto error; } } c_vector_append(parameters, ¶m); 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; }
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)); }
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)); }
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; }
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); }