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>