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


Ignore:
Timestamp:
2012-07-28T21:25:49Z (12 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
84e8a70
Parents:
32eb01b
Message:

Bithenge: add expressions that use the current node being created

File:
1 edited

Legend:

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

    r32eb01b rf85ca3f  
    119119}
    120120
    121 /** Note that an error has occurred. */
     121/** Note that an error has occurred if error is not EOK. */
    122122static void error_errno(state_t *state, int error)
    123123{
    124124        // Don't overwrite a previous error.
    125         if (state->error == EOK) {
     125        if (state->error == EOK && error != EOK) {
    126126                done_with_token(state);
    127127                state->token = TOKEN_ERROR;
     
    220220                int rc = bithenge_parse_int(state->buffer +
    221221                    state->old_buffer_pos, &state->token_int);
    222                 if (rc != EOK)
    223                         error_errno(state, rc);
     222                error_errno(state, rc);
    224223        } else if (ch == '<') {
    225224                state->token = ch;
     
    368367
    369368                next_token(state);
     369
     370                return expr;
     371        } else if (state->token == '.') {
     372                next_token(state);
     373
     374                const char *id = expect_identifier(state);
     375                bithenge_node_t *key = NULL;
     376                bithenge_expression_t *expr = NULL;
     377                int rc = bithenge_current_node_expression(&expr);
     378                error_errno(state, rc);
     379
     380                if (state->error == EOK) {
     381                        rc = bithenge_new_string_node(&key, id, true);
     382                        id = NULL;
     383                        error_errno(state, rc);
     384                }
     385
     386                if (state->error == EOK) {
     387                        rc = bithenge_member_expression(&expr, expr, key);
     388                        key = NULL;
     389                        if (rc != EOK)
     390                                expr = NULL;
     391                        error_errno(state, rc);
     392                }
     393
     394                if (state->error != EOK) {
     395                        free((char *)id);
     396                        bithenge_node_dec_ref(key);
     397                        bithenge_expression_dec_ref(expr);
     398                        return NULL;
     399                }
    370400
    371401                return expr;
     
    588618        done_with_token(state);
    589619        state->token = TOKEN_ERROR;
    590         fclose(state->file);
     620        if (state->file)
     621                fclose(state->file);
    591622        transform_list_t *entry = state->transform_list;
    592623        while (entry) {
Note: See TracChangeset for help on using the changeset viewer.