Ada 3.1.0
Fast spec-compliant URL parser
Loading...
Searching...
No Matches
ada_c.cpp
Go to the documentation of this file.
3
6}
7
8extern "C" {
9typedef void* ada_url;
11typedef void* ada_strings;
15
16struct ada_string {
17 const char* data;
18 size_t length;
19};
20
21struct ada_owned_string {
22 const char* data;
23 size_t length;
24};
25
26struct ada_string_pair {
27 ada_string key;
28 ada_string value;
29};
30
31ada_string ada_string_create(const char* data, size_t length) {
32 ada_string out{};
33 out.data = data;
34 out.length = length;
35 return out;
36}
37
38struct ada_url_components {
39 /*
40 * By using 32-bit integers, we implicitly assume that the URL string
41 * cannot exceed 4 GB.
42 *
43 * https://user:[email protected]:1234/foo/bar?baz#quux
44 * | | | | ^^^^| | |
45 * | | | | | | | `----- hash_start
46 * | | | | | | `--------- search_start
47 * | | | | | `----------------- pathname_start
48 * | | | | `--------------------- port
49 * | | | `----------------------- host_end
50 * | | `---------------------------------- host_start
51 * | `--------------------------------------- username_end
52 * `--------------------------------------------- protocol_end
53 */
54 uint32_t protocol_end;
59 uint32_t username_end;
60 uint32_t host_start;
61 uint32_t host_end;
62 uint32_t port;
63 uint32_t pathname_start;
64 uint32_t search_start;
65 uint32_t hash_start;
66};
67
68ada_url ada_parse(const char* input, size_t length) noexcept {
70 ada::parse<ada::url_aggregator>(std::string_view(input, length)));
71}
72
73ada_url ada_parse_with_base(const char* input, size_t input_length,
74 const char* base, size_t base_length) noexcept {
75 auto base_out =
76 ada::parse<ada::url_aggregator>(std::string_view(base, base_length));
77
78 if (!base_out) {
79 return new ada::result<ada::url_aggregator>(base_out);
80 }
81
83 std::string_view(input, input_length), &base_out.value()));
84}
85
86bool ada_can_parse(const char* input, size_t length) noexcept {
87 return ada::can_parse(std::string_view(input, length));
88}
89
90bool ada_can_parse_with_base(const char* input, size_t input_length,
91 const char* base, size_t base_length) noexcept {
92 std::string_view base_view(base, base_length);
93 return ada::can_parse(std::string_view(input, input_length), &base_view);
94}
95
96void ada_free(ada_url result) noexcept {
97 auto* r = (ada::result<ada::url_aggregator>*)result;
98 delete r;
99}
100
105
106bool ada_is_valid(ada_url result) noexcept {
108 return r.has_value();
109}
110
111// caller must free the result with ada_free_owned_string
114 ada_owned_string owned{};
115 if (!r) {
116 owned.data = nullptr;
117 owned.length = 0;
118 return owned;
119 }
120 std::string out = r->get_origin();
121 owned.length = out.size();
122 owned.data = new char[owned.length];
123 memcpy((void*)owned.data, out.data(), owned.length);
124 return owned;
125}
126
128 delete[] owned.data;
129}
130
133 if (!r) {
134 return ada_string_create(nullptr, 0);
135 }
136 std::string_view out = r->get_href();
137 return ada_string_create(out.data(), out.length());
138}
139
142 if (!r) {
143 return ada_string_create(nullptr, 0);
144 }
145 std::string_view out = r->get_username();
146 return ada_string_create(out.data(), out.length());
147}
148
151 if (!r) {
152 return ada_string_create(nullptr, 0);
153 }
154 std::string_view out = r->get_password();
155 return ada_string_create(out.data(), out.length());
156}
157
160 if (!r) {
161 return ada_string_create(nullptr, 0);
162 }
163 std::string_view out = r->get_port();
164 return ada_string_create(out.data(), out.length());
165}
166
169 if (!r) {
170 return ada_string_create(nullptr, 0);
171 }
172 std::string_view out = r->get_hash();
173 return ada_string_create(out.data(), out.length());
174}
175
178 if (!r) {
179 return ada_string_create(nullptr, 0);
180 }
181 std::string_view out = r->get_host();
182 return ada_string_create(out.data(), out.length());
183}
184
187 if (!r) {
188 return ada_string_create(nullptr, 0);
189 }
190 std::string_view out = r->get_hostname();
191 return ada_string_create(out.data(), out.length());
192}
193
196 if (!r) {
197 return ada_string_create(nullptr, 0);
198 }
199 std::string_view out = r->get_pathname();
200 return ada_string_create(out.data(), out.length());
201}
202
205 if (!r) {
206 return ada_string_create(nullptr, 0);
207 }
208 std::string_view out = r->get_search();
209 return ada_string_create(out.data(), out.length());
210}
211
214 if (!r) {
215 return ada_string_create(nullptr, 0);
216 }
217 std::string_view out = r->get_protocol();
218 return ada_string_create(out.data(), out.length());
219}
220
221uint8_t ada_get_host_type(ada_url result) noexcept {
223 if (!r) {
224 return 0;
225 }
226 return r->host_type;
227}
228
229uint8_t ada_get_scheme_type(ada_url result) noexcept {
231 if (!r) {
232 return 0;
233 }
234 return r->type;
235}
236
237bool ada_set_href(ada_url result, const char* input, size_t length) noexcept {
239 if (!r) {
240 return false;
241 }
242 return r->set_href(std::string_view(input, length));
243}
244
245bool ada_set_host(ada_url result, const char* input, size_t length) noexcept {
247 if (!r) {
248 return false;
249 }
250 return r->set_host(std::string_view(input, length));
251}
252
253bool ada_set_hostname(ada_url result, const char* input,
254 size_t length) noexcept {
256 if (!r) {
257 return false;
258 }
259 return r->set_hostname(std::string_view(input, length));
260}
261
262bool ada_set_protocol(ada_url result, const char* input,
263 size_t length) noexcept {
265 if (!r) {
266 return false;
267 }
268 return r->set_protocol(std::string_view(input, length));
269}
270
271bool ada_set_username(ada_url result, const char* input,
272 size_t length) noexcept {
274 if (!r) {
275 return false;
276 }
277 return r->set_username(std::string_view(input, length));
278}
279
280bool ada_set_password(ada_url result, const char* input,
281 size_t length) noexcept {
283 if (!r) {
284 return false;
285 }
286 return r->set_password(std::string_view(input, length));
287}
288
289bool ada_set_port(ada_url result, const char* input, size_t length) noexcept {
291 if (!r) {
292 return false;
293 }
294 return r->set_port(std::string_view(input, length));
295}
296
297bool ada_set_pathname(ada_url result, const char* input,
298 size_t length) noexcept {
300 if (!r) {
301 return false;
302 }
303 return r->set_pathname(std::string_view(input, length));
304}
305
313void ada_set_search(ada_url result, const char* input, size_t length) noexcept {
315 if (r) {
316 r->set_search(std::string_view(input, length));
317 }
318}
319
327void ada_set_hash(ada_url result, const char* input, size_t length) noexcept {
329 if (r) {
330 r->set_hash(std::string_view(input, length));
331 }
332}
333
334void ada_clear_port(ada_url result) noexcept {
336 if (r) {
337 r->clear_port();
338 }
339}
340
347void ada_clear_hash(ada_url result) noexcept {
349 if (r) {
350 r->clear_hash();
351 }
352}
353
360void ada_clear_search(ada_url result) noexcept {
362 if (r) {
363 r->clear_search();
364 }
365}
366
367bool ada_has_credentials(ada_url result) noexcept {
369 if (!r) {
370 return false;
371 }
372 return r->has_credentials();
373}
374
375bool ada_has_empty_hostname(ada_url result) noexcept {
377 if (!r) {
378 return false;
379 }
380 return r->has_empty_hostname();
381}
382
383bool ada_has_hostname(ada_url result) noexcept {
385 if (!r) {
386 return false;
387 }
388 return r->has_hostname();
389}
390
391bool ada_has_non_empty_username(ada_url result) noexcept {
393 if (!r) {
394 return false;
395 }
396 return r->has_non_empty_username();
397}
398
399bool ada_has_non_empty_password(ada_url result) noexcept {
401 if (!r) {
402 return false;
403 }
404 return r->has_non_empty_password();
405}
406
407bool ada_has_port(ada_url result) noexcept {
409 if (!r) {
410 return false;
411 }
412 return r->has_port();
413}
414
415bool ada_has_password(ada_url result) noexcept {
417 if (!r) {
418 return false;
419 }
420 return r->has_password();
421}
422
423bool ada_has_hash(ada_url result) noexcept {
425 if (!r) {
426 return false;
427 }
428 return r->has_hash();
429}
430
431bool ada_has_search(ada_url result) noexcept {
433 if (!r) {
434 return false;
435 }
436 return r->has_search();
437}
438
439// returns a pointer to the internal url_aggregator::url_components
441 static_assert(sizeof(ada_url_components) == sizeof(ada::url_components));
443 if (!r) {
444 return nullptr;
445 }
446 return reinterpret_cast<const ada_url_components*>(&r->get_components());
447}
448
449ada_owned_string ada_idna_to_unicode(const char* input, size_t length) {
450 std::string out = ada::idna::to_unicode(std::string_view(input, length));
451 ada_owned_string owned{};
452 owned.length = out.length();
453 owned.data = new char[owned.length];
454 memcpy((void*)owned.data, out.data(), owned.length);
455 return owned;
456}
457
458ada_owned_string ada_idna_to_ascii(const char* input, size_t length) {
459 std::string out = ada::idna::to_ascii(std::string_view(input, length));
460 ada_owned_string owned{};
461 owned.length = out.size();
462 owned.data = new char[owned.length];
463 memcpy((void*)owned.data, out.data(), owned.length);
464 return owned;
465}
466
468 size_t length) {
470 ada::url_search_params(std::string_view(input, length)));
471}
472
474 auto* r = (ada::result<ada::url_search_params>*)result;
475 delete r;
476}
477
481 if (!r) return ada_owned_string{nullptr, 0};
482 std::string out = r->to_string();
483 ada_owned_string owned{};
484 owned.length = out.size();
485 owned.data = new char[owned.length];
486 memcpy((void*)owned.data, out.data(), owned.length);
487 return owned;
488}
489
493 if (!r) {
494 return 0;
495 }
496 return r->size();
497}
498
502 if (r) {
503 r->sort();
504 }
505}
506
507void ada_search_params_reset(ada_url_search_params result, const char* input,
508 size_t length) {
511 if (r) {
512 r->reset(std::string_view(input, length));
513 }
514}
515
517 size_t key_length, const char* value,
518 size_t value_length) {
521 if (r) {
522 r->append(std::string_view(key, key_length),
523 std::string_view(value, value_length));
524 }
525}
526
527void ada_search_params_set(ada_url_search_params result, const char* key,
528 size_t key_length, const char* value,
529 size_t value_length) {
532 if (r) {
533 r->set(std::string_view(key, key_length),
534 std::string_view(value, value_length));
535 }
536}
537
539 size_t key_length) {
542 if (r) {
543 r->remove(std::string_view(key, key_length));
544 }
545}
546
548 const char* key, size_t key_length,
549 const char* value, size_t value_length) {
552 if (r) {
553 r->remove(std::string_view(key, key_length),
554 std::string_view(value, value_length));
555 }
556}
557
558bool ada_search_params_has(ada_url_search_params result, const char* key,
559 size_t key_length) {
562 if (!r) {
563 return false;
564 }
565 return r->has(std::string_view(key, key_length));
566}
567
569 size_t key_length, const char* value,
570 size_t value_length) {
573 if (!r) {
574 return false;
575 }
576 return r->has(std::string_view(key, key_length),
577 std::string_view(value, value_length));
578}
579
581 size_t key_length) {
584 if (!r) {
585 return ada_string_create(nullptr, 0);
586 }
587 auto found = r->get(std::string_view(key, key_length));
588 if (!found.has_value()) {
589 return ada_string_create(nullptr, 0);
590 }
591 return ada_string_create(found->data(), found->length());
592}
593
595 const char* key, size_t key_length) {
598 if (!r) {
600 std::vector<std::string>());
601 }
603 r->get_all(std::string_view(key, key_length)));
604}
605
616
627
638
640 auto* r = (ada::result<std::vector<std::string>>*)result;
641 delete r;
642}
643
645 auto* r = (ada::result<std::vector<std::string>>*)result;
646 if (!r) {
647 return 0;
648 }
649 return (*r)->size();
650}
651
653 auto* r = (ada::result<std::vector<std::string>>*)result;
654 if (!r) {
655 return ada_string_create(nullptr, 0);
656 }
657 std::string_view view = (*r)->at(index);
658 return ada_string_create(view.data(), view.length());
659}
660
665
669 if (!r) {
670 return ada_string_create(nullptr, 0);
671 }
672 auto next = (*r)->next();
673 if (!next.has_value()) {
674 return ada_string_create(nullptr, 0);
675 }
676 return ada_string_create(next->data(), next->length());
677}
678
682 if (!r) {
683 return false;
684 }
685 return (*r)->has_next();
686}
687
693
697 if (!r) {
698 return ada_string_create(nullptr, 0);
699 }
700 auto next = (*r)->next();
701 if (!next.has_value()) {
702 return ada_string_create(nullptr, 0);
703 }
704 return ada_string_create(next->data(), next->length());
705}
706
710 if (!r) {
711 return false;
712 }
713 return (*r)->has_next();
714}
715
721
725 if (!r) return {ada_string_create(nullptr, 0), ada_string_create(nullptr, 0)};
726 auto next = (*r)->next();
727 if (!next.has_value()) {
728 return {ada_string_create(nullptr, 0), ada_string_create(nullptr, 0)};
729 }
730 return ada_string_pair{
731 ada_string_create(next->first.data(), next->first.length()),
732 ada_string_create(next->second.data(), next->second.length())};
733}
734
738 if (!r) {
739 return false;
740 }
741 return (*r)->has_next();
742}
743
744} // extern "C"
ada_url_search_params ada_parse_search_params(const char *input, size_t length)
Definition ada_c.cpp:467
ada_string ada_get_search(ada_url result) noexcept
Definition ada_c.cpp:203
ada_strings ada_search_params_get_all(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:594
uint8_t ada_get_scheme_type(ada_url result) noexcept
Definition ada_c.cpp:229
bool ada_has_search(ada_url result) noexcept
Definition ada_c.cpp:431
void ada_free_search_params_entries_iter(ada_url_search_params_entries_iter result)
Definition ada_c.cpp:716
bool ada_search_params_keys_iter_has_next(ada_url_search_params_keys_iter result)
Definition ada_c.cpp:679
ada_string ada_search_params_values_iter_next(ada_url_search_params_values_iter result)
Definition ada_c.cpp:694
void ada_free_search_params_keys_iter(ada_url_search_params_keys_iter result)
Definition ada_c.cpp:661
void ada_clear_hash(ada_url result) noexcept
Definition ada_c.cpp:347
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:568
void ada_free_strings(ada_strings result)
Definition ada_c.cpp:639
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:516
ada_url_search_params_entries_iter ada_search_params_get_entries(ada_url_search_params result)
Definition ada_c.cpp:628
ada_string ada_search_params_get(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:580
void ada_free(ada_url result) noexcept
Definition ada_c.cpp:96
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:90
void ada_free_owned_string(ada_owned_string owned) noexcept
Definition ada_c.cpp:127
ada_url ada_parse(const char *input, size_t length) noexcept
Definition ada_c.cpp:68
uint8_t ada_get_host_type(ada_url result) noexcept
Definition ada_c.cpp:221
ada_string ada_get_protocol(ada_url result) noexcept
Definition ada_c.cpp:212
void ada_search_params_sort(ada_url_search_params result)
Definition ada_c.cpp:499
bool ada_has_credentials(ada_url result) noexcept
Definition ada_c.cpp:367
bool ada_set_pathname(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:297
ada_string ada_get_host(ada_url result) noexcept
Definition ada_c.cpp:176
bool ada_set_password(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:280
ada_string ada_get_port(ada_url result) noexcept
Definition ada_c.cpp:158
ada_string ada_string_create(const char *data, size_t length)
Definition ada_c.cpp:31
ada::result< ada::url_aggregator > & get_instance(void *result) noexcept
Definition ada_c.cpp:4
ada_owned_string ada_idna_to_unicode(const char *input, size_t length)
Definition ada_c.cpp:449
ada_string ada_get_hash(ada_url result) noexcept
Definition ada_c.cpp:167
ada_owned_string ada_get_origin(ada_url result) noexcept
Definition ada_c.cpp:112
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:547
ada_string ada_get_hostname(ada_url result) noexcept
Definition ada_c.cpp:185
void ada_free_search_params(ada_url_search_params result)
Definition ada_c.cpp:473
bool ada_set_username(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:271
bool ada_has_empty_hostname(ada_url result) noexcept
Definition ada_c.cpp:375
bool ada_has_hash(ada_url result) noexcept
Definition ada_c.cpp:423
ada_string ada_get_href(ada_url result) noexcept
Definition ada_c.cpp:131
ada_string ada_get_password(ada_url result) noexcept
Definition ada_c.cpp:149
bool ada_set_protocol(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:262
bool ada_can_parse(const char *input, size_t length) noexcept
Definition ada_c.cpp:86
bool ada_is_valid(ada_url result) noexcept
Definition ada_c.cpp:106
ada_owned_string ada_search_params_to_string(ada_url_search_params result)
Definition ada_c.cpp:478
ada_string ada_strings_get(ada_strings result, size_t index)
Definition ada_c.cpp:652
void ada_set_search(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:313
const ada_url_components * ada_get_components(ada_url result) noexcept
Definition ada_c.cpp:440
bool ada_search_params_entries_iter_has_next(ada_url_search_params_entries_iter result)
Definition ada_c.cpp:735
size_t ada_search_params_size(ada_url_search_params result)
Definition ada_c.cpp:490
ada_string ada_get_pathname(ada_url result) noexcept
Definition ada_c.cpp:194
void ada_free_search_params_values_iter(ada_url_search_params_values_iter result)
Definition ada_c.cpp:688
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:73
ada_string ada_search_params_keys_iter_next(ada_url_search_params_keys_iter result)
Definition ada_c.cpp:666
void ada_clear_port(ada_url result) noexcept
Definition ada_c.cpp:334
bool ada_set_hostname(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:253
bool ada_has_hostname(ada_url result) noexcept
Definition ada_c.cpp:383
ada_string_pair ada_search_params_entries_iter_next(ada_url_search_params_entries_iter result)
Definition ada_c.cpp:722
ada_url_search_params_keys_iter ada_search_params_get_keys(ada_url_search_params result)
Definition ada_c.cpp:606
ada_owned_string ada_idna_to_ascii(const char *input, size_t length)
Definition ada_c.cpp:458
bool ada_has_non_empty_password(ada_url result) noexcept
Definition ada_c.cpp:399
bool ada_set_href(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:237
ada_url ada_copy(ada_url input) noexcept
Definition ada_c.cpp:101
bool ada_has_password(ada_url result) noexcept
Definition ada_c.cpp:415
bool ada_search_params_values_iter_has_next(ada_url_search_params_values_iter result)
Definition ada_c.cpp:707
bool ada_set_port(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:289
bool ada_has_port(ada_url result) noexcept
Definition ada_c.cpp:407
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:527
bool ada_set_host(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:245
size_t ada_strings_size(ada_strings result)
Definition ada_c.cpp:644
ada_url_search_params_values_iter ada_search_params_get_values(ada_url_search_params result)
Definition ada_c.cpp:617
void ada_set_hash(ada_url result, const char *input, size_t length) noexcept
Definition ada_c.cpp:327
bool ada_search_params_has(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:558
bool ada_has_non_empty_username(ada_url result) noexcept
Definition ada_c.cpp:391
void ada_search_params_reset(ada_url_search_params result, const char *input, size_t length)
Definition ada_c.cpp:507
void ada_search_params_remove(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:538
void ada_clear_search(ada_url result) noexcept
Definition ada_c.cpp:360
ada_string ada_get_username(ada_url result) noexcept
Definition ada_c.cpp:140
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
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_warn_unused ada::result< result_type > parse(std::string_view input, const result_type *base_url=nullptr)
URL Component representations using offsets.
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.