int64_t ndk_atoi64 (u_char *line, size_t n) { int64_t value; if (n == 0ll) { return NGX_ERROR; } for (value = 0ll; n--; line++) { if (*line < '0' || *line > '9') { return NGX_ERROR; } value = value * 10ll + (*line - '0'); } if (value < 0ll) { return NGX_ERROR; } return value; } ngx_int_t ndk_strcntc (ngx_str_t *s, char c) { ngx_int_t n; size_t i; u_char *p; i = s->len; p = s->data; for (n=0; i; i--, p++) { if (*p == (u_char) c) n++; } return n; } ngx_int_t ndk_strccnt (char *s, char c) { ngx_int_t n; n = 0; while (*s != '\0') { if (*s == 'c') n++; s++; } return n; } ngx_array_t * ndk_str_array_create (ngx_pool_t *pool, char **s, ngx_int_t n) { ngx_int_t i; ngx_str_t *str; ngx_array_t *a; a = ngx_array_create (pool, n, sizeof (ngx_str_t)); if (a == NULL) return NULL; for (i=0; idata = (u_char *) *s; str->len = strlen (*s); } return a; } u_char * ndk_vcatstrf (ngx_pool_t *pool, ngx_str_t *dest, const char *fmt, va_list args) { size_t len, l, el; int argc; u_char *p, *m, *e, c, c1, *cp; argc = strlen (fmt); ngx_str_t *s; ndk_estr_t *sp, *sp2, ss [argc]; u_char cs [argc]; sp = sp2 = ss; cp = cs; len = 0; /* TODO : maybe have 'e' at the beginning? */ /* parse format to get strings */ while (*fmt) { switch (*fmt) { case 'S' : s = va_arg (args, ngx_str_t *); sp->data = s->data; sp->len = s->len; sp->escaped = 0; len += sp->len; break; case 's' : sp->data = va_arg (args, u_char *); sp->len = (size_t) ngx_strlen (sp->data); sp->escaped = 0; len += sp->len; break; case 'l' : sp->data = va_arg (args, u_char *); sp->len = (size_t) va_arg (args, int); sp->escaped = 0; len += sp->len; break; case 'L' : sp->data = va_arg (args, u_char *); sp->len = va_arg (args, size_t); sp->escaped = 0; len += sp->len; break; case 'e' : p = va_arg (args, u_char *); sp->data = p; l = 0; el = 0; c = *p; while (c != '\0') { if (c == '\\') { l += 2; p += 2; } else { l++; p++; } el++; c = *p; } sp->len = l; sp->escaped = 1; len += el; break; case 'E' : s = va_arg (args, ngx_str_t *); sp->data = s->data; sp->len = s->len; p = sp->data; el = 0; e = p + sp->len; while (p < e) { c = *p; if (c == '\\') { p += 2; } else { p++; } el++; } sp->escaped = 1; len += el; break; case 'n' : sp->data = va_arg (args, u_char *); sp->len = (size_t) va_arg (args, int); p = sp->data; el = 0; e = p + sp->len; while (p < e) { c = *p; if (c == '\\') { p += 2; } else { p++; } el++; } sp->escaped = 1; len += el; break; case 'c' : *cp = (u_char) va_arg (args, int); sp->data = cp; sp->len = (size_t) 1; len++; cp++; break; default : ndk_log_alert (pool->log, 0, "catstrf () : format [%s] incorrect", fmt); return NULL; } sp++; fmt++; } /* create space for string (assumes no NULL's in strings) */ ndk_palloc_rn (p, pool, len + 1); dest->data = p; dest->len = len; /* copy other strings */ if (len) { while (sp2 < sp) { if (sp2->escaped) { m = sp2->data; e = m + sp2->len; while (m < e) { c = *m; if (c == '\\') { if (m == e - 1) { *p = '\\'; p++; break; } c1 = m[1]; switch (c1) { case 'n' : *p = '\n'; break; case 't' : *p = '\t'; break; case '0' : *p = '\0'; break; case '\\' : *p = '\\'; break; case 's' : *p = ' '; break; case 'b' : *p = '\b'; break; case 'r' : *p = '\r'; break; default : *p = c1; break; } m += 2; } else { *p = c; m++; } p++; } } else { p = ngx_cpymem (p, sp2->data, sp2->len); } sp2++; } } *p = '\0'; return dest->data; } u_char * ndk_catstrf (ngx_pool_t *pool, ngx_str_t *dest, const char *fmt, ...) { u_char *p; va_list args; va_start (args, fmt); p = ndk_vcatstrf (pool, dest, fmt, args); va_end (args); return p; } ngx_int_t ndk_cmpstr (ngx_str_t *s1, ngx_str_t *s2) { ngx_int_t rv; size_t len1, len2; len1 = s1->len; len2 = s2->len; if (len1 == len2) { return ngx_strncmp (s1->data, s2->data, len1); } if (len1 > len2) { rv = ngx_strncmp (s1->data, s2->data, len2); if (rv == 0) return 1; return rv; } rv = ngx_strncmp (s1->data, s2->data, len1); if (rv == 0) return -1; return rv; } u_char * ndk_dupstr (ngx_pool_t *pool, ngx_str_t *dest, ngx_str_t *src) { u_char *d; size_t n; n = src->len; ndk_palloc_rn (d, pool, n + 1); ndk_strncpy (d, src->data, n); dest->data = d; dest->len = n; return d; } /* ngx_keyval_t * ndk_url_args_to_keyval_list (ngx_pool_t *pool, ngx_str_t *str) { ngx_keyval_t *kv; ngx_st } */