void deal_tmp(sqstack *operator, sqstack *operand, char ch) { int op1, op2; while ( convert_operator(ch) <= convert_operator((char)top_stack(operator)) ) { op2 = pop_stack(operand); op1 = pop_stack(operand); switch ( (char)pop_stack(operator) ) { case '+' : printf("push data: %d + %d\n", op1, op2); push_stack(operand, op1 + op2); break; case '-' : printf("push data: %d - %d\n", op1, op2); push_stack(operand, op1 - op2); break; case '*' : printf("push data: %d * %d\n", op1, op2); push_stack(operand, op1 * op2); break; case '/' : printf("push data: %d / %d\n", op1, op2); push_stack(operand, op1 / op2); break; } if ( empty_stack(operator) || ((char)pop_stack(operator) == '(') ) { break; } } push_stack(operator, (int)ch); }
void deal_bracket(sqstack *operator, sqstack *operand) { int op1, op2; while ( (char)top_stack(operator) != '(' ) { op2 = pop_stack(operand); op1 = pop_stack(operand); switch ( (char)pop_stack(operator) ) { case '+' : printf("push data: %d + %d\n", op1, op2); push_stack(operand, op1 + op2); break; case '-' : printf("push data: %d - %d\n", op1, op2); push_stack(operand, op1 - op2); break; case '*' : printf("push data: %d * %d\n", op1, op2); push_stack(operand, op1 * op2); break; case '/' : printf("push data: %d / %d\n", op1, op2); push_stack(operand, op1 / op2); break; } } pop_stack(operator); }
NEON_API void application_next_state(unsigned int state) { if (state > states_num) { LOG_ERROR("State(%d) out of range", state); exit(EXIT_FAILURE); } push_stack(states_stack, &allstates[state]); ((APP_STATE*)top_stack(states_stack))->on_init(); frame_flush(); }
NEON_API int application_exec(const char *title, APP_STATE *states, size_t states_n) { allstates = states; states_num = states_n; if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { LOG_ERROR("%s\n", SDL_GetError()); return EXIT_FAILURE; } atexit(SDL_Quit); if (TTF_Init() < 0) { LOG_ERROR("%s\n", TTF_GetError()); return EXIT_FAILURE; } atexit(TTF_Quit); if ((states_stack = new_stack(sizeof(APP_STATE), states_n + 1)) == NULL) { LOG_ERROR("%s\n", "Can\'t create game states stack"); return EXIT_FAILURE; } LOG("%s launched...\n", title); LOG("Platform: %s\n", SDL_GetPlatform()); video_init(title); audio_init(); atexit(application_cleanup); application_next_state(0); if (is_stack_empty(states_stack)) { LOG_CRITICAL("%s\n", "No game states"); exit(EXIT_FAILURE); } SDL_Event event; Uint64 current = 0; Uint64 last = 0; float accumulator = 0.0f; while(running) { frame_begin(); while(SDL_PollEvent(&event)) { ((APP_STATE*)top_stack(states_stack))->on_event(&event); } asset_process(); resources_process(); last = current; current = SDL_GetPerformanceCounter(); Uint64 freq = SDL_GetPerformanceFrequency(); float delta = (double)(current - last) / (double)freq; accumulator += CLAMP(delta, 0.f, 0.2f); while(accumulator >= TIMESTEP) { accumulator -= TIMESTEP; ((APP_STATE*)top_stack(states_stack))->on_update(TIMESTEP); } ((APP_STATE*)top_stack(states_stack))->on_present(screen.width, screen.height, accumulator / TIMESTEP); video_swap_buffers(); frame_end(); SDL_Delay(1); } return EXIT_SUCCESS; }
int main() { char expression[30],*p; sqstack *operator, *operand; int sum, flag = 0; int op1, op2; operator = (sqstack *)malloc(sizeof(sqstack)); setnull(operator); operand = (sqstack *)malloc(sizeof(sqstack)); setnull(operand); gets(expression); p = expression; while ( *p ) { if ( (*p >= '0') && (*p <= '9') ) { p++; continue; } switch ( *p ) { case '+' : case '-' : case '*' : case '/' : case ' ' : case '(' : case ')' : break; default : printf("Wrong Character %c in expression!\n", *p); return -1; } p++; } p = expression; while ( *p ) { if ( (*p >= '0') && (*p <= '9') ) { if ( flag ) { sum = 10*sum + (*p - '0'); } else { sum = *p - '0'; flag = 1; } p++; continue; } if ( flag ) { printf("push data %d\n", sum); push_stack(operand, sum); flag = 0; } if ( *p == ' ' ) { p++; continue; } if ( empty_stack( operator ) ) { printf("push %c\n", *p); push_stack(operator, (int)*p); p++; continue; } if ( *p == ')' ) { printf("*** Wow, we meet ) ***\n"); deal_bracket(operator, operand); p++; continue; } if ( (convert_operator(*p) > convert_operator((char)top_stack(operator))) || ((char)top_stack(operator) == '(') ) { printf("push %c\n", *p); push_stack(operator, (int)*p); } else { deal_tmp(operator, operand, *p); } p++; } if ( flag ) push_stack(operand, sum); while ( !empty_stack(operator) ) { op2 = pop_stack(operand); op1 = pop_stack(operand); switch ( (char)pop_stack(operator) ) { case '+' : printf("push data: %d + %d\n", op1, op2); push_stack(operand, op1 + op2); break; case '-' : printf("push data: %d - %d\n", op1, op2); push_stack(operand, op1 - op2); case '*' : printf("push data: %d * %d\n", op1, op2); push_stack(operand, op1 * op2); break; case '/' : printf("push data: %d / %d\n", op1, op2); push_stack(operand, op1 / op2); break; } } printf("%d\n", pop_stack(operand)); return 0; }