/* operand_list */ static int _operand_list(State * state) /* operand [ space ] { "," [ space ] operand [ space ] } */ { int ret; #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif ret = _operand(state); state->call.operands_cnt++; if(_parser_in_set(state, TS_SPACE)) ret |= _space(state); while(_parser_is_code(state, AS_CODE_COMMA)) { /* "," */ ret |= _parser_scan(state); /* [ space ] */ if(_parser_in_set(state, TS_SPACE)) ret |= _space(state); /* operand */ ret |= _operand(state); /* [ space ] */ if(_parser_in_set(state, TS_SPACE)) ret |= _space(state); state->call.operands_cnt++; } return ret; }
int check_plan(void) { int r = 0; if (tests_done[level] != plan_test[level]) { _space(stderr); fprintf(stderr, "# Looks like you planned %d tests but ran %d.\n", plan_test[level], tests_done[level]); r = -1; } if (tests_failed[level]) { _space(stderr); fprintf(stderr, "# Looks like you failed %d test of %d run.\n", tests_failed[level], tests_done[level]); r = tests_failed[level]; } --level; if (level >= 0) { is(r, 0, "subtests"); } return r; }
/* instruction */ static int _instruction(State * state) /* instruction_name [ space [ operand_list ] ] */ { int ret; #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif /* reset the current instruction */ memset(&state->call, 0, sizeof(state->call)); /* instruction_name */ ret = _instruction_name(state); if(!_parser_in_set(state, TS_SPACE)) return ret; /* [ space ] */ ret |= _space(state); /* [ operand_list ] */ if(_parser_in_set(state, TS_OPERAND_LIST)) ret |= _operand_list(state); /* call the current instruction */ if(state->call.name != NULL) { if(asmcode_instruction(state->code, &state->call) != 0) ret |= _parser_error(state, "%s", error_get()); free(state->call.name); } /* FIXME memory leak (register names...) */ memset(&state->call, 0, sizeof(state->call)); return ret; }
/* address */ static int _address(State * state) /* "[" [ space ] [ sign [ space ] ] value [ space ] [ offset [ space ] ] "]" */ { int ret; #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif state->address = 1; /* "[" */ ret = _parser_scan(state); /* [ space ] */ if(_parser_in_set(state, TS_SPACE)) ret |= _space(state); /* [ sign [ space ] ] */ if(_parser_in_set(state, TS_SIGN)) { ret |= _sign(state); if(_parser_in_set(state, TS_SPACE)) ret |= _space(state); } else state->negative = 0; /* value */ if(_parser_in_set(state, TS_VALUE)) ret |= _value(state); else ret |= _parser_error(state, "%s", "Expected value"); /* [ space ] */ if(_parser_in_set(state, TS_SPACE)) ret |= _space(state); /* [ offset [ space ] ] */ if(_parser_in_set(state, TS_OFFSET)) { state->address = 2; ret |= _offset(state); if(_parser_in_set(state, TS_SPACE)) ret |= _space(state); } state->address = 0; /* "]" */ return ret | _parser_check(state, AS_CODE_OPERATOR_RBRACKET); }
void plan(int count) { ++level; plan_test[level] = count; tests_done[level] = 0; tests_failed[level] = 0; _space(stdout); printf("%d..%d\n", 1, plan_test[level]); }
int _ok(int condition, const char *fmt, ...) { va_list ap; _space(stdout); printf("%s %d - ", condition ? "ok" : "not ok", ++tests_done[level]); if (!condition) tests_failed[level]++; va_start(ap, fmt); vprintf(fmt, ap); printf("\n"); return condition; }
/* newline */ static int _newline(State * state) /* [ space ] NEWLINE */ { int ret = 0; #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif /* [ space ] */ if(_parser_in_set(state, TS_SPACE)) ret |= _space(state); /* NEWLINE */ ret |= _parser_check(state, AS_CODE_NEWLINE); return ret; }
/* offset */ static int _offset(State * state) /* sign [ space ] value */ { int ret; #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif /* sign */ ret = _sign(state); /* [ space ] */ if(_parser_in_set(state, TS_SPACE)) ret |= _space(state); /* value */ if(_parser_in_set(state, TS_VALUE)) ret |= _value(state); else ret |= _parser_error(state, "%s", "Expected a value"); return ret; }
/* statement */ static int _statement(State * state) /* ( function | [ space [ instruction ] ] ) newline */ { int ret; #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif if(_parser_in_set(state, TS_FUNCTION)) /* function */ ret = _function(state); else if(_parser_in_set(state, TS_SPACE)) { /* space [ instruction ] */ ret = _space(state); if(_parser_in_set(state, TS_INSTRUCTION)) ret |= _instruction(state); } else if(!_parser_in_set(state, TS_NEWLINE)) return _parser_recover(state, AS_CODE_NEWLINE, "Statement"); ret |= _newline(state); return ret; }