Ada 3.4.4
Fast spec-compliant URL parser
Loading...
Searching...
No Matches
ada_c.c
Go to the documentation of this file.
1#include "ada_c.h"
2
3#include <stdbool.h>
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7
8int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
9 if (size == 0) return 0;
10
14 size_t half = size / 2;
15 const char* input = (const char*)data;
16 size_t input_len = half;
17 const char* base = (const char*)(data + half);
18 size_t base_len = size - half;
19
23 ada_url out = ada_parse(input, input_len);
24 bool is_valid = ada_is_valid(out);
25
26 if (is_valid) {
27 ada_set_href(out, input, input_len);
28 ada_set_host(out, input, input_len);
29 ada_set_hostname(out, input, input_len);
30 ada_set_protocol(out, input, input_len);
31 ada_set_username(out, input, input_len);
32 ada_set_password(out, input, input_len);
33 ada_set_port(out, input, input_len);
34 ada_set_pathname(out, input, input_len);
35 ada_set_search(out, input, input_len);
36 ada_set_hash(out, input, input_len);
37
38 ada_get_hash(out);
39 ada_get_host(out);
42 ada_get_href(out);
43 ada_owned_string out_get_origin = ada_get_origin(out);
48 ada_get_port(out);
49 ada_get_search(out);
51
57 ada_has_port(out);
59 ada_has_hash(out);
60 ada_has_search(out);
61
63
64 ada_clear_port(out);
65 ada_clear_hash(out);
67
68 ada_free_owned_string(out_get_origin);
69
70 /* Test ada_copy */
71 ada_url out_copy = ada_copy(out);
72 bool copy_is_valid = ada_is_valid(out_copy);
73 if (copy_is_valid) {
74 ada_string href_orig = ada_get_href(out);
75 ada_string href_copy = ada_get_href(out_copy);
76 /* The copy should have the same href (after our setters above) */
77 (void)href_orig;
78 (void)href_copy;
79 }
80 ada_free(out_copy);
81 }
82
83 bool can_parse_result = ada_can_parse(input, input_len);
84 (void)can_parse_result;
85
86 ada_free(out);
87
91 ada_url out_with_base = ada_parse_with_base(input, input_len, base, base_len);
92 bool with_base_valid = ada_is_valid(out_with_base);
93
94 if (with_base_valid) {
95 ada_string href = ada_get_href(out_with_base);
96 volatile size_t len = href.length;
97 (void)len;
98
99 ada_owned_string origin = ada_get_origin(out_with_base);
100 ada_free_owned_string(origin);
101
102 ada_get_hostname(out_with_base);
103 ada_get_pathname(out_with_base);
104 ada_get_search(out_with_base);
105 ada_get_hash(out_with_base);
106 ada_get_protocol(out_with_base);
107 ada_get_port(out_with_base);
108 ada_get_username(out_with_base);
109 ada_get_password(out_with_base);
110
111 ada_has_credentials(out_with_base);
112 ada_has_port(out_with_base);
113 ada_has_hash(out_with_base);
114 ada_has_search(out_with_base);
115 ada_get_components(out_with_base);
116 }
117
118 bool can_parse_with_base =
119 ada_can_parse_with_base(input, input_len, base, base_len);
120
121 /* Consistency check: can_parse_with_base should match
122 * ada_is_valid(ada_parse_with_base(...)) */
123 if (can_parse_with_base != with_base_valid) {
124 printf("ada_can_parse_with_base inconsistency: can_parse=%d is_valid=%d\n",
125 can_parse_with_base, with_base_valid);
126 abort();
127 }
128
129 ada_free(out_with_base);
130
134 {
135 ada_owned_string unicode_result = ada_idna_to_unicode(input, input_len);
136 volatile size_t ulen = unicode_result.length;
137 (void)ulen;
138 ada_free_owned_string(unicode_result);
139
140 ada_owned_string ascii_result = ada_idna_to_ascii(input, input_len);
141 volatile size_t alen = ascii_result.length;
142 (void)alen;
143 ada_free_owned_string(ascii_result);
144 }
145
149 {
150 const char* version = ada_get_version();
151 volatile size_t vlen = strlen(version);
152 (void)vlen;
153
155 volatile int major = ver_comps.major;
156 (void)major;
157 }
158
162 {
163 ada_url_search_params sp = ada_parse_search_params(input, input_len);
164
165 /* Size */
166 volatile size_t sp_size = ada_search_params_size(sp);
167 (void)sp_size;
168
169 /* Append */
170 ada_search_params_append(sp, input, input_len, base, base_len);
171
172 /* Set (replaces first match) */
173 ada_search_params_set(sp, input, input_len, base, base_len);
174
175 /* has */
176 volatile bool has_key = ada_search_params_has(sp, input, input_len);
177 (void)has_key;
178
179 /* has_value */
180 volatile bool has_kv =
181 ada_search_params_has_value(sp, input, input_len, base, base_len);
182 (void)has_kv;
183
184 /* get - returns ada_string (may have data=NULL if not found) */
185 ada_string got = ada_search_params_get(sp, input, input_len);
186 volatile size_t got_len = got.length;
187 (void)got_len;
188
189 /* get_all */
190 ada_strings all_vals = ada_search_params_get_all(sp, input, input_len);
191 volatile size_t all_size = ada_strings_size(all_vals);
192 for (size_t i = 0; i < all_size; i++) {
193 ada_string s = ada_strings_get(all_vals, i);
194 volatile size_t slen = s.length;
195 (void)slen;
196 }
197 ada_free_strings(all_vals);
198
199 /* sort */
201
202 /* to_string */
204 volatile size_t str_len = sp_str.length;
205 (void)str_len;
206 ada_free_owned_string(sp_str);
207
208 /* keys iterator */
210 while (ada_search_params_keys_iter_has_next(keys_iter)) {
212 volatile size_t klen = k.length;
213 (void)klen;
214 }
216
217 /* values iterator */
220 while (ada_search_params_values_iter_has_next(values_iter)) {
222 volatile size_t vlen = v.length;
223 (void)vlen;
224 }
226
227 /* entries iterator */
230 while (ada_search_params_entries_iter_has_next(entries_iter)) {
232 volatile size_t ek = entry.key.length;
233 volatile size_t ev = entry.value.length;
234 (void)ek;
235 (void)ev;
236 }
238
239 /* remove */
240 ada_search_params_remove(sp, input, input_len);
241
242 /* remove_value */
243 ada_search_params_remove_value(sp, input, input_len, base, base_len);
244
245 /* reset */
246 ada_search_params_reset(sp, base, base_len);
247
248 /* Verify size after reset */
249 volatile size_t sp_size_after = ada_search_params_size(sp);
250 (void)sp_size_after;
251
253 }
254
255 return 0;
256}
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
Definition ada_c.c:8
Includes the C definitions for Ada. This is a C file, not C++.
ada_url_search_params ada_parse_search_params(const char *input, size_t length)
Definition ada_c.cpp:469
ada_string ada_get_hash(ada_url result)
Definition ada_c.cpp:169
bool ada_set_port(ada_url result, const char *input, size_t length)
Definition ada_c.cpp:291
ada_strings ada_search_params_get_all(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:596
void ada_clear_search(ada_url result)
Definition ada_c.cpp:362
void ada_free_search_params_entries_iter(ada_url_search_params_entries_iter result)
Definition ada_c.cpp:718
bool ada_set_host(ada_url result, const char *input, size_t length)
Definition ada_c.cpp:247
bool ada_has_password(ada_url result)
Definition ada_c.cpp:417
bool ada_search_params_keys_iter_has_next(ada_url_search_params_keys_iter result)
Definition ada_c.cpp:681
ada_string ada_search_params_values_iter_next(ada_url_search_params_values_iter result)
Definition ada_c.cpp:696
void ada_free_search_params_keys_iter(ada_url_search_params_keys_iter result)
Definition ada_c.cpp:663
ada_string ada_get_pathname(ada_url result)
Definition ada_c.cpp:196
const ada_url_components * ada_get_components(ada_url result)
Definition ada_c.cpp:442
bool ada_search_params_has_value(ada_url_search_params result, const char *key, size_t key_length, const char *value, size_t value_length)
Definition ada_c.cpp:570
bool ada_has_empty_hostname(ada_url result)
Definition ada_c.cpp:377
void ada_free_strings(ada_strings result)
Definition ada_c.cpp:641
void ada_search_params_append(ada_url_search_params result, const char *key, size_t key_length, const char *value, size_t value_length)
Definition ada_c.cpp:518
bool ada_has_non_empty_password(ada_url result)
Definition ada_c.cpp:401
bool ada_set_password(ada_url result, const char *input, size_t length)
Definition ada_c.cpp:282
ada_url_search_params_entries_iter ada_search_params_get_entries(ada_url_search_params result)
Definition ada_c.cpp:630
void * ada_url_search_params_entries_iter
Definition ada_c.h:125
ada_string ada_get_hostname(ada_url result)
Definition ada_c.cpp:187
bool ada_can_parse_with_base(const char *input, size_t input_length, const char *base, size_t base_length)
Definition ada_c.cpp:92
ada_string ada_search_params_get(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:582
uint8_t ada_get_host_type(ada_url result)
Definition ada_c.cpp:223
ada_string ada_get_password(ada_url result)
Definition ada_c.cpp:151
const char * ada_get_version()
Definition ada_c.cpp:752
ada_version_components ada_get_version_components()
Definition ada_c.cpp:754
void * ada_strings
Definition ada_c.h:116
void ada_search_params_sort(ada_url_search_params result)
Definition ada_c.cpp:501
ada_owned_string ada_idna_to_unicode(const char *input, size_t length)
Definition ada_c.cpp:451
void ada_search_params_remove_value(ada_url_search_params result, const char *key, size_t key_length, const char *value, size_t value_length)
Definition ada_c.cpp:549
bool ada_set_hostname(ada_url result, const char *input, size_t length)
Definition ada_c.cpp:255
ada_url ada_parse_with_base(const char *input, size_t input_length, const char *base, size_t base_length)
Definition ada_c.cpp:75
void ada_free_search_params(ada_url_search_params result)
Definition ada_c.cpp:475
ada_string ada_get_port(ada_url result)
Definition ada_c.cpp:160
bool ada_set_pathname(ada_url result, const char *input, size_t length)
Definition ada_c.cpp:299
ada_string ada_get_host(ada_url result)
Definition ada_c.cpp:178
void * ada_url_search_params
Definition ada_c.h:113
ada_url ada_parse(const char *input, size_t length)
Definition ada_c.cpp:70
bool ada_has_port(ada_url result)
Definition ada_c.cpp:409
void ada_clear_hash(ada_url result)
Definition ada_c.cpp:349
void ada_free_owned_string(ada_owned_string owned)
Definition ada_c.cpp:129
ada_owned_string ada_search_params_to_string(ada_url_search_params result)
Definition ada_c.cpp:480
ada_string ada_strings_get(ada_strings result, size_t index)
Definition ada_c.cpp:654
bool ada_set_href(ada_url result, const char *input, size_t length)
Definition ada_c.cpp:239
void ada_free(ada_url result)
Definition ada_c.cpp:98
void * ada_url
Definition ada_c.h:39
bool ada_search_params_entries_iter_has_next(ada_url_search_params_entries_iter result)
Definition ada_c.cpp:737
size_t ada_search_params_size(ada_url_search_params result)
Definition ada_c.cpp:492
ada_owned_string ada_get_origin(ada_url result)
Definition ada_c.cpp:114
ada_string ada_get_protocol(ada_url result)
Definition ada_c.cpp:214
void ada_free_search_params_values_iter(ada_url_search_params_values_iter result)
Definition ada_c.cpp:690
bool ada_set_username(ada_url result, const char *input, size_t length)
Definition ada_c.cpp:273
ada_string ada_get_username(ada_url result)
Definition ada_c.cpp:142
uint8_t ada_get_scheme_type(ada_url result)
Definition ada_c.cpp:231
ada_string ada_search_params_keys_iter_next(ada_url_search_params_keys_iter result)
Definition ada_c.cpp:668
ada_string_pair ada_search_params_entries_iter_next(ada_url_search_params_entries_iter result)
Definition ada_c.cpp:724
void ada_clear_port(ada_url result)
Definition ada_c.cpp:336
bool ada_is_valid(ada_url result)
Definition ada_c.cpp:108
ada_url_search_params_keys_iter ada_search_params_get_keys(ada_url_search_params result)
Definition ada_c.cpp:608
ada_owned_string ada_idna_to_ascii(const char *input, size_t length)
Definition ada_c.cpp:460
void ada_set_search(ada_url result, const char *input, size_t length)
Definition ada_c.cpp:315
void * ada_url_search_params_keys_iter
Definition ada_c.h:117
bool ada_search_params_values_iter_has_next(ada_url_search_params_values_iter result)
Definition ada_c.cpp:709
void ada_search_params_set(ada_url_search_params result, const char *key, size_t key_length, const char *value, size_t value_length)
Definition ada_c.cpp:529
ada_string ada_get_href(ada_url result)
Definition ada_c.cpp:133
bool ada_set_protocol(ada_url result, const char *input, size_t length)
Definition ada_c.cpp:264
size_t ada_strings_size(ada_strings result)
Definition ada_c.cpp:646
ada_url_search_params_values_iter ada_search_params_get_values(ada_url_search_params result)
Definition ada_c.cpp:619
bool ada_has_hash(ada_url result)
Definition ada_c.cpp:425
bool ada_search_params_has(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:560
bool ada_has_hostname(ada_url result)
Definition ada_c.cpp:385
bool ada_has_credentials(ada_url result)
Definition ada_c.cpp:369
void * ada_url_search_params_values_iter
Definition ada_c.h:118
bool ada_can_parse(const char *input, size_t length)
Definition ada_c.cpp:88
ada_string ada_get_search(ada_url result)
Definition ada_c.cpp:205
void ada_search_params_reset(ada_url_search_params result, const char *input, size_t length)
Definition ada_c.cpp:509
void ada_search_params_remove(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:540
bool ada_has_non_empty_username(ada_url result)
Definition ada_c.cpp:393
bool ada_has_search(ada_url result)
Definition ada_c.cpp:433
ada_url ada_copy(ada_url input)
Definition ada_c.cpp:103
void ada_set_hash(ada_url result, const char *input, size_t length)
Definition ada_c.cpp:329
size_t length
Definition ada_c.h:25
ada_string value
Definition ada_c.h:122
ada_string key
Definition ada_c.h:121
size_t length
Definition ada_c.h:19