1 /**
2  * @file ada_c.h
3  * @brief Includes the C definitions for Ada. This is a C file, not C++.
4  */
5 #ifndef ADA_C_H
6 #define ADA_C_H
7 
8 #include <stdbool.h>
9 #include <stdint.h>
10 #include <stddef.h>
11 
12 // This is a reference to ada::url_components::omitted
13 // It represents "uint32_t(-1)"
14 #define ada_url_omitted 0xffffffff
15 
16 // string that is owned by the ada_url instance
17 typedef struct {
18   const char* data;
19   size_t length;
20 } ada_string;
21 
22 // string that must be freed by the caller
23 typedef struct {
24   const char* data;
25   size_t length;
26 } ada_owned_string;
27 
28 typedef struct {
29   uint32_t protocol_end;
30   uint32_t username_end;
31   uint32_t host_start;
32   uint32_t host_end;
33   uint32_t port;
34   uint32_t pathname_start;
35   uint32_t search_start;
36   uint32_t hash_start;
37 } ada_url_components;
38 
39 typedef void* ada_url;
40 
41 // input should be a null terminated C string (ASCII or UTF-8)
42 // you must call ada_free on the returned pointer
43 ada_url ada_parse(const char* input, size_t length);
44 ada_url ada_parse_with_base(const char* input, size_t input_length,
45                             const char* base, size_t base_length);
46 
47 // input and base should be a null terminated C strings
48 bool ada_can_parse(const char* input, size_t length);
49 bool ada_can_parse_with_base(const char* input, size_t input_length,
50                              const char* base, size_t base_length);
51 
52 void ada_free(ada_url result);
53 void ada_free_owned_string(ada_owned_string owned);
54 ada_url ada_copy(ada_url input);
55 
56 bool ada_is_valid(ada_url result);
57 
58 // url_aggregator getters
59 // if ada_is_valid(result)) is false, an empty string is returned
60 ada_owned_string ada_get_origin(ada_url result);
61 ada_string ada_get_href(ada_url result);
62 ada_string ada_get_username(ada_url result);
63 ada_string ada_get_password(ada_url result);
64 ada_string ada_get_port(ada_url result);
65 ada_string ada_get_hash(ada_url result);
66 ada_string ada_get_host(ada_url result);
67 ada_string ada_get_hostname(ada_url result);
68 ada_string ada_get_pathname(ada_url result);
69 ada_string ada_get_search(ada_url result);
70 ada_string ada_get_protocol(ada_url result);
71 uint8_t ada_get_host_type(ada_url result);
72 uint8_t ada_get_scheme_type(ada_url result);
73 
74 // url_aggregator setters
75 // if ada_is_valid(result)) is false, the setters have no effect
76 // input should be a null terminated C string
77 bool ada_set_href(ada_url result, const char* input, size_t length);
78 bool ada_set_host(ada_url result, const char* input, size_t length);
79 bool ada_set_hostname(ada_url result, const char* input, size_t length);
80 bool ada_set_protocol(ada_url result, const char* input, size_t length);
81 bool ada_set_username(ada_url result, const char* input, size_t length);
82 bool ada_set_password(ada_url result, const char* input, size_t length);
83 bool ada_set_port(ada_url result, const char* input, size_t length);
84 bool ada_set_pathname(ada_url result, const char* input, size_t length);
85 void ada_set_search(ada_url result, const char* input, size_t length);
86 void ada_set_hash(ada_url result, const char* input, size_t length);
87 
88 // url_aggregator clear methods
89 void ada_clear_port(ada_url result);
90 void ada_clear_hash(ada_url result);
91 void ada_clear_search(ada_url result);
92 
93 // url_aggregator functions
94 // if ada_is_valid(result) is false, functions below will return false
95 bool ada_has_credentials(ada_url result);
96 bool ada_has_empty_hostname(ada_url result);
97 bool ada_has_hostname(ada_url result);
98 bool ada_has_non_empty_username(ada_url result);
99 bool ada_has_non_empty_password(ada_url result);
100 bool ada_has_port(ada_url result);
101 bool ada_has_password(ada_url result);
102 bool ada_has_hash(ada_url result);
103 bool ada_has_search(ada_url result);
104 
105 // returns a pointer to the internal url_aggregator::url_components
106 const ada_url_components* ada_get_components(ada_url result);
107 
108 // idna methods
109 ada_owned_string ada_idna_to_unicode(const char* input, size_t length);
110 ada_owned_string ada_idna_to_ascii(const char* input, size_t length);
111 
112 // url search params
113 typedef void* ada_url_search_params;
114 
115 // Represents an std::vector<std::string>
116 typedef void* ada_strings;
117 typedef void* ada_url_search_params_keys_iter;
118 typedef void* ada_url_search_params_values_iter;
119 
120 typedef struct {
121   ada_string key;
122   ada_string value;
123 } ada_string_pair;
124 
125 typedef void* ada_url_search_params_entries_iter;
126 
127 ada_url_search_params ada_parse_search_params(const char* input, size_t length);
128 void ada_free_search_params(ada_url_search_params result);
129 
130 size_t ada_search_params_size(ada_url_search_params result);
131 void ada_search_params_sort(ada_url_search_params result);
132 ada_owned_string ada_search_params_to_string(ada_url_search_params result);
133 
134 void ada_search_params_append(ada_url_search_params result, const char* key,
135                               size_t key_length, const char* value,
136                               size_t value_length);
137 void ada_search_params_set(ada_url_search_params result, const char* key,
138                            size_t key_length, const char* value,
139                            size_t value_length);
140 void ada_search_params_remove(ada_url_search_params result, const char* key,
141                               size_t key_length);
142 void ada_search_params_remove_value(ada_url_search_params result,
143                                     const char* key, size_t key_length,
144                                     const char* value, size_t value_length);
145 bool ada_search_params_has(ada_url_search_params result, const char* key,
146                            size_t key_length);
147 bool ada_search_params_has_value(ada_url_search_params result, const char* key,
148                                  size_t key_length, const char* value,
149                                  size_t value_length);
150 ada_string ada_search_params_get(ada_url_search_params result, const char* key,
151                                  size_t key_length);
152 ada_strings ada_search_params_get_all(ada_url_search_params result,
153                                       const char* key, size_t key_length);
154 ada_url_search_params_keys_iter ada_search_params_get_keys(
155     ada_url_search_params result);
156 ada_url_search_params_values_iter ada_search_params_get_values(
157     ada_url_search_params result);
158 ada_url_search_params_entries_iter ada_search_params_get_entries(
159     ada_url_search_params result);
160 
161 void ada_free_strings(ada_strings result);
162 size_t ada_strings_size(ada_strings result);
163 ada_string ada_strings_get(ada_strings result, size_t index);
164 
165 void ada_free_search_params_keys_iter(ada_url_search_params_keys_iter result);
166 ada_string ada_search_params_keys_iter_next(
167     ada_url_search_params_keys_iter result);
168 bool ada_search_params_keys_iter_has_next(
169     ada_url_search_params_keys_iter result);
170 
171 void ada_free_search_params_values_iter(
172     ada_url_search_params_values_iter result);
173 ada_string ada_search_params_values_iter_next(
174     ada_url_search_params_values_iter result);
175 bool ada_search_params_values_iter_has_next(
176     ada_url_search_params_values_iter result);
177 
178 void ada_free_search_params_entries_iter(
179     ada_url_search_params_entries_iter result);
180 ada_string_pair ada_search_params_entries_iter_next(
181     ada_url_search_params_entries_iter result);
182 bool ada_search_params_entries_iter_has_next(
183     ada_url_search_params_entries_iter result);
184 
185 #endif  // ADA_C_H
186