Annotation of embedaddon/lighttpd/src/mod_ssi_exprparser.y, revision 1.1.1.2

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>