[mod_openssl] remove erroneous SSL_set_shutdown()
[lighttpd.git] / src / mod_ssi_exprparser.y
blob0b18edc141642c250f0002d439731164f746e588
1 %token_prefix TK_
2 %token_type {buffer *}
3 %extra_argument {ssi_ctx_t *ctx}
4 %name ssiexprparser
6 %include {
7 #include "first.h"
8 #include "mod_ssi_expr.h"
9 #include "buffer.h"
11 #include <string.h>
14 %parse_failure {
15 ctx->ok = 0;
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($$); }
24 %left AND.
25 %left OR.
26 %nonassoc EQ NE GT GE LT LE.
27 %right NOT.
29 input ::= exprline(B). {
30 ctx->val.bo = ssi_val_tobool(B);
31 ctx->val.type = SSI_TYPE_BOOL;
33 ssi_val_free(B);
36 exprline(A) ::= expr(B) cond(C) expr(D). {
37 int cmp;
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);
46 A = B;
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;
57 A->type = SSI_TYPE_BOOL;
59 ssi_val_free(D);
61 exprline(A) ::= expr(B). {
62 A = B;
64 expr(A) ::= expr(B) AND expr(C). {
65 int e;
67 e = ssi_val_tobool(B) && ssi_val_tobool(C);
69 A = B;
70 A->bo = e;
71 A->type = SSI_TYPE_BOOL;
72 ssi_val_free(C);
75 expr(A) ::= expr(B) OR expr(C). {
76 int e;
78 e = ssi_val_tobool(B) || ssi_val_tobool(C);
80 A = B;
81 A->bo = e;
82 A->type = SSI_TYPE_BOOL;
83 ssi_val_free(C);
86 expr(A) ::= NOT expr(B). {
87 int e;
89 e = !ssi_val_tobool(B);
91 A = B;
92 A->bo = e;
93 A->type = SSI_TYPE_BOOL;
95 expr(A) ::= LPARAN exprline(B) RPARAN. {
96 A = B;
99 expr(A) ::= value(B). {
100 A = ssi_val_init();
101 A->str = B;
102 A->type = SSI_TYPE_STRING;
105 value(A) ::= VALUE(B). {
106 A = B;
109 value(A) ::= value(B) VALUE(C). {
110 A = B;
111 buffer_append_string_buffer(A, C);
112 buffer_free(C);
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; }