Пример #1
0
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);
}
Пример #2
0
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);    
}
Пример #3
0
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();
}
Пример #4
0
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;
}
Пример #5
0
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;
}