1. Си / Говнокод #14263

    +135

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    Структура для хранения данных:
    typedef struct rs_script_t {
        int status; // on/off
        int next_stage;
        int next_time;
    } rs_script_t;
    
    Макросы:
    
    #define SEQ(scr1,t)    \
        const int scr_zero = __COUNTER__;   \
        rs_script_t *scr = scr1; \
        if ( (scr->status) && (t > scr->next_time) ) {  \
            switch(scr->next_stage) {    \
        
    #define END_SEQ } };             
    
    
    #define SEQ_FIRST \
            case 0: \
                    scr->next_stage = scr_zero;
                    
    
    #define SEQ_DT(dt) \
                    scr->next_stage = __COUNTER__ + 1;   \
                    scr->next_time += dt;  \
                    break;  \
                case __COUNTER__:   \
                
    #define SEQ_DT_TAGGED(dt,tag) \
                    scr->next_stage = __COUNTER__ + 1; \
                    scr->next_time += dt;    \
                    break; \
                case __COUNTER__:    \
                case (100000+tag):   \
    
    #define SEQ_LAST_DEFAULT    \
                    scr->status = 0; \
                    break;  \
                    \
                default:    \
                    DEBUG10f(":: ERROR, unknown stage position: %d \n", scr->next_stage);    \
                    break;
    
    #define SEQ_GOTO(dt,tag) \
                    scr->next_stage = 100000+tag; \
                    scr->next_time += dt; \
                    break;
                    
    #define SEQ_GOTO_INSTANT(tag) \
                    scr->next_stage = 100000+tag; \
                    break;
    
    Пользоваться примерно так:
    void process() { // вызывать каждый кадр
    
        SEQ(&scrtest, rs_app.app_time)
                
            SEQ_FIRST
                printf("Ноль\n");
                
            SEQ_DT(1000)
                printf("Один\n");
                
            SEQ_DT(1000)
                printf("Два\n");
                
            SEQ_DT_TAGGED(1000, 555)
                printf("Три (метка №555) \n");
                
            SEQ_DT(1000)
                printf("Четыре\n");
                
            SEQ_DT(1000)
                printf("Пять\n");
                
            SEQ_DT(1000)
                printf("Шесть, повторяем с метки №555, если нажат Шифт\n");
                if (rs_keyboard_is_key_down(RS_KEY_SHIFT_L)) {
                    SEQ_GOTO(1000, 555);
                };
                printf("Завершаем. \n");
                
            SEQ_LAST_DEFAULT     
            
        END_SEQ;
    
    };

    Страдания по yield

    Запостил: TarasB, 23 Декабря 2013

    Комментарии (5) RSS

    • Кстати похоже на protothread\protosockets.
      ---
      Собственно да, посмотрел исходник, они также сделаны - либо на switch, либо на gcc-изме "labels as values".
      Ответить
    • BEGIN_MESSAGE_MAP()
      Ответить
    • Вопреки парадигме пишут. В крестах бы тоже не помешало. Только не в таком виде конечно, так как с деструкторами не совместимо.

      Во время коммунизма, значит прислали в одно далекое сибирское рабочее поселение бензопилу "дружба".
      Берут значит, хмурые сибирские сишники, и подсовывают пиле тоненький прутик.
      - Бзык! - сказала пила, и перепилила прутик.
      - Хмм! - сказали хмурые сибирские сишники и подсунули прутик потолще.
      - Бжжзык! - сказала пила, и перепилила прутик потолще.
      - Хмм! - сказали хмурые сибирские сишники и подсунули целое бревно.
      - Бзззззз! - сказала пила, и перепилила бревно.
      - Хмм! - сказали хмурые сибирские сишники и подсунули толстый стальной прут.
      - Бзззззз---жжж--хряк! - сказала пила, и поломалась.
      - То-то! - сказали хмурые сибирские сишники.
      Ответить
      • Я тоже расскажу.
        Монашка-настоятельница женского монастыря собрала монашек и упавшим голосом объявила: Мы прогневали господа, вчера наш монастырь посетил мужской дух!..
        (Все монашки хором)
        -О господи, за что ты посылаешь нам такие испытания!
        (Один голос)
        -Ахахах!...
        Монашка продолжает:
        -Вчера в саду я обнаружила использованный презерватив!
        (Все монашки хором)
        -О господи, за что ты посылаешь нам такие испытания!
        (Один голос)
        -Ахахах!...
        -Но есть и хорошая новость: в презервативе обнаружена дырка!
        (Все монашки хором)
        -Ахахах!!!
        (Один голос)
        --О господи, за что ты посылаешь мне такие испытания!..
        Ответить
    • vanished
      Ответить

    Добавить комментарий