mirror of
https://github.com/cesanta/mongoose.git
synced 2024-12-14 00:31:42 +08:00
89 lines
2.2 KiB
C
89 lines
2.2 KiB
C
|
#include "str.h"
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
struct mg_str mg_str(const char *s) {
|
||
|
struct mg_str str = {s, s == NULL ? 0 : strlen(s)};
|
||
|
return str;
|
||
|
}
|
||
|
|
||
|
struct mg_str mg_str_n(const char *s, int n) {
|
||
|
struct mg_str str = {s, n};
|
||
|
return str;
|
||
|
}
|
||
|
|
||
|
int mg_lower(const char *s) {
|
||
|
return tolower(*(const unsigned char *) s);
|
||
|
}
|
||
|
|
||
|
int mg_ncasecmp(const char *s1, const char *s2, size_t len) {
|
||
|
int diff = 0;
|
||
|
if (len > 0) do {
|
||
|
diff = mg_lower(s1++) - mg_lower(s2++);
|
||
|
} while (diff == 0 && s1[-1] != '\0' && --len > 0);
|
||
|
return diff;
|
||
|
}
|
||
|
|
||
|
int mg_casecmp(const char *s1, const char *s2) {
|
||
|
return mg_ncasecmp(s1, s2, (size_t) ~0);
|
||
|
}
|
||
|
|
||
|
int mg_vcmp(const struct mg_str *s1, const char *s2) {
|
||
|
size_t n2 = strlen(s2), n1 = s1->len;
|
||
|
int r = strncmp(s1->ptr, s2, (n1 < n2) ? n1 : n2);
|
||
|
if (r == 0) return (int) (n1 - n2);
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
int mg_vcasecmp(const struct mg_str *str1, const char *str2) {
|
||
|
size_t n2 = strlen(str2), n1 = str1->len;
|
||
|
int r = mg_ncasecmp(str1->ptr, str2, (n1 < n2) ? n1 : n2);
|
||
|
if (r == 0) return (int) (n1 - n2);
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
struct mg_str mg_strdup(const struct mg_str s) {
|
||
|
struct mg_str r = {NULL, 0};
|
||
|
if (s.len > 0 && s.ptr != NULL) {
|
||
|
char *sc = (char *) malloc(s.len + 1);
|
||
|
if (sc != NULL) {
|
||
|
memcpy(sc, s.ptr, s.len);
|
||
|
sc[s.len] = '\0';
|
||
|
r.ptr = sc;
|
||
|
r.len = s.len;
|
||
|
}
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
int mg_strcmp(const struct mg_str str1, const struct mg_str str2) {
|
||
|
size_t i = 0;
|
||
|
while (i < str1.len && i < str2.len) {
|
||
|
int c1 = str1.ptr[i];
|
||
|
int c2 = str2.ptr[i];
|
||
|
if (c1 < c2) return -1;
|
||
|
if (c1 > c2) return 1;
|
||
|
i++;
|
||
|
}
|
||
|
if (i < str1.len) return 1;
|
||
|
if (i < str2.len) return -1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
const char *mg_strstr(const struct mg_str haystack,
|
||
|
const struct mg_str needle) {
|
||
|
size_t i;
|
||
|
if (needle.len > haystack.len) return NULL;
|
||
|
for (i = 0; i <= haystack.len - needle.len; i++) {
|
||
|
if (memcmp(haystack.ptr + i, needle.ptr, needle.len) == 0) {
|
||
|
return haystack.ptr + i;
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
struct mg_str mg_strstrip(struct mg_str s) {
|
||
|
while (s.len > 0 && isspace((int) *s.ptr)) s.ptr++, s.len--;
|
||
|
while (s.len > 0 && isspace((int) *(s.ptr + s.len - 1))) s.len--;
|
||
|
return s;
|
||
|
}
|