1160 return 0; |
1160 return 0; |
1161 } |
1161 } |
1162 } |
1162 } |
1163 // RULE: "(", LogicalExpression, ")" |
1163 // RULE: "(", LogicalExpression, ")" |
1164 else if (token_is(token, DAVQL_TOKEN_OPENP)) { |
1164 else if (token_is(token, DAVQL_TOKEN_OPENP)) { |
1165 token = token->next; |
1165 int consumed = dav_parse_logical_expr(stmt, token->next, expr); |
1166 |
1166 if (consumed) { |
1167 int consumed = dav_parse_logical_expr(stmt, token, expr); |
1167 token = ucx_list_get(token->next, consumed); |
1168 if (stmt->errorcode) { |
1168 |
1169 return 0; |
1169 if (token_is(token, DAVQL_TOKEN_CLOSEP)) { |
1170 } |
1170 token = token->next; |
1171 if (!consumed) { |
1171 return consumed + 2; |
1172 dav_error_in_context(DAVQL_ERROR_MISSING_EXPR, |
1172 } else { |
1173 _error_missing_expr, stmt, token); |
1173 dav_error_in_context(DAVQL_ERROR_MISSING_PAR, _error_missing_par, |
1174 return 0; |
1174 stmt, token); |
1175 } |
1175 return 0; |
1176 |
1176 } |
1177 token = ucx_list_get(token, consumed); |
|
1178 |
|
1179 if (token_is(token, DAVQL_TOKEN_CLOSEP)) { |
|
1180 token = token->next; |
|
1181 return consumed + 2; |
|
1182 } else { |
1177 } else { |
1183 dav_error_in_context(DAVQL_ERROR_MISSING_PAR, _error_missing_par, |
1178 // don't handle errors here, we can also try a boolean primary |
1184 stmt, token); |
1179 stmt->errorcode = 0; |
1185 return 0; |
1180 if (stmt->errormessage) { |
1186 } |
1181 free(stmt->errormessage); |
1187 } |
1182 } |
|
1183 } |
|
1184 } |
|
1185 |
1188 // RULE: BooleanPrimary |
1186 // RULE: BooleanPrimary |
1189 else { |
1187 return dav_parse_bool_prim(stmt, token, expr); |
1190 return dav_parse_bool_prim(stmt, token, expr); |
|
1191 } |
|
1192 } |
1188 } |
1193 |
1189 |
1194 static int dav_parse_logical_expr(DavQLStatement *stmt, UcxList *token, |
1190 static int dav_parse_logical_expr(DavQLStatement *stmt, UcxList *token, |
1195 DavQLExpression *expr) { |
1191 DavQLExpression *expr) { |
1196 |
1192 |