Ada 2.7.8
Fast spec-compliant URL parser
Loading...
Searching...
No Matches
ada_c.cpp
Go to the documentation of this file.
1#include "ada.h"
2
5}
6
7extern "C" {
8typedef void* ada_url;
10typedef void* ada_strings;
14
15struct ada_string {
16 const char* data;
17 size_t length;
18};
19
20struct ada_owned_string {
21 const char* data;
22 size_t length;
23};
24
25struct ada_string_pair {
28};
29
30ada_string ada_string_create(const char* data, size_t length) {
31 ada_string out{};
32 out.data = data;
33 out.length = length;
34 return out;
35}
36
37struct ada_url_components {
38 /*
39 * By using 32-bit integers, we implicitly assume that the URL string
40 * cannot exceed 4 GB.
41 *
42 * https://user:pass@example.com:1234/foo/bar?baz#quux
43 * | | | | ^^^^| | |
44 * | | | | | | | `----- hash_start
45 * | | | | | | `--------- search_start
46 * | | | | | `----------------- pathname_start
47 * | | | | `--------------------- port
48 * | | | `----------------------- host_end
49 * | | `---------------------------------- host_start
50 * | `--------------------------------------- username_end
51 * `--------------------------------------------- protocol_end
52 */
53 uint32_t protocol_end;
58 uint32_t username_end;
59 uint32_t host_start;
60 uint32_t host_end;
61 uint32_t port;
62 uint32_t pathname_start;
63 uint32_t search_start;
64 uint32_t hash_start;
65};
66
67ada_url ada_parse(const char* input, size_t length) noexcept {
69 ada::parse<ada::url_aggregator>(std::string_view(input, length)));
70}
71
72ada_url ada_parse_with_base(const char* input, size_t input_length,
73 const char* base, size_t base_length) noexcept {
74 auto base_out =
75 ada::parse<ada::url_aggregator>(std::string_view(base, base_length));
76
77 if (!base_out) {
78 return new ada::result<ada::url_aggregator>(base_out);
79 }
80
82 std::string_view(input, input_length), &base_out.value()));
83}
84
85bool ada_can_parse(const char* input, size_t length) noexcept {
86 return ada::can_parse(std::string_view(input, length));
87}
88
89bool ada_can_parse_with_base(const char* input, size_t input_length,
90 const char* base, size_t base_length) noexcept {
91 std::string_view base_view(base, base_length);
92 return ada::can_parse(std::string_view(input, input_length), &base_view);
93}
94
95void ada_free(ada_url result) noexcept {
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 owned.data = nullptr;
130 owned.length = 0;
131}
132
135 if (!r) {
136 return ada_string_create(NULL, 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(NULL, 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(NULL, 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(NULL, 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(NULL, 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(NULL, 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(NULL, 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(NULL, 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(NULL, 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(NULL, 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
480
484 if (!r) return ada_owned_string{NULL, 0};
485 std::string out = r->to_string();
486 ada_owned_string owned{};
487 owned.length = out.size();
488 owned.data = new char[owned.length];
489 memcpy((void*)owned.data, out.data(), owned.length);
490 return owned;
491}
492
496 if (!r) {
497 return 0;
498 }
499 return r->size();
500}
501
505 if (r) {
506 r->sort();
507 }
508}
509
511 size_t key_length, const char* value,
512 size_t value_length) {
515 if (r) {
516 r->append(std::string_view(key, key_length),
517 std::string_view(value, value_length));
518 }
519}
520
521void ada_search_params_set(ada_url_search_params result, const char* key,
522 size_t key_length, const char* value,
523 size_t value_length) {
526 if (r) {
527 r->set(std::string_view(key, key_length),
528 std::string_view(value, value_length));
529 }
530}
531
533 size_t key_length) {
536 if (r) {
537 r->remove(std::string_view(key, key_length));
538 }
539}
540
542 const char* key, size_t key_length,
543 const char* value, size_t value_length) {
546 if (r) {
547 r->remove(std::string_view(key, key_length),
548 std::string_view(value, value_length));
549 }
550}
551
552bool ada_search_params_has(ada_url_search_params result, const char* key,
553 size_t key_length) {
556 if (!r) {
557 return false;
558 }
559 return r->has(std::string_view(key, key_length));
560}
561
563 size_t key_length, const char* value,
564 size_t value_length) {
567 if (!r) {
568 return false;
569 }
570 return r->has(std::string_view(key, key_length),
571 std::string_view(value, value_length));
572}
573
575 size_t key_length) {
578 if (!r) {
579 return ada_string_create(NULL, 0);
580 }
581 auto found = r->get(std::string_view(key, key_length));
582 if (!found.has_value()) {
583 return ada_string_create(NULL, 0);
584 }
585 return ada_string_create(found->data(), found->length());
586}
587
589 const char* key, size_t key_length) {
592 if (!r) {
594 std::vector<std::string>());
595 }
597 r->get_all(std::string_view(key, key_length)));
598}
599
610
621
632
638
642 if (!r) {
643 return 0;
644 }
645 return (*r)->size();
646}
647
651 if (!r) {
652 return ada_string_create(NULL, 0);
653 }
654 std::string_view view = (*r)->at(index);
655 return ada_string_create(view.data(), view.length());
656}
657
663
668 if (!r) {
669 return ada_string_create(NULL, 0);
670 }
671 auto next = (*r)->next();
672 if (!next.has_value()) {
673 return ada_string_create(NULL, 0);
674 }
675 return ada_string_create(next->data(), next->length());
676}
677
682 if (!r) {
683 return false;
684 }
685 return (*r)->has_next();
686}
687
694
699 if (!r) {
700 return ada_string_create(NULL, 0);
701 }
702 auto next = (*r)->next();
703 if (!next.has_value()) {
704 return ada_string_create(NULL, 0);
705 }
706 return ada_string_create(next->data(), next->length());
707}
708
713 if (!r) {
714 return false;
715 }
716 return (*r)->has_next();
717}
718
725
730 if (!r) return {ada_string_create(NULL, 0), ada_string_create(NULL, 0)};
731 auto next = (*r)->next();
732 if (!next.has_value()) {
733 return {ada_string_create(NULL, 0), ada_string_create(NULL, 0)};
734 }
735 return ada_string_pair{
736 ada_string_create(next->first.data(), next->first.length()),
737 ada_string_create(next->second.data(), next->second.length())};
738}
739
744 if (!r) {
745 return false;
746 }
747 return (*r)->has_next();
748}
749
750} // extern "C"
Includes all definitions for Ada.
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:588
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:719
bool ada_search_params_keys_iter_has_next(ada_url_search_params_keys_iter result)
Definition ada_c.cpp:678
ada_string ada_search_params_values_iter_next(ada_url_search_params_values_iter result)
Definition ada_c.cpp:695
void ada_free_search_params_keys_iter(ada_url_search_params_keys_iter result)
Definition ada_c.cpp:658
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:562
void ada_free_strings(ada_strings result)
Definition ada_c.cpp:633
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:510
ada_url_search_params_entries_iter ada_search_params_get_entries(ada_url_search_params result)
Definition ada_c.cpp:622
void * ada_url_search_params_entries_iter
Definition ada_c.cpp:13
ada_string ada_search_params_get(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:574
void ada_free(ada_url result) noexcept
Definition ada_c.cpp:95
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:89
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:67
uint8_t ada_get_host_type(ada_url result) noexcept
Definition ada_c.cpp:223
void * ada_strings
Definition ada_c.cpp:10
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:502
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:30
ada::result< ada::url_aggregator > & get_instance(void *result) noexcept
Definition ada_c.cpp:3
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: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:541
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
void * ada_url_search_params
Definition ada_c.cpp:9
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:85
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:481
ada_string ada_strings_get(ada_strings result, size_t index)
Definition ada_c.cpp:648
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
void * ada_url
Definition ada_c.cpp:8
bool ada_search_params_entries_iter_has_next(ada_url_search_params_entries_iter result)
Definition ada_c.cpp:740
size_t ada_search_params_size(ada_url_search_params result)
Definition ada_c.cpp:493
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: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:72
ada_string ada_search_params_keys_iter_next(ada_url_search_params_keys_iter result)
Definition ada_c.cpp:664
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:726
ada_url_search_params_keys_iter ada_search_params_get_keys(ada_url_search_params result)
Definition ada_c.cpp:600
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:101
bool ada_has_password(ada_url result) noexcept
Definition ada_c.cpp:417
void * ada_url_search_params_keys_iter
Definition ada_c.cpp:11
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:521
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:639
ada_url_search_params_values_iter ada_search_params_get_values(ada_url_search_params result)
Definition ada_c.cpp:611
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:552
bool ada_has_non_empty_username(ada_url result) noexcept
Definition ada_c.cpp:393
void * ada_url_search_params_values_iter
Definition ada_c.cpp:12
void ada_search_params_remove(ada_url_search_params result, const char *key, size_t key_length)
Definition ada_c.cpp:532
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
std::string to_ascii(std::string_view ut8_string)
std::string to_unicode(std::string_view input)
bool can_parse(std::string_view input, const std::string_view *base_input=nullptr)
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