visaljs 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/README.md +12 -4
  2. package/THIRD_PARTY_LICENSES +31 -1
  3. package/cli.js +962 -68
  4. package/node/include/js_node.h +11 -1
  5. package/node/prelude/_http_common.js +29 -0
  6. package/node/prelude/async_hooks.js +50 -11
  7. package/node/prelude/child_process.js +31 -4
  8. package/node/prelude/console.js +311 -143
  9. package/node/prelude/crypto.js +6 -4
  10. package/node/prelude/dgram.js +1169 -0
  11. package/node/prelude/diagnostics_channel.js +3 -1
  12. package/node/prelude/dns.js +250 -45
  13. package/node/prelude/dns_promises.js +8 -2
  14. package/node/prelude/fs_promises.js +9 -1
  15. package/node/prelude/http.js +395 -86
  16. package/node/prelude/https.js +13 -4
  17. package/node/prelude/internal/console_class.js +7 -0
  18. package/node/prelude/internal/console_global.js +25 -0
  19. package/node/prelude/internal/crypto/key_encryption.js +217 -0
  20. package/node/prelude/internal/crypto/keys.js +161 -26
  21. package/node/prelude/internal/crypto/random.js +24 -0
  22. package/node/prelude/internal/crypto/util.js +2 -1
  23. package/node/prelude/internal/crypto_x509.js +161 -0
  24. package/node/prelude/internal/dns_classes.js +6 -0
  25. package/node/prelude/internal/dns_resolver.js +371 -0
  26. package/node/prelude/internal/errors.js +9 -0
  27. package/node/prelude/internal/events_on.js +82 -37
  28. package/node/prelude/internal/features.js +8 -4
  29. package/node/prelude/internal/fs_filehandle.js +10 -4
  30. package/node/prelude/internal/perf_histogram.js +1 -1
  31. package/node/prelude/internal/process_more.js +32 -17
  32. package/node/prelude/internal/process_signals.js +8 -2
  33. package/node/prelude/internal/punycode.ts +163 -0
  34. package/node/prelude/internal/readline.js +648 -274
  35. package/node/prelude/internal/readline_editor.js +1240 -0
  36. package/node/prelude/internal/string_width.js +43 -0
  37. package/node/prelude/internal/tls/common.js +145 -33
  38. package/node/prelude/internal/tls/wrap.js +182 -49
  39. package/node/prelude/internal/tls/x509.js +4 -1
  40. package/node/prelude/internal/udp.js +177 -0
  41. package/node/prelude/net.js +13 -1
  42. package/node/prelude/os.js +24 -6
  43. package/node/prelude/perf_hooks.js +37 -2
  44. package/node/prelude/punycode.js +2 -130
  45. package/node/prelude/readline.js +113 -4
  46. package/node/prelude/readline_promises.js +56 -32
  47. package/node/prelude/tls.js +21 -4
  48. package/node/prelude/util.js +3 -16
  49. package/node/src/host_dns.c +623 -0
  50. package/node/src/host_http.c +12 -0
  51. package/node/src/host_net.c +46 -0
  52. package/node/src/host_os.c +1 -6
  53. package/node/src/host_sys.c +70 -0
  54. package/node/src/host_udp.c +418 -0
  55. package/node/third_party/c-ares/LICENSE.md +24 -0
  56. package/node/third_party/c-ares/config/darwin/ares_config.h +573 -0
  57. package/node/third_party/c-ares/config/freebsd/ares_config.h +573 -0
  58. package/node/third_party/c-ares/config/linux/ares_config.h +573 -0
  59. package/node/third_party/c-ares/config/openbsd/ares_config.h +583 -0
  60. package/node/third_party/c-ares/include/ares.h +1237 -0
  61. package/node/third_party/c-ares/include/ares_build.h +202 -0
  62. package/node/third_party/c-ares/include/ares_dns.h +127 -0
  63. package/node/third_party/c-ares/include/ares_dns_record.h +1119 -0
  64. package/node/third_party/c-ares/include/ares_nameser.h +510 -0
  65. package/node/third_party/c-ares/include/ares_version.h +47 -0
  66. package/node/third_party/c-ares/src/lib/ares_addrinfo2hostent.c +305 -0
  67. package/node/third_party/c-ares/src/lib/ares_addrinfo_localhost.c +245 -0
  68. package/node/third_party/c-ares/src/lib/ares_android.c +496 -0
  69. package/node/third_party/c-ares/src/lib/ares_android.h +38 -0
  70. package/node/third_party/c-ares/src/lib/ares_cancel.c +87 -0
  71. package/node/third_party/c-ares/src/lib/ares_close_sockets.c +137 -0
  72. package/node/third_party/c-ares/src/lib/ares_conn.c +511 -0
  73. package/node/third_party/c-ares/src/lib/ares_conn.h +202 -0
  74. package/node/third_party/c-ares/src/lib/ares_cookie.c +461 -0
  75. package/node/third_party/c-ares/src/lib/ares_data.c +168 -0
  76. package/node/third_party/c-ares/src/lib/ares_data.h +92 -0
  77. package/node/third_party/c-ares/src/lib/ares_destroy.c +159 -0
  78. package/node/third_party/c-ares/src/lib/ares_free_hostent.c +54 -0
  79. package/node/third_party/c-ares/src/lib/ares_free_string.c +33 -0
  80. package/node/third_party/c-ares/src/lib/ares_freeaddrinfo.c +67 -0
  81. package/node/third_party/c-ares/src/lib/ares_getaddrinfo.c +806 -0
  82. package/node/third_party/c-ares/src/lib/ares_getenv.c +38 -0
  83. package/node/third_party/c-ares/src/lib/ares_getenv.h +34 -0
  84. package/node/third_party/c-ares/src/lib/ares_gethostbyaddr.c +229 -0
  85. package/node/third_party/c-ares/src/lib/ares_gethostbyname.c +341 -0
  86. package/node/third_party/c-ares/src/lib/ares_getnameinfo.c +437 -0
  87. package/node/third_party/c-ares/src/lib/ares_hosts_file.c +960 -0
  88. package/node/third_party/c-ares/src/lib/ares_inet_net_pton.h +31 -0
  89. package/node/third_party/c-ares/src/lib/ares_init.c +631 -0
  90. package/node/third_party/c-ares/src/lib/ares_ipv6.h +115 -0
  91. package/node/third_party/c-ares/src/lib/ares_library_init.c +190 -0
  92. package/node/third_party/c-ares/src/lib/ares_metrics.c +261 -0
  93. package/node/third_party/c-ares/src/lib/ares_options.c +492 -0
  94. package/node/third_party/c-ares/src/lib/ares_parse_into_addrinfo.c +179 -0
  95. package/node/third_party/c-ares/src/lib/ares_private.h +648 -0
  96. package/node/third_party/c-ares/src/lib/ares_process.c +1649 -0
  97. package/node/third_party/c-ares/src/lib/ares_qcache.c +442 -0
  98. package/node/third_party/c-ares/src/lib/ares_query.c +151 -0
  99. package/node/third_party/c-ares/src/lib/ares_search.c +623 -0
  100. package/node/third_party/c-ares/src/lib/ares_send.c +300 -0
  101. package/node/third_party/c-ares/src/lib/ares_set_socket_functions.c +590 -0
  102. package/node/third_party/c-ares/src/lib/ares_setup.h +224 -0
  103. package/node/third_party/c-ares/src/lib/ares_socket.c +427 -0
  104. package/node/third_party/c-ares/src/lib/ares_socket.h +163 -0
  105. package/node/third_party/c-ares/src/lib/ares_sortaddrinfo.c +447 -0
  106. package/node/third_party/c-ares/src/lib/ares_strerror.c +91 -0
  107. package/node/third_party/c-ares/src/lib/ares_sysconfig.c +642 -0
  108. package/node/third_party/c-ares/src/lib/ares_sysconfig_files.c +851 -0
  109. package/node/third_party/c-ares/src/lib/ares_sysconfig_mac.c +373 -0
  110. package/node/third_party/c-ares/src/lib/ares_sysconfig_win.c +673 -0
  111. package/node/third_party/c-ares/src/lib/ares_timeout.c +162 -0
  112. package/node/third_party/c-ares/src/lib/ares_update_servers.c +1376 -0
  113. package/node/third_party/c-ares/src/lib/ares_version.c +36 -0
  114. package/node/third_party/c-ares/src/lib/config-dos.h +114 -0
  115. package/node/third_party/c-ares/src/lib/config-win32.h +396 -0
  116. package/node/third_party/c-ares/src/lib/dsa/ares_array.c +409 -0
  117. package/node/third_party/c-ares/src/lib/dsa/ares_htable.c +451 -0
  118. package/node/third_party/c-ares/src/lib/dsa/ares_htable.h +174 -0
  119. package/node/third_party/c-ares/src/lib/dsa/ares_htable_asvp.c +224 -0
  120. package/node/third_party/c-ares/src/lib/dsa/ares_htable_dict.c +230 -0
  121. package/node/third_party/c-ares/src/lib/dsa/ares_htable_strvp.c +210 -0
  122. package/node/third_party/c-ares/src/lib/dsa/ares_htable_szvp.c +188 -0
  123. package/node/third_party/c-ares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  124. package/node/third_party/c-ares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  125. package/node/third_party/c-ares/src/lib/dsa/ares_llist.c +385 -0
  126. package/node/third_party/c-ares/src/lib/dsa/ares_slist.c +479 -0
  127. package/node/third_party/c-ares/src/lib/dsa/ares_slist.h +207 -0
  128. package/node/third_party/c-ares/src/lib/event/ares_event.h +191 -0
  129. package/node/third_party/c-ares/src/lib/event/ares_event_configchg.c +746 -0
  130. package/node/third_party/c-ares/src/lib/event/ares_event_epoll.c +192 -0
  131. package/node/third_party/c-ares/src/lib/event/ares_event_kqueue.c +248 -0
  132. package/node/third_party/c-ares/src/lib/event/ares_event_poll.c +140 -0
  133. package/node/third_party/c-ares/src/lib/event/ares_event_select.c +159 -0
  134. package/node/third_party/c-ares/src/lib/event/ares_event_thread.c +575 -0
  135. package/node/third_party/c-ares/src/lib/event/ares_event_wake_pipe.c +172 -0
  136. package/node/third_party/c-ares/src/lib/event/ares_event_win32.c +981 -0
  137. package/node/third_party/c-ares/src/lib/event/ares_event_win32.h +161 -0
  138. package/node/third_party/c-ares/src/lib/include/ares_array.h +276 -0
  139. package/node/third_party/c-ares/src/lib/include/ares_buf.h +732 -0
  140. package/node/third_party/c-ares/src/lib/include/ares_htable_asvp.h +130 -0
  141. package/node/third_party/c-ares/src/lib/include/ares_htable_dict.h +123 -0
  142. package/node/third_party/c-ares/src/lib/include/ares_htable_strvp.h +130 -0
  143. package/node/third_party/c-ares/src/lib/include/ares_htable_szvp.h +118 -0
  144. package/node/third_party/c-ares/src/lib/include/ares_htable_vpstr.h +111 -0
  145. package/node/third_party/c-ares/src/lib/include/ares_htable_vpvp.h +128 -0
  146. package/node/third_party/c-ares/src/lib/include/ares_llist.h +239 -0
  147. package/node/third_party/c-ares/src/lib/include/ares_mem.h +41 -0
  148. package/node/third_party/c-ares/src/lib/include/ares_str.h +261 -0
  149. package/node/third_party/c-ares/src/lib/inet_net_pton.c +451 -0
  150. package/node/third_party/c-ares/src/lib/inet_ntop.c +219 -0
  151. package/node/third_party/c-ares/src/lib/legacy/ares_create_query.c +78 -0
  152. package/node/third_party/c-ares/src/lib/legacy/ares_expand_name.c +99 -0
  153. package/node/third_party/c-ares/src/lib/legacy/ares_expand_string.c +107 -0
  154. package/node/third_party/c-ares/src/lib/legacy/ares_fds.c +80 -0
  155. package/node/third_party/c-ares/src/lib/legacy/ares_getsock.c +85 -0
  156. package/node/third_party/c-ares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  157. package/node/third_party/c-ares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  158. package/node/third_party/c-ares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  159. package/node/third_party/c-ares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  160. package/node/third_party/c-ares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  161. package/node/third_party/c-ares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  162. package/node/third_party/c-ares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  163. package/node/third_party/c-ares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  164. package/node/third_party/c-ares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  165. package/node/third_party/c-ares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  166. package/node/third_party/c-ares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  167. package/node/third_party/c-ares/src/lib/record/ares_dns_mapping.c +982 -0
  168. package/node/third_party/c-ares/src/lib/record/ares_dns_multistring.c +309 -0
  169. package/node/third_party/c-ares/src/lib/record/ares_dns_multistring.h +72 -0
  170. package/node/third_party/c-ares/src/lib/record/ares_dns_name.c +736 -0
  171. package/node/third_party/c-ares/src/lib/record/ares_dns_parse.c +1360 -0
  172. package/node/third_party/c-ares/src/lib/record/ares_dns_private.h +273 -0
  173. package/node/third_party/c-ares/src/lib/record/ares_dns_record.c +1701 -0
  174. package/node/third_party/c-ares/src/lib/record/ares_dns_write.c +1229 -0
  175. package/node/third_party/c-ares/src/lib/str/ares_buf.c +1510 -0
  176. package/node/third_party/c-ares/src/lib/str/ares_str.c +562 -0
  177. package/node/third_party/c-ares/src/lib/str/ares_strsplit.c +90 -0
  178. package/node/third_party/c-ares/src/lib/str/ares_strsplit.h +51 -0
  179. package/node/third_party/c-ares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  180. package/node/third_party/c-ares/src/lib/util/ares_iface_ips.c +640 -0
  181. package/node/third_party/c-ares/src/lib/util/ares_iface_ips.h +140 -0
  182. package/node/third_party/c-ares/src/lib/util/ares_math.c +167 -0
  183. package/node/third_party/c-ares/src/lib/util/ares_math.h +58 -0
  184. package/node/third_party/c-ares/src/lib/util/ares_rand.c +389 -0
  185. package/node/third_party/c-ares/src/lib/util/ares_rand.h +36 -0
  186. package/node/third_party/c-ares/src/lib/util/ares_threads.c +613 -0
  187. package/node/third_party/c-ares/src/lib/util/ares_threads.h +60 -0
  188. package/node/third_party/c-ares/src/lib/util/ares_time.h +49 -0
  189. package/node/third_party/c-ares/src/lib/util/ares_timeval.c +95 -0
  190. package/node/third_party/c-ares/src/lib/util/ares_uri.c +1627 -0
  191. package/node/third_party/c-ares/src/lib/util/ares_uri.h +252 -0
  192. package/node/third_party/c-ares/src/lib/windows_port.c +29 -0
  193. package/package.json +1 -1
  194. package/prebuilt/darwin-arm64/cares-a6286c65ca9374a3.a +0 -0
  195. package/prebuilt/darwin-x64/cares-a6286c65ca9374a3.a +0 -0
  196. package/prebuilt/linux-arm64/cares-4ba05ac8e948af8e.a +0 -0
  197. package/prebuilt/linux-arm64-musl/cares-4ba05ac8e948af8e.a +0 -0
  198. package/prebuilt/linux-x64/cares-4ba05ac8e948af8e.a +0 -0
  199. package/prebuilt/linux-x64-musl/cares-4ba05ac8e948af8e.a +0 -0
  200. package/prebuilt/win32-x64/boringssl-ce573858472b7fc9.a +0 -0
  201. package/prebuilt/win32-x64/brotli-20d86a61f30baeb3.a +0 -0
  202. package/prebuilt/win32-x64/cares-49c9ec95162b912d.a +0 -0
  203. package/prebuilt/win32-x64/uv-b11bae65d7fced82.a +0 -0
  204. package/prebuilt/win32-x64/zlib-4ce2317a4c3f5fb5.a +0 -0
  205. package/prebuilt/win32-x64/zstd-015315ac7c784c73.a +0 -0
  206. package/runtime/include/js_builtins.h +5 -0
  207. package/runtime/include/js_crypto.h +11 -0
  208. package/runtime/include/js_gc.h +13 -10
  209. package/runtime/include/js_jobs.h +2 -0
  210. package/runtime/include/js_object.h +58 -0
  211. package/runtime/include/jscontext.h +1 -0
  212. package/runtime/src/crypto_internal.h +1 -0
  213. package/runtime/src/crypto_subtle.c +66 -7
  214. package/runtime/src/crypto_tls.c +265 -19
  215. package/runtime/src/gc.c +73 -92
  216. package/runtime/src/inspect.c +18 -1
  217. package/runtime/src/jobs.c +37 -22
  218. package/runtime/src/object.c +49 -2
  219. package/runtime/src/os.c +16 -6
  220. package/runtime/src/os.h +2 -0
  221. package/runtime/src/process.c +97 -10
