diff src/core/ngx_regex.c @ 0:f0b350454894 NGINX_0_1_0

nginx 0.1.0 *) The first public version.
author Igor Sysoev <http://sysoev.ru>
date Mon, 04 Oct 2004 00:00:00 +0400
parents
children 46833bd150cb
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/src/core/ngx_regex.c
@@ -0,0 +1,125 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+static void *ngx_regex_malloc(size_t size);
+static void ngx_regex_free(void *p);
+
+
+static ngx_pool_t  *ngx_pcre_pool;
+
+
+void ngx_regex_init()
+{
+    pcre_malloc = ngx_regex_malloc;
+    pcre_free = ngx_regex_free;
+}
+
+
+ngx_regex_t *ngx_regex_compile(ngx_str_t *pattern, ngx_int_t options,
+                               ngx_pool_t *pool, ngx_str_t *err)
+{
+    int              erroff;
+    const char      *errstr;
+    ngx_regex_t     *re;
+#if (NGX_THREADS)
+    ngx_core_tls_t  *tls;
+
+#if (NGX_SUPPRESS_WARN)
+    tls = NULL;
+#endif
+
+    if (ngx_threaded) {
+        tls = ngx_thread_get_tls(ngx_core_tls_key);
+        tls->pool = pool;
+    } else {
+        ngx_pcre_pool = pool;
+    }
+
+#else
+
+    ngx_pcre_pool = pool;
+
+#endif
+
+    re = pcre_compile((const char *) pattern->data, (int) options,
+                      &errstr, &erroff, NULL);
+
+    if (re == NULL) {
+       if ((size_t) erroff == pattern->len) {
+           ngx_snprintf((char *) err->data, err->len - 1,
+                        "pcre_compile() failed: %s in \"%s\"",
+                        errstr, pattern->data);
+        } else {
+           ngx_snprintf((char *) err->data, err->len - 1,
+                        "pcre_compile() failed: %s in \"%s\" at \"%s\"",
+                        errstr, pattern->data, pattern->data + erroff);
+        }
+    }
+
+    /* ensure that there is no current pool */
+
+#if (NGX_THREADS)
+    if (ngx_threaded) {
+        tls->pool = NULL;
+    } else {
+        ngx_pcre_pool = NULL;
+    }
+#else
+    ngx_pcre_pool = NULL;
+#endif
+
+    return re;
+}
+
+
+ngx_int_t ngx_regex_exec(ngx_regex_t *re, ngx_str_t *s,
+                         int *matches, ngx_int_t size)
+{
+    int  rc;
+
+    rc = pcre_exec(re, NULL, (const char *) s->data, s->len, 0, 0,
+                   matches, size);
+
+    if (rc == -1) {
+        return NGX_DECLINED;
+    }
+
+    return rc;
+}
+
+
+static void *ngx_regex_malloc(size_t size)
+{
+    ngx_pool_t      *pool;
+#if (NGX_THREADS)
+    ngx_core_tls_t  *tls;
+
+    if (ngx_threaded) {
+        tls = ngx_thread_get_tls(ngx_core_tls_key);
+        pool = tls->pool;
+    } else {
+        pool = ngx_pcre_pool;
+    }
+#else
+    pool = ngx_pcre_pool;
+#endif
+
+    if (pool) {
+        return ngx_palloc(pool, size);
+    }
+
+    return NULL;
+}
+
+
+static void ngx_regex_free(void *p)
+{
+    return;
+}