⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod_include.c

📁 apache简化版
💻 C
📖 第 1 页 / 共 5 页
字号:
                break;            case '&':                if (*(string + 1) == '&') {                    goto TOKEN_DONE;                }                break;            case '<':                goto TOKEN_DONE;            case '>':                goto TOKEN_DONE;            }            token->value[next++] = ch;        }        else {            if (ch == '\'') {                qs = 0;                ++string;                goto TOKEN_DONE;            }            token->value[next++] = ch;        }    }  TOKEN_DONE:    /* If qs is still set, I have an unmatched ' */    if (qs) {        ap_rputs("\nUnmatched '\n", r);        next = 0;    }    token->value[next] = '\0';    return (string);}/* * Hey I still know that goto's are BAD.  I don't think that I've ever * used two in the same project, let alone the same file before.  But, * I absolutely want to make sure that I clean up the memory in all * cases.  And, without rewriting this completely, the easiest way * is to just branch to the return code which cleans it up. *//* there is an implicit assumption here that expr is at most MAX_STRING_LEN-1 * characters long... */static int parse_expr(request_rec *r, const char *expr, const char *error){    struct parse_node {        struct parse_node *left, *right, *parent;        struct token token;        int value, done;    }         *root, *current, *new;    const char *parse;    char buffer[MAX_STRING_LEN];    pool *expr_pool;    int retval = 0;    if ((parse = expr) == (char *) NULL) {        return (0);    }    root = current = (struct parse_node *) NULL;    expr_pool = ap_make_sub_pool(r->pool);    /* Create Parse Tree */    while (1) {        new = (struct parse_node *) ap_palloc(expr_pool,                                           sizeof(struct parse_node));        new->parent = new->left = new->right = (struct parse_node *) NULL;        new->done = 0;        if ((parse = get_ptoken(r, parse, &new->token)) == (char *) NULL) {            break;        }        switch (new->token.type) {        case token_string:#ifdef DEBUG_INCLUDE            ap_rvputs(r, "     Token: string (", new->token.value, ")\n", NULL);#endif            if (current == (struct parse_node *) NULL) {                root = current = new;                break;            }            switch (current->token.type) {            case token_string:                if (current->token.value[0] != '\0') {                    strncat(current->token.value, " ",                         sizeof(current->token.value)			    - strlen(current->token.value) - 1);                }                strncat(current->token.value, new->token.value,                         sizeof(current->token.value)			    - strlen(current->token.value) - 1);		current->token.value[sizeof(current->token.value) - 1] = '\0';                break;            case token_eq:            case token_ne:            case token_and:            case token_or:            case token_lbrace:            case token_not:            case token_ge:            case token_gt:            case token_le:            case token_lt:                new->parent = current;                current = current->right = new;                break;            default:                ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,                            "Invalid expression \"%s\" in file %s",                            expr, r->filename);                ap_rputs(error, r);                goto RETURN;            }            break;        case token_and:        case token_or:#ifdef DEBUG_INCLUDE            ap_rputs("     Token: and/or\n", r);#endif            if (current == (struct parse_node *) NULL) {                ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,                            "Invalid expression \"%s\" in file %s",                            expr, r->filename);                ap_rputs(error, r);                goto RETURN;            }            /* Percolate upwards */            while (current != (struct parse_node *) NULL) {                switch (current->token.type) {                case token_string:                case token_group:                case token_not:                case token_eq:                case token_ne:                case token_and:                case token_or:                case token_ge:                case token_gt:                case token_le:                case token_lt:                    current = current->parent;                    continue;                case token_lbrace:                    break;                default:                    ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,                                "Invalid expression \"%s\" in file %s",                                expr, r->filename);                    ap_rputs(error, r);                    goto RETURN;                }                break;            }            if (current == (struct parse_node *) NULL) {                new->left = root;                new->left->parent = new;                new->parent = (struct parse_node *) NULL;                root = new;            }            else {                new->left = current->right;                current->right = new;                new->parent = current;            }            current = new;            break;        case token_not:#ifdef DEBUG_INCLUDE            ap_rputs("     Token: not\n", r);#endif            if (current == (struct parse_node *) NULL) {                root = current = new;                break;            }            /* Percolate upwards */            while (current != (struct parse_node *) NULL) {                switch (current->token.type) {                case token_not:                case token_eq:                case token_ne:                case token_and:                case token_or:                case token_lbrace:                case token_ge:                case token_gt:                case token_le:                case token_lt:                    break;                default:                    ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,                                "Invalid expression \"%s\" in file %s",                                expr, r->filename);                    ap_rputs(error, r);                    goto RETURN;                }                break;            }            if (current == (struct parse_node *) NULL) {                new->left = root;                new->left->parent = new;                new->parent = (struct parse_node *) NULL;                root = new;            }            else {                new->left = current->right;                current->right = new;                new->parent = current;            }            current = new;            break;        case token_eq:        case token_ne:        case token_ge:        case token_gt:        case token_le:        case token_lt:#ifdef DEBUG_INCLUDE            ap_rputs("     Token: eq/ne/ge/gt/le/lt\n", r);#endif            if (current == (struct parse_node *) NULL) {                ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,                            "Invalid expression \"%s\" in file %s",                            expr, r->filename);                ap_rputs(error, r);                goto RETURN;            }            /* Percolate upwards */            while (current != (struct parse_node *) NULL) {                switch (current->token.type) {                case token_string:                case token_group:                    current = current->parent;                    continue;                case token_lbrace:                case token_and:                case token_or:                    break;                case token_not:                case token_eq:                case token_ne:                case token_ge:                case token_gt:                case token_le:                case token_lt:                default:                    ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,                                "Invalid expression \"%s\" in file %s",                                expr, r->filename);                    ap_rputs(error, r);                    goto RETURN;                }                break;            }            if (current == (struct parse_node *) NULL) {                new->left = root;                new->left->parent = new;                new->parent = (struct parse_node *) NULL;                root = new;            }            else {                new->left = current->right;                current->right = new;                new->parent = current;            }            current = new;            break;        case token_rbrace:#ifdef DEBUG_INCLUDE            ap_rputs("     Token: rbrace\n", r);#endif            while (current != (struct parse_node *) NULL) {                if (current->token.type == token_lbrace) {                    current->token.type = token_group;                    break;                }                current = current->parent;            }            if (current == (struct parse_node *) NULL) {                ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,                            "Unmatched ')' in \"%s\" in file %s",			    expr, r->filename);                ap_rputs(error, r);                goto RETURN;            }            break;        case token_lbrace:#ifdef DEBUG_INCLUDE            ap_rputs("     Token: lbrace\n", r);#endif            if (current == (struct parse_node *) NULL) {                root = current = new;                break;            }            /* Percolate upwards */            while (current != (struct parse_node *) NULL) {                switch (current->token.type) {                case token_not:                case token_eq:                case token_ne:                case token_and:                case token_or:                case token_lbrace:                case token_ge:                case token_gt:                case token_le:                case token_lt:                    break;                case token_string:                case token_group:                default:                    ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,                                "Invalid expression \"%s\" in file %s",                                expr, r->filename);                    ap_rputs(error, r);                    goto RETURN;                }                break;            }            if (current == (struct parse_node *) NULL) {                new->left = root;                new->left->parent = new;                new->parent = (struct parse_node *) NULL;                root = new;            }            else {                new->left = current->right;                current->right = new;                new->parent = current;            }            current = new;            break;        default:            break;        }    }    /* Evaluate Parse Tree */    current = root;    while (current != (struct parse_node *) NULL) {        switch (current->token.type) {        case token_string:#ifdef DEBUG_INCLUDE            ap_rputs("     Evaluate string\n", r);#endif            parse_string(r, current->token.value, buffer, sizeof(buffer), 0);	    ap_cpystrn(current->token.value, buffer, sizeof(current->token.value));            current->value = (current->token.value[0] != '\0');            current->done = 1;            current = current->parent;            break;        case token_and:        case token_or:#ifdef DEBUG_INCLUDE            ap_rputs("     Evaluate and/or\n", r);#endif            if (current->left == (struct parse_node *) NULL ||                current->right == (struct parse_node *) NULL) {                ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,                            "Invalid expression \"%s\" in file %s",                            expr, r->filename);                ap_rputs(error, r);                goto RETURN;            }            if (!current->left->done) {                switch (current->left->token.type) {                case token_string:                    parse_string(r, current->left->token.value,                                 buffer, sizeof(buffer), 0);                    ap_cpystrn(current->left->token.value, buffer,                            sizeof(current->left->token.value));		    current->left->value = (current->left->token.value[0] != '\0');                    current->left->done = 1;                    break;                default:                    current = current->left;                    continue;                }            }            if (!current->right->done) {                switch (current->right->token.type) {                case token_string:                    parse_string(r, current->right->token.value,                                 buffer, sizeof(buffer), 0);                    ap_cpystrn(current->right->token.value, buffer,                            sizeof(current->right->token.value));		    current->right->value = (current->right->token.value[0] != '\0');                    current->right->done = 1;                    break;                default:                    current = current->right;                    continue;                }            }#ifdef DEBUG_INCLUDE            ap_rvputs(r, "     Left: ", current->left->value ? "1" : "0",                   "\n", NULL);            ap_rvputs(r, "     Right: ", current->right->value ? "1" : "0",                   "\n", NULL);#endif            if (current->token.type == token_and) {                current->value = current->left->value && current->right->value;            }            else {                current->value = current->left->value || current->right->value;            }#ifdef DEBUG_INCLUDE            ap_rvputs(r, "     Returning ", current->value ? "1" : "0",                   "\n", NULL);#endif            current->done = 1;            current = current->parent;            break;        case token_eq:        case token_ne:#ifdef DEBUG_INCLUDE            ap_rputs("     Evaluate eq/ne\n", r);#endif            if ((current->left == (struct parse_node *) NULL) ||                (current->right == (struct parse_node *) NULL) ||                (current->left->token.type != token_string) ||

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -