Ada 3.4.3
Fast spec-compliant URL parser
Loading...
Searching...
No Matches
ada_c.cpp
Go to the documentation of this file.
1// NOLINTBEGIN(bugprone-exception-escape,
2// bugprone-suspicious-stringview-data-usage)
5
8}
9
10extern "C" {
11typedef void* ada_url;
13typedef void* ada_strings;
17
18struct ada_string {
19 const char* data;
20 size_t length;
21};
22
23struct ada_owned_string {
24 const char* data;
25 size_t length;
26};
27
28struct ada_string_pair {
29 ada_string key;
30 ada_string value;
31};
32
33ada_string ada_string_create(const char* data, size_t length) {
34 ada_string out{};
35 out.data = data;
36 out.length = length;
37 return out;
38}
39
40struct ada_url_components {
41 /*
42 * By using 32-bit integers, we implicitly assume that the URL string
43 * cannot exceed 4 GB.
44 *
45 * https://user:pass@example.com:1234/foo/bar?baz#quux
46 * | | | | ^^^^| | |
47 * | | | | | | | `----- hash_start
48 * | | | | | | `--------- search_start
49 * | | | | | `----------------- pathname_start
50 * | | | | `--------------------- port
51 * | | | `----------------------- host_end
52 * | | `---------------------------------- host_start
53 * | `--------------------------------------- username_end
54 * `--------------------------------------------- protocol_end
55 */
56 uint32_t protocol_end;
61 uint32_t username_end;
62 uint32_t host_start;
63 uint32_t host_end;
64 uint32_t port;
65 uint32_t pathname_start;
66 uint32_t search_start;
67 uint32_t hash_start;
68};
69
70ada_url ada_parse(const char* input, size_t length) noexcept {
72 ada::parse<ada::url_aggregator>(std::string_view(input, length)));
73}
74
75ada_url ada_parse_with_base(const char* input, size_t input_length,
76 const char* base, size_t base_length) noexcept {
77 auto base_out =
78 ada::parse<ada::url_aggregator>(std::string_view(base, base_length));
79
80 if (!base_out) {
81 return new ada::result<ada::url_aggregator>(base_out);
82 }
83
85 std::string_view(input, input_length), &base_out.value()));
86}
87
88bool ada_can_parse(const char* input, size_t length) noexcept {
89 return ada::can_parse(std::string_view(input, length));
90}
91
92bool ada_can_parse_with_base(const char* input, size_t input_length,
93 const char* base, size_t base_length) noexcept {
94 std::string_view base_view(base, base_length);
95 return ada::can_parse(std::string_view(input, input_length), &base_view);
96}
97
98void ada_free(ada_url result) noexcept {
99 auto* r = (ada::result<ada::url_aggregator>*)result;
100 delete r;
101}
102
107
108bool ada_is_valid(ada_url result) noexcept {
110 return r.has_value();
111}
112
113// caller must free the result with ada_free_owned_string
116 ada_owned_string owned{};
117 if (!r) {
118 owned.data = nullptr;
119 owned.length = 0;
120 return owned;
121 }
122 std::string out = r->get_origin();
123 owned.length = out.size();
124 owned.data = new char[owned.length];
125 memcpy((void*)owned.data, out.data(), owned.length);
126 return owned;
127}
128
130 delete[] owned.data;
131}
132
135 if (!r) {
136 return ada_string_create(nullptr, 0);
137 }
138 std::string_view out = r->get_href();
139 return ada_string_create(out.data(), out.length());
140}
141
144 if (!r) {
145 return ada_string_create(nullptr, 0);
146 }
147 std::string_view out = r->get_username();
148 return ada_string_create(out.data(), out.length());
149}
150
153 if (!r) {
154 return ada_string_create(nullptr, 0);
155 }
156 std::string_view out = r->get_password();
157 return ada_string_create(out.data(), out.length());
158}
159
162 if (!r) {
163 return ada_string_create(nullptr, 0);
164 }
165 std::string_view out = r->get_port();
166 return ada_string_create(out.data(), out.length());
167}
168
171 if (!r) {
172 return ada_string_create(nullptr, 0);
173 }
174 std::string_view out = r->get_hash();
175 return ada_string_create(out.data(), out.length());
176}
177
180 if (!r) {
181 return ada_string_create(nullptr, 0);
182 }
183 std::string_view out = r->get_host();
184 return ada_string_create(out.data(), out.length());
185}
186
189 if (!r) {
190 return ada_string_create(nullptr, 0);
191 }
192 std::string_view out = r->get_hostname();
193 return ada_string_create(out.data(), out.length());
194}
195
198 if (!r) {
199 return ada_string_create(nullptr, 0);
200 }
201 std::string_view out = r->get_pathname();
202 return ada_string_create(out.data(), out.length());
203}
204
207 if (!r) {
208 return ada_string_create(nullptr, 0);
209 }
210 std::string_view out = r->get_search();
211 return ada_string_create(out.data(), out.length());
212}
213
216 if (!r) {
217 return ada_string_create(nullptr, 0);
218 }
219 std::string_view out = r->get_protocol();
220 return ada_string_create(out.data(), out.length());
221}
222
223uint8_t ada_get_host_type(ada_url result) noexcept {
225 if (!r) {
226 return 0;
227 }
228 return r->host_type;
229}
230
231uint8_t ada_get_scheme_type(ada_url result) noexcept {
233 if (!r) {
234 return 0;
235 }
236 return r->type;
237}
238
239bool ada_set_href(ada_url result, const char* input, size_t length) noexcept {
241 if (!r) {
242 return false;
243 }
244 return r->set_href(std::string_view(input, length));
245}
246
247bool ada_set_host(ada_url result, const char* input, size_t length) noexcept {
249 if (!r) {
250 return false;
251 }
252 return r->set_host(std::string_view(input, length));
253}
254
255bool ada_set_hostname(ada_url result, const char* input,
256 size_t length) noexcept {
258 if (!r) {
259 return false;
260 }
261 return r->set_hostname(std::string_view(input, length));
262}
263
264bool ada_set_protocol(ada_url result, const char* input,
265 size_t length) noexcept {
267 if (!r) {
268 return false;
269 }
270 return r->set_protocol(std::string_view(input, length));
271}
272
273bool ada_set_username(ada_url result, const char* input,
274 size_t length) noexcept {
276 if (!r) {
277 return false;
278 }
279 return r->set_username(std::string_view(input, length));
280}
281
282bool ada_set_password(ada_url result, const char* input,
283 size_t length) noexcept {
285 if (!r) {
286 return false;
287 }
288 return r->set_password(std::string_view(input, length));
289}
290
291bool ada_set_port(ada_url result, const char* input, size_t length) noexcept {
293 if (!r) {
294 return false;
295 }
296 return r->set_port(std::string_view(input, length));
297}
298
299bool ada_set_pathname(ada_url result, const char* input,
300 size_t length) noexcept {
302 if (!r) {
303 return false;
304 }
305 return r->set_pathname(std::string_view(input, length));
306}
307
315void ada_set_search(ada_url result, const char* input, size_t length) noexcept {
317 if (r) {
318 r->set_search(std::string_view(input, length));
319 }
320}
321
329void ada_set_hash(ada_url result, const char* input, size_t length) noexcept {
331 if (r) {
332 r->set_hash(std::string_view(input, length));
333 }
334}
335
336void ada_clear_port(ada_url result) noexcept {
338 if (r) {
339 r->clear_port();
340 }
341}
342
349void ada_clear_hash(ada_url result) noexcept {
351 if (r) {
352 r->clear_hash();
353 }
354}
355
362void ada_clear_search(ada_url result) noexcept {
364 if (r) {
365 r->clear_search();
366 }
367}
368
369bool ada_has_credentials(ada_url result) noexcept {
371 if (!r) {
372 return false;
373 }
374 return r->has_credentials();
375}
376
377bool ada_has_empty_hostname(ada_url result) noexcept {
379 if (!r) {
380 return false;
381 }
382 return r->has_empty_hostname();
383}
384
385bool ada_has_hostname(ada_url result) noexcept {
387 if (!r) {
388 return false;
389 }
390 return r->has_hostname();
391}
392
393bool ada_has_non_empty_username(ada_url result) noexcept {
395 if (!r) {
396 return false;
397 }
398 return r->has_non_empty_username();
399}
400
401bool ada_has_non_empty_password(ada_url result) noexcept {
403 if (!r) {
404 return false;
405 }
406 return r->has_non_empty_password();
407}
408
409bool ada_has_port(ada_url result) noexcept {
411 if (!r) {
412 return false;
413 }
414 return r->has_port();
415}
416
417bool ada_has_password(ada_url result) noexcept {
419 if (!r) {
420 return false;
421 }
422 return r->has_password();
423}
424
425bool ada_has_hash(ada_url result) noexcept {
427 if (!r) {
428 return false;
429 }
430 return r->has_hash();
431}
432
433bool ada_has_search(ada_url result) noexcept {
435 if (!r) {
436 return false;
437 }
438 return r->has_search();
439}
440
441// returns a pointer to the internal url_aggregator::url_components
443 static_assert(sizeof(ada_url_components) == sizeof(ada::url_components));
445 if (!r) {
446 return nullptr;
447 }
448 return reinterpret_cast<const ada_url_components*>(&r->get_components());
449}
450
451ada_owned_string ada_idna_to_unicode(const char* input, size_t length) {
452 std::string out = ada::idna::to_unicode(std::string_view(input, length));
453 ada_owned_string owned{};
454 owned.length = out.length();
455 owned.data = new char[owned.length];
456 memcpy((void*)owned.data, out.data(), owned.length);
457 return owned;
458}
459
460ada_owned_string ada_idna_to_ascii(const char* input, size_t length) {
461 std::string out = ada::idna::to_ascii(std::string_view(input, length));
462 ada_owned_string owned{};
463 owned.length = out.size();
464 owned.data = new char[owned.length];
465 memcpy((void*)owned.data, out.data(), owned.length);
466 return owned;
467}
468
470 size_t length) {
472 ada::url_search_params(std::string_view(input, length)));
473}
474
476 auto* r = (ada::result<ada::url_search_params>*)result;
477 delete r;
478}
479
483 if (!r) return ada_owned_string{nullptr, 0};
484 std::string out = r->to_string();
485 ada_owned_string owned{};
486 owned.length = out.size();
487 owned.data = new char[owned.length];
488 memcpy((void*)owned.data, out.data(), owned.length);
489 return owned;
490}
491
495 if (!r) {
496 return 0;
497 }
498 return r->size();
499}
500
504 if (r) {
505 r->sort();
506 }
507}
508
509void ada_search_params_reset(ada_url_search_params result, const char* input,
510 size_t length) {
513 if (r) {
514 r->reset(std::string_view(input, length));
515 }
516}
517
519 size_t key_length, const char* value,
520 size_t value_length) {
523 if (r) {
524 r->append(std::string_view(key, key_length),
525 std::string_view(value, value_length));
526 }
527}
528
529void ada_search_params_set(ada_url_search_params result, const char* key,
530 size_t key_length, const char* value,
531 size_t value_length) {
534 if (r) {
535 r->set(std::string_view(key, key_length),
536 std::string_view(value, value_length));
537 }
538}
539
541 size_t key_length) {
544 if (r) {
545 r->remove(std::string_view(key, key_length));
546 }
547}
548
550 const char* key, size_t key_length,
551 const char* value, size_t value_length) {
554 if (r) {
555 r->remove(std::string_view(key, key_length),
556 std::string_view(value, value_length));
557 }
558}
559
560bool ada_search_params_has(ada_url_search_params result, const char* key,
561 size_t key_length) {
564 if (!r) {
565 return false;
566 }
567 return r->has(std::string_view(key, key_length));
568}
569
571 size_t key_length, const char* value,
572 size_t value_length) {
575 if (!r) {
576 return false;
577 }
578 return r->has(std::string_view(key, key_length),
579 std::string_view(value, value_length));
580}
581
583 size_t key_length) {
586 if (!r) {
587 return ada_string_create(nullptr, 0);
588 }
589 auto found = r->get(std::string_view(key, key_length));
590 if (!found.has_value()) {
591 return ada_string_create(nullptr, 0);
592 }
593 return ada_string_create(found->data(), found->length());
594}
595
597 const char* key, size_t key_length) {
600 if (!r) {
602 std::vector<std::string>());
603 }
605 r->get_all(std::string_view(key, key_length)));
606}
607
618
629
640
642 auto* r = (ada::result<std::vector<std::string>>*)result;
643 delete r;
644}
645
647 auto* r = (ada::result<std::vector<std::string>>*)result;
648 if (!r) {
649 return 0;
650 }
651 return (*r)->size();
652}
653
655 auto* r = (ada::result<std::vector<std::string>>*)result;
656 if (!r) {
657 return ada_string_create(nullptr, 0);
658 }
659 std::string_view view = (*r)->at(index);
660 return ada_string_create(view.data(), view.length());
661}
662
667
671 if (!r) {
672 return ada_string_create(nullptr, 0);
673 }
674 auto next = (*r)->next();
675 if (!next.has_value()) {
676 return ada_string_create(nullptr, 0);
677 }
678 return ada_string_create(next->data(), next->length());
679}
680
684 if (!r) {
685 return false;
686 }
687 return (*r)->has_next();
688}
689
695
699 if (!r) {
700 return ada_string_create(nullptr, 0);
701 }
702 auto next = (*r)->next();
703 if (!next.has_value()) {
704 return ada_string_create(nullptr, 0);
705 }
706 return ada_string_create(next->data(), next->length());
707}
708
712 if (!r) {
713 return false;
714 }
715 return (*r)->has_next();
716}
717
723
727 if (!r) return {ada_string_create(nullptr, 0), ada_string_create(nullptr, 0)};
728 auto next = (*r)->next();
729 if (!next.has_value()) {
730 return {ada_string_create(nullptr, 0), ada_string_create(nullptr, 0)};
731 }
732 return ada_string_pair{
733 ada_string_create(next->first.data(), next->first.length()),
734 ada_string_create(next->second.data(), next->second.length())};
735}
736
740 if (!r) {
741 return false;
742 }
743 return (*r)->has_next();
744}
745
746typedef struct {
747 int major;
748 int minor;
749 int revision;
751
752const char* ada_get_version() { return ADA_VERSION; }
753
761
762} // extern "C"
763// NOLINTEND(bugprone-exception-escape,
764// bugprone-suspicious-stringview-data-usage)
ada_url_search_params ada_parse_search_params(const char *input, size_t length)
Definition ada_c.cpp:469
ada_string ada_get_search(ada_url result) noexcept
Definition ada_c.cpp:205
ada_strings ada_search_params_get_all(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:596
uint8_t ada_get_scheme_type(ada_url result) noexcept
Definition ada_c.cpp:231
bool ada_has_search(ada_url result) noexcept
Definition ada_c.cpp:433
void ada_free_search_params_entries_iter(ada_url_search_params_entries_iter result)
Definition ada_c.cpp:718
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
void ada_clear_hash(ada_url result) noexcept
Definition ada_c.cpp:349
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
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
ada_url_search_params_entries_iter ada_search_params_get_entries(ada_url_search_params result)
Definition ada_c.cpp:630
ada_string ada_search_params_get(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:582
void ada_free(ada_url result) noexcept
Definition ada_c.cpp:98
bool ada_can_parse_with_base(const char *input, size_t input_length, const char *base, size_t base_length) noexcept
Definition ada_c.cpp:92
void ada_free_owned_string(ada_owned_string owned) noexcept
Definition ada_c.cpp:129
ada_url ada_parse(const char *input, size_t length) noexcept
Definition ada_c.cpp:70
const char * ada_get_version()
Definition ada_c.cpp:752
ada_version_components ada_get_version_components()
Definition ada_c.cpp:754
uint8_t ada_get_host_type(ada_url result) noexcept
Definition ada_c.cpp:223
ada_string ada_get_protocol(ada_url result) noexcept
Definition ada_c.cpp:214
void ada_search_params_sort(ada_url_search_params result)
Definition ada_c.cpp:501
bool ada_has_credentials(ada_url result) noexcept
Definition ada_c.cpp:369
bool ada_set_pathname(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:299
ada_string ada_get_host(ada_url result) noexcept
Definition ada_c.cpp:178
bool ada_set_password(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:282
ada_string ada_get_port(ada_url result) noexcept
Definition ada_c.cpp:160
ada_string ada_string_create(const char *data, size_t length)
Definition ada_c.cpp:33
ada::result< ada::url_aggregator > & get_instance(void *result) noexcept
Definition ada_c.cpp:6
ada_owned_string ada_idna_to_unicode(const char *input, size_t length)
Definition ada_c.cpp:451
ada_string ada_get_hash(ada_url result) noexcept
Definition ada_c.cpp:169
ada_owned_string ada_get_origin(ada_url result) noexcept
Definition ada_c.cpp:114
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
ada_string ada_get_hostname(ada_url result) noexcept
Definition ada_c.cpp:187
void ada_free_search_params(ada_url_search_params result)
Definition ada_c.cpp:475
bool ada_set_username(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:273
bool ada_has_empty_hostname(ada_url result) noexcept
Definition ada_c.cpp:377
bool ada_has_hash(ada_url result) noexcept
Definition ada_c.cpp:425
ada_string ada_get_href(ada_url result) noexcept
Definition ada_c.cpp:133
ada_string ada_get_password(ada_url result) noexcept
Definition ada_c.cpp:151
bool ada_set_protocol(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:264
bool ada_can_parse(const char *input, size_t length) noexcept
Definition ada_c.cpp:88
bool ada_is_valid(ada_url result) noexcept
Definition ada_c.cpp:108
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
void ada_set_search(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:315
const ada_url_components * ada_get_components(ada_url result) noexcept
Definition ada_c.cpp:442
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_string ada_get_pathname(ada_url result) noexcept
Definition ada_c.cpp:196
void ada_free_search_params_values_iter(ada_url_search_params_values_iter result)
Definition ada_c.cpp:690
ada_url ada_parse_with_base(const char *input, size_t input_length, const char *base, size_t base_length) noexcept
Definition ada_c.cpp:75
ada_string ada_search_params_keys_iter_next(ada_url_search_params_keys_iter result)
Definition ada_c.cpp:668
void ada_clear_port(ada_url result) noexcept
Definition ada_c.cpp:336
bool ada_set_hostname(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:255
bool ada_has_hostname(ada_url result) noexcept
Definition ada_c.cpp:385
ada_string_pair ada_search_params_entries_iter_next(ada_url_search_params_entries_iter result)
Definition ada_c.cpp:724
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
bool ada_has_non_empty_password(ada_url result) noexcept
Definition ada_c.cpp:401
bool ada_set_href(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:239
ada_url ada_copy(ada_url input) noexcept
Definition ada_c.cpp:103
bool ada_has_password(ada_url result) noexcept
Definition ada_c.cpp:417
bool ada_search_params_values_iter_has_next(ada_url_search_params_values_iter result)
Definition ada_c.cpp:709
bool ada_set_port(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:291
bool ada_has_port(ada_url result) noexcept
Definition ada_c.cpp:409
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
bool ada_set_host(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:247
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
void ada_set_hash(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:329
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_non_empty_username(ada_url result) noexcept
Definition ada_c.cpp:393
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
void ada_clear_search(ada_url result) noexcept
Definition ada_c.cpp:362
ada_string ada_get_username(ada_url result) noexcept
Definition ada_c.cpp:142
void * ada_url_search_params_entries_iter
Definition ada_c.h:125
void * ada_strings
Definition ada_c.h:116
void * ada_url_search_params
Definition ada_c.h:113
void * ada_url
Definition ada_c.h:39
void * ada_url_search_params_keys_iter
Definition ada_c.h:117
void * ada_url_search_params_values_iter
Definition ada_c.h:118
#define ADA_VERSION
Definition ada_version.h:8
std::string to_ascii(std::string_view ut8_string)
std::string to_unicode(std::string_view input)
url_search_params_iter< std::string_view, url_search_params_iter_type::VALUES > url_search_params_values_iter
bool can_parse(std::string_view input, const std::string_view *base_input=nullptr)
url_search_params_iter< key_value_view_pair, url_search_params_iter_type::ENTRIES > url_search_params_entries_iter
url_search_params_iter< std::string_view, url_search_params_iter_type::KEYS > url_search_params_keys_iter
tl::expected< result_type, ada::errors > result
@ ADA_VERSION_MINOR
Definition ada_version.h:14
@ ADA_VERSION_REVISION
Definition ada_version.h:15
@ ADA_VERSION_MAJOR
Definition ada_version.h:13
ada_warn_unused ada::result< result_type > parse(std::string_view input, const result_type *base_url=nullptr)
Stores byte offsets for URL components within a buffer.
Class for parsing and manipulating URL query strings.
size_t length
Definition ada_c.h:25
const char * data
Definition ada_c.h:24
ada_string value
Definition ada_c.h:122
ada_string key
Definition ada_c.h:121
const char * data
Definition ada_c.h:18
size_t length
Definition ada_c.h:19
uint32_t username_end
Definition ada_c.h:30
uint32_t host_end
Definition ada_c.h:32
uint32_t hash_start
Definition ada_c.h:36
uint32_t pathname_start
Definition ada_c.h:34
uint32_t port
Definition ada_c.h:33
uint32_t protocol_end
Definition ada_c.h:29
uint32_t search_start
Definition ada_c.h:35
uint32_t host_start
Definition ada_c.h:31
Inline functions for url aggregator.
Inline declarations for the URL Search Params.