Annotation of embedaddon/lighttpd/src/mod_ssi_exprparser.y, revision 1.1
1.1 ! misho 1: %token_prefix TK_
! 2: %token_type {buffer *}
! 3: %extra_argument {ssi_ctx_t *ctx}
! 4: %name ssiexprparser
! 5:
! 6: %include {
! 7: #include "mod_ssi_expr.h"
! 8: #include "buffer.h"
! 9:
! 10: #include <assert.h>
! 11: #include <string.h>
! 12: }
! 13:
! 14: %parse_failure {
! 15: ctx->ok = 0;
! 16: }
! 17:
! 18: %type expr { ssi_val_t * }
! 19: %type value { buffer * }
! 20: %type exprline { ssi_val_t * }
! 21: %type cond { int }
! 22: %token_destructor { buffer_free($$); }
! 23:
! 24: %left AND.
! 25: %left OR.
! 26: %nonassoc EQ NE GT GE LT LE.
! 27: %right NOT.
! 28:
! 29: input ::= exprline(B). {
! 30: ctx->val.bo = ssi_val_tobool(B);
! 31: ctx->val.type = SSI_TYPE_BOOL;
! 32:
! 33: ssi_val_free(B);
! 34: }
! 35:
! 36: exprline(A) ::= expr(B) cond(C) expr(D). {
! 37: int cmp;
! 38:
! 39: if (B->type == SSI_TYPE_STRING &&
! 40: D->type == SSI_TYPE_STRING) {
! 41: cmp = strcmp(B->str->ptr, D->str->ptr);
! 42: } else {
! 43: cmp = ssi_val_tobool(B) - ssi_val_tobool(D);
! 44: }
! 45:
! 46: A = B;
! 47:
! 48: switch(C) {
! 49: case SSI_COND_EQ: A->bo = (cmp == 0) ? 1 : 0; break;
! 50: case SSI_COND_NE: A->bo = (cmp != 0) ? 1 : 0; break;
! 51: case SSI_COND_GE: A->bo = (cmp >= 0) ? 1 : 0; break;
! 52: case SSI_COND_GT: A->bo = (cmp > 0) ? 1 : 0; break;
! 53: case SSI_COND_LE: A->bo = (cmp <= 0) ? 1 : 0; break;
! 54: case SSI_COND_LT: A->bo = (cmp < 0) ? 1 : 0; break;
! 55: }
! 56:
! 57: A->type = SSI_TYPE_BOOL;
! 58:
! 59: ssi_val_free(D);
! 60: }
! 61: exprline(A) ::= expr(B). {
! 62: A = B;
! 63: }
! 64: expr(A) ::= expr(B) AND expr(C). {
! 65: int e;
! 66:
! 67: e = ssi_val_tobool(B) && ssi_val_tobool(C);
! 68:
! 69: A = B;
! 70: A->bo = e;
! 71: A->type = SSI_TYPE_BOOL;
! 72: ssi_val_free(C);
! 73: }
! 74:
! 75: expr(A) ::= expr(B) OR expr(C). {
! 76: int e;
! 77:
! 78: e = ssi_val_tobool(B) || ssi_val_tobool(C);
! 79:
! 80: A = B;
! 81: A->bo = e;
! 82: A->type = SSI_TYPE_BOOL;
! 83: ssi_val_free(C);
! 84: }
! 85:
! 86: expr(A) ::= NOT expr(B). {
! 87: int e;
! 88:
! 89: e = !ssi_val_tobool(B);
! 90:
! 91: A = B;
! 92: A->bo = e;
! 93: A->type = SSI_TYPE_BOOL;
! 94: }
! 95: expr(A) ::= LPARAN exprline(B) RPARAN. {
! 96: A = B;
! 97: }
! 98:
! 99: expr(A) ::= value(B). {
! 100: A = ssi_val_init();
! 101: A->str = B;
! 102: A->type = SSI_TYPE_STRING;
! 103: }
! 104:
! 105: value(A) ::= VALUE(B). {
! 106: A = B;
! 107: }
! 108:
! 109: value(A) ::= value(B) VALUE(C). {
! 110: A = B;
! 111: buffer_append_string_buffer(A, C);
! 112: buffer_free(C);
! 113: }
! 114:
! 115: cond(A) ::= EQ. { A = SSI_COND_EQ; }
! 116: cond(A) ::= NE. { A = SSI_COND_NE; }
! 117: cond(A) ::= LE. { A = SSI_COND_LE; }
! 118: cond(A) ::= GE. { A = SSI_COND_GE; }
! 119: cond(A) ::= LT. { A = SSI_COND_LT; }
! 120: cond(A) ::= GT. { A = SSI_COND_GT; }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>