Changeset 2988aec7 in mainline for uspace/app/bithenge/script.c
- Timestamp:
- 2012-08-14T03:17:17Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade
- Children:
- 71b0d4d4
- Parents:
- 1b6b76d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/script.c
r1b6b76d r2988aec7 53 53 * other token uses one of these values: */ 54 54 typedef enum { 55 TOKEN_EQUALS = -128, 56 TOKEN_ERROR, 55 TOKEN_ERROR = -128, 56 57 TOKEN_AND, 58 TOKEN_CONCAT, 59 TOKEN_EQUALS, 57 60 TOKEN_EOF, 58 61 TOKEN_GREATER_THAN_OR_EQUAL, … … 63 66 TOKEN_LESS_THAN_OR_EQUAL, 64 67 TOKEN_NOT_EQUAL, 68 TOKEN_OR, 65 69 66 70 /* Keywords */ … … 308 312 state->buffer_pos++; 309 313 } 314 } else if (ch == '&') { 315 state->token = ch; 316 state->buffer_pos++; 317 if (state->buffer[state->buffer_pos] == '&') { 318 state->token = TOKEN_AND; 319 state->buffer_pos++; 320 } 321 } else if (ch == '|') { 322 state->token = ch; 323 state->buffer_pos++; 324 if (state->buffer[state->buffer_pos] == '|') { 325 state->token = TOKEN_OR; 326 state->buffer_pos++; 327 } 328 } else if (ch == '+') { 329 state->token = ch; 330 state->buffer_pos++; 331 if (state->buffer[state->buffer_pos] == '+') { 332 state->token = TOKEN_CONCAT; 333 state->buffer_pos++; 334 } 310 335 } else { 311 336 state->token = ch; … … 415 440 typedef enum { 416 441 PRECEDENCE_NONE, 442 PRECEDENCE_AND, 417 443 PRECEDENCE_EQUALS, 418 444 PRECEDENCE_COMPARE, … … 446 472 case TOKEN_NOT_EQUAL: 447 473 return BITHENGE_EXPRESSION_NOT_EQUALS; 474 case TOKEN_AND: 475 return BITHENGE_EXPRESSION_AND; 476 case TOKEN_OR: 477 return BITHENGE_EXPRESSION_OR; 478 case TOKEN_CONCAT: 479 return BITHENGE_EXPRESSION_CONCAT; 448 480 default: 449 481 return BITHENGE_EXPRESSION_INVALID_BINARY_OP; … … 455 487 switch (op) { 456 488 case BITHENGE_EXPRESSION_ADD: /* fallthrough */ 457 case BITHENGE_EXPRESSION_SUBTRACT: 489 case BITHENGE_EXPRESSION_SUBTRACT: /* fallthrough */ 490 case BITHENGE_EXPRESSION_CONCAT: 458 491 return PRECEDENCE_ADD; 459 492 case BITHENGE_EXPRESSION_MULTIPLY: /* fallthrough */ … … 469 502 case BITHENGE_EXPRESSION_NOT_EQUALS: 470 503 return PRECEDENCE_EQUALS; 504 case BITHENGE_EXPRESSION_AND: /* fallthrough */ 505 case BITHENGE_EXPRESSION_OR: 506 return PRECEDENCE_AND; 471 507 default: 472 508 assert(false); … … 609 645 } 610 646 611 rc = bithenge_member_expression(&expr, expr, key); 647 bithenge_expression_t *key_expr; 648 rc = bithenge_const_expression(&key_expr, key); 649 if (rc != EOK) { 650 error_errno(state, rc); 651 bithenge_expression_dec_ref(expr); 652 return NULL; 653 } 654 655 rc = bithenge_binary_expression(&expr, 656 BITHENGE_EXPRESSION_MEMBER, expr, key_expr); 612 657 if (rc != EOK) { 613 658 error_errno(state, rc); … … 618 663 bithenge_expression_t *start = parse_expression(state); 619 664 bool absolute_limit = false; 620 if (state->token == ',' ) {621 absolute_limit = false;665 if (state->token == ',' || state->token == ':') { 666 absolute_limit = state->token == ':'; 622 667 next_token(state); 623 } else if (state->token == ':') { 624 absolute_limit = true; 668 bithenge_expression_t *limit = NULL; 669 if (!(state->token == ']' && absolute_limit)) 670 limit = parse_expression(state); 671 expect(state, ']'); 672 673 if (state->error != EOK) { 674 bithenge_expression_dec_ref(expr); 675 bithenge_expression_dec_ref(start); 676 bithenge_expression_dec_ref(limit); 677 return NULL; 678 } 679 rc = bithenge_subblob_expression(&expr, expr, start, 680 limit, absolute_limit); 681 if (rc != EOK) { 682 error_errno(state, rc); 683 return NULL; 684 } 685 } else if (state->token == ']') { 625 686 next_token(state); 687 688 if (state->error != EOK) { 689 bithenge_expression_dec_ref(expr); 690 bithenge_expression_dec_ref(start); 691 return NULL; 692 } 693 rc = bithenge_binary_expression(&expr, 694 BITHENGE_EXPRESSION_MEMBER, expr, start); 695 if (rc != EOK) { 696 error_errno(state, rc); 697 return NULL; 698 } 626 699 } else { 627 syntax_error(state, "expected ',' or ':'"); 628 } 629 bithenge_expression_t *limit = NULL; 630 if (!(state->token == ']' && absolute_limit)) 631 limit = parse_expression(state); 632 expect(state, ']'); 633 634 if (state->error != EOK) { 700 syntax_error(state, "expected ',', ':', or ']'"); 635 701 bithenge_expression_dec_ref(expr); 636 702 bithenge_expression_dec_ref(start); 637 bithenge_expression_dec_ref(limit);638 return NULL;639 }640 rc = bithenge_subblob_expression(&expr, expr, start,641 limit, absolute_limit);642 if (rc != EOK) {643 error_errno(state, rc);644 703 return NULL; 645 704 } … … 1173 1232 } 1174 1233 1234 bithenge_transform_t *barrier = NULL; 1235 if (state->error == EOK) { 1236 int rc = bithenge_new_barrier_transform(&barrier, 1237 state->num_params); 1238 if (rc != EOK) { 1239 barrier = NULL; 1240 error_errno(state, rc); 1241 } 1242 } 1243 1244 add_named_transform(state, barrier, name); 1245 1175 1246 expect(state, '='); 1176 1247 bithenge_transform_t *xform = parse_transform(state); … … 1178 1249 1179 1250 if (state->error == EOK) { 1180 int rc = bithenge_ new_barrier_transform(&xform, xform,1181 state->num_params);1182 if (rc != EOK) {1183 xform = NULL;1184 error_errno(state, rc); 1185 1186 } 1187 1188 add_named_transform(state, xform, name);1251 int rc = bithenge_barrier_transform_set_subtransform(barrier, 1252 xform); 1253 xform = NULL; 1254 if (rc != EOK) 1255 error_errno(state, rc); 1256 } 1257 1258 if (state->error != EOK) 1259 bithenge_transform_dec_ref(xform); 1189 1260 1190 1261 for (int i = 0; i < state->num_params; i++)
Note:
See TracChangeset
for help on using the changeset viewer.