mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-27 14:58:30 +00:00
Apply clang-format update to repo (#1154)
Commit bc6c183
introduced a bunch of discrepancies between what files
look like in the repo and what clang-format says they should look like.
However, there were already a few discrepancies prior to that. Most of
these discrepancies seemed to be unintentional, but a few of them were
load-bearing (e.g., a #include that violated header ordering needing
something to have been #defined by a 'later' #include.)
I opted to take what I hope is a relatively smooth-brained approach: I
reverted the .clang-format change, ran clang-format on the whole repo,
reapplied the .clang-format change, reran clang-format again, and then
reverted the commit that contained the first run. Thus the full effect
of this PR should only be to apply the changed formatting rules to the
repo, and from skimming the results, this seems to be the case.
My work can be checked by applying the short, manual commits, and then
rerunning the command listed in the autogenerated commits (those whose
messages I have prefixed auto:) and seeing if your results agree.
It might be that the other diffs should be fixed at some point but I'm
leaving that aside for now.
fd '\.c(c|pp)?$' --print0| xargs -0 clang-format -i
This commit is contained in:
parent
342d0c81e5
commit
6e6fc38935
863 changed files with 9201 additions and 4627 deletions
|
@ -25,7 +25,8 @@ const char base32def[] = "0123456789abcdefghjkmnpqrstvwxyz";
|
|||
|
||||
int tobits(int b) {
|
||||
int bits = 0;
|
||||
while (b && (b >>= 1)) bits++;
|
||||
while (b && (b >>= 1))
|
||||
bits++;
|
||||
return bits;
|
||||
}
|
||||
|
||||
|
@ -48,7 +49,8 @@ char *EncodeBase32(const char *s, size_t sl, const char *a, size_t al,
|
|||
size_t *ol) {
|
||||
size_t count = 0;
|
||||
char *r = NULL;
|
||||
if (sl == -1) sl = s ? strlen(s) : 0;
|
||||
if (sl == -1)
|
||||
sl = s ? strlen(s) : 0;
|
||||
if (al == 0) {
|
||||
a = base32def;
|
||||
al = sizeof(base32def) / sizeof(a[0]);
|
||||
|
@ -78,7 +80,8 @@ char *EncodeBase32(const char *s, size_t sl, const char *a, size_t al,
|
|||
}
|
||||
r[count] = '\0';
|
||||
}
|
||||
if (ol) *ol = r ? count : 0;
|
||||
if (ol)
|
||||
*ol = r ? count : 0;
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -119,7 +122,8 @@ char *DecodeBase32(const char *s, size_t sl, const char *a, size_t al,
|
|||
size_t *ol) {
|
||||
size_t count = 0;
|
||||
char *r = NULL;
|
||||
if (sl == -1) sl = s ? strlen(s) : 0;
|
||||
if (sl == -1)
|
||||
sl = s ? strlen(s) : 0;
|
||||
if (al == 0) {
|
||||
a = base32def;
|
||||
al = sizeof(base32def) / sizeof(a[0]);
|
||||
|
@ -138,12 +142,15 @@ char *DecodeBase32(const char *s, size_t sl, const char *a, size_t al,
|
|||
map = kBase32cust;
|
||||
memset(map, -1, 256);
|
||||
// populate the map based on alphabet
|
||||
for (int i = 0; i < al; i++) map[a[i] & 0xff] = i;
|
||||
for (int i = 0; i < al; i++)
|
||||
map[a[i] & 0xff] = i;
|
||||
}
|
||||
while (count < n && *s) {
|
||||
signed char m = map[*s++ & 0xff];
|
||||
if (m == -2) continue;
|
||||
if (m == -1) break;
|
||||
if (m == -2)
|
||||
continue;
|
||||
if (m == -1)
|
||||
break;
|
||||
buffer <<= bl;
|
||||
buffer |= m;
|
||||
bitsLeft += bl;
|
||||
|
@ -154,6 +161,7 @@ char *DecodeBase32(const char *s, size_t sl, const char *a, size_t al,
|
|||
}
|
||||
r[count] = '\0';
|
||||
}
|
||||
if (ol) *ol = r ? count : 0;
|
||||
if (ol)
|
||||
*ol = r ? count : 0;
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -26,25 +26,44 @@
|
|||
*/
|
||||
int CategorizeIp(uint32_t x) {
|
||||
int a;
|
||||
if (IsLoopbackIp(x)) return kIpLoopback;
|
||||
if (IsPrivateIp(x)) return kIpPrivate;
|
||||
if (IsMulticastIp(x)) return kIpMulticast;
|
||||
if (IsAnonymousIp(x)) return kIpAnonymous; /* order matters */
|
||||
if (IsTestnetIp(x)) return kIpTestnet; /* order matters */
|
||||
if (IsAfrinicIp(x)) return kIpAfrinic;
|
||||
if (IsLacnicIp(x)) return kIpLacnic;
|
||||
if (IsApnicIp(x)) return kIpApnic;
|
||||
if (IsArinIp(x)) return kIpArin;
|
||||
if (IsRipeIp(x)) return kIpRipe;
|
||||
if (IsDodIp(x)) return kIpDod;
|
||||
if (IsLoopbackIp(x))
|
||||
return kIpLoopback;
|
||||
if (IsPrivateIp(x))
|
||||
return kIpPrivate;
|
||||
if (IsMulticastIp(x))
|
||||
return kIpMulticast;
|
||||
if (IsAnonymousIp(x))
|
||||
return kIpAnonymous; /* order matters */
|
||||
if (IsTestnetIp(x))
|
||||
return kIpTestnet; /* order matters */
|
||||
if (IsAfrinicIp(x))
|
||||
return kIpAfrinic;
|
||||
if (IsLacnicIp(x))
|
||||
return kIpLacnic;
|
||||
if (IsApnicIp(x))
|
||||
return kIpApnic;
|
||||
if (IsArinIp(x))
|
||||
return kIpArin;
|
||||
if (IsRipeIp(x))
|
||||
return kIpRipe;
|
||||
if (IsDodIp(x))
|
||||
return kIpDod;
|
||||
a = (x & 0xff000000) >> 24;
|
||||
if (a == 12) return kIpAtt;
|
||||
if (a == 17) return kIpApple;
|
||||
if (a == 19) return kIpFord;
|
||||
if (a == 38) return kIpCogent;
|
||||
if (a == 48) return kIpPrudential;
|
||||
if (a == 56) return kIpUsps;
|
||||
if (a == 73) return kIpComcast;
|
||||
if (a >= 240) return kIpFuture;
|
||||
if (a == 12)
|
||||
return kIpAtt;
|
||||
if (a == 17)
|
||||
return kIpApple;
|
||||
if (a == 19)
|
||||
return kIpFord;
|
||||
if (a == 38)
|
||||
return kIpCogent;
|
||||
if (a == 48)
|
||||
return kIpPrudential;
|
||||
if (a == 56)
|
||||
return kIpUsps;
|
||||
if (a == 73)
|
||||
return kIpComcast;
|
||||
if (a >= 240)
|
||||
return kIpFuture;
|
||||
return kIpUnknown;
|
||||
}
|
||||
|
|
|
@ -58,22 +58,27 @@ char *DecodeBase64(const char *data, size_t size, size_t *out_size) {
|
|||
char *r, *q;
|
||||
int a, b, c, d, w;
|
||||
const char *p, *pe;
|
||||
if (size == -1) size = data ? strlen(data) : 0;
|
||||
if (size == -1)
|
||||
size = data ? strlen(data) : 0;
|
||||
if ((r = malloc(ROUNDUP(size, 4) / 4 * 3 + 1))) {
|
||||
q = r;
|
||||
p = data;
|
||||
pe = p + size;
|
||||
for (;;) {
|
||||
do {
|
||||
if (p == pe) goto Done;
|
||||
if (p == pe)
|
||||
goto Done;
|
||||
a = kBase64[*p++ & 0xff];
|
||||
} while (a == -1);
|
||||
if (a == -2) continue;
|
||||
if (a == -2)
|
||||
continue;
|
||||
do {
|
||||
if (p == pe) goto Done;
|
||||
if (p == pe)
|
||||
goto Done;
|
||||
b = kBase64[*p++ & 0xff];
|
||||
} while (b == -1);
|
||||
if (b == -2) continue;
|
||||
if (b == -2)
|
||||
continue;
|
||||
do {
|
||||
c = p < pe ? kBase64[*p++ & 0xff] : -2;
|
||||
} while (c == -1);
|
||||
|
@ -81,16 +86,21 @@ char *DecodeBase64(const char *data, size_t size, size_t *out_size) {
|
|||
d = p < pe ? kBase64[*p++ & 0xff] : -2;
|
||||
} while (d == -1);
|
||||
w = a << 18 | b << 12;
|
||||
if (c != -2) w |= c << 6;
|
||||
if (d != -2) w |= d;
|
||||
if (c != -2)
|
||||
w |= c << 6;
|
||||
if (d != -2)
|
||||
w |= d;
|
||||
*q++ = (w & 0xFF0000) >> 020;
|
||||
if (c != -2) *q++ = (w & 0x00FF00) >> 010;
|
||||
if (d != -2) *q++ = (w & 0x0000FF) >> 000;
|
||||
if (c != -2)
|
||||
*q++ = (w & 0x00FF00) >> 010;
|
||||
if (d != -2)
|
||||
*q++ = (w & 0x0000FF) >> 000;
|
||||
}
|
||||
Done:
|
||||
n = q - r;
|
||||
*q++ = '\0';
|
||||
if ((q = realloc(r, q - r))) r = q;
|
||||
if ((q = realloc(r, q - r)))
|
||||
r = q;
|
||||
} else {
|
||||
n = 0;
|
||||
}
|
||||
|
|
|
@ -35,15 +35,18 @@ char *DecodeLatin1(const char *p, size_t n, size_t *z) {
|
|||
size_t i;
|
||||
char *r, *q;
|
||||
int8_t v1[16], v2[16], vz[16];
|
||||
if (z) *z = 0;
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (z)
|
||||
*z = 0;
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
if ((q = r = malloc(n * 2 + 1))) {
|
||||
for (i = 0; i < n;) {
|
||||
bzero(vz, 16); /* 3x speedup for ASCII */
|
||||
while (i + 16 < n) {
|
||||
memcpy(v1, p + i, 16);
|
||||
pcmpgtb(v2, v1, vz);
|
||||
if (pmovmskb((void *)v2) != 0xFFFF) break;
|
||||
if (pmovmskb((void *)v2) != 0xFFFF)
|
||||
break;
|
||||
memcpy(q, v1, 16);
|
||||
q += 16;
|
||||
i += 16;
|
||||
|
@ -56,9 +59,11 @@ char *DecodeLatin1(const char *p, size_t n, size_t *z) {
|
|||
*q++ = 0200 | (c & 077);
|
||||
}
|
||||
}
|
||||
if (z) *z = q - r;
|
||||
if (z)
|
||||
*z = q - r;
|
||||
*q++ = '\0';
|
||||
if ((q = realloc(r, q - r))) r = q;
|
||||
if ((q = realloc(r, q - r)))
|
||||
r = q;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -35,14 +35,18 @@ char *EncodeBase64(const char *data, size_t size, size_t *out_size) {
|
|||
unsigned w;
|
||||
char *r, *q;
|
||||
const unsigned char *p, *pe;
|
||||
if (size == -1) size = data ? strlen(data) : 0;
|
||||
if ((n = size) % 3) n += 3 - size % 3;
|
||||
if (size == -1)
|
||||
size = data ? strlen(data) : 0;
|
||||
if ((n = size) % 3)
|
||||
n += 3 - size % 3;
|
||||
n /= 3, n *= 4;
|
||||
if ((r = malloc(n + 1))) {
|
||||
for (q = r, p = (void *)data, pe = p + size; p < pe; p += 3) {
|
||||
w = p[0] << 020;
|
||||
if (p + 1 < pe) w |= p[1] << 010;
|
||||
if (p + 2 < pe) w |= p[2] << 000;
|
||||
if (p + 1 < pe)
|
||||
w |= p[1] << 010;
|
||||
if (p + 2 < pe)
|
||||
w |= p[2] << 000;
|
||||
*q++ = CHARS[(w >> 18) & 077];
|
||||
*q++ = CHARS[(w >> 12) & 077];
|
||||
*q++ = p + 1 < pe ? CHARS[(w >> 6) & 077] : '=';
|
||||
|
|
|
@ -45,7 +45,8 @@ char *EncodeHttpHeaderValue(const char *data, size_t size, size_t *out_size) {
|
|||
size_t n;
|
||||
char *r, *q;
|
||||
const char *p, *e;
|
||||
if (size == -1) size = data ? strlen(data) : 0;
|
||||
if (size == -1)
|
||||
size = data ? strlen(data) : 0;
|
||||
if ((r = malloc(size + 1))) {
|
||||
t = 0;
|
||||
q = r;
|
||||
|
@ -77,10 +78,12 @@ char *EncodeHttpHeaderValue(const char *data, size_t size, size_t *out_size) {
|
|||
return NULL;
|
||||
}
|
||||
}
|
||||
while (q > r && (q[-1] == ' ' || q[-1] == '\t')) --q;
|
||||
while (q > r && (q[-1] == ' ' || q[-1] == '\t'))
|
||||
--q;
|
||||
n = q - r;
|
||||
*q++ = '\0';
|
||||
if ((q = realloc(r, q - r))) r = q;
|
||||
if ((q = realloc(r, q - r)))
|
||||
r = q;
|
||||
} else {
|
||||
n = 0;
|
||||
}
|
||||
|
|
|
@ -41,11 +41,15 @@ char *EncodeLatin1(const char *p, size_t n, size_t *z, int f) {
|
|||
char t[256];
|
||||
char *r, *q;
|
||||
bzero(t, sizeof(t));
|
||||
if (f & kControlC0) memset(t + 0x00, 1, 0x20 - 0x00), t[0x7F] = 1;
|
||||
if (f & kControlC1) memset(t + 0x80, 1, 0xA0 - 0x80);
|
||||
if (f & kControlC0)
|
||||
memset(t + 0x00, 1, 0x20 - 0x00), t[0x7F] = 1;
|
||||
if (f & kControlC1)
|
||||
memset(t + 0x80, 1, 0xA0 - 0x80);
|
||||
t['\t'] = t['\r'] = t['\n'] = t['\v'] = !!(f & kControlWs);
|
||||
if (z) *z = 0;
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (z)
|
||||
*z = 0;
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
if ((q = r = malloc(n + 1))) {
|
||||
for (i = 0; i < n;) {
|
||||
c = p[i++] & 0xff;
|
||||
|
@ -61,9 +65,11 @@ char *EncodeLatin1(const char *p, size_t n, size_t *z, int f) {
|
|||
}
|
||||
*q++ = c;
|
||||
}
|
||||
if (z) *z = q - r;
|
||||
if (z)
|
||||
*z = q - r;
|
||||
*q++ = '\0';
|
||||
if ((q = realloc(r, q - r))) r = q;
|
||||
if ((q = realloc(r, q - r)))
|
||||
r = q;
|
||||
}
|
||||
return r;
|
||||
Invalid:
|
||||
|
|
|
@ -55,8 +55,10 @@ static size_t DimensionUrl(struct Url *h) {
|
|||
static bool NeedsSquareBrackets(struct Url *h) {
|
||||
int c;
|
||||
size_t i;
|
||||
if (!memchr(h->host.p, ':', h->host.n)) return false;
|
||||
if (h->pass.p) return true;
|
||||
if (!memchr(h->host.p, ':', h->host.n))
|
||||
return false;
|
||||
if (h->pass.p)
|
||||
return true;
|
||||
if (h->host.n >= 4 && h->host.p[0] == 'v' && h->host.p[2] == '.' &&
|
||||
kHexToInt[h->host.p[1] & 0xFF] != -1) {
|
||||
for (i = 3; i < h->host.n; ++i) {
|
||||
|
@ -122,7 +124,8 @@ char *EncodeUrl(struct Url *h, size_t *z) {
|
|||
if (h->params.p) {
|
||||
*p++ = '?';
|
||||
for (i = 0; i < h->params.n; ++i) {
|
||||
if (i) *p++ = '&';
|
||||
if (i)
|
||||
*p++ = '&';
|
||||
p = EscapeUrlView(p, &h->params.p[i].key, kEscapeParam);
|
||||
if (h->params.p[i].val.p) {
|
||||
*p++ = '=';
|
||||
|
@ -136,10 +139,12 @@ char *EncodeUrl(struct Url *h, size_t *z) {
|
|||
}
|
||||
n = p - m;
|
||||
*p++ = '\0';
|
||||
if ((p = realloc(m, p - m))) m = p;
|
||||
if ((p = realloc(m, p - m)))
|
||||
m = p;
|
||||
} else {
|
||||
n = 0;
|
||||
}
|
||||
if (z) *z = n;
|
||||
if (z)
|
||||
*z = n;
|
||||
return m;
|
||||
}
|
||||
|
|
|
@ -33,8 +33,10 @@ char *EscapeHtml(const char *p, size_t n, size_t *z) {
|
|||
int c;
|
||||
size_t i;
|
||||
char *q, *r;
|
||||
if (z) *z = 0;
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (z)
|
||||
*z = 0;
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
if ((q = r = malloc(n * 6 + 1))) {
|
||||
for (i = 0; i < n; ++i) {
|
||||
switch ((c = p[i])) {
|
||||
|
@ -82,9 +84,11 @@ char *EscapeHtml(const char *p, size_t n, size_t *z) {
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (z) *z = q - r;
|
||||
if (z)
|
||||
*z = q - r;
|
||||
*q++ = '\0';
|
||||
if ((q = realloc(r, q - r))) r = q;
|
||||
if ((q = realloc(r, q - r)))
|
||||
r = q;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -64,8 +64,10 @@ char *EscapeJsStringLiteral(char **r, size_t *y, const char *p, size_t n,
|
|||
uint64_t w;
|
||||
size_t i, j, m;
|
||||
wint_t x, a, b;
|
||||
if (z) *z = 0; // TODO(jart): why is this here?
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (z)
|
||||
*z = 0; // TODO(jart): why is this here?
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
q = *r;
|
||||
i = n * 8 + 6 + 1; // only need *6 but *8 is faster
|
||||
if (i > *y) {
|
||||
|
@ -83,7 +85,8 @@ char *EscapeJsStringLiteral(char **r, size_t *y, const char *p, size_t n,
|
|||
if (i + m <= n) {
|
||||
for (j = 0;;) {
|
||||
b = p[i + j] & 0xff;
|
||||
if (!ThomPikeCont(b)) break;
|
||||
if (!ThomPikeCont(b))
|
||||
break;
|
||||
a = ThomPikeMerge(a, b);
|
||||
if (++j == m) {
|
||||
x = a;
|
||||
|
@ -148,7 +151,8 @@ char *EscapeJsStringLiteral(char **r, size_t *y, const char *p, size_t n,
|
|||
__builtin_unreachable();
|
||||
}
|
||||
}
|
||||
if (z) *z = q - *r;
|
||||
if (z)
|
||||
*z = q - *r;
|
||||
*q++ = '\0';
|
||||
}
|
||||
return *r;
|
||||
|
|
|
@ -42,14 +42,18 @@
|
|||
char *EscapeUrl(const char *p, size_t n, size_t *z, const char T[256]) {
|
||||
char *r, *q;
|
||||
struct UrlView v;
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (z) *z = 0;
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
if (z)
|
||||
*z = 0;
|
||||
if ((q = r = malloc(n * 6 + 1))) {
|
||||
v.p = (char *)p, v.n = n;
|
||||
q = EscapeUrlView(r, &v, T);
|
||||
if (z) *z = q - r;
|
||||
if (z)
|
||||
*z = q - r;
|
||||
*q++ = '\0';
|
||||
if ((q = realloc(r, q - r))) r = q;
|
||||
if ((q = realloc(r, q - r)))
|
||||
r = q;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -138,7 +138,8 @@ static const char *BisectContentType(uint64_t ext) {
|
|||
const char *FindContentType(const char *p, size_t n) {
|
||||
int c;
|
||||
uint64_t w;
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
for (w = 0; n--;) {
|
||||
c = p[n] & 255;
|
||||
if (c == '.') {
|
||||
|
|
|
@ -35,10 +35,13 @@ ssize_t HasControlCodes(const char *p, size_t n, int f) {
|
|||
wint_t x, a, b;
|
||||
size_t i, j, m, g;
|
||||
bzero(t, sizeof(t));
|
||||
if (f & kControlC0) memset(t + 0x00, 1, 0x20 - 0x00), t[0x7F] = 1;
|
||||
if (f & kControlC1) memset(t + 0x80, 1, 0xA0 - 0x80);
|
||||
if (f & kControlC0)
|
||||
memset(t + 0x00, 1, 0x20 - 0x00), t[0x7F] = 1;
|
||||
if (f & kControlC1)
|
||||
memset(t + 0x80, 1, 0xA0 - 0x80);
|
||||
t['\t'] = t['\r'] = t['\n'] = t['\v'] = !!(f & kControlWs);
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
for (i = 0; i < n;) {
|
||||
g = i;
|
||||
x = p[i++] & 0xff;
|
||||
|
@ -48,7 +51,8 @@ ssize_t HasControlCodes(const char *p, size_t n, int f) {
|
|||
if (i + m <= n) {
|
||||
for (j = 0;;) {
|
||||
b = p[i + j] & 0xff;
|
||||
if (!ThomPikeCont(b)) break;
|
||||
if (!ThomPikeCont(b))
|
||||
break;
|
||||
a = ThomPikeMerge(a, b);
|
||||
if (++j == m) {
|
||||
x = a;
|
||||
|
|
|
@ -34,7 +34,8 @@ bool HeaderHas(struct HttpMessage *m, const char *b, int h, const char *s,
|
|||
size_t n) {
|
||||
size_t i;
|
||||
unassert(0 <= h && h < kHttpHeadersMax);
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
if (m->headers[h].a) {
|
||||
if (memmem(b + m->headers[h].a, m->headers[h].b - m->headers[h].a, s, n)) {
|
||||
return true;
|
||||
|
|
|
@ -34,7 +34,8 @@ char *IndentLines(const char *p, size_t n, size_t *z, size_t j) {
|
|||
char *r, *q;
|
||||
const char *l;
|
||||
size_t t, m, a;
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
r = 0;
|
||||
t = 0;
|
||||
do {
|
||||
|
@ -49,7 +50,8 @@ char *IndentLines(const char *p, size_t n, size_t *z, size_t j) {
|
|||
r = q;
|
||||
} else {
|
||||
free(r);
|
||||
if (z) *z = 0;
|
||||
if (z)
|
||||
*z = 0;
|
||||
return 0;
|
||||
}
|
||||
memset(r + t, ' ', a);
|
||||
|
@ -58,7 +60,8 @@ char *IndentLines(const char *p, size_t n, size_t *z, size_t j) {
|
|||
p += m;
|
||||
n -= m;
|
||||
} while (l);
|
||||
if (z) *z = t;
|
||||
if (z)
|
||||
*z = t;
|
||||
r[t] = '\0';
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -54,8 +54,10 @@ extern const char kHostChars[256]; // -_0-9A-Za-z
|
|||
bool IsAcceptableHost(const char *s, size_t n) {
|
||||
size_t i;
|
||||
int c, b, j;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (!n) return true;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
if (!n)
|
||||
return true;
|
||||
if (n > DNS_NAME_MAX) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -40,7 +40,8 @@
|
|||
bool IsAcceptablePath(const char *data, size_t size) {
|
||||
const char *p, *e;
|
||||
int x, y, a, b, t, i, n;
|
||||
if (size == -1) size = data ? strlen(data) : 0;
|
||||
if (size == -1)
|
||||
size = data ? strlen(data) : 0;
|
||||
t = 0;
|
||||
y = '/';
|
||||
p = data;
|
||||
|
@ -53,7 +54,8 @@ bool IsAcceptablePath(const char *data, size_t size) {
|
|||
if (p + n <= e) {
|
||||
for (i = 0;;) {
|
||||
b = p[i] & 0xff;
|
||||
if (!ThomPikeCont(b)) break;
|
||||
if (!ThomPikeCont(b))
|
||||
break;
|
||||
a = ThomPikeMerge(a, b);
|
||||
if (++i == n) {
|
||||
x = a;
|
||||
|
@ -68,10 +70,10 @@ bool IsAcceptablePath(const char *data, size_t size) {
|
|||
}
|
||||
if (y == '/') {
|
||||
if (x == '.' && // allow /.well-known/ in the first position
|
||||
(p - data > 2 ||
|
||||
size < 13 ||
|
||||
memcmp(data, "/.well-known/", 13) != 0)) return false;
|
||||
if (x == '/' && t) return false;
|
||||
(p - data > 2 || size < 13 || memcmp(data, "/.well-known/", 13) != 0))
|
||||
return false;
|
||||
if (x == '/' && t)
|
||||
return false;
|
||||
}
|
||||
y = x;
|
||||
t = 1;
|
||||
|
|
|
@ -39,7 +39,8 @@
|
|||
bool IsAcceptablePort(const char *s, size_t n) {
|
||||
int p, c;
|
||||
size_t i;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
for (p = i = 0; i < n; ++i) {
|
||||
c = s[i] & 255;
|
||||
if ('0' <= c && c <= '9') {
|
||||
|
|
|
@ -25,10 +25,13 @@
|
|||
*/
|
||||
bool IsMimeType(const char *t, size_t n, const char *s) {
|
||||
size_t i;
|
||||
if (n == -1) n = t ? strlen(t) : 0;
|
||||
if (n == -1)
|
||||
n = t ? strlen(t) : 0;
|
||||
for (i = 0; i < n; ++i) {
|
||||
if (!s[i]) return !kHttpToken[t[i] & 0xFF];
|
||||
if (kToLower[s[i] & 0xFF] != kToLower[t[i] & 0xFF]) return false;
|
||||
if (!s[i])
|
||||
return !kHttpToken[t[i] & 0xFF];
|
||||
if (kToLower[s[i] & 0xFF] != kToLower[t[i] & 0xFF])
|
||||
return false;
|
||||
}
|
||||
return !s[i];
|
||||
}
|
||||
|
|
|
@ -58,12 +58,15 @@ static bool BisectNoCompressExts(uint64_t ext) {
|
|||
bool IsNoCompressExt(const char *p, size_t n) {
|
||||
int c, i;
|
||||
uint64_t w;
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
if (n) {
|
||||
for (i = w = 0; n--;) {
|
||||
c = p[n] & 255;
|
||||
if (c == '.') break;
|
||||
if (++i > 8) return false;
|
||||
if (c == '.')
|
||||
break;
|
||||
if (++i > 8)
|
||||
return false;
|
||||
w <<= 8;
|
||||
w |= kToLower[c];
|
||||
}
|
||||
|
|
|
@ -29,7 +29,8 @@
|
|||
bool IsReasonablePath(const char *data, size_t size) {
|
||||
const char *p, *e;
|
||||
int x, y, z, a, b, i, n;
|
||||
if (size == -1) size = data ? strlen(data) : 0;
|
||||
if (size == -1)
|
||||
size = data ? strlen(data) : 0;
|
||||
z = '/';
|
||||
y = '/';
|
||||
x = '/';
|
||||
|
@ -43,7 +44,8 @@ bool IsReasonablePath(const char *data, size_t size) {
|
|||
if (p + n <= e) {
|
||||
for (i = 0;;) {
|
||||
b = p[i] & 0xff;
|
||||
if (!ThomPikeCont(b)) break;
|
||||
if (!ThomPikeCont(b))
|
||||
break;
|
||||
a = ThomPikeMerge(a, b);
|
||||
if (++i == n) {
|
||||
x = a;
|
||||
|
@ -56,12 +58,16 @@ bool IsReasonablePath(const char *data, size_t size) {
|
|||
if (x == '\\') {
|
||||
x = '/';
|
||||
}
|
||||
if (z == '/' && y == '.' && x == '/') return false;
|
||||
if (z == '/' && y == '.' && x == '.') return false;
|
||||
if (z == '/' && y == '.' && x == '/')
|
||||
return false;
|
||||
if (z == '/' && y == '.' && x == '.')
|
||||
return false;
|
||||
z = y;
|
||||
y = x;
|
||||
}
|
||||
if (y == '/' && x == '.') return false;
|
||||
if (z == '/' && y == '.' && x == '.') return false;
|
||||
if (y == '/' && x == '.')
|
||||
return false;
|
||||
if (z == '/' && y == '.' && x == '.')
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -33,7 +33,8 @@ static inline bool IsCookieOctet(unsigned char i) {
|
|||
*/
|
||||
bool IsValidCookieValue(const char *s, size_t n) {
|
||||
size_t i;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
for (i = 0; i < n; ++i) {
|
||||
if (!IsCookieOctet(s[i])) {
|
||||
return false;
|
||||
|
|
|
@ -26,8 +26,10 @@
|
|||
*/
|
||||
bool IsValidHttpToken(const char *s, size_t n) {
|
||||
size_t i;
|
||||
if (!n) return false;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (!n)
|
||||
return false;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
for (i = 0; i < n; ++i) {
|
||||
if (!kHttpToken[s[i] & 0xff]) {
|
||||
return false;
|
||||
|
|
|
@ -38,7 +38,8 @@ struct Cidr ParseCidr(const char *s, size_t n) {
|
|||
size_t i;
|
||||
const char *p;
|
||||
struct Cidr c;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
if ((p = strchr(s, '/'))) {
|
||||
if ((c.addr = ParseIp(s, (i = p - s))) != -1) {
|
||||
c.cidr = 0;
|
||||
|
|
|
@ -30,14 +30,19 @@
|
|||
int64_t ParseContentLength(const char *s, size_t n) {
|
||||
size_t i;
|
||||
int64_t r;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (!n) return -1;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
if (!n)
|
||||
return -1;
|
||||
for (r = i = 0; i < n; ++i) {
|
||||
if (s[i] == ',' && i > 0) break;
|
||||
if (!isdigit(s[i])) return -1;
|
||||
if (s[i] == ',' && i > 0)
|
||||
break;
|
||||
if (!isdigit(s[i]))
|
||||
return -1;
|
||||
r *= 10;
|
||||
r += s[i] - '0';
|
||||
if (r >= MAXIMUM) return -1;
|
||||
if (r >= MAXIMUM)
|
||||
return -1;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -40,12 +40,14 @@ int ParseForwarded(const char *s, size_t n, uint32_t *ip, uint16_t *port) {
|
|||
size_t i;
|
||||
char *r;
|
||||
uint32_t x;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
if (n) {
|
||||
t = x = i = 0;
|
||||
if ((r = memrchr(s, ',', n))) {
|
||||
i = r - s;
|
||||
if ((s[++i] & 255) == ' ') ++i; // skip optional space
|
||||
if ((s[++i] & 255) == ' ')
|
||||
++i; // skip optional space
|
||||
}
|
||||
do {
|
||||
c = s[i++] & 255;
|
||||
|
@ -82,8 +84,10 @@ int ParseForwarded(const char *s, size_t n, uint32_t *ip, uint16_t *port) {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (ip) *ip = x;
|
||||
if (port) *port = t;
|
||||
if (ip)
|
||||
*ip = x;
|
||||
if (port)
|
||||
*port = t;
|
||||
return 0;
|
||||
} else {
|
||||
return -1;
|
||||
|
|
|
@ -42,8 +42,10 @@ static unsigned ParseMonth(const char *p) {
|
|||
*/
|
||||
int64_t ParseHttpDateTime(const char *p, size_t n) {
|
||||
unsigned year, month, day, hour, minute, second, yday, leap;
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (n != 29) return 0;
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
if (n != 29)
|
||||
return 0;
|
||||
day = (p[5] - '0') * 10 + (p[6] - '0') - 1;
|
||||
month = ParseMonth(p + 8);
|
||||
year = (p[12] - '0') * 1000 + (p[13] - '0') * 100 + (p[14] - '0') * 10 +
|
||||
|
|
|
@ -91,8 +91,10 @@ int ParseHttpMessage(struct HttpMessage *r, const char *p, size_t n) {
|
|||
c = p[r->i] & 0xff;
|
||||
switch (r->t) {
|
||||
case kHttpStateStart:
|
||||
if (c == '\r' || c == '\n') break; // RFC7230 § 3.5
|
||||
if (!kHttpToken[c]) return ebadmsg();
|
||||
if (c == '\r' || c == '\n')
|
||||
break; // RFC7230 § 3.5
|
||||
if (!kHttpToken[c])
|
||||
return ebadmsg();
|
||||
if (r->type == kHttpRequest) {
|
||||
r->t = kHttpStateMethod;
|
||||
r->method = kToUpper[c];
|
||||
|
@ -114,14 +116,16 @@ int ParseHttpMessage(struct HttpMessage *r, const char *p, size_t n) {
|
|||
c = kToUpper[c];
|
||||
r->method |= (uint64_t)c << r->a;
|
||||
r->a += 8;
|
||||
if (++r->i == n) break;
|
||||
if (++r->i == n)
|
||||
break;
|
||||
c = p[r->i] & 0xff;
|
||||
}
|
||||
break;
|
||||
case kHttpStateUri:
|
||||
for (;;) {
|
||||
if (c == ' ' || c == '\r' || c == '\n') {
|
||||
if (r->i == r->a) return ebadmsg();
|
||||
if (r->i == r->a)
|
||||
return ebadmsg();
|
||||
r->uri.a = r->a;
|
||||
r->uri.b = r->i;
|
||||
if (c == ' ') {
|
||||
|
@ -135,7 +139,8 @@ int ParseHttpMessage(struct HttpMessage *r, const char *p, size_t n) {
|
|||
} else if (c < 0x20 || (0x7F <= c && c < 0xA0)) {
|
||||
return ebadmsg();
|
||||
}
|
||||
if (++r->i == n) break;
|
||||
if (++r->i == n)
|
||||
break;
|
||||
c = p[r->i] & 0xff;
|
||||
}
|
||||
break;
|
||||
|
@ -158,7 +163,8 @@ int ParseHttpMessage(struct HttpMessage *r, const char *p, size_t n) {
|
|||
case kHttpStateStatus:
|
||||
for (;;) {
|
||||
if (c == ' ' || c == '\r' || c == '\n') {
|
||||
if (r->status < 100) return ebadmsg();
|
||||
if (r->status < 100)
|
||||
return ebadmsg();
|
||||
if (c == ' ') {
|
||||
r->a = r->i + 1;
|
||||
r->t = kHttpStateMessage;
|
||||
|
@ -169,11 +175,13 @@ int ParseHttpMessage(struct HttpMessage *r, const char *p, size_t n) {
|
|||
} else if ('0' <= c && c <= '9') {
|
||||
r->status *= 10;
|
||||
r->status += c - '0';
|
||||
if (r->status > 999) return ebadmsg();
|
||||
if (r->status > 999)
|
||||
return ebadmsg();
|
||||
} else {
|
||||
return ebadmsg();
|
||||
}
|
||||
if (++r->i == n) break;
|
||||
if (++r->i == n)
|
||||
break;
|
||||
c = p[r->i] & 0xff;
|
||||
}
|
||||
break;
|
||||
|
@ -187,12 +195,14 @@ int ParseHttpMessage(struct HttpMessage *r, const char *p, size_t n) {
|
|||
} else if (c < 0x20 || (0x7F <= c && c < 0xA0)) {
|
||||
return ebadmsg();
|
||||
}
|
||||
if (++r->i == n) break;
|
||||
if (++r->i == n)
|
||||
break;
|
||||
c = p[r->i] & 0xff;
|
||||
}
|
||||
break;
|
||||
case kHttpStateCr:
|
||||
if (c != '\n') return ebadmsg();
|
||||
if (c != '\n')
|
||||
return ebadmsg();
|
||||
r->t = kHttpStateLf1;
|
||||
break;
|
||||
case kHttpStateLf1:
|
||||
|
@ -218,12 +228,14 @@ int ParseHttpMessage(struct HttpMessage *r, const char *p, size_t n) {
|
|||
} else if (!kHttpToken[c]) {
|
||||
return ebadmsg();
|
||||
}
|
||||
if (++r->i == n) break;
|
||||
if (++r->i == n)
|
||||
break;
|
||||
c = p[r->i] & 0xff;
|
||||
}
|
||||
break;
|
||||
case kHttpStateColon:
|
||||
if (c == ' ' || c == '\t') break;
|
||||
if (c == ' ' || c == '\t')
|
||||
break;
|
||||
r->a = r->i;
|
||||
r->t = kHttpStateValue;
|
||||
// fallthrough
|
||||
|
@ -231,7 +243,8 @@ int ParseHttpMessage(struct HttpMessage *r, const char *p, size_t n) {
|
|||
for (;;) {
|
||||
if (c == '\r' || c == '\n') {
|
||||
i = r->i;
|
||||
while (i > r->a && (p[i - 1] == ' ' || p[i - 1] == '\t')) --i;
|
||||
while (i > r->a && (p[i - 1] == ' ' || p[i - 1] == '\t'))
|
||||
--i;
|
||||
if ((h = GetHttpHeader(p + r->k.a, r->k.b - r->k.a)) != -1 &&
|
||||
(!r->headers[h].a || !kHttpRepeatable[h])) {
|
||||
r->headers[h].a = r->a;
|
||||
|
@ -265,7 +278,8 @@ int ParseHttpMessage(struct HttpMessage *r, const char *p, size_t n) {
|
|||
} else if ((c < 0x20 && c != '\t') || (0x7F <= c && c < 0xA0)) {
|
||||
return ebadmsg();
|
||||
}
|
||||
if (++r->i == n) break;
|
||||
if (++r->i == n)
|
||||
break;
|
||||
c = p[r->i] & 0xff;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -31,11 +31,14 @@
|
|||
uint64_t ParseHttpMethod(const char *str, size_t len) {
|
||||
int s = 0;
|
||||
uint64_t w = 0;
|
||||
if (len == -1) len = str ? strlen(str) : 0;
|
||||
if (len == -1)
|
||||
len = str ? strlen(str) : 0;
|
||||
for (size_t i = 0; i < len; ++i) {
|
||||
int c = kToUpper[str[i] & 255];
|
||||
if (!kHttpToken[c]) return 0;
|
||||
if (s == 64) return 0;
|
||||
if (!kHttpToken[c])
|
||||
return 0;
|
||||
if (s == 64)
|
||||
return 0;
|
||||
w |= (uint64_t)c << s;
|
||||
s += 8;
|
||||
}
|
||||
|
|
|
@ -38,23 +38,30 @@ bool ParseHttpRange(const char *p, size_t n, long resourcelength,
|
|||
long start, length, ending;
|
||||
*out_start = 0;
|
||||
*out_length = 0;
|
||||
if (memchr(p, ',', n)) return false;
|
||||
if (n < 7 || memcmp(p, "bytes=", 6) != 0) return false;
|
||||
if (memchr(p, ',', n))
|
||||
return false;
|
||||
if (n < 7 || memcmp(p, "bytes=", 6) != 0)
|
||||
return false;
|
||||
p += 6, n -= 6;
|
||||
if (n && *p == '-') {
|
||||
++p, --n;
|
||||
length = 0;
|
||||
while (n && '0' <= *p && *p <= '9') {
|
||||
if (ckd_mul(&length, length, 10)) return false;
|
||||
if (ckd_add(&length, length, *p - '0')) return false;
|
||||
if (ckd_mul(&length, length, 10))
|
||||
return false;
|
||||
if (ckd_add(&length, length, *p - '0'))
|
||||
return false;
|
||||
++p, --n;
|
||||
}
|
||||
if (ckd_sub(&start, resourcelength, length)) return false;
|
||||
if (ckd_sub(&start, resourcelength, length))
|
||||
return false;
|
||||
} else {
|
||||
start = 0;
|
||||
while (n && '0' <= *p && *p <= '9') {
|
||||
if (ckd_mul(&start, start, 10)) return false;
|
||||
if (ckd_add(&start, start, *p - '0')) return false;
|
||||
if (ckd_mul(&start, start, 10))
|
||||
return false;
|
||||
if (ckd_add(&start, start, *p - '0'))
|
||||
return false;
|
||||
++p, --n;
|
||||
}
|
||||
if (n && *p == '-') {
|
||||
|
@ -64,22 +71,31 @@ bool ParseHttpRange(const char *p, size_t n, long resourcelength,
|
|||
} else {
|
||||
length = 0;
|
||||
while (n && '0' <= *p && *p <= '9') {
|
||||
if (ckd_mul(&length, length, 10)) return false;
|
||||
if (ckd_add(&length, length, *p - '0')) return false;
|
||||
if (ckd_mul(&length, length, 10))
|
||||
return false;
|
||||
if (ckd_add(&length, length, *p - '0'))
|
||||
return false;
|
||||
++p, --n;
|
||||
}
|
||||
if (ckd_add(&length, length, 1)) return false;
|
||||
if (ckd_sub(&length, length, start)) return false;
|
||||
if (ckd_add(&length, length, 1))
|
||||
return false;
|
||||
if (ckd_sub(&length, length, start))
|
||||
return false;
|
||||
}
|
||||
} else if (ckd_sub(&length, resourcelength, start)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (n) return false;
|
||||
if (start < 0) return false;
|
||||
if (length < 1) return false;
|
||||
if (start > resourcelength) return false;
|
||||
if (ckd_add(&ending, start, length)) return false;
|
||||
if (n)
|
||||
return false;
|
||||
if (start < 0)
|
||||
return false;
|
||||
if (length < 1)
|
||||
return false;
|
||||
if (start > resourcelength)
|
||||
return false;
|
||||
if (ckd_add(&ending, start, length))
|
||||
return false;
|
||||
if (ending > resourcelength) {
|
||||
length = resourcelength - start;
|
||||
}
|
||||
|
|
|
@ -32,8 +32,10 @@ int64_t ParseIp(const char *s, size_t n) {
|
|||
size_t i;
|
||||
unsigned b, x;
|
||||
bool dotted = false;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (!n) return -1;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
if (!n)
|
||||
return -1;
|
||||
for (b = x = j = i = 0; i < n; ++i) {
|
||||
c = s[i] & 255;
|
||||
if (isdigit(c)) {
|
||||
|
@ -43,7 +45,8 @@ int64_t ParseIp(const char *s, size_t n) {
|
|||
return -1;
|
||||
}
|
||||
} else if (c == '.') {
|
||||
if (b > 255) return -1;
|
||||
if (b > 255)
|
||||
return -1;
|
||||
dotted = true;
|
||||
x <<= 8;
|
||||
x |= b;
|
||||
|
|
|
@ -204,7 +204,8 @@ static void ParsePath(struct UrlParser *u, struct UrlView *h) {
|
|||
|
||||
static void ParseQuery(struct UrlParser *u, struct UrlParams *h) {
|
||||
bool t = false;
|
||||
if (!h->p) h->p = malloc(0);
|
||||
if (!h->p)
|
||||
h->p = malloc(0);
|
||||
while (u->i < u->n) {
|
||||
u->c = u->s[u->i++] & 255;
|
||||
if (u->c == '#') {
|
||||
|
@ -285,7 +286,8 @@ static void ParseFragment(struct UrlParser *u, struct UrlView *h) {
|
|||
char *ParseUrl(const char *s, size_t n, struct Url *h, int f) {
|
||||
char *m;
|
||||
struct UrlParser u;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
u.i = 0;
|
||||
u.c = 0;
|
||||
u.s = s;
|
||||
|
@ -294,10 +296,14 @@ char *ParseUrl(const char *s, size_t n, struct Url *h, int f) {
|
|||
bzero(h, sizeof(*h));
|
||||
if ((m = malloc((f & kUrlLatin1) ? u.n * 2 : u.n))) {
|
||||
u.q = u.p = m;
|
||||
if (ParseScheme(&u, h)) ParseAuthority(&u, h);
|
||||
if (u.c != '#' && u.c != '?') ParsePath(&u, &h->path);
|
||||
if (u.c == '?') ParseQuery(&u, &h->params);
|
||||
if (u.c == '#') ParseFragment(&u, &h->fragment);
|
||||
if (ParseScheme(&u, h))
|
||||
ParseAuthority(&u, h);
|
||||
if (u.c != '#' && u.c != '?')
|
||||
ParsePath(&u, &h->path);
|
||||
if (u.c == '?')
|
||||
ParseQuery(&u, &h->params);
|
||||
if (u.c == '#')
|
||||
ParseFragment(&u, &h->fragment);
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
@ -325,7 +331,8 @@ char *ParseUrl(const char *s, size_t n, struct Url *h, int f) {
|
|||
char *ParseParams(const char *s, size_t n, struct UrlParams *h) {
|
||||
char *m;
|
||||
struct UrlParser u;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
u.i = 0;
|
||||
u.s = s;
|
||||
u.n = n;
|
||||
|
@ -365,7 +372,8 @@ char *ParseParams(const char *s, size_t n, struct UrlParams *h) {
|
|||
char *ParseHost(const char *s, size_t n, struct Url *h) {
|
||||
char *m;
|
||||
struct UrlParser u;
|
||||
if (n == -1) n = s ? strlen(s) : 0;
|
||||
if (n == -1)
|
||||
n = s ? strlen(s) : 0;
|
||||
u.i = 0;
|
||||
u.c = 0;
|
||||
u.s = s;
|
||||
|
|
|
@ -37,7 +37,8 @@
|
|||
void ReplenishTokens(atomic_uint_fast64_t *w, size_t n) {
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
uint64_t a = atomic_load_explicit(w + i, memory_order_relaxed);
|
||||
if (a == 0x7f7f7f7f7f7f7f7f) continue;
|
||||
if (a == 0x7f7f7f7f7f7f7f7f)
|
||||
continue;
|
||||
uint64_t b = 0x8080808080808080;
|
||||
uint64_t c = 0x7f7f7f7f7f7f7f7f ^ a;
|
||||
uint64_t d = ((((c >> 1 | b) - c) & b) ^ b) >> 7;
|
||||
|
@ -75,7 +76,8 @@ void ReplenishTokens(atomic_uint_fast64_t *w, size_t n) {
|
|||
int AcquireToken(atomic_schar *b, uint32_t x, int c) {
|
||||
uint32_t i = x >> (32 - c);
|
||||
int t = atomic_load_explicit(b + i, memory_order_relaxed);
|
||||
if (t <= 0) return t;
|
||||
if (t <= 0)
|
||||
return t;
|
||||
return atomic_fetch_add_explicit(b + i, -1, memory_order_relaxed);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,14 +37,16 @@ ssize_t Unchunk(struct HttpUnchunker *u, char *p, size_t n, size_t *l) {
|
|||
c = p[u->i++] & 255;
|
||||
switch (u->t) {
|
||||
case kHttpStateChunkStart:
|
||||
if ((u->m = kHexToInt[c]) == -1) return ebadmsg();
|
||||
if ((u->m = kHexToInt[c]) == -1)
|
||||
return ebadmsg();
|
||||
u->t = kHttpStateChunkSize;
|
||||
break;
|
||||
case kHttpStateChunkSize:
|
||||
if ((h = kHexToInt[c]) != -1) {
|
||||
u->m *= 16;
|
||||
u->m += h;
|
||||
if (u->m >= 0x0000010000000000) return ebadmsg();
|
||||
if (u->m >= 0x0000010000000000)
|
||||
return ebadmsg();
|
||||
break;
|
||||
}
|
||||
u->t = kHttpStateChunkExt;
|
||||
|
@ -58,7 +60,8 @@ ssize_t Unchunk(struct HttpUnchunker *u, char *p, size_t n, size_t *l) {
|
|||
}
|
||||
/* fallthrough */
|
||||
case kHttpStateChunkLf1:
|
||||
if (c != '\n') return ebadmsg();
|
||||
if (c != '\n')
|
||||
return ebadmsg();
|
||||
u->t = u->m ? kHttpStateChunk : kHttpStateTrailerStart;
|
||||
break;
|
||||
case kHttpStateChunk:
|
||||
|
@ -68,7 +71,8 @@ ssize_t Unchunk(struct HttpUnchunker *u, char *p, size_t n, size_t *l) {
|
|||
u->i += s;
|
||||
u->j += s;
|
||||
u->m -= s;
|
||||
if (!u->m) u->t = kHttpStateChunkCr2;
|
||||
if (!u->m)
|
||||
u->t = kHttpStateChunkCr2;
|
||||
break;
|
||||
case kHttpStateChunkCr2:
|
||||
if (c == '\r') {
|
||||
|
@ -77,7 +81,8 @@ ssize_t Unchunk(struct HttpUnchunker *u, char *p, size_t n, size_t *l) {
|
|||
}
|
||||
/* fallthrough */
|
||||
case kHttpStateChunkLf2:
|
||||
if (c != '\n') return ebadmsg();
|
||||
if (c != '\n')
|
||||
return ebadmsg();
|
||||
u->t = kHttpStateChunkStart;
|
||||
break;
|
||||
case kHttpStateTrailerStart:
|
||||
|
@ -98,14 +103,18 @@ ssize_t Unchunk(struct HttpUnchunker *u, char *p, size_t n, size_t *l) {
|
|||
}
|
||||
/* fallthrough */
|
||||
case kHttpStateTrailerLf1:
|
||||
if (c != '\n') return ebadmsg();
|
||||
if (c != '\n')
|
||||
return ebadmsg();
|
||||
u->t = kHttpStateTrailerStart;
|
||||
break;
|
||||
case kHttpStateTrailerLf2:
|
||||
if (c != '\n') return ebadmsg();
|
||||
if (c != '\n')
|
||||
return ebadmsg();
|
||||
Finished:
|
||||
if (l) *l = u->j;
|
||||
if (u->j < n) p[u->j] = 0;
|
||||
if (l)
|
||||
*l = u->j;
|
||||
if (u->j < n)
|
||||
p[u->j] = 0;
|
||||
return u->i;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -41,15 +41,18 @@ char *Underlong(const char *p, size_t n, size_t *z) {
|
|||
size_t i, j, m;
|
||||
wint_t x, a, b;
|
||||
int8_t v1[16], v2[16], vz[16];
|
||||
if (z) *z = 0;
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (z)
|
||||
*z = 0;
|
||||
if (n == -1)
|
||||
n = p ? strlen(p) : 0;
|
||||
if ((q = r = malloc(n * 2 + 1))) {
|
||||
for (i = 0; i < n;) {
|
||||
bzero(vz, 16); /* 50x speedup for ASCII */
|
||||
while (i + 16 < n) {
|
||||
memcpy(v1, p + i, 16);
|
||||
pcmpgtb(v2, v1, vz);
|
||||
if (pmovmskb((void *)v2) != 0xFFFF) break;
|
||||
if (pmovmskb((void *)v2) != 0xFFFF)
|
||||
break;
|
||||
memcpy(q, v1, 16);
|
||||
q += 16;
|
||||
i += 16;
|
||||
|
@ -61,7 +64,8 @@ char *Underlong(const char *p, size_t n, size_t *z) {
|
|||
if (i + m <= n) {
|
||||
for (j = 0;;) {
|
||||
b = p[i + j] & 0xff;
|
||||
if (!ThomPikeCont(b)) break;
|
||||
if (!ThomPikeCont(b))
|
||||
break;
|
||||
a = ThomPikeMerge(a, b);
|
||||
if (++j == m) {
|
||||
x = a;
|
||||
|
@ -76,9 +80,11 @@ char *Underlong(const char *p, size_t n, size_t *z) {
|
|||
*q++ = w;
|
||||
} while ((w >>= 8));
|
||||
}
|
||||
if (z) *z = q - r;
|
||||
if (z)
|
||||
*z = q - r;
|
||||
*q++ = '\0';
|
||||
if ((q = realloc(r, q - r))) r = q;
|
||||
if ((q = realloc(r, q - r)))
|
||||
r = q;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -43,7 +43,8 @@ char *VisualizeControlCodes(const char *data, size_t size, size_t *out_size) {
|
|||
unsigned i, n;
|
||||
wint_t x, a, b;
|
||||
const char *p, *e;
|
||||
if (size == -1) size = data ? strlen(data) : 0;
|
||||
if (size == -1)
|
||||
size = data ? strlen(data) : 0;
|
||||
if ((r = malloc(size * 6 + 1))) {
|
||||
q = r;
|
||||
p = data;
|
||||
|
@ -56,7 +57,8 @@ char *VisualizeControlCodes(const char *data, size_t size, size_t *out_size) {
|
|||
if (p + n <= e) {
|
||||
for (i = 0;;) {
|
||||
b = p[i] & 0xff;
|
||||
if (!ThomPikeCont(b)) break;
|
||||
if (!ThomPikeCont(b))
|
||||
break;
|
||||
a = ThomPikeMerge(a, b);
|
||||
if (++i == n) {
|
||||
x = a;
|
||||
|
@ -116,7 +118,8 @@ char *VisualizeControlCodes(const char *data, size_t size, size_t *out_size) {
|
|||
}
|
||||
n = q - r;
|
||||
*q++ = '\0';
|
||||
if ((q = realloc(r, q - r))) r = q;
|
||||
if ((q = realloc(r, q - r)))
|
||||
r = q;
|
||||
} else {
|
||||
n = 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue