Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 0caaaa00 in mainline


Ignore:
Timestamp:
2012-08-03T21:03:27Z (9 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master
Children:
e3f2765
Parents:
ee7cc3c
Message:

Bithenge: add repeat(count) syntax

Location:
uspace
Files:
2 added
2 edited

Legend:

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

    ree7cc3c r0caaaa00  
    6262        TOKEN_FALSE,
    6363        TOKEN_IF,
     64        TOKEN_REPEAT,
    6465        TOKEN_STRUCT,
    6566        TOKEN_SWITCH,
     
    218219                } else if (!str_cmp(value, "if")) {
    219220                        state->token = TOKEN_IF;
     221                        free(value);
     222                } else if (!str_cmp(value, "repeat")) {
     223                        state->token = TOKEN_REPEAT;
    220224                        free(value);
    221225                } else if (!str_cmp(value, "struct")) {
     
    654658}
    655659
     660static bithenge_transform_t *parse_repeat(state_t *state)
     661{
     662        expect(state, TOKEN_REPEAT);
     663        expect(state, '(');
     664        bithenge_expression_t *expr = parse_expression(state);
     665        expect(state, ')');
     666        expect(state, '{');
     667        bithenge_transform_t *xform = parse_transform(state);
     668        expect(state, '}');
     669
     670        if (state->error != EOK) {
     671                bithenge_expression_dec_ref(expr);
     672                bithenge_transform_dec_ref(xform);
     673                return NULL;
     674        }
     675
     676        bithenge_transform_t *repeat_xform;
     677        int rc = bithenge_repeat_transform(&repeat_xform, xform, expr);
     678        if (rc != EOK) {
     679                error_errno(state, rc);
     680                return NULL;
     681        }
     682        return repeat_xform;
     683}
     684
    656685/* The TOKEN_STRUCT and '{' must already have been skipped. */
    657686static bithenge_transform_t *parse_struct(state_t *state)
     
    712741        } else if (state->token == TOKEN_IF) {
    713742                return parse_if(state, false);
     743        } else if (state->token == TOKEN_REPEAT) {
     744                return parse_repeat(state);
    714745        } else if (state->token == TOKEN_STRUCT) {
    715746                next_token(state);
  • uspace/app/bithenge/sequence.c

    ree7cc3c r0caaaa00  
    695695        node->xform = self->xform;
    696696        node->count = count;
     697        node->prefix = prefix;
    697698        *out = repeat_as_node(node);
    698699        return EOK;
Note: See TracChangeset for help on using the changeset viewer.