Skip to content

Commit ed6713c

Browse files
committed
mg_split -> mg_span. Remove mg_commalist
1 parent fa5aa30 commit ed6713c

File tree

9 files changed

+99
-135
lines changed

9 files changed

+99
-135
lines changed

mongoose.c

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1594,6 +1594,7 @@ size_t mg_vxprintf(void (*out)(char, void *), void *param, const char *fmt,
15941594

15951595

15961596

1597+
15971598
struct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags) {
15981599
struct mg_fd *fd = (struct mg_fd *) calloc(1, sizeof(*fd));
15991600
if (fd != NULL) {
@@ -2328,9 +2329,10 @@ void mg_http_bauth(struct mg_connection *c, const char *user,
23282329
}
23292330

23302331
struct mg_str mg_http_var(struct mg_str buf, struct mg_str name) {
2331-
struct mg_str k, v, result = mg_str_n(NULL, 0);
2332-
while (mg_split(&buf, &k, &v, '&')) {
2333-
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) {
23342336
result = v;
23352337
break;
23362338
}
@@ -2719,7 +2721,7 @@ static struct mg_str s_known_types[] = {
27192721
// clang-format on
27202722

27212723
static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
2722-
struct mg_str k, v, s = mg_str(extra);
2724+
struct mg_str entry, k, v, s = mg_str(extra);
27232725
size_t i = 0;
27242726

27252727
// Shrink path to its extension only
@@ -2728,8 +2730,8 @@ static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
27282730
path.len = i;
27292731

27302732
// Process user-provided mime type overrides, if any
2731-
while (mg_commalist(&s, &k, &v)) {
2732-
if (mg_strcmp(path, k) == 0) return v;
2733+
while (mg_span(s, &entry, &s, ',')) {
2734+
if (mg_span(entry, &k, &v, '=') && mg_strcmp(path, k) == 0) return v;
27332735
}
27342736

27352737
// Process built-in mime types
@@ -2745,7 +2747,7 @@ static int getrange(struct mg_str *s, size_t *a, size_t *b) {
27452747
for (i = 0; i + 6 < s->len; i++) {
27462748
struct mg_str k, v = mg_str_n(s->ptr + i + 6, s->len - i - 6);
27472749
if (memcmp(&s->ptr[i], "bytes=", 6) != 0) continue;
2748-
if (mg_split(&v, &k, NULL, '-')) {
2750+
if (mg_span(v, &k, &v, '-')) {
27492751
if (mg_to_size_t(k, a)) numparsed++;
27502752
if (v.len > 0 && mg_to_size_t(v, b)) numparsed++;
27512753
} else {
@@ -3025,8 +3027,9 @@ static int uri_to_path(struct mg_connection *c, struct mg_http_message *hm,
30253027
const struct mg_http_serve_opts *opts, char *path,
30263028
size_t path_size) {
30273029
struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;
3028-
struct mg_str k, v, s = mg_str(opts->root_dir), u = {0, 0}, p = {0, 0};
3029-
while (mg_commalist(&s, &k, &v)) {
3030+
struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u;
3031+
while (mg_span(s, &part, &s, ',')) {
3032+
if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0);
30303033
if (v.len == 0) v = k, k = mg_str("/"), u = k, p = v;
30313034
if (hm->uri.len < k.len) continue;
30323035
if (mg_strcmp(k, mg_str_n(hm->uri.ptr, k.len)) != 0) continue;
@@ -7000,7 +7003,7 @@ static void sntp_cb(struct mg_connection *c, int ev, void *ev_data) {
70007003
if (ev == MG_EV_READ) {
70017004
int64_t milliseconds = mg_sntp_parse(c->recv.buf, c->recv.len);
70027005
if (milliseconds > 0) {
7003-
MG_INFO(("%lu got time: %lld ms from epoch", c->id, milliseconds));
7006+
MG_DEBUG(("%lu got time: %lld ms from epoch", c->id, milliseconds));
70047007
mg_call(c, MG_EV_SNTP_TIME, (uint64_t *) &milliseconds);
70057008
MG_VERBOSE(("%u.%u", (unsigned) (milliseconds / 1000),
70067009
(unsigned) (milliseconds % 1000)));
@@ -7992,31 +7995,13 @@ bool mg_globmatch(const char *s1, size_t n1, const char *s2, size_t n2) {
79927995
return mg_match(mg_str_n(s2, n2), mg_str_n(s1, n1), NULL);
79937996
}
79947997

7995-
static size_t mg_nce(const char *s, size_t n, size_t ofs, size_t *koff,
7996-
size_t *klen, size_t *voff, size_t *vlen, char delim) {
7997-
size_t kvlen, kl;
7998-
for (kvlen = 0; ofs + kvlen < n && s[ofs + kvlen] != delim;) kvlen++;
7999-
for (kl = 0; kl < kvlen && s[ofs + kl] != '=';) kl++;
8000-
if (koff != NULL) *koff = ofs;
8001-
if (klen != NULL) *klen = kl;
8002-
if (voff != NULL) *voff = kl < kvlen ? ofs + kl + 1 : 0;
8003-
if (vlen != NULL) *vlen = kl < kvlen ? kvlen - kl - 1 : 0;
8004-
ofs += kvlen + 1;
8005-
return ofs > n ? n : ofs;
8006-
}
8007-
8008-
bool mg_split(struct mg_str *s, struct mg_str *k, struct mg_str *v, char sep) {
8009-
size_t koff = 0, klen = 0, voff = 0, vlen = 0, off = 0;
8010-
if (s->ptr == NULL || s->len == 0) return 0;
8011-
off = mg_nce(s->ptr, s->len, 0, &koff, &klen, &voff, &vlen, sep);
8012-
if (k != NULL) *k = mg_str_n(s->ptr + koff, klen);
8013-
if (v != NULL) *v = mg_str_n(s->ptr + voff, vlen);
8014-
*s = mg_str_n(s->ptr + off, s->len - off);
8015-
return off > 0;
8016-
}
8017-
8018-
bool mg_commalist(struct mg_str *s, struct mg_str *k, struct mg_str *v) {
8019-
return mg_split(s, k, v, ',');
7998+
bool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char sep) {
7999+
size_t len = 0;
8000+
while (len < s.len && s.ptr[len] != sep) len++; // Find separator
8001+
if (a != NULL) *a = mg_str_n(s.ptr, len);
8002+
if (b != NULL) *b = mg_str_n(s.ptr + len, s.len - len);
8003+
if (b != NULL && len < s.len) b->ptr++, b->len--; // Separator found, skip it
8004+
return s.len > 0;
80208005
}
80218006

80228007
char *mg_hex(const void *buf, size_t len, char *to) {
@@ -13868,18 +13853,18 @@ static int parse_net(const char *spec, uint32_t *net, uint32_t *mask) {
1386813853
}
1386913854

1387013855
int mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip) {
13871-
struct mg_str k, v;
13856+
struct mg_str entry;
1387213857
int allowed = acl.len == 0 ? '+' : '-'; // If any ACL is set, deny by default
1387313858
uint32_t remote_ip4;
1387413859
if (remote_ip->is_ip6) {
1387513860
return -1; // TODO(): handle IPv6 ACL and addresses
1387613861
} else { // IPv4
1387713862
memcpy((void *) &remote_ip4, remote_ip->ip, sizeof(remote_ip4));
13878-
while (mg_commalist(&acl, &k, &v)) {
13863+
while (mg_span(acl, &entry, &acl, ',')) {
1387913864
uint32_t net, mask;
13880-
if (k.ptr[0] != '+' && k.ptr[0] != '-') return -1;
13881-
if (parse_net(&k.ptr[1], &net, &mask) == 0) return -2;
13882-
if ((mg_ntohl(remote_ip4) & mask) == net) allowed = k.ptr[0];
13865+
if (entry.ptr[0] != '+' && entry.ptr[0] != '-') return -1;
13866+
if (parse_net(&entry.ptr[1], &net, &mask) == 0) return -2;
13867+
if ((mg_ntohl(remote_ip4) & mask) == net) allowed = entry.ptr[0];
1388313868
}
1388413869
}
1388513870
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/fs.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "fs.h"
22
#include "printf.h"
3+
#include "str.h"
34

45
struct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags) {
56
struct mg_fd *fd = (struct mg_fd *) calloc(1, sizeof(*fd));

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
}
@@ -504,7 +505,7 @@ static struct mg_str s_known_types[] = {
504505
// clang-format on
505506

506507
static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
507-
struct mg_str k, v, s = mg_str(extra);
508+
struct mg_str entry, k, v, s = mg_str(extra);
508509
size_t i = 0;
509510

510511
// Shrink path to its extension only
@@ -513,8 +514,8 @@ static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
513514
path.len = i;
514515

515516
// Process user-provided mime type overrides, if any
516-
while (mg_commalist(&s, &k, &v)) {
517-
if (mg_strcmp(path, k) == 0) return v;
517+
while (mg_span(s, &entry, &s, ',')) {
518+
if (mg_span(entry, &k, &v, '=') && mg_strcmp(path, k) == 0) return v;
518519
}
519520

520521
// Process built-in mime types
@@ -530,7 +531,7 @@ static int getrange(struct mg_str *s, size_t *a, size_t *b) {
530531
for (i = 0; i + 6 < s->len; i++) {
531532
struct mg_str k, v = mg_str_n(s->ptr + i + 6, s->len - i - 6);
532533
if (memcmp(&s->ptr[i], "bytes=", 6) != 0) continue;
533-
if (mg_split(&v, &k, NULL, '-')) {
534+
if (mg_span(v, &k, &v, '-')) {
534535
if (mg_to_size_t(k, a)) numparsed++;
535536
if (v.len > 0 && mg_to_size_t(v, b)) numparsed++;
536537
} else {
@@ -810,8 +811,9 @@ static int uri_to_path(struct mg_connection *c, struct mg_http_message *hm,
810811
const struct mg_http_serve_opts *opts, char *path,
811812
size_t path_size) {
812813
struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;
813-
struct mg_str k, v, s = mg_str(opts->root_dir), u = {0, 0}, p = {0, 0};
814-
while (mg_commalist(&s, &k, &v)) {
814+
struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u;
815+
while (mg_span(s, &part, &s, ',')) {
816+
if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0);
815817
if (v.len == 0) v = k, k = mg_str("/"), u = k, p = v;
816818
if (hm->uri.len < k.len) continue;
817819
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: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -129,31 +129,13 @@ 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+
size_t len = 0;
134+
while (len < s.len && s.ptr[len] != sep) len++; // Find separator
135+
if (a != NULL) *a = mg_str_n(s.ptr, len);
136+
if (b != NULL) *b = mg_str_n(s.ptr + len, s.len - len);
137+
if (b != NULL && len < s.len) b->ptr++, b->len--; // Separator found, skip it
138+
return s.len > 0;
157139
}
158140

159141
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)