Changeset c3437d9 in mainline for uspace/app/bithenge/script.c


Ignore:
Timestamp:
2012-08-04T03:51:15Z (13 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0ce0103
Parents:
e3f2765
Message:

Bithenge: add do{}while() transforms

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bithenge/script.c

    re3f2765 rc3437d9  
    5959
    6060        /* Keywords */
     61        TOKEN_DO,
    6162        TOKEN_ELSE,
    6263        TOKEN_FALSE,
     
    6768        TOKEN_TRANSFORM,
    6869        TOKEN_TRUE,
     70        TOKEN_WHILE,
    6971} token_type_t;
    7072
     
    211213                if (!value) {
    212214                        error_errno(state, ENOMEM);
     215                } else if (!str_cmp(value, "do")) {
     216                        state->token = TOKEN_DO;
     217                        free(value);
    213218                } else if (!str_cmp(value, "else")) {
    214219                        state->token = TOKEN_ELSE;
     
    234239                } else if (!str_cmp(value, "true")) {
    235240                        state->token = TOKEN_TRUE;
     241                        free(value);
     242                } else if (!str_cmp(value, "while")) {
     243                        state->token = TOKEN_WHILE;
    236244                        free(value);
    237245                } else {
     
    686694}
    687695
     696static bithenge_transform_t *parse_do_while(state_t *state)
     697{
     698        expect(state, TOKEN_DO);
     699        expect(state, '{');
     700        bithenge_transform_t *xform = parse_transform(state);
     701        expect(state, '}');
     702        expect(state, TOKEN_WHILE);
     703        expect(state, '(');
     704        bithenge_expression_t *expr = parse_expression(state);
     705        expect(state, ')');
     706
     707        if (state->error != EOK) {
     708                bithenge_expression_dec_ref(expr);
     709                bithenge_transform_dec_ref(xform);
     710                return NULL;
     711        }
     712
     713        bithenge_transform_t *do_while_xform;
     714        int rc = bithenge_do_while_transform(&do_while_xform, xform, expr);
     715        if (rc != EOK) {
     716                error_errno(state, rc);
     717                return NULL;
     718        }
     719        return do_while_xform;
     720}
     721
    688722/* The TOKEN_STRUCT and '{' must already have been skipped. */
    689723static bithenge_transform_t *parse_struct(state_t *state)
     
    740774static bithenge_transform_t *parse_transform_no_compose(state_t *state)
    741775{
    742         if (state->token == TOKEN_IDENTIFIER) {
     776        if (state->token == TOKEN_DO) {
     777                return parse_do_while(state);
     778        } else if (state->token == TOKEN_IDENTIFIER) {
    743779                return parse_invocation(state);
    744780        } else if (state->token == TOKEN_IF) {
Note: See TracChangeset for help on using the changeset viewer.