summaryrefslogtreecommitdiff
path: root/pjlib/src/pj
diff options
context:
space:
mode:
Diffstat (limited to 'pjlib/src/pj')
-rw-r--r--pjlib/src/pj/os_info.c18
-rw-r--r--pjlib/src/pj/string.c107
2 files changed, 118 insertions, 7 deletions
diff --git a/pjlib/src/pj/os_info.c b/pjlib/src/pj/os_info.c
index 514ff242..3bf11670 100644
--- a/pjlib/src/pj/os_info.c
+++ b/pjlib/src/pj/os_info.c
@@ -98,24 +98,28 @@ static char *ver_info(pj_uint32_t ver, char *buf)
}
static pj_uint32_t parse_version(char *str)
-{
- char *tok;
- int i, maxtok;
+{
+ int i, maxtok, found_idx;
pj_uint32_t version = 0;
+ pj_str_t in_str = pj_str(str);
+ pj_str_t token, delim;
while (*str && !pj_isdigit(*str))
str++;
maxtok = 4;
- for (tok = strtok(str, ".-"), i=0; tok && i<maxtok;
- ++i, tok=strtok(NULL, ".-"))
+ delim = pj_str(".-");
+ for (found_idx = pj_strtok(&in_str, &delim, &token, 0), i=0;
+ found_idx != in_str.slen && i < maxtok;
+ ++i, found_idx = pj_strtok(&in_str, &delim, &token,
+ found_idx + token.slen))
{
int n;
- if (!pj_isdigit(*tok))
+ if (!pj_isdigit(*token.ptr))
break;
- n = atoi(tok);
+ n = atoi(token.ptr);
version |= (n << ((3-i)*8));
}
diff --git a/pjlib/src/pj/string.c b/pjlib/src/pj/string.c
index d62b674a..307cfb47 100644
--- a/pjlib/src/pj/string.c
+++ b/pjlib/src/pj/string.c
@@ -28,6 +28,113 @@
# include <pj/string_i.h>
#endif
+PJ_DEF(pj_ssize_t) pj_strspn(const pj_str_t *str, const pj_str_t *set_char)
+{
+ pj_ssize_t i, j, count = 0;
+ for (i = 0; i < str->slen; i++) {
+ if (count != i)
+ break;
+
+ for (j = 0; j < set_char->slen; j++) {
+ if (str->ptr[i] == set_char->ptr[j])
+ count++;
+ }
+ }
+ return count;
+}
+
+
+PJ_DEF(pj_ssize_t) pj_strspn2(const pj_str_t *str, const char *set_char)
+{
+ pj_ssize_t i, j, count = 0;
+ for (i = 0; i < str->slen; i++) {
+ if (count != i)
+ break;
+
+ for (j = 0; set_char[j] != 0; j++) {
+ if (str->ptr[i] == set_char[j])
+ count++;
+ }
+ }
+ return count;
+}
+
+
+PJ_DEF(pj_ssize_t) pj_strcspn(const pj_str_t *str, const pj_str_t *set_char)
+{
+ pj_ssize_t i, j;
+ for (i = 0; i < str->slen; i++) {
+ for (j = 0; j < set_char->slen; j++) {
+ if (str->ptr[i] == set_char->ptr[j])
+ return i;
+ }
+ }
+ return i;
+}
+
+
+PJ_DECL(pj_ssize_t) pj_strcspn2(const pj_str_t *str, const char *set_char)
+{
+ pj_ssize_t i, j;
+ for (i = 0; i < str->slen; i++) {
+ for (j = 0; set_char[j] != 0; j++) {
+ if (str->ptr[i] == set_char[j])
+ return i;
+ }
+ }
+ return i;
+}
+
+
+PJ_DEF(pj_ssize_t) pj_strtok(const pj_str_t *str, const pj_str_t *delim,
+ pj_str_t *tok, pj_size_t start_idx)
+{
+ pj_ssize_t str_idx;
+
+ tok->slen = 0;
+ if ((str->slen == 0) || ((pj_size_t)str->slen < start_idx)) {
+ return str->slen;
+ }
+
+ tok->ptr = str->ptr + start_idx;
+ tok->slen = str->slen - start_idx;
+
+ str_idx = pj_strspn(tok, delim);
+ if (start_idx+str_idx == (pj_size_t)str->slen) {
+ return str->slen;
+ }
+ tok->ptr += str_idx;
+ tok->slen -= str_idx;
+
+ tok->slen = pj_strcspn(tok, delim);
+ return start_idx + str_idx;
+}
+
+
+PJ_DECL(pj_ssize_t) pj_strtok2(const pj_str_t *str, const char *delim,
+ pj_str_t *tok, pj_size_t start_idx)
+{
+ pj_ssize_t str_idx;
+
+ tok->slen = 0;
+ if ((str->slen == 0) || ((pj_size_t)str->slen < start_idx)) {
+ return str->slen;
+ }
+
+ tok->ptr = str->ptr + start_idx;
+ tok->slen = str->slen - start_idx;
+
+ str_idx = pj_strspn2(tok, delim);
+ if (start_idx + str_idx == (pj_size_t)str->slen) {
+ return str->slen;
+ }
+ tok->ptr += str_idx;
+ tok->slen -= str_idx;
+
+ tok->slen = pj_strcspn2(tok, delim);
+ return start_idx + str_idx;
+}
+
PJ_DEF(char*) pj_strstr(const pj_str_t *str, const pj_str_t *substr)
{