nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
diff --git a/src/core/ngx_config_command.c b/src/core/ngx_config_command.c
index e764fef..26cd26b 100644
--- a/src/core/ngx_config_command.c
+++ b/src/core/ngx_config_command.c
@@ -1,6 +1,260 @@
 
 #include <ngx_config.h>
 
+
+#if 0
+
+typedef struct ngx_conf_file_t {
+    ngx_fd_t  fd;
+    char     *name;
+    int       line;
+    char     *pos;
+};
+
+typedef struct ngx_conf_t {
+    char             *name;
+    ngx_array_t      *args;
+
+    ngx_conf_file_t  *file;
+    ngx_log_t        *log;
+
+    void *context;             # ngx_http_conf_t
+};
+
+static int argument_number[] = {
+    NGX_CONF_NOARGS,
+    NGX_CONF_TAKE1,
+    NGX_CONF_TAKE2,
+    NGX_CONF_TAKE3
+};
+
+
+ngx_conf_parse(cf, container, filename)
+{
+    create cf;
+
+    *conatiner(cf);
+
+    if (filename) {
+        open;
+    }
+
+    for ( ;; ) {
+        rc = ngx_conf_read_token(cf);
+
+NGX_OK, NGX_ERROR, NGX_CONF_FILE_DONE, NGX_CONF_BLOCK_DONE
+
+        if (rc != NGX_OK)
+            return rc;
+
+"listen address:port;"
+"location /images/ {"
+
+        cmd = ngx_conf_find_token(cf);
+        if (cmd == NULL) {
+            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
+                          "unknown directive \"%s\" in %s:%d",
+                          cf->name, cf->file->name, cf->file->line);
+            return NGX_ERROR;
+        }
+
+        if (cmd->type == NGX_CONF_CONTAINER) {
+            ngx_conf_parse(cf, cmd->container, NULL);
+
+        } else if (cmd->type == NGX_CONF_FLAG) {
+
+            if (cf->args->nelts != 1) {
+                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
+                              "invalid number of arguments "
+                              "in directive \"%s\" in %s:%d",
+                              cf->name, cf->file->name, cf->file->line);
+                return NGX_ERROR;
+            }
+
+            if (ngx_strcasecmp(cf->args->elts[0], "on") == 0) {
+                flag = 1;
+
+            } else if (ngx_strcasecmp(cf->args->elts[0], "off") == 0) {
+                flag = 0;
+
+            } else {
+                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
+                              "invalid flag in directive \"%s\" in %s:%d",
+                              cf->name, cf->file->name, cf->file->line);
+                return NGX_ERROR;
+            }
+
+            rv = cmd->set(cf, cmd->offset, flag);
+            if (rv) {
+                 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
+                               "%s in directive \"%s\" in %s:%d",
+                               rv, cf->name, cf->file->name, cf->file->line);
+                return NGX_ERROR;
+            }
+
+        } else if (cmd->type & argument_number[args->nelts]) {
+            rv = cmd->set(cf, cmd->offset, cf->args);
+            if (rv) {
+                 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
+                               "%s in directive \"%s\" in %s:%d",
+                               rv, cf->name, cf->file->name, cf->file->line);
+                return NGX_ERROR;
+            }
+
+        } else {
+            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
+                          "invalid number of arguments "
+                          "in directive \"%s\" in %s:%d",
+                          cf->name, cf->file->name, cf->file->line);
+            return NGX_ERROR;
+        }
+    }
+
+    if (filename) {
+        close;
+    }
+}    
+
+int ngx_conf_read_token(ngx_conf_t *cf)
+{
+
+    need_space = 0;
+    last_space = 1;
+    len = 0;
+    quoted = s_quoted = d_quoted = 0;
+
+    cf->args->nelts = 0;
+
+    for (/* void */ ; cf->pos < cf->end; cf->pos++) {
+
+        ch = *cf->pos;
+
+        if (ch == LF)
+            cf->line++;
+
+        if (quoted) {
+            quoted = 0;
+            continue;
+        }
+
+        len++;
+
+        if (ch = '\\') {
+            quoted = 1;
+            continue;
+        }
+
+        if (d_quoted) {
+
+            if (ch == '"') {
+                d_qouted = 0;
+                need_space = 1;
+                last_space = 1;
+                continue;
+            }
+
+        } else if (s_quoted) {
+
+            if (ch == '\'') {
+                s_qouted = 0;
+                need_space = 1;
+                last_space = 1;
+                continue;
+            }
+
+        } else {
+
+            if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) {
+                ngx_test_null(word, ngx_push_array(cf->args), NGX_ERRROR);
+                ngx_test_null(*word, ngx_palloc(cf->temp_pool, len + 1),
+                              NGX_ERROR);
+
+                for (dst = *word, src = cf->start; src < cf->pos; /* void */) {
+                    if (*src == '\\')
+                        src++;
+                    *dst++ = *src++;
+                }
+                *dst = '\0';
+
+                need_space = 0;
+                last_space = 1;
+                continue;
+            }
+
+            if (need_space) {
+                return NGX_ERROR;
+            }
+
+            if (ch == ';')
+                return NGX_OK;
+
+            if (ch == '{')
+                return NGX_OK;
+
+            if (ch == '}')
+                return NGX_BLOCK_DONE;
+
+            if (last_space) {
+                if (ch == '"') {
+                    d_qouted = 1;
+                    continue;
+                }
+
+                if (ch == '\'') {
+                    s_qouted = 1;
+                    continue;
+                }
+            }
+
+            last_space = 0;
+        }
+    }
+}
+
+container
+    server
+    location
+    module
+    if
+
+http_conf current server
+          current location
+
+
+ngx_conf_t *ngx_conf_open(char *filename, ngx_log_t *log)
+{
+    ngx_cf->fd = ngx_open_file(config, NGX_FILE_RDONLY);
+    if (ngx_conf->fd == -1) {
+        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+                      "ngx_conf_open: "
+                      ngx_open_file_n " %s failed", filename);
+
+        return NULL;
+    }
+
+    ngx_conf->name = filename;
+    ngx_conf->log = log;
+    return ngx_conf;
+}
+
+void ngx_conf_close(ngx_conf_t *cf)
+{
+    if (ngx_close_file(cf->fd) == -1) {
+        ngx_log_error(NGX_LOG_ERR, cf->log, ngx_errno,
+                      ngx_close_file_n " %s failed", cf->name);
+    }
+
+    cf->fd = -1;
+}
+
+
+
+
+
+
+#endif
+
+
 char *ngx_conf_set_size_slot(char *conf, int offset, char *value)
 {
     int size;
diff --git a/src/core/ngx_string.h b/src/core/ngx_string.h
index 0a78a06..de9b14b 100644
--- a/src/core/ngx_string.h
+++ b/src/core/ngx_string.h
@@ -5,6 +5,11 @@
 #include <ngx_config.h>
 
 
+typedef struct {
+    int   len;
+    char *data;
+} ngx_str_t;
+
 #if (WIN32)
 
 #define ngx_snprintf              _snprintf
diff --git a/src/core/ngx_table.h b/src/core/ngx_table.h
new file mode 100644
index 0000000..9936648
--- /dev/null
+++ b/src/core/ngx_table.h
@@ -0,0 +1,21 @@
+#ifndef _NGX_TABLE_H_INCLUDED_
+#define _NGX_TABLE_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_string.h>
+#include <ngx_alloc.h>
+#include <ngx_array.h>
+
+typedef ngx_array_t  ngx_table_t;
+
+typedef struct {
+    ngx_str_t  key;
+    ngx_str_t  value;
+} ngx_table_elt_t;
+
+#define ngx_create_table(p, n)  ngx_create_array(p, n, 2 * sizeof(ngx_str_t))
+#define ngx_push_table(t)       ngx_push_array(t)
+
+
+#endif /* _NGX_TABLE_H_INCLUDED_ */