📄 mod_include.c
字号:
} /* Percolate upwards */ if (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_ERR, 0, r, "Invalid expression \"%s\" in file %s", expr, r->filename); *was_error = 1; return retval; } } 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 memcpy(&debug[debug_pos], " Token: eq/ne/ge/gt/le/lt\n", sizeof(" Token: eq/ne/ge/gt/le/lt\n")); debug_pos += sizeof(" Token: eq/ne/ge/gt/le/lt\n");#endif if (current == (struct parse_node *) NULL) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Invalid expression \"%s\" in file %s", expr, r->filename); *was_error = 1; return retval; } /* Percolate upwards */ while (current != (struct parse_node *) NULL) { switch (current->token.type) { case token_string: case token_re: 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_ERR, 0, r, "Invalid expression \"%s\" in file %s", expr, r->filename); *was_error = 1; return retval; } 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; new->left->parent = new; current->right = new; new->parent = current; } current = new; break; case token_rbrace:#ifdef DEBUG_INCLUDE memcpy (&debug[debug_pos], " Token: rbrace\n", sizeof (" Token: rbrace\n")); debug_pos += sizeof (" Token: rbrace\n");#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_ERR, 0, r, "Unmatched ')' in \"%s\" in file %s", expr, r->filename); *was_error = 1; return retval; } break; case token_lbrace:#ifdef DEBUG_INCLUDE memcpy (&debug[debug_pos], " Token: lbrace\n", sizeof (" Token: lbrace\n")); debug_pos += sizeof (" Token: lbrace\n");#endif if (current == (struct parse_node *) NULL) { root = current = new; break; } /* Percolate upwards */ if (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_re: case token_group: default: ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Invalid expression \"%s\" in file %s", expr, r->filename); *was_error = 1; return retval; } } 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 memcpy (&debug[debug_pos], " Evaluate string\n", sizeof (" Evaluate string\n")); debug_pos += sizeof (" Evaluate string\n");#endif buffer = ap_ssi_parse_string(r, ctx, current->token.value, NULL, MAX_STRING_LEN, 0); current->token.value = buffer; current->value = (current->token.value[0] != '\0'); current->done = 1; current = current->parent; break; case token_re: ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "No operator before regex of expr \"%s\" in file %s", expr, r->filename); *was_error = 1; return retval; case token_and: case token_or:#ifdef DEBUG_INCLUDE memcpy(&debug[debug_pos], " Evaluate and/or\n", sizeof(" Evaluate and/or\n")); debug_pos += sizeof(" Evaluate and/or\n");#endif if (current->left == (struct parse_node *) NULL || current->right == (struct parse_node *) NULL) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Invalid expression \"%s\" in file %s", expr, r->filename); *was_error = 1; return retval; } if (!current->left->done) { switch (current->left->token.type) { case token_string: buffer = ap_ssi_parse_string(r, ctx, current->left->token.value, NULL, MAX_STRING_LEN, 0); current->left->token.value = buffer; 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: buffer = ap_ssi_parse_string(r, ctx, current->right->token.value, NULL, MAX_STRING_LEN, 0); current->right->token.value = buffer; current->right->value = (current->right->token.value[0] != '\0'); current->right->done = 1; break; default: current = current->right; continue; } }#ifdef DEBUG_INCLUDE debug_pos += sprintf (&debug[debug_pos], " Left: %c\n", current->left->value ? '1' : '0'); debug_pos += sprintf (&debug[debug_pos], " Right: %c\n", current->right->value ? '1' : '0');#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 debug_pos += sprintf (&debug[debug_pos], " Returning %c\n", current->value ? '1' : '0');#endif current->done = 1; current = current->parent; break; case token_eq: case token_ne:#ifdef DEBUG_INCLUDE memcpy (&debug[debug_pos], " Evaluate eq/ne\n", sizeof (" Evaluate eq/ne\n")); debug_pos += sizeof (" Evaluate eq/ne\n");#endif if ((current->left == (struct parse_node *) NULL) || (current->right == (struct parse_node *) NULL) || (current->left->token.type != token_string) || ((current->right->token.type != token_string) && (current->right->token.type != token_re))) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Invalid expression \"%s\" in file %s", expr, r->filename); *was_error = 1; return retval; } buffer = ap_ssi_parse_string(r, ctx, current->left->token.value, NULL, MAX_STRING_LEN, 0); current->left->token.value = buffer; buffer = ap_ssi_parse_string(r, ctx, current->right->token.value, NULL, MAX_STRING_LEN, 0); current->right->token.value = buffer; if (current->right->token.type == token_re) {#ifdef DEBUG_INCLUDE debug_pos += sprintf (&debug[debug_pos], " Re Compare (%s) with /%s/\n", current->left->token.value, current->right->token.value);#endif current->value = re_check(r, ctx, current->left->token.value, current->right->token.value); } else {#ifdef DEBUG_INCLUDE debug_pos += sprintf (&debug[debug_pos], " Compare (%s) with (%s)\n", current->left->token.value, current->right->token.value);#endif current->value = (strcmp(current->left->token.value, current->right->token.value) == 0); } if (current->token.type == token_ne) { current->value = !current->value; }#ifdef DEBUG_INCLUDE debug_pos += sprintf (&debug[debug_pos], " Returning %c\n", current->value ? '1' : '0');#endif current->done = 1; current = current->parent; break; case token_ge: case token_gt: case token_le: case token_lt:#ifdef DEBUG_INCLUDE memcpy (&debug[debug_pos], " Evaluate ge/gt/le/lt\n", sizeof (" Evaluate ge/gt/le/lt\n")); debug_pos += sizeof (" Evaluate ge/gt/le/lt\n");#endif if ((current->left == (struct parse_node *) NULL) || (current->right == (struct parse_node *) NULL) || (current->left->token.type != token_string) || (current->right->token.type != token_string)) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Invalid expression \"%s\" in file %s", expr, r->filename); *was_error = 1; return retval; } buffer = ap_ssi_parse_string(r, ctx, current->left->token.value, NULL, MAX_STRING_LEN, 0); current->left->token.value = buffer; buffer = ap_ssi_parse_string(r, ctx, current->right->token.value, NULL, MAX_STRING_LEN, 0); current->right->token.value = buffer;#ifdef DEBUG_INCLUDE debug_pos += sprintf (&debug[debug_pos], " Compare (%s) with (%s)\n", current->left->token.value, current->right->token.value);#endif current->value = strcmp(current->left->token.value, current->right->token.value); if (current->token.type == token_ge) { current->value = current->value >= 0; } else if (current->token.type == token_gt) { current->value = current->value > 0; } else if (current->token.type == token_le) { current->value = current->value <= 0; } else if (current->token.type == token_lt) { current->value = current->value < 0; } else { current->value = 0; /* Don't return -1 if unknown token */ }#ifdef DEBUG_INCLUDE debug_pos += sprintf (&debug[debug_pos], " Returning %c\n", current->value ? '1' : '0');#endif current->done = 1; current = current->parent; break; case token_not: if (current->right != (struct parse_node *) NULL) { if (!current->right->done) { current = current->right; continue; } current->value = !current
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -