Skip to content

Commit 936e7bb

Browse files
committed
mg_split -> mg_span. Remove mg_commalist
1 parent 93b5063 commit 936e7bb

File tree

8 files changed

+105
-135
lines changed

8 files changed

+105
-135
lines changed

mongoose.c

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2329,9 +2329,10 @@ void mg_http_bauth(struct mg_connection *c, const char *user,
23292329
}
23302330

23312331
struct mg_str mg_http_var(struct mg_str buf, struct mg_str name) {
2332-
struct mg_str k, v, result = mg_str_n(NULL, 0);
2333-
while (mg_split(&buf, &k, &v, '&')) {
2334-
if (name.len == k.len && mg_ncasecmp(name.ptr, k.ptr, k.len) == 0) {
2332+
struct mg_str entry, k, v, result = mg_str_n(NULL, 0);
2333+
while (mg_span(buf, &entry, &buf, '&')) {
2334+
if (mg_span(entry, &k, &v, '=') && name.len == k.len &&
2335+
mg_ncasecmp(name.ptr, k.ptr, k.len) == 0) {
23352336
result = v;
23362337
break;
23372338
}
@@ -2722,7 +2723,7 @@ static struct mg_str s_known_types[] = {
27222723
// clang-format on
27232724

27242725
static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
2725-
struct mg_str k, v, s = mg_str(extra);
2726+
struct mg_str entry, k, v, s = mg_str(extra);
27262727
size_t i = 0;
27272728

27282729
// Shrink path to its extension only
@@ -2731,8 +2732,8 @@ static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
27312732
path.len = i;
27322733

27332734
// Process user-provided mime type overrides, if any
2734-
while (mg_commalist(&s, &k, &v)) {
2735-
if (mg_strcmp(path, k) == 0) return v;
2735+
while (mg_span(s, &entry, &s, ',')) {
2736+
if (mg_span(entry, &k, &v, '=') && mg_strcmp(path, k) == 0) return v;
27362737
}
27372738

27382739
// Process built-in mime types
@@ -2748,7 +2749,7 @@ static int getrange(struct mg_str *s, size_t *a, size_t *b) {
27482749
for (i = 0; i + 6 < s->len; i++) {
27492750
struct mg_str k, v = mg_str_n(s->ptr + i + 6, s->len - i - 6);
27502751
if (memcmp(&s->ptr[i], "bytes=", 6) != 0) continue;
2751-
if (mg_split(&v, &k, NULL, '-')) {
2752+
if (mg_span(v, &k, &v, '-')) {
27522753
if (mg_to_size_t(k, a)) numparsed++;
27532754
if (v.len > 0 && mg_to_size_t(v, b)) numparsed++;
27542755
} else {
@@ -3028,8 +3029,9 @@ static int uri_to_path(struct mg_connection *c, struct mg_http_message *hm,
30283029
const struct mg_http_serve_opts *opts, char *path,
30293030
size_t path_size) {
30303031
struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;
3031-
struct mg_str k, v, s = mg_str(opts->root_dir), u = {0, 0}, p = {0, 0};
3032-
while (mg_commalist(&s, &k, &v)) {
3032+
struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u;
3033+
while (mg_span(s, &part, &s, ',')) {
3034+
if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0);
30333035
if (v.len == 0) v = k, k = mg_str("/"), u = k, p = v;
30343036
if (hm->uri.len < k.len) continue;
30353037
if (mg_strcmp(k, mg_str_n(hm->uri.ptr, k.len)) != 0) continue;
@@ -7011,7 +7013,7 @@ static void sntp_cb(struct mg_connection *c, int ev, void *ev_data) {
70117013
if (ev == MG_EV_READ) {
70127014
int64_t milliseconds = mg_sntp_parse(c->recv.buf, c->recv.len);
70137015
if (milliseconds > 0) {
7014-
MG_INFO(("%lu got time: %lld ms from epoch", c->id, milliseconds));
7016+
MG_DEBUG(("%lu got time: %lld ms from epoch", c->id, milliseconds));
70157017
mg_call(c, MG_EV_SNTP_TIME, (uint64_t *) &milliseconds);
70167018
MG_VERBOSE(("%u.%u", (unsigned) (milliseconds / 1000),
70177019
(unsigned) (milliseconds % 1000)));
@@ -8003,31 +8005,17 @@ bool mg_globmatch(const char *s1, size_t n1, const char *s2, size_t n2) {
80038005
return mg_match(mg_str_n(s2, n2), mg_str_n(s1, n1), NULL);
80048006
}
80058007

8006-
static size_t mg_nce(const char *s, size_t n, size_t ofs, size_t *koff,
8007-
size_t *klen, size_t *voff, size_t *vlen, char delim) {
8008-
size_t kvlen, kl;
8009-
for (kvlen = 0; ofs + kvlen < n && s[ofs + kvlen] != delim;) kvlen++;
8010-
for (kl = 0; kl < kvlen && s[ofs + kl] != '=';) kl++;
8011-
if (koff != NULL) *koff = ofs;
8012-
if (klen != NULL) *klen = kl;
8013-
if (voff != NULL) *voff = kl < kvlen ? ofs + kl + 1 : 0;
8014-
if (vlen != NULL) *vlen = kl < kvlen ? kvlen - kl - 1 : 0;
8015-
ofs += kvlen + 1;
8016-
return ofs > n ? n : ofs;
8017-
}
8018-
8019-
bool mg_split(struct mg_str *s, struct mg_str *k, struct mg_str *v, char sep) {
8020-
size_t koff = 0, klen = 0, voff = 0, vlen = 0, off = 0;
8021-
if (s->ptr == NULL || s->len == 0) return 0;
8022-
off = mg_nce(s->ptr, s->len, 0, &koff, &klen, &voff, &vlen, sep);
8023-
if (k != NULL) *k = mg_str_n(s->ptr + koff, klen);
8024-
if (v != NULL) *v = mg_str_n(s->ptr + voff, vlen);
8025-
*s = mg_str_n(s->ptr + off, s->len - off);
8026-
return off > 0;
8027-
}
8028-
8029-
bool mg_commalist(struct mg_str *s, struct mg_str *k, struct mg_str *v) {
8030-
return mg_split(s, k, v, ',');
8008+
bool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char sep) {
8009+
if (s.len == 0 || s.ptr == NULL) {
8010+
return false; // Empty string, nothing to span - fail
8011+
} else {
8012+
size_t len = 0;
8013+
while (len < s.len && s.ptr[len] != sep) len++; // Find separator
8014+
if (a) *a = mg_str_n(s.ptr, len); // Init a
8015+
if (b) *b = mg_str_n(s.ptr + len, s.len - len); // Init b
8016+
if (b && len < s.len) b->ptr++, b->len--; // Skip separator
8017+
return true;
8018+
}
80318019
}
80328020

80338021
char *mg_hex(const void *buf, size_t len, char *to) {
@@ -13880,18 +13868,18 @@ static int parse_net(const char *spec, uint32_t *net, uint32_t *mask) {
1388013868
}
1388113869

1388213870
int mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip) {
13883-
struct mg_str k, v;
13871+
struct mg_str entry;
1388413872
int allowed = acl.len == 0 ? '+' : '-'; // If any ACL is set, deny by default
1388513873
uint32_t remote_ip4;
1388613874
if (remote_ip->is_ip6) {
1388713875
return -1; // TODO(): handle IPv6 ACL and addresses
1388813876
} else { // IPv4
1388913877
memcpy((void *) &remote_ip4, remote_ip->ip, sizeof(remote_ip4));
13890-
while (mg_commalist(&acl, &k, &v)) {
13878+
while (mg_span(acl, &entry, &acl, ',')) {
1389113879
uint32_t net, mask;
13892-
if (k.ptr[0] != '+' && k.ptr[0] != '-') return -1;
13893-
if (parse_net(&k.ptr[1], &net, &mask) == 0) return -2;
13894-
if ((mg_ntohl(remote_ip4) & mask) == net) allowed = k.ptr[0];
13880+
if (entry.ptr[0] != '+' && entry.ptr[0] != '-') return -1;
13881+
if (parse_net(&entry.ptr[1], &net, &mask) == 0) return -2;
13882+
if ((mg_ntohl(remote_ip4) & mask) == net) allowed = entry.ptr[0];
1389513883
}
1389613884
}
1389713885
return allowed == '+';

mongoose.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -840,9 +840,6 @@ struct mg_str {
840840
size_t len; // String len
841841
};
842842

843-
#define MG_NULL_STR \
844-
{ NULL, 0 }
845-
846843
#define MG_C_STR(a) \
847844
{ (a), sizeof(a) - 1 }
848845

@@ -862,8 +859,7 @@ struct mg_str mg_strdup(const struct mg_str s);
862859
const char *mg_strstr(const struct mg_str haystack, const struct mg_str needle);
863860
bool mg_match(struct mg_str str, struct mg_str pattern, struct mg_str *caps);
864861
bool mg_globmatch(const char *pattern, size_t plen, const char *s, size_t n);
865-
bool mg_commalist(struct mg_str *s, struct mg_str *k, struct mg_str *v);
866-
bool mg_split(struct mg_str *s, struct mg_str *k, struct mg_str *v, char delim);
862+
bool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char delim);
867863
char *mg_hex(const void *buf, size_t len, char *dst);
868864
void mg_unhex(const char *buf, size_t len, unsigned char *to);
869865
unsigned long mg_unhexn(const char *s, size_t len);

src/http.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,10 @@ void mg_http_bauth(struct mg_connection *c, const char *user,
113113
}
114114

115115
struct mg_str mg_http_var(struct mg_str buf, struct mg_str name) {
116-
struct mg_str k, v, result = mg_str_n(NULL, 0);
117-
while (mg_split(&buf, &k, &v, '&')) {
118-
if (name.len == k.len && mg_ncasecmp(name.ptr, k.ptr, k.len) == 0) {
116+
struct mg_str entry, k, v, result = mg_str_n(NULL, 0);
117+
while (mg_span(buf, &entry, &buf, '&')) {
118+
if (mg_span(entry, &k, &v, '=') && name.len == k.len &&
119+
mg_ncasecmp(name.ptr, k.ptr, k.len) == 0) {
119120
result = v;
120121
break;
121122
}
@@ -506,7 +507,7 @@ static struct mg_str s_known_types[] = {
506507
// clang-format on
507508

508509
static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
509-
struct mg_str k, v, s = mg_str(extra);
510+
struct mg_str entry, k, v, s = mg_str(extra);
510511
size_t i = 0;
511512

512513
// Shrink path to its extension only
@@ -515,8 +516,8 @@ static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
515516
path.len = i;
516517

517518
// Process user-provided mime type overrides, if any
518-
while (mg_commalist(&s, &k, &v)) {
519-
if (mg_strcmp(path, k) == 0) return v;
519+
while (mg_span(s, &entry, &s, ',')) {
520+
if (mg_span(entry, &k, &v, '=') && mg_strcmp(path, k) == 0) return v;
520521
}
521522

522523
// Process built-in mime types
@@ -532,7 +533,7 @@ static int getrange(struct mg_str *s, size_t *a, size_t *b) {
532533
for (i = 0; i + 6 < s->len; i++) {
533534
struct mg_str k, v = mg_str_n(s->ptr + i + 6, s->len - i - 6);
534535
if (memcmp(&s->ptr[i], "bytes=", 6) != 0) continue;
535-
if (mg_split(&v, &k, NULL, '-')) {
536+
if (mg_span(v, &k, &v, '-')) {
536537
if (mg_to_size_t(k, a)) numparsed++;
537538
if (v.len > 0 && mg_to_size_t(v, b)) numparsed++;
538539
} else {
@@ -812,8 +813,9 @@ static int uri_to_path(struct mg_connection *c, struct mg_http_message *hm,
812813
const struct mg_http_serve_opts *opts, char *path,
813814
size_t path_size) {
814815
struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;
815-
struct mg_str k, v, s = mg_str(opts->root_dir), u = {0, 0}, p = {0, 0};
816-
while (mg_commalist(&s, &k, &v)) {
816+
struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u;
817+
while (mg_span(s, &part, &s, ',')) {
818+
if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0);
817819
if (v.len == 0) v = k, k = mg_str("/"), u = k, p = v;
818820
if (hm->uri.len < k.len) continue;
819821
if (mg_strcmp(k, mg_str_n(hm->uri.ptr, k.len)) != 0) continue;

src/sntp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static void sntp_cb(struct mg_connection *c, int ev, void *ev_data) {
4242
if (ev == MG_EV_READ) {
4343
int64_t milliseconds = mg_sntp_parse(c->recv.buf, c->recv.len);
4444
if (milliseconds > 0) {
45-
MG_INFO(("%lu got time: %lld ms from epoch", c->id, milliseconds));
45+
MG_DEBUG(("%lu got time: %lld ms from epoch", c->id, milliseconds));
4646
mg_call(c, MG_EV_SNTP_TIME, (uint64_t *) &milliseconds);
4747
MG_VERBOSE(("%u.%u", (unsigned) (milliseconds / 1000),
4848
(unsigned) (milliseconds % 1000)));

src/str.c

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -129,31 +129,17 @@ bool mg_globmatch(const char *s1, size_t n1, const char *s2, size_t n2) {
129129
return mg_match(mg_str_n(s2, n2), mg_str_n(s1, n1), NULL);
130130
}
131131

132-
static size_t mg_nce(const char *s, size_t n, size_t ofs, size_t *koff,
133-
size_t *klen, size_t *voff, size_t *vlen, char delim) {
134-
size_t kvlen, kl;
135-
for (kvlen = 0; ofs + kvlen < n && s[ofs + kvlen] != delim;) kvlen++;
136-
for (kl = 0; kl < kvlen && s[ofs + kl] != '=';) kl++;
137-
if (koff != NULL) *koff = ofs;
138-
if (klen != NULL) *klen = kl;
139-
if (voff != NULL) *voff = kl < kvlen ? ofs + kl + 1 : 0;
140-
if (vlen != NULL) *vlen = kl < kvlen ? kvlen - kl - 1 : 0;
141-
ofs += kvlen + 1;
142-
return ofs > n ? n : ofs;
143-
}
144-
145-
bool mg_split(struct mg_str *s, struct mg_str *k, struct mg_str *v, char sep) {
146-
size_t koff = 0, klen = 0, voff = 0, vlen = 0, off = 0;
147-
if (s->ptr == NULL || s->len == 0) return 0;
148-
off = mg_nce(s->ptr, s->len, 0, &koff, &klen, &voff, &vlen, sep);
149-
if (k != NULL) *k = mg_str_n(s->ptr + koff, klen);
150-
if (v != NULL) *v = mg_str_n(s->ptr + voff, vlen);
151-
*s = mg_str_n(s->ptr + off, s->len - off);
152-
return off > 0;
153-
}
154-
155-
bool mg_commalist(struct mg_str *s, struct mg_str *k, struct mg_str *v) {
156-
return mg_split(s, k, v, ',');
132+
bool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char sep) {
133+
if (s.len == 0 || s.ptr == NULL) {
134+
return false; // Empty string, nothing to span - fail
135+
} else {
136+
size_t len = 0;
137+
while (len < s.len && s.ptr[len] != sep) len++; // Find separator
138+
if (a) *a = mg_str_n(s.ptr, len); // Init a
139+
if (b) *b = mg_str_n(s.ptr + len, s.len - len); // Init b
140+
if (b && len < s.len) b->ptr++, b->len--; // Skip separator
141+
return true;
142+
}
157143
}
158144

159145
char *mg_hex(const void *buf, size_t len, char *to) {

src/str.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@ struct mg_str {
77
size_t len; // String len
88
};
99

10-
#define MG_NULL_STR \
11-
{ NULL, 0 }
12-
1310
#define MG_C_STR(a) \
1411
{ (a), sizeof(a) - 1 }
1512

@@ -29,8 +26,7 @@ struct mg_str mg_strdup(const struct mg_str s);
2926
const char *mg_strstr(const struct mg_str haystack, const struct mg_str needle);
3027
bool mg_match(struct mg_str str, struct mg_str pattern, struct mg_str *caps);
3128
bool mg_globmatch(const char *pattern, size_t plen, const char *s, size_t n);
32-
bool mg_commalist(struct mg_str *s, struct mg_str *k, struct mg_str *v);
33-
bool mg_split(struct mg_str *s, struct mg_str *k, struct mg_str *v, char delim);
29+
bool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char delim);
3430
char *mg_hex(const void *buf, size_t len, char *dst);
3531
void mg_unhex(const char *buf, size_t len, unsigned char *to);
3632
unsigned long mg_unhexn(const char *s, size_t len);

src/util.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,18 +89,18 @@ static int parse_net(const char *spec, uint32_t *net, uint32_t *mask) {
8989
}
9090

9191
int mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip) {
92-
struct mg_str k, v;
92+
struct mg_str entry;
9393
int allowed = acl.len == 0 ? '+' : '-'; // If any ACL is set, deny by default
9494
uint32_t remote_ip4;
9595
if (remote_ip->is_ip6) {
9696
return -1; // TODO(): handle IPv6 ACL and addresses
9797
} else { // IPv4
9898
memcpy((void *) &remote_ip4, remote_ip->ip, sizeof(remote_ip4));
99-
while (mg_commalist(&acl, &k, &v)) {
99+
while (mg_span(acl, &entry, &acl, ',')) {
100100
uint32_t net, mask;
101-
if (k.ptr[0] != '+' && k.ptr[0] != '-') return -1;
102-
if (parse_net(&k.ptr[1], &net, &mask) == 0) return -2;
103-
if ((mg_ntohl(remote_ip4) & mask) == net) allowed = k.ptr[0];
101+
if (entry.ptr[0] != '+' && entry.ptr[0] != '-') return -1;
102+
if (parse_net(&entry.ptr[1], &net, &mask) == 0) return -2;
103+
if ((mg_ntohl(remote_ip4) & mask) == net) allowed = entry.ptr[0];
104104
}
105105
}
106106
return allowed == '+';

0 commit comments

Comments
 (0)