File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / lighttpd / src / mod_ssi_exprparser.y
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Oct 14 10:32:48 2013 UTC (10 years, 8 months ago) by misho
Branches: lighttpd, MAIN
CVS tags: v1_4_35p0, v1_4_35, v1_4_33, HEAD
1.4.33

    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>