@@ -0,0 +1,562 @@
1
+ /* MIT License
2
+ *
3
+ * Copyright (c) 1998 Massachusetts Institute of Technology
4
+ * Copyright (c) The c-ares project and its contributors
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice (including the next
14
+ * paragraph) shall be included in all copies or substantial portions of the
15
+ * Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ * SOFTWARE.
24
+ *
25
+ * SPDX-License-Identifier: MIT
26
+ */
27
+
28
+ #include "ares_private.h"
29
+ #include "ares_str.h"
30
+
31
+ #include <errno.h>
32
+ #include <limits.h>
33
+
34
+ #ifdef HAVE_STDINT_H
35
+ # include <stdint.h>
36
+ #endif
37
+
38
+ size_t ares_strnlen(const char *str, size_t maxlen) {
39
+ const char *p = NULL;
40
+ if (str == NULL) {
41
+ return 0;
42
+ }
43
+ #ifdef HAVE_STRNLEN
44
+ (void)p;
45
+ return strnlen(str, maxlen);
46
+ #else
47
+ if ((p = memchr(str, 0, maxlen)) == NULL) {
48
+ return maxlen;
49
+ } else {
50
+ return (size_t)(p - str);
51
+ }
52
+ #endif /* HAVE_STRNLEN */
53
+ }
54
+
55
+ size_t ares_strlen(const char *str)
56
+ {
57
+ if (str == NULL) {
58
+ return 0;
59
+ }
60
+
61
+ return strlen(str);
62
+ }
63
+
64
+ char *ares_strdup(const char *s1)
65
+ {
66
+ size_t len;
67
+ char *out;
68
+
69
+ if (s1 == NULL) {
70
+ return NULL;
71
+ }
72
+
73
+ len = ares_strlen(s1);
74
+
75
+ /* Don't see how this is possible */
76
+ if (len == SIZE_MAX) {
77
+ return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */
78
+ }
79
+
80
+ out = ares_malloc(len + 1);
81
+ if (out == NULL) {
82
+ return NULL;
83
+ }
84
+
85
+ if (len) {
86
+ memcpy(out, s1, len);
87
+ }
88
+
89
+ out[len] = 0;
90
+ return out;
91
+ }
92
+
93
+ size_t ares_strcpy(char *dest, const char *src, size_t dest_size)
94
+ {
95
+ size_t len = 0;
96
+
97
+ if (dest == NULL || dest_size == 0) {
98
+ return 0; /* LCOV_EXCL_LINE: DefensiveCoding */
99
+ }
100
+
101
+ len = ares_strlen(src);
102
+
103
+ if (len >= dest_size) {
104
+ len = dest_size - 1;
105
+ }
106
+
107
+ if (len) {
108
+ memcpy(dest, src, len);
109
+ }
110
+
111
+ dest[len] = 0;
112
+ return len;
113
+ }
114
+
115
+ ares_bool_t ares_str_isnum(const char *str)
116
+ {
117
+ size_t i;
118
+
119
+ if (str == NULL || *str == 0) {
120
+ return ARES_FALSE;
121
+ }
122
+
123
+ for (i = 0; str[i] != 0; i++) {
124
+ if (!ares_isdigit(str[i])) {
125
+ return ARES_FALSE;
126
+ }
127
+ }
128
+ return ARES_TRUE;
129
+ }
130
+
131
+ ares_bool_t ares_str_parse_uint(const char *str, unsigned long max,
132
+ unsigned int *out)
133
+ {
134
+ char *end = NULL;
135
+ unsigned long val;
136
+
137
+ /* Require a leading digit so strtoul()'s tolerance of a sign or leading
138
+ * whitespace (e.g. "-1" wrapping to UINT_MAX) can't slip through here. This
139
+ * also rejects NULL and empty strings. */
140
+ if (str == NULL || out == NULL || !ares_isdigit(*str)) {
141
+ return ARES_FALSE;
142
+ }
143
+
144
+ /* out is unsigned int, so a max above UINT_MAX would let strtoul's result
145
+ * truncate silently on assignment. Cap it. */
146
+ if (max > UINT_MAX) {
147
+ max = UINT_MAX;
148
+ }
149
+
150
+ errno = 0;
151
+ val = strtoul(str, &end, 10);
152
+ if (errno == ERANGE || *end != '\0' || val > max) {
153
+ return ARES_FALSE;
154
+ }
155
+
156
+ *out = (unsigned int)val;
157
+ return ARES_TRUE;
158
+ }
159
+
160
+ ares_bool_t ares_parse_port(const char *str, unsigned short *port,
161
+ ares_bool_t allow_zero)
162
+ {
163
+ unsigned int val;
164
+
165
+ if (port == NULL) {
166
+ return ARES_FALSE;
167
+ }
168
+
169
+ if (!ares_str_parse_uint(str, 65535UL, &val)) {
170
+ return ARES_FALSE;
171
+ }
172
+
173
+ if (!allow_zero && val == 0) {
174
+ return ARES_FALSE;
175
+ }
176
+
177
+ *port = (unsigned short)val;
178
+
179
+ return ARES_TRUE;
180
+ }
181
+
182
+ ares_bool_t ares_str_isalnum(const char *str)
183
+ {
184
+ size_t i;
185
+
186
+ if (str == NULL || *str == 0) {
187
+ return ARES_FALSE;
188
+ }
189
+
190
+ for (i = 0; str[i] != 0; i++) {
191
+ if (!ares_isdigit(str[i]) && !ares_isalpha(str[i])) {
192
+ return ARES_FALSE;
193
+ }
194
+ }
195
+ return ARES_TRUE;
196
+ }
197
+
198
+ void ares_str_rtrim(char *str)
199
+ {
200
+ size_t len;
201
+ size_t i;
202
+
203
+ if (str == NULL) {
204
+ return; /* LCOV_EXCL_LINE: DefensiveCoding */
205
+ }
206
+
207
+ len = ares_strlen(str);
208
+ for (i = len; i > 0; i--) {
209
+ if (!ares_isspace(str[i - 1])) {
210
+ break;
211
+ }
212
+ }
213
+ str[i] = 0;
214
+ }
215
+
216
+ void ares_str_ltrim(char *str)
217
+ {
218
+ size_t i;
219
+ size_t len;
220
+
221
+ if (str == NULL) {
222
+ return; /* LCOV_EXCL_LINE: DefensiveCoding */
223
+ }
224
+
225
+ for (i = 0; str[i] != 0 && ares_isspace(str[i]); i++) {
226
+ /* Do nothing */
227
+ }
228
+
229
+ if (i == 0) {
230
+ return;
231
+ }
232
+
233
+ len = ares_strlen(str);
234
+ if (i != len) {
235
+ memmove(str, str + i, len - i);
236
+ }
237
+ str[len - i] = 0;
238
+ }
239
+
240
+ void ares_str_trim(char *str)
241
+ {
242
+ ares_str_ltrim(str);
243
+ ares_str_rtrim(str);
244
+ }
245
+
246
+ /* tolower() is locale-specific. Use a lookup table fast conversion that only
247
+ * operates on ASCII */
248
+ static const unsigned char ares_tolower_lookup[] = {
249
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
250
+ 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
251
+ 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
252
+ 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33,
253
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40,
254
+ 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D,
255
+ 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
256
+ 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
257
+ 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74,
258
+ 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81,
259
+ 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
260
+ 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B,
261
+ 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
262
+ 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5,
263
+ 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2,
264
+ 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
265
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC,
266
+ 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
267
+ 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6,
268
+ 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
269
+ };
270
+
271
+ unsigned char ares_tolower(unsigned char c)
272
+ {
273
+ return ares_tolower_lookup[c];
274
+ }
275
+
276
+ void ares_str_lower(char *str)
277
+ {
278
+ size_t i;
279
+
280
+ if (str == NULL) {
281
+ return;
282
+ }
283
+
284
+ for (i = 0; str[i] != 0; i++) {
285
+ str[i] = (char)ares_tolower((unsigned char)str[i]);
286
+ }
287
+ }
288
+
289
+ unsigned char *ares_memmem(const unsigned char *big, size_t big_len,
290
+ const unsigned char *little, size_t little_len)
291
+ {
292
+ unsigned char *ptr;
293
+
294
+ if (big == NULL || little == NULL || big_len == 0 || little_len == 0) {
295
+ return NULL;
296
+ }
297
+
298
+ #ifdef HAVE_MEMMEM
299
+ ptr = memmem(big, big_len, little, little_len);
300
+ return ptr;
301
+ #else
302
+ while (1) {
303
+ ptr = memchr(big, little[0], big_len);
304
+ if (ptr == NULL) {
305
+ break;
306
+ }
307
+
308
+ big_len -= (size_t)(ptr - big);
309
+ big = ptr;
310
+ if (big_len < little_len) {
311
+ break;
312
+ }
313
+
314
+ if (memcmp(big, little, little_len) == 0) {
315
+ return ptr;
316
+ }
317
+
318
+ big++;
319
+ big_len--;
320
+ }
321
+
322
+ return NULL;
323
+ #endif
324
+ }
325
+
326
+ ares_bool_t ares_memeq(const unsigned char *ptr, const unsigned char *val,
327
+ size_t len)
328
+ {
329
+ return memcmp(ptr, val, len) == 0 ? ARES_TRUE : ARES_FALSE;
330
+ }
331
+
332
+ ares_bool_t ares_memeq_ci(const unsigned char *ptr, const unsigned char *val,
333
+ size_t len)
334
+ {
335
+ size_t i;
336
+ for (i = 0; i < len; i++) {
337
+ if (ares_tolower_lookup[ptr[i]] != ares_tolower_lookup[val[i]]) {
338
+ return ARES_FALSE;
339
+ }
340
+ }
341
+ return ARES_TRUE;
342
+ }
343
+
344
+ ares_bool_t ares_is_hostname(const char *str)
345
+ {
346
+ size_t i;
347
+
348
+ if (str == NULL) {
349
+ return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */
350
+ }
351
+
352
+ for (i = 0; str[i] != 0; i++) {
353
+ if (!ares_is_hostnamech(str[i])) {
354
+ return ARES_FALSE;
355
+ }
356
+ }
357
+ return ARES_TRUE;
358
+ }
359
+
360
+ ares_bool_t ares_str_isprint(const char *str, size_t len)
361
+ {
362
+ size_t i;
363
+
364
+ if (str == NULL && len != 0) {
365
+ return ARES_FALSE;
366
+ }
367
+
368
+ for (i = 0; i < len; i++) {
369
+ if (!ares_isprint(str[i])) {
370
+ return ARES_FALSE;
371
+ }
372
+ }
373
+ return ARES_TRUE;
374
+ }
375
+
376
+ int ares_strcmp(const char *a, const char *b)
377
+ {
378
+ if (a == NULL && b == NULL) {
379
+ return 0;
380
+ }
381
+
382
+ if (a != NULL && b == NULL) {
383
+ if (*a == 0) {
384
+ return 0;
385
+ }
386
+ return 1;
387
+ }
388
+
389
+ if (a == NULL && b != NULL) {
390
+ if (*b == 0) {
391
+ return 0;
392
+ }
393
+ return -1;
394
+ }
395
+
396
+ return strcmp(a, b);
397
+ }
398
+
399
+ int ares_strncmp(const char *a, const char *b, size_t n)
400
+ {
401
+ if (n == 0) {
402
+ return 0;
403
+ }
404
+
405
+ if (a == NULL && b == NULL) {
406
+ return 0;
407
+ }
408
+
409
+ if (a != NULL && b == NULL) {
410
+ if (*a == 0) {
411
+ return 0;
412
+ }
413
+ return 1;
414
+ }
415
+
416
+ if (a == NULL && b != NULL) {
417
+ if (*b == 0) {
418
+ return 0;
419
+ }
420
+ return -1;
421
+ }
422
+
423
+ return strncmp(a, b, n);
424
+ }
425
+
426
+ int ares_strcasecmp(const char *a, const char *b)
427
+ {
428
+ if (a == NULL && b == NULL) {
429
+ return 0;
430
+ }
431
+
432
+ if (a != NULL && b == NULL) {
433
+ if (*a == 0) {
434
+ return 0;
435
+ }
436
+ return 1;
437
+ }
438
+
439
+ if (a == NULL && b != NULL) {
440
+ if (*b == 0) {
441
+ return 0;
442
+ }
443
+ return -1;
444
+ }
445
+
446
+ #if defined(HAVE_STRCASECMP)
447
+ return strcasecmp(a, b);
448
+ #elif defined(HAVE_STRCMPI)
449
+ return strcmpi(a, b);
450
+ #elif defined(HAVE_STRICMP)
451
+ return stricmp(a, b);
452
+ #else
453
+ {
454
+ size_t i;
455
+
456
+ for (i = 0; i < (size_t)-1; i++) {
457
+ int c1 = ares_tolower(a[i]);
458
+ int c2 = ares_tolower(b[i]);
459
+ if (c1 != c2) {
460
+ return c1 - c2;
461
+ }
462
+ if (!c1) {
463
+ break;
464
+ }
465
+ }
466
+ }
467
+ return 0;
468
+ #endif
469
+ }
470
+
471
+ int ares_strncasecmp(const char *a, const char *b, size_t n)
472
+ {
473
+ if (n == 0) {
474
+ return 0;
475
+ }
476
+
477
+ if (a == NULL && b == NULL) {
478
+ return 0;
479
+ }
480
+
481
+ if (a != NULL && b == NULL) {
482
+ if (*a == 0) {
483
+ return 0;
484
+ }
485
+ return 1;
486
+ }
487
+
488
+ if (a == NULL && b != NULL) {
489
+ if (*b == 0) {
490
+ return 0;
491
+ }
492
+ return -1;
493
+ }
494
+
495
+ #if defined(HAVE_STRNCASECMP)
496
+ return strncasecmp(a, b, n);
497
+ #elif defined(HAVE_STRNCMPI)
498
+ return strncmpi(a, b, n);
499
+ #elif defined(HAVE_STRNICMP)
500
+ return strnicmp(a, b, n);
501
+ #else
502
+ {
503
+ size_t i;
504
+
505
+ for (i = 0; i < n; i++) {
506
+ int c1 = ares_tolower(a[i]);
507
+ int c2 = ares_tolower(b[i]);
508
+ if (c1 != c2) {
509
+ return c1 - c2;
510
+ }
511
+ if (!c1) {
512
+ break;
513
+ }
514
+ }
515
+ }
516
+ return 0;
517
+ #endif
518
+ }
519
+
520
+ ares_bool_t ares_strcaseeq(const char *a, const char *b)
521
+ {
522
+ return ares_strcasecmp(a, b) == 0 ? ARES_TRUE : ARES_FALSE;
523
+ }
524
+
525
+ ares_bool_t ares_strcaseeq_max(const char *a, const char *b, size_t n)
526
+ {
527
+ return ares_strncasecmp(a, b, n) == 0 ? ARES_TRUE : ARES_FALSE;
528
+ }
529
+
530
+ ares_bool_t ares_streq(const char *a, const char *b)
531
+ {
532
+ return ares_strcmp(a, b) == 0 ? ARES_TRUE : ARES_FALSE;
533
+ }
534
+
535
+ ares_bool_t ares_streq_max(const char *a, const char *b, size_t n)
536
+ {
537
+ return ares_strncmp(a, b, n) == 0 ? ARES_TRUE : ARES_FALSE;
538
+ }
539
+
540
+ void ares_free_array(void *arrp, size_t nmembers, void (*freefunc)(void *))
541
+ {
542
+ size_t i;
543
+ void **arr = arrp;
544
+
545
+ if (arr == NULL) {
546
+ return;
547
+ }
548
+
549
+ if (freefunc != NULL) {
550
+ if (nmembers == SIZE_MAX) {
551
+ for (i = 0; arr[i] != NULL; i++) {
552
+ freefunc(arr[i]);
553
+ }
554
+ } else {
555
+ for (i = 0; i < nmembers; i++) {
556
+ freefunc(arr[i]);
557
+ }
558
+ }
559
+ }
560
+
561
+ ares_free(arr);
562
+ }
@@ -0,0 +1,90 @@
1
+ /* MIT License
2
+ *
3
+ * Copyright (c) 2018 John Schember
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice (including the next
13
+ * paragraph) shall be included in all copies or substantial portions of the
14
+ * Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ *
24
+ * SPDX-License-Identifier: MIT
25
+ */
26
+ #include "ares_private.h"
27
+
28
+ void ares_strsplit_free(char **elms, size_t num_elm)
29
+ {
30
+ ares_free_array(elms, num_elm, ares_free);
31
+ }
32
+
33
+ char **ares_strsplit_duplicate(char **elms, size_t num_elm)
34
+ {
35
+ size_t i;
36
+ char **out;
37
+
38
+ if (elms == NULL || num_elm == 0) {
39
+ return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */
40
+ }
41
+
42
+ out = ares_malloc_zero(sizeof(*elms) * num_elm);
43
+ if (out == NULL) {
44
+ return NULL; /* LCOV_EXCL_LINE: OutOfMemory */
45
+ }
46
+
47
+ for (i = 0; i < num_elm; i++) {
48
+ out[i] = ares_strdup(elms[i]);
49
+ if (out[i] == NULL) {
50
+ ares_strsplit_free(out, num_elm); /* LCOV_EXCL_LINE: OutOfMemory */
51
+ return NULL; /* LCOV_EXCL_LINE: OutOfMemory */
52
+ }
53
+ }
54
+
55
+ return out;
56
+ }
57
+
58
+ char **ares_strsplit(const char *in, const char *delms, size_t *num_elm)
59
+ {
60
+ ares_status_t status;
61
+ ares_buf_t *buf = NULL;
62
+ char **out = NULL;
63
+
64
+ if (in == NULL || delms == NULL || num_elm == NULL) {
65
+ return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */
66
+ }
67
+
68
+ *num_elm = 0;
69
+
70
+ buf = ares_buf_create_const((const unsigned char *)in, ares_strlen(in));
71
+ if (buf == NULL) {
72
+ return NULL;
73
+ }
74
+
75
+ status = ares_buf_split_str(
76
+ buf, (const unsigned char *)delms, ares_strlen(delms),
77
+ ARES_BUF_SPLIT_NO_DUPLICATES | ARES_BUF_SPLIT_CASE_INSENSITIVE, 0, &out,
78
+ num_elm);
79
+ if (status != ARES_SUCCESS) {
80
+ goto done;
81
+ }
82
+
83
+ done:
84
+ ares_buf_destroy(buf);
85
+ if (status != ARES_SUCCESS) {
86
+ out = NULL;
87
+ }
88
+
89
+ return out;
90
+ }
@@ -0,0 +1,51 @@
1
+ /* MIT License
2
+ *
3
+ * Copyright (c) 2018 John Schember
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice (including the next
13
+ * paragraph) shall be included in all copies or substantial portions of the
14
+ * Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ *
24
+ * SPDX-License-Identifier: MIT
25
+ */
26
+ #ifndef HEADER_CARES_STRSPLIT_H
27
+ #define HEADER_CARES_STRSPLIT_H
28
+
29
+ /* Split a string on delms skipping empty or duplicate elements.
30
+ *
31
+ * param in String to split.
32
+ * param delms String of characters to treat as a delimiter.
33
+ * Each character in the string is a delimiter so
34
+ * there can be multiple delimiters to split on.
35
+ * E.g. ", " will split on all comma's and spaces.
36
+ * Duplicate (case-insensitive) entries are removed.
37
+ * param num_elm Return parameter of the number of elements
38
+ * in the result array.
39
+ *
40
+ * returns an allocated array of allocated string elements.
41
+ *
42
+ */
43
+ char **ares_strsplit(const char *in, const char *delms, size_t *num_elm);
44
+
45
+ /* Frees the result returned from ares_strsplit(). */
46
+ void ares_strsplit_free(char **elms, size_t num_elm);
47
+
48
+ /* Duplicate the array */
49
+ char **ares_strsplit_duplicate(char **elms, size_t num_elm);
50
+
51
+ #endif /* HEADER_CARES_STRSPLIT_H */