Changeset 600f5d1 in mainline for uspace/app/bithenge/script.c


Ignore:
Timestamp:
2012-06-27T20:10:30Z (12 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
02dcb20
Parents:
978ccaf1
Message:

Bithenge: add composition, ascii, and zero_terminated

File:
1 edited

Legend:

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

    r978ccaf1 r600f5d1  
    177177                return;
    178178        } else if (isalpha(ch)) {
    179                 while (isalnum(state->buffer[state->buffer_pos]))
     179                while (isalnum(state->buffer[state->buffer_pos])
     180                    || state->buffer[state->buffer_pos] == '_')
    180181                        state->buffer_pos++;
    181182                char *value = str_ndup(state->buffer + state->old_buffer_pos,
     
    308309        expect(state, '{');
    309310        while (state->error == EOK && state->token != '}') {
    310                 expect(state, '.');
    311                 subxforms[num].name = expect_identifier(state);
    312                 expect(state, TOKEN_LEFT_ARROW);
     311                if (state->token == '.') {
     312                        expect(state, '.');
     313                        subxforms[num].name = expect_identifier(state);
     314                        expect(state, TOKEN_LEFT_ARROW);
     315                } else {
     316                        subxforms[num].name = NULL;
     317                        expect(state, TOKEN_LEFT_ARROW);
     318                }
    313319                subxforms[num].transform = parse_transform(state);
    314320                expect(state, ';');
     
    339345}
    340346
    341 /** Parse a transform.
     347/** Parse a transform without composition.
    342348 * @return The parsed transform, or NULL if an error occurred. */
    343 static bithenge_transform_t *parse_transform(state_t *state)
     349static bithenge_transform_t *parse_transform_no_compose(state_t *state)
    344350{
    345351        if (state->token == TOKEN_IDENTIFIER) {
     
    356362                return NULL;
    357363        }
     364}
     365
     366/** Parse a transform.
     367 * @return The parsed transform, or NULL if an error occurred. */
     368static bithenge_transform_t *parse_transform(state_t *state)
     369{
     370        bithenge_transform_t *result = parse_transform_no_compose(state);
     371        bithenge_transform_t **xforms = NULL;
     372        size_t num = 1;
     373        while (state->token == TOKEN_LEFT_ARROW) {
     374                expect(state, TOKEN_LEFT_ARROW);
     375                xforms = state_realloc(state, xforms,
     376                    (num + 1) * sizeof(*xforms));
     377                if (state->error != EOK)
     378                        break;
     379                xforms[num] = parse_transform_no_compose(state);
     380                num++;
     381        }
     382        if (state->error != EOK) {
     383                while (xforms && num--)
     384                        bithenge_transform_dec_ref(xforms[num]);
     385                free(xforms);
     386                bithenge_transform_dec_ref(result);
     387                return NULL;
     388        }
     389        if (xforms) {
     390                xforms[0] = result;
     391                int rc = bithenge_new_composed_transform(&result, xforms, num);
     392                if (rc != EOK) {
     393                        error_errno(state, rc);
     394                        return NULL;
     395                }
     396        }
     397        return result;
    358398}
    359399
Note: See TracChangeset for help on using the changeset viewer.