From 565edd051fde088dbfc223fb5534e4c42790d108 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sun, 17 Jan 2021 09:42:52 -0800 Subject: [PATCH] Remove dependency on ragel command --- build/bootstrap/net/http/uricspn.c.gz | Bin 1527 -> 0 bytes build/bootstrap/net/http/uriparse.c.gz | Bin 5717 -> 0 bytes build/definitions.mk | 1 - build/rules.mk | 13 - net/http/http.mk | 12 - net/http/todo.S | 50 -- net/http/uricspn.c | 185 +++++++ net/http/uricspn.rl | 2 + net/http/uriparse.c | 724 +++++++++++++++++++++++++ net/http/uriparse.rl | 2 + 10 files changed, 913 insertions(+), 76 deletions(-) delete mode 100644 build/bootstrap/net/http/uricspn.c.gz delete mode 100644 build/bootstrap/net/http/uriparse.c.gz delete mode 100644 net/http/todo.S create mode 100644 net/http/uricspn.c create mode 100644 net/http/uriparse.c diff --git a/build/bootstrap/net/http/uricspn.c.gz b/build/bootstrap/net/http/uricspn.c.gz deleted file mode 100644 index 75e0fb90fc0225787457f08e9a8643a80ff45ae6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1527 zcmVqBE@J@YSYL12NDzOvKgBdXRgge1(4+|tNVH1Y zoZ2)3(l)9pWb8Fw#jKHc4av2fPWK7!p?$fBlkThalicjC0rM}({p(9tnBdu&-^|W$ zc6Jr>VMrN)GHfv-N`Vl=QW8^_57}-UZkeU+;&u@Rkw>?i%P_3XuHLp z!>L=0e4i6htJpYQ98*sOwFBFYJj(jDMEJ!6K%}pqe>L$L(HfvKpiA&Y-37tx72x`N zj9)%sZe3g5F=`{KK)?L)^~-PH&F4>Vy&ND`L=iUI;c&A6O&`Fpep1A`z{r=#?=AotJt6PMNz~fW0!>I_wG$ z31|yMLF5zaqt}x#isAx1jku8NubP`ctxCCU70Xqt3>WPct-m=G=$GHWe*Wcq_-vQV zhm^Tt;t|*iY0oV=oMT7d4Yrmi7`g5fR;`fI^})VR9FfFijT*ns$w&kxlEe2vGq9x;PfZb73xnOGX&WXesD(D3no+bJOtFk z+p&%M+4*4sA0nj^#pM_@fZoJ8=?*@9f(Oc#)JZ4gI~-v$uAlfgEX%rcRyyz@_wHc7 z`=a^gIM;mhF0Z2pJa4cWu!SYeSE`UF(te0Zm2xS-YlD7)9i^oltYkB7001cud;1%B z$mks2vkw?pn=Z#F7V6D5jmebty-ghl8OR#Wt46LYH7;9~`^O=v>t2PDT?6|j?K5@7 zLZRAFD9uu?S`8-5kc7yr)@3^LreX9WJdV49;GQ6nZ>JhESY$J!fmbct?8byA15z^$ z1&9k;)6tNgwe8X69}r$EW-S*xhtiVxxU{U+QcKfdDpsx9kkQKKvAFIq8WXvP(*!Kd z4yd;xONPU_g0T8HgKz=TIE(5m1jmv>}HJaV0V$;Mk9@HGsWu&)q1tG9j-mg^^4lfx3v^K zxwA8b2TMIk_ZnNajI=w|;3GyP?ewo%+uh&vucCD)gg$Te*@Qtg=3O~+HCQ^QhM2JF dIW&PZ&6#;Z*~kfV>A^KI{{jVO4ZFe;002=k&l>;$ diff --git a/build/bootstrap/net/http/uriparse.c.gz b/build/bootstrap/net/http/uriparse.c.gz deleted file mode 100644 index 9234d6b675838768ef0f7fd7fd62971fe299d27f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5717 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 Htxf;{;57{s diff --git a/build/definitions.mk b/build/definitions.mk index b8e87b44..5430b644 100644 --- a/build/definitions.mk +++ b/build/definitions.mk @@ -53,7 +53,6 @@ SILENT ?= 1 ZFLAGS ?= XARGS ?= xargs -P4 -rs8000 NICE ?= build/actuallynice -RAGEL ?= ragel DOT ?= dot GZ ?= gzip CLANG = clang-10 diff --git a/build/rules.mk b/build/rules.mk index bbaa6eb8..9e91caa6 100644 --- a/build/rules.mk +++ b/build/rules.mk @@ -86,16 +86,3 @@ o/$(MODE)/%-clang.asm: %.f; @ACTION=OBJECTIFY.f build/compile $(OBJECTIFY.f) -S o/$(MODE)/%-gcc.asm: %.F; @ACTION=OBJECTIFY.F build/compile $(OBJECTIFY.F) -S -g0 $(OUTPUT_OPTION) $< o/$(MODE)/%-clang.asm: CC = $(CLANG) o/$(MODE)/%-clang.asm: %.F; @ACTION=OBJECTIFY.F build/compile $(OBJECTIFY.F) -S -g0 $(OUTPUT_OPTION) $< || echo / need $(CLANG) >$@ - -# ragel state machine compiler -.PRECIOUS: build/bootstrap/%.c.gz -o/$(MODE)/%.c: %.rl build/bootstrap/%.c.gz - @mkdir -p $(dir $@) - @$(GZ) $(ZFLAGS) -dc $(<:%.rl=build/bootstrap/%.c.gz) >$@ - -@ACTION=RAGEL build/do $(RAGEL) $(RAGELFLAGS) $(OUTPUT_OPTION) $< -build/bootstrap/%.c.gz: %.rl - @mkdir -p $(dir $@) - @$(RAGEL) -o $(@:%.gz=%) $< - @$(GZ) $(ZFLAGS) -f $(@:%.gz=%) -%.svgz: %.rl - @$(RAGEL) -V -p $< | $(DOT) -Tsvg | $(GZ) $(ZFLAGS) >$@ diff --git a/net/http/http.mk b/net/http/http.mk index 570b466a..786faca4 100644 --- a/net/http/http.mk +++ b/net/http/http.mk @@ -58,24 +58,12 @@ o/$(MODE)/net/http/formathttpdatetime.o: \ OVERRIDE_CFLAGS += \ -O3 -# ifeq (,$(MODE)) -# $(NET_HTTP_A_OBJS): \ -# OVERRIDE_CFLAGS += \ -# -fsanitize=address -# endif - NET_HTTP_LIBS = $(foreach x,$(NET_HTTP_ARTIFACTS),$($(x))) NET_HTTP_SRCS = $(foreach x,$(NET_HTTP_ARTIFACTS),$($(x)_SRCS)) NET_HTTP_HDRS = $(foreach x,$(NET_HTTP_ARTIFACTS),$($(x)_HDRS)) NET_HTTP_CHECKS = $(foreach x,$(NET_HTTP_ARTIFACTS),$($(x)_CHECKS)) NET_HTTP_OBJS = $(foreach x,$(NET_HTTP_ARTIFACTS),$($(x)_OBJS)) -.PRECIOUS: \ - $(NET_HTTP_A_SRCS_R:%.rl=o/$(MODE)/%.c) \ - o/$(MODE)/net/http/uricspn.s \ - o/$(MODE)/net/http/uricspn.i \ - o/$(MODE)/net/http/uricspn.c - .PHONY: o/$(MODE)/net/http o/$(MODE)/net/http: \ $(NET_HTTP_CHECKS) \ diff --git a/net/http/todo.S b/net/http/todo.S deleted file mode 100644 index 7c722e77..00000000 --- a/net/http/todo.S +++ /dev/null @@ -1,50 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ - -/ TODO(jart): FIX ME - - .globl "o//net/http/uricspn.c" - .equ "o//net/http/uricspn.c",. - .globl "o//net/http/uriparse.c" - .equ "o//net/http/uriparse.c",. - - .globl "o/rel/net/http/uricspn.c" - .equ "o/rel/net/http/uricspn.c",. - .globl "o/rel/net/http/uriparse.c" - .equ "o/rel/net/http/uriparse.c",. - - .globl "o/tiny/net/http/uricspn.c" - .equ "o/tiny/net/http/uricspn.c",. - .globl "o/tiny/net/http/uriparse.c" - .equ "o/tiny/net/http/uriparse.c",. - - .globl "o/dbg/net/http/uricspn.c" - .equ "o/dbg/net/http/uricspn.c",. - .globl "o/dbg/net/http/uriparse.c" - .equ "o/dbg/net/http/uriparse.c",. - - .globl "o/opt/net/http/uricspn.c" - .equ "o/opt/net/http/uricspn.c",. - .globl "o/opt/net/http/uriparse.c" - .equ "o/opt/net/http/uriparse.c",. - - .globl "o/ansi/net/http/uricspn.c" - .equ "o/ansi/net/http/uricspn.c",. - .globl "o/ansi/net/http/uriparse.c" - .equ "o/ansi/net/http/uriparse.c",. diff --git a/net/http/uricspn.c b/net/http/uricspn.c new file mode 100644 index 00000000..502b5e89 --- /dev/null +++ b/net/http/uricspn.c @@ -0,0 +1,185 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" +#include "libc/nexgen32e/x86feature.h" +#include "libc/sysv/errfuns.h" +#include "net/http/uri.h" + +/* + * GENERATED BY + * + * ragel -o net/http/uricspn.c net/http/uricspn.rl + * + * TODO(jart): Rewrite in normal C. + */ + +#define static + +/* clang-format off */ + +#line 29 "net/http/uricspn.rl" + +#line 34 "build/bootstrap/net/http/uricspn.c" +static const char _uricspn_key_offsets[] = { + 0, 0 +}; + +static const char _uricspn_trans_keys[] = { + 33, 61, 95, 126, 36, 59, 63, 90, + 97, 122, 0 +}; + +static const char _uricspn_single_lengths[] = { + 0, 4 +}; + +static const char _uricspn_range_lengths[] = { + 0, 3 +}; + +static const char _uricspn_index_offsets[] = { + 0, 0 +}; + +static const char _uricspn_trans_targs[] = { + 1, 1, 1, 1, 1, 1, 1, 0, + 0 +}; + +static const int uricspn_start = 1; +static const int uricspn_first_final = 1; +static const int uricspn_error = 0; + +static const int uricspn_en_machina = 1; + + +#line 30 "net/http/uricspn.rl" +/* clang-format on */ + +int uricspn(const char *data, size_t size) { + int uricspn$avx(const char *, size_t) hidden; + const char *p, *pe; + int cs; + + assert(data || !size); + assert(size <= 0x7ffff000); + assert(size <= 0x7ffff000); + + if (X86_HAVE(AVX)) { + return uricspn$avx(data, size); + } + + p = data; + pe = data + size; + + /* clang-format off */ + + +#line 56 "net/http/uricspn.rl" + + + +#line 94 "build/bootstrap/net/http/uricspn.c" + { + cs = uricspn_start; + } + +#line 59 "net/http/uricspn.rl" + cs = uricspn_en_machina; + +#line 102 "build/bootstrap/net/http/uricspn.c" + { + int _klen; + unsigned int _trans; + const char *_keys; + + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) + goto _out; +_resume: + _keys = _uricspn_trans_keys + _uricspn_key_offsets[cs]; + _trans = _uricspn_index_offsets[cs]; + + _klen = _uricspn_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + _klen - 1; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( (*p) < *_mid ) + _upper = _mid - 1; + else if ( (*p) > *_mid ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += _klen; + } + + _klen = _uricspn_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + (_klen<<1) - 2; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( (*p) < _mid[0] ) + _upper = _mid - 2; + else if ( (*p) > _mid[1] ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + goto _match; + } + } + _trans += _klen; + } + +_match: + cs = _uricspn_trans_targs[_trans]; + + if ( cs == 0 ) + goto _out; + if ( ++p != pe ) + goto _resume; + _test_eof: {} + _out: {} + } + +#line 61 "net/http/uricspn.rl" + + /* clang-format on */ + + if (cs >= uricspn_first_final) { + return p - data; + } else { + return einval(); + } +} diff --git a/net/http/uricspn.rl b/net/http/uricspn.rl index c61e462a..b33ec63d 100644 --- a/net/http/uricspn.rl +++ b/net/http/uricspn.rl @@ -21,6 +21,8 @@ #include "libc/sysv/errfuns.h" #include "net/http/uri.h" +/* TODO(jart): Rewrite in C */ + #define static /* clang-format off */ diff --git a/net/http/uriparse.c b/net/http/uriparse.c new file mode 100644 index 00000000..f3ea440a --- /dev/null +++ b/net/http/uriparse.c @@ -0,0 +1,724 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" +#include "libc/dce.h" +#include "libc/dns/dns.h" +#include "libc/log/log.h" +#include "libc/str/str.h" +#include "libc/sysv/errfuns.h" +#include "net/http/uri.h" + +/* + * GENERATED BY + * + * ragel -o net/http/uriparse.c net/http/uriparse.rl + * + * TODO(jart): Rewrite in normal C. + */ + +#define static + +/* clang-format off */ + +#line 32 "net/http/uriparse.rl" + +#line 37 "build/bootstrap/net/http/uriparse.c" +static const char _uriparse_actions[] = { + 0, 1, 0, 1, 1, 1, 2, 1, + 3, 1, 4, 1, 5, 1, 6, 1, + 8, 1, 11, 1, 12, 2, 0, 2, + 2, 4, 8, 2, 5, 8, 2, 6, + 9, 2, 6, 10, 2, 7, 9, 2, + 7, 10, 2, 8, 0, 2, 11, 0, + 3, 4, 8, 0, 3, 5, 8, 0, + 3, 6, 9, 0, 3, 7, 9, 0 + +}; + +static const short _uriparse_key_offsets[] = { + 0, 0, 6, 12, 18, 24, 37, 43, + 49, 64, 70, 76, 91, 97, 103, 118, + 124, 130, 145, 151, 157, 169, 188, 202, + 208, 214, 224, 226, 233, 241, 256, 273, + 279, 285, 302, 308, 314, 326, 332, 338, + 357, 371, 377, 383, 393, 395, 410, 416, + 422, 437, 443, 449, 456, 464, 479, 494, + 509, 520, 531, 546, 564, 581, 598, 614, + 625, 630, 634, 653, 671, 689, 707, 727, + 728, 739, 742, 759, 775, 777, 797 +}; + +static const char _uriparse_trans_keys[] = { + 48, 57, 65, 70, 97, 102, 48, 57, + 65, 70, 97, 102, 48, 57, 65, 70, + 97, 102, 48, 57, 65, 70, 97, 102, + 33, 37, 61, 95, 126, 36, 46, 48, + 58, 64, 90, 97, 122, 48, 57, 65, + 70, 97, 102, 48, 57, 65, 70, 97, + 102, 33, 37, 93, 95, 126, 36, 43, + 45, 46, 48, 58, 65, 91, 97, 122, + 48, 57, 65, 70, 97, 102, 48, 57, + 65, 70, 97, 102, 33, 37, 93, 95, + 126, 36, 43, 45, 46, 48, 58, 65, + 91, 97, 122, 48, 57, 65, 70, 97, + 102, 48, 57, 65, 70, 97, 102, 33, + 36, 37, 63, 93, 95, 126, 39, 43, + 45, 58, 65, 91, 97, 122, 48, 57, + 65, 70, 97, 102, 48, 57, 65, 70, + 97, 102, 33, 36, 37, 63, 93, 95, + 126, 39, 43, 45, 58, 65, 91, 97, + 122, 48, 57, 65, 70, 97, 102, 48, + 57, 65, 70, 97, 102, 33, 37, 47, + 61, 95, 126, 36, 58, 64, 90, 97, + 122, 33, 37, 43, 58, 61, 63, 91, + 95, 126, 36, 44, 45, 46, 48, 57, + 65, 90, 97, 122, 33, 37, 61, 64, + 95, 126, 36, 46, 48, 58, 63, 90, + 97, 122, 48, 57, 65, 70, 97, 102, + 48, 57, 65, 70, 97, 102, 43, 91, + 45, 46, 48, 57, 65, 90, 97, 122, + 48, 57, 46, 48, 58, 65, 70, 97, + 102, 46, 93, 48, 58, 65, 70, 97, + 102, 33, 37, 58, 61, 64, 95, 126, + 36, 46, 48, 57, 63, 90, 97, 122, + 33, 37, 38, 44, 47, 61, 64, 91, + 93, 95, 126, 36, 58, 63, 90, 97, + 122, 48, 57, 65, 70, 97, 102, 48, + 57, 65, 70, 97, 102, 33, 37, 38, + 44, 47, 61, 64, 91, 93, 95, 126, + 36, 58, 63, 90, 97, 122, 48, 57, + 65, 70, 97, 102, 48, 57, 65, 70, + 97, 102, 33, 37, 47, 61, 95, 126, + 36, 59, 63, 90, 97, 122, 48, 57, + 65, 70, 97, 102, 48, 57, 65, 70, + 97, 102, 33, 37, 43, 58, 61, 63, + 91, 95, 126, 36, 44, 45, 46, 48, + 57, 65, 90, 97, 122, 33, 37, 61, + 64, 95, 126, 36, 46, 48, 58, 63, + 90, 97, 122, 48, 57, 65, 70, 97, + 102, 48, 57, 65, 70, 97, 102, 43, + 91, 45, 46, 48, 57, 65, 90, 97, + 122, 48, 57, 33, 37, 93, 95, 126, + 36, 43, 45, 46, 48, 58, 65, 91, + 97, 122, 48, 57, 65, 70, 97, 102, + 48, 57, 65, 70, 97, 102, 33, 37, + 93, 95, 126, 36, 43, 45, 46, 48, + 58, 65, 91, 97, 122, 48, 57, 65, + 70, 97, 102, 48, 57, 65, 70, 97, + 102, 46, 48, 58, 65, 70, 97, 102, + 46, 93, 48, 58, 65, 70, 97, 102, + 33, 37, 58, 61, 64, 95, 126, 36, + 46, 48, 57, 63, 90, 97, 122, 33, + 35, 37, 47, 59, 61, 64, 95, 126, + 36, 57, 65, 90, 97, 122, 33, 35, + 37, 47, 59, 61, 63, 95, 126, 36, + 57, 64, 90, 97, 122, 33, 37, 61, + 95, 126, 36, 59, 63, 90, 97, 122, + 33, 37, 61, 95, 126, 36, 59, 63, + 90, 97, 122, 33, 35, 37, 47, 59, + 61, 63, 95, 126, 36, 58, 64, 90, + 97, 122, 33, 35, 37, 47, 59, 61, + 63, 93, 95, 126, 36, 43, 45, 58, + 65, 91, 97, 122, 33, 35, 37, 47, + 59, 63, 93, 95, 126, 36, 43, 45, + 58, 65, 91, 97, 122, 33, 35, 37, + 38, 61, 63, 93, 95, 126, 36, 43, + 45, 58, 65, 91, 97, 122, 33, 35, + 37, 38, 63, 93, 95, 126, 36, 43, + 45, 58, 65, 91, 97, 122, 35, 43, + 47, 58, 63, 45, 57, 65, 90, 97, + 122, 35, 47, 63, 48, 57, 35, 47, + 58, 63, 33, 35, 37, 43, 47, 58, + 61, 63, 64, 95, 126, 36, 44, 45, + 57, 65, 90, 97, 122, 33, 35, 37, + 47, 58, 61, 63, 64, 95, 126, 36, + 46, 48, 57, 65, 90, 97, 122, 33, + 35, 37, 38, 44, 47, 61, 64, 91, + 93, 95, 126, 36, 58, 63, 90, 97, + 122, 33, 35, 37, 38, 44, 47, 61, + 64, 91, 93, 95, 126, 36, 58, 63, + 90, 97, 122, 33, 35, 37, 43, 47, + 58, 59, 61, 63, 64, 95, 126, 36, + 44, 45, 57, 65, 90, 97, 122, 35, + 43, 58, 59, 45, 46, 48, 57, 65, + 90, 97, 122, 59, 48, 57, 33, 37, + 59, 61, 93, 95, 126, 36, 43, 45, + 46, 48, 58, 65, 91, 97, 122, 33, + 37, 59, 93, 95, 126, 36, 43, 45, + 46, 48, 58, 65, 91, 97, 122, 58, + 59, 33, 37, 43, 58, 59, 61, 63, + 64, 95, 126, 36, 44, 45, 46, 48, + 57, 65, 90, 97, 122, 33, 37, 58, + 59, 61, 64, 95, 126, 36, 46, 48, + 57, 63, 90, 97, 122, 0 +}; + +static const char _uriparse_single_lengths[] = { + 0, 0, 0, 0, 0, 5, 0, 0, + 5, 0, 0, 5, 0, 0, 7, 0, + 0, 7, 0, 0, 6, 9, 6, 0, + 0, 2, 0, 1, 2, 7, 11, 0, + 0, 11, 0, 0, 6, 0, 0, 9, + 6, 0, 0, 2, 0, 5, 0, 0, + 5, 0, 0, 1, 2, 7, 9, 9, + 5, 5, 9, 10, 9, 9, 8, 5, + 3, 4, 11, 10, 12, 12, 12, 1, + 3, 1, 7, 6, 2, 10, 8 +}; + +static const char _uriparse_range_lengths[] = { + 0, 3, 3, 3, 3, 4, 3, 3, + 5, 3, 3, 5, 3, 3, 4, 3, + 3, 4, 3, 3, 3, 5, 4, 3, + 3, 4, 1, 3, 3, 4, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 5, + 4, 3, 3, 4, 1, 5, 3, 3, + 5, 3, 3, 3, 3, 4, 3, 3, + 3, 3, 3, 4, 4, 4, 4, 3, + 1, 0, 4, 4, 3, 3, 4, 0, + 4, 1, 5, 5, 0, 5, 4 +}; + +static const short _uriparse_index_offsets[] = { + 0, 0, 4, 8, 12, 16, 26, 30, + 34, 45, 49, 53, 64, 68, 72, 84, + 88, 92, 104, 108, 112, 122, 137, 148, + 152, 156, 163, 165, 170, 176, 188, 203, + 207, 211, 226, 230, 234, 244, 248, 252, + 267, 278, 282, 286, 293, 295, 306, 310, + 314, 325, 329, 333, 338, 344, 356, 369, + 382, 391, 400, 413, 428, 442, 456, 469, + 478, 483, 488, 504, 519, 535, 551, 568, + 570, 578, 581, 594, 606, 609, 625 +}; + +static const unsigned char _uriparse_indicies[] = { + 0, 0, 0, 1, 2, 2, 2, 1, + 3, 3, 3, 1, 4, 4, 4, 1, + 5, 6, 5, 5, 5, 5, 5, 5, + 5, 1, 7, 7, 7, 1, 5, 5, + 5, 1, 8, 9, 8, 8, 8, 8, + 8, 8, 8, 8, 1, 10, 10, 10, + 1, 11, 11, 11, 1, 12, 13, 12, + 12, 12, 12, 12, 12, 12, 12, 1, + 14, 14, 14, 1, 15, 15, 15, 1, + 16, 16, 17, 16, 16, 16, 16, 16, + 16, 16, 16, 1, 18, 18, 18, 1, + 19, 19, 19, 1, 20, 20, 21, 20, + 20, 20, 20, 20, 20, 20, 20, 1, + 22, 22, 22, 1, 23, 23, 23, 1, + 5, 6, 24, 5, 5, 5, 5, 5, + 5, 1, 25, 26, 27, 25, 25, 25, + 28, 25, 25, 25, 27, 27, 27, 27, + 1, 29, 30, 29, 31, 29, 29, 29, + 29, 29, 29, 1, 32, 32, 32, 1, + 29, 29, 29, 1, 33, 28, 33, 33, + 33, 33, 1, 34, 1, 35, 35, 35, + 35, 1, 36, 37, 36, 36, 36, 1, + 29, 30, 29, 29, 31, 29, 29, 29, + 38, 29, 29, 1, 39, 40, 29, 29, + 16, 29, 31, 16, 16, 39, 39, 39, + 39, 39, 1, 41, 41, 41, 1, 42, + 42, 42, 1, 43, 44, 29, 29, 20, + 29, 31, 20, 20, 43, 43, 43, 43, + 43, 1, 45, 45, 45, 1, 46, 46, + 46, 1, 47, 48, 49, 47, 47, 47, + 47, 47, 47, 1, 50, 50, 50, 1, + 47, 47, 47, 1, 51, 52, 53, 51, + 51, 51, 54, 51, 51, 51, 53, 53, + 53, 53, 1, 55, 56, 55, 57, 55, + 55, 55, 55, 55, 55, 1, 58, 58, + 58, 1, 55, 55, 55, 1, 59, 60, + 59, 59, 59, 59, 1, 61, 1, 62, + 63, 62, 62, 62, 62, 62, 62, 62, + 62, 1, 64, 64, 64, 1, 65, 65, + 65, 1, 66, 67, 66, 66, 66, 66, + 66, 66, 66, 66, 1, 68, 68, 68, + 1, 69, 69, 69, 1, 70, 70, 70, + 70, 1, 71, 72, 71, 71, 71, 1, + 55, 56, 55, 55, 57, 55, 55, 55, + 73, 55, 55, 1, 74, 75, 76, 49, + 74, 74, 74, 74, 74, 74, 77, 77, + 1, 4, 78, 79, 80, 4, 4, 81, + 4, 4, 4, 4, 4, 1, 82, 83, + 82, 82, 82, 82, 82, 82, 1, 2, + 84, 2, 2, 2, 2, 2, 2, 1, + 5, 78, 6, 80, 85, 5, 81, 5, + 5, 5, 5, 5, 1, 11, 86, 87, + 88, 89, 90, 91, 11, 11, 11, 11, + 11, 11, 11, 1, 15, 92, 93, 94, + 95, 96, 15, 15, 15, 15, 15, 15, + 15, 1, 19, 97, 98, 99, 100, 19, + 19, 19, 19, 19, 19, 19, 19, 1, + 23, 101, 102, 103, 23, 23, 23, 23, + 23, 23, 23, 23, 1, 104, 105, 106, + 107, 108, 105, 105, 105, 1, 109, 110, + 112, 111, 1, 113, 114, 115, 116, 1, + 29, 104, 30, 117, 106, 118, 29, 119, + 31, 29, 29, 29, 117, 117, 117, 1, + 29, 109, 30, 110, 29, 29, 121, 31, + 29, 29, 29, 120, 29, 29, 1, 42, + 97, 122, 123, 29, 19, 124, 31, 19, + 19, 42, 42, 42, 42, 42, 1, 46, + 101, 125, 126, 29, 23, 29, 31, 23, + 23, 46, 46, 46, 46, 46, 1, 4, + 78, 79, 127, 80, 128, 4, 4, 81, + 4, 4, 4, 4, 127, 127, 127, 1, + 75, 1, 129, 130, 131, 129, 129, 129, + 129, 1, 133, 132, 1, 65, 134, 135, + 136, 65, 65, 65, 65, 65, 65, 65, + 65, 1, 69, 137, 138, 69, 69, 69, + 69, 69, 69, 69, 69, 1, 139, 140, + 1, 55, 56, 141, 142, 131, 55, 55, + 57, 55, 55, 55, 141, 141, 141, 141, + 1, 55, 56, 55, 133, 55, 57, 55, + 55, 55, 143, 55, 55, 1, 0 +}; + +static const char _uriparse_trans_targs[] = { + 2, 0, 57, 4, 55, 58, 6, 7, + 59, 9, 10, 59, 60, 12, 13, 60, + 61, 15, 16, 61, 62, 18, 19, 62, + 21, 22, 23, 66, 27, 22, 23, 25, + 24, 63, 64, 28, 28, 65, 67, 68, + 31, 32, 68, 69, 34, 35, 69, 71, + 37, 20, 38, 40, 41, 77, 51, 40, + 41, 43, 42, 72, 51, 73, 74, 46, + 47, 74, 75, 49, 50, 75, 52, 52, + 76, 78, 55, 56, 3, 70, 56, 3, + 5, 14, 57, 1, 1, 8, 56, 9, + 5, 8, 11, 14, 56, 12, 5, 8, + 14, 56, 15, 14, 17, 56, 18, 14, + 56, 63, 5, 26, 14, 56, 5, 64, + 14, 56, 5, 26, 14, 66, 29, 30, + 67, 30, 31, 30, 33, 34, 30, 70, + 36, 72, 44, 45, 73, 45, 46, 45, + 48, 49, 45, 44, 45, 77, 53, 78 +}; + +static const char _uriparse_trans_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 1, 1, 0, 0, + 1, 1, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 7, + 0, 1, 1, 1, 0, 9, 1, 1, + 1, 0, 0, 1, 1, 0, 0, 19, + 0, 1, 0, 1, 1, 1, 1, 0, + 0, 7, 0, 1, 0, 1, 1, 1, + 0, 0, 1, 1, 0, 0, 1, 0, + 9, 1, 1, 0, 1, 1, 17, 0, + 45, 17, 1, 1, 0, 17, 30, 0, + 56, 30, 13, 30, 36, 0, 60, 36, + 36, 33, 0, 33, 13, 39, 0, 39, + 24, 0, 48, 9, 24, 27, 52, 0, + 27, 15, 42, 0, 15, 0, 9, 24, + 0, 27, 0, 33, 13, 0, 39, 0, + 3, 0, 9, 9, 0, 11, 0, 30, + 13, 0, 36, 0, 0, 0, 9, 0 +}; + +static const char _uriparse_eof_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 17, + 21, 5, 17, 30, 36, 33, 39, 24, + 27, 15, 24, 27, 33, 39, 17, 0, + 9, 11, 30, 36, 0, 9, 11 +}; + +static const int uriparse_start = 54; +static const int uriparse_first_final = 54; +static const int uriparse_error = 0; + +static const int uriparse_en_sip = 39; +static const int uriparse_en_uri = 54; + + +#line 33 "net/http/uriparse.rl" +/* clang-format on */ + +/** + * Parses URI. + * + * This is a general URL parser. It's typically used for HTTP. Support + * for the bonus syntax needed by SIP is provided. The whirlwhind tour + * of the URI rabbit hole is as follows: + * + * /foo.html + * //justine.local/foo.html + * http://justine.local/foo.html + * http://bettersearchengine.local/search.cgi?q=my%20query + * file:///etc/passwd + * gs://bucket/object.txt + * zip:///usr/share/zoneinfo/GMT + * sip:127.0.0.1:5060;lr + * sip:+12125650666@gateway.example + * sip:bob%20barker:priceisright@[dead:beef::666]:5060;isup-oli=00 + * data:video/mpeg;base64,gigabytesofhex + * + * This parser operates on slices rather than C strings. It performs + * slicing and validation only. Operations like turning "%20"→" " or + * "80"→80 and perfect hashing can be done later, if needed. + * + * The Uri object is owned by the caller; it has a lifecycle like the + * following: + * + * struct Uri uri; + * memset(&uri, 0, sizeof(uri)); + * + * uriparse(&uri, s1, strlen(s1)); + * CHECK_EQ(kUriSchemeHttp, urischeme(uri->scheme, s1)); + * + * uriparse(&uri, s2, strlen(s2)); + * printf("host = %`.*s\n", uri->host.n, s2 + uri->host.i); + * + * Inner arrays may be granted memory by the caller. The uri->𝐴.i field + * is cleared at the mark of this function. No more than uri->𝐴.n items + * can be inserted. If we need more than that, then ENOMEM is returned + * rather than dynamically extending uri->𝐴.p. However, if uri->𝐴.n==0, + * we assume caller doesn't care about uri->𝐴 and its data is discarded. + * + * @param uri is owned by caller + * @param p is caller-owned uri string; won't copy/alias/mutate + * @return 0 on success, or -1 w/ errno + * @see RFC2396: Uniform Resource Identifiers (URI): Generic Syntax + * @see RFC3261: SIP: Session Initiation Protocol + */ +int uriparse(struct Uri *uri, const char *p, size_t size) { + unsigned zero, cs; + struct UriKeyval kv; + const char *pe, *eof, *buf, *mark; + + assert(p || !size); + assert(size <= 0x7ffff000); + +#define ABSENT ((struct UriSlice){zero, zero}) +#define SLICE ((struct UriSlice){mark - buf, p - mark}) + + cs = zero = VEIL("r", 0u); + eof = pe = (mark = buf = p) + size; + + uri->scheme = ABSENT; + uri->opaque = ABSENT; + uri->userinfo = ABSENT; + uri->host = ABSENT; + uri->port = ABSENT; + uri->fragment = ABSENT; + uri->segs.i = zero; + uri->paramsegs.i = zero; + uri->params.i = zero; + uri->queries.i = zero; + + /* clang-format off */ + + +#line 229 "net/http/uriparse.rl" + + + +#line 435 "build/bootstrap/net/http/uriparse.c" + { + cs = uriparse_start; + } + +#line 232 "net/http/uriparse.rl" + cs = uriparse_en_uri; + +#line 443 "build/bootstrap/net/http/uriparse.c" + { + int _klen; + unsigned int _trans; + const char *_acts; + unsigned int _nacts; + const char *_keys; + + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) + goto _out; +_resume: + _keys = _uriparse_trans_keys + _uriparse_key_offsets[cs]; + _trans = _uriparse_index_offsets[cs]; + + _klen = _uriparse_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + _klen - 1; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( (*p) < *_mid ) + _upper = _mid - 1; + else if ( (*p) > *_mid ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += _klen; + } + + _klen = _uriparse_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + (_klen<<1) - 2; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( (*p) < _mid[0] ) + _upper = _mid - 2; + else if ( (*p) > _mid[1] ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + goto _match; + } + } + _trans += _klen; + } + +_match: + _trans = _uriparse_indicies[_trans]; + cs = _uriparse_trans_targs[_trans]; + + if ( _uriparse_trans_actions[_trans] == 0 ) + goto _again; + + _acts = _uriparse_actions + _uriparse_trans_actions[_trans]; + _nacts = (unsigned int) *_acts++; + while ( _nacts-- > 0 ) + { + switch ( *_acts++ ) + { + case 0: +#line 110 "net/http/uriparse.rl" + { mark = p; } + break; + case 1: +#line 111 "net/http/uriparse.rl" + { uri->scheme = SLICE; } + break; + case 3: +#line 113 "net/http/uriparse.rl" + { uri->userinfo = SLICE; } + break; + case 4: +#line 114 "net/http/uriparse.rl" + { uri->host = SLICE; } + break; + case 5: +#line 115 "net/http/uriparse.rl" + { uri->port = SLICE; } + break; + case 6: +#line 117 "net/http/uriparse.rl" + { + kv.k = SLICE; + kv.v = (struct UriSlice){zero, zero}; + } + break; + case 7: +#line 122 "net/http/uriparse.rl" + { + kv.v = SLICE; + } + break; + case 8: +#line 126 "net/http/uriparse.rl" + { + uri->segs.i = zero; + uri->paramsegs.i = zero; + } + break; + case 9: +#line 131 "net/http/uriparse.rl" + { + if (uri->params.n) { + if (uri->params.i < uri->params.n) { + uri->params.p[uri->params.i++] = kv; + } else { + return enomem(); + } + } + } + break; + case 10: +#line 141 "net/http/uriparse.rl" + { + if (uri->queries.n) { + if (uri->queries.i < uri->queries.n) { + uri->queries.p[uri->queries.i++] = kv; + } else { + return enomem(); + } + } + } + break; + case 11: +#line 151 "net/http/uriparse.rl" + { + if (p > mark && uri->segs.n) { + if (uri->segs.i < uri->segs.n) { + uri->segs.p[uri->segs.i++] = SLICE; + } else { + return enomem(); + } + } + } + break; + case 12: +#line 161 "net/http/uriparse.rl" + { + switch (urischeme(uri->scheme, buf)) { + case kUriSchemeSip: + case kUriSchemeSips: + --p; + {cs = 39;goto _again;} + default: + if (uricspn(p, pe - p) == pe - p) { + uri->opaque = (struct UriSlice){p - buf, pe - p}; + return zero; + } else { + return einval(); + } + } + } + break; +#line 611 "build/bootstrap/net/http/uriparse.c" + } + } + +_again: + if ( cs == 0 ) + goto _out; + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + const char *__acts = _uriparse_actions + _uriparse_eof_actions[cs]; + unsigned int __nacts = (unsigned int) *__acts++; + while ( __nacts-- > 0 ) { + switch ( *__acts++ ) { + case 0: +#line 110 "net/http/uriparse.rl" + { mark = p; } + break; + case 2: +#line 112 "net/http/uriparse.rl" + { uri->fragment = SLICE; } + break; + case 4: +#line 114 "net/http/uriparse.rl" + { uri->host = SLICE; } + break; + case 5: +#line 115 "net/http/uriparse.rl" + { uri->port = SLICE; } + break; + case 6: +#line 117 "net/http/uriparse.rl" + { + kv.k = SLICE; + kv.v = (struct UriSlice){zero, zero}; + } + break; + case 7: +#line 122 "net/http/uriparse.rl" + { + kv.v = SLICE; + } + break; + case 8: +#line 126 "net/http/uriparse.rl" + { + uri->segs.i = zero; + uri->paramsegs.i = zero; + } + break; + case 9: +#line 131 "net/http/uriparse.rl" + { + if (uri->params.n) { + if (uri->params.i < uri->params.n) { + uri->params.p[uri->params.i++] = kv; + } else { + return enomem(); + } + } + } + break; + case 10: +#line 141 "net/http/uriparse.rl" + { + if (uri->queries.n) { + if (uri->queries.i < uri->queries.n) { + uri->queries.p[uri->queries.i++] = kv; + } else { + return enomem(); + } + } + } + break; + case 11: +#line 151 "net/http/uriparse.rl" + { + if (p > mark && uri->segs.n) { + if (uri->segs.i < uri->segs.n) { + uri->segs.p[uri->segs.i++] = SLICE; + } else { + return enomem(); + } + } + } + break; +#line 699 "build/bootstrap/net/http/uriparse.c" + } + } + } + + _out: {} + } + +#line 234 "net/http/uriparse.rl" + + /* clang-format on */ + + if (cs >= uriparse_first_final) { + if (uri->host.n <= DNS_NAME_MAX && uri->port.n <= 6) { + return zero; + } else { + return eoverflow(); + } + } else { + return einval(); + } +} diff --git a/net/http/uriparse.rl b/net/http/uriparse.rl index 8f037bf5..04133c16 100644 --- a/net/http/uriparse.rl +++ b/net/http/uriparse.rl @@ -24,6 +24,8 @@ #include "libc/sysv/errfuns.h" #include "net/http/uri.h" +/* TODO(jart): Rewrite in C */ + #define static /* clang-format off */