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

    +137

    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
    #define SPLICE(a,b) SPLICE_1(a,b)
    #define SPLICE_1(a,b) SPLICE_2(a,b)
    #define SPLICE_2(a,b) a##b
     
     
    #define PP_ARG_N( \
              _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, _10, \
             _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
             _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
             _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
             _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
             _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
             _61, _62, _63, N, ...) N
     
    /* Note 63 is removed */
    #define PP_RSEQ_N()                                        \
             62, 61, 60,                                       \
             59, 58, 57, 56, 55, 54, 53, 52, 51, 50,           \
             49, 48, 47, 46, 45, 44, 43, 42, 41, 40,           \
             39, 38, 37, 36, 35, 34, 33, 32, 31, 30,           \
             29, 28, 27, 26, 25, 24, 23, 22, 21, 20,           \
             19, 18, 17, 16, 15, 14, 13, 12, 11, 10,           \
              9,  8,  7,  6,  5,  4,  3,  2,  1,  0
     
    #define PP_NARG_(...)    PP_ARG_N(__VA_ARGS__)    
     
    /* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
    #define PP_NARG(...)     PP_NARG_(_, ##__VA_ARGS__, PP_RSEQ_N())
     
    #define NARG(...)     func(PP_NARG(__VA_ARGS__), __VA_ARGS__)
     
    #define INCR 20
     
    #define FIELD_0(...)
     
    #define FIELD_1(field, ...) \
      INCR+field
     
    #define FIELD_2(field, ...) \
      INCR+field, FIELD_1(__VA_ARGS__)
     
    #define FIELD_3(field, ...) \
      INCR+field, FIELD_2(__VA_ARGS__)
     
    #define FIELD_4(field, ...) \
      INCR+field, FIELD_3(__VA_ARGS__)
     
    #define FIELD_5(field, ...) \
      INCR+field, FIELD_4(__VA_ARGS__)
     
    #define FIELD_5(field, ...) \
      INCR+field, FIELD_4(__VA_ARGS__)
     
    #define FIELD_6(field, ...) \
      INCR+field, FIELD_5(__VA_ARGS__)
     
    #define FIELD_7(field, ...) \
      INCR+field, FIELD_6(__VA_ARGS__)
     
    #define FIELD_8(field, ...) \
      INCR+field, FIELD_7(__VA_ARGS__)
     
    #define FIELD_9(field, ...) \
      INCR+field, FIELD_8(__VA_ARGS__)
     
    #define FIELD_10(field, ...) \
      INCR+field, FIELD_9(__VA_ARGS__)
     
    #define FIELD_11(field, ...) \
      INCR+field, FIELD_10(__VA_ARGS__)
    //..... дальше лень ...
     
    #define FIELDS_(N, ...) \
      SPLICE(FIELD_, N)(__VA_ARGS__)
     
    #define FIELDS(...) \
      FIELDS_(PP_NARG(__VA_ARGS__), __VA_ARGS__)
     
     
    a = { FIELDS('p', 'a', 's', 's', 'w', 'o', 'r', 'd') }

    Примитивное компил-тайм шифрование строки через сишный препроцессор. На выходе получаем

    a = { 20 +'p', 20 +'a', 20 +'s', 20 +'s', 20 +'w', 20 +'o', 20 +'r', 20 +'d' };

    Базируется на http://smackerelofopinion.blogspot.com/2011/10/determining-number-of-arguments-in-c.html

    j123123, 06 Февраля 2014

    Комментарии (18)
  2. Си / Говнокод #14379

    +132

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    rc = system
       (
       "test "
       "`ls -1 $WORKDIR/somedir/ | wc -l` = 1"
       " -a "
       "`ls -1 $WORKDIR/somedir/*/somefiles.* | wc -l` = 1"
       );
    ASSERTM( rc != -1, "check for number of <dirs>" );
    ASSERTM( rc == 0, "number of <some> files is greater than 1" );

    по мотивам http://govnokod.ru/14374

    из теста. да, можно было на С написать. да, мне было просто лень.

    Dummy00001, 17 Января 2014

    Комментарии (100)
  3. Си / Говнокод #14366

    +139

    1. 1
    #include "intel_glamor.h"

    Строка из драйвера видеокарты X11: intel_driver.c.
    Гламур спасёт мир.

    laMer007, 15 Января 2014

    Комментарии (131)
  4. Си / Говнокод #14266

    +136

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    int file_exist (char *filename)
    {
        char s[200];
        sprintf(s, "test -e %s", filename);
        if (system(s) == 0){
            return 1;
        }else{
            return 0;
        }
    }

    http://stackoverflow.com/questions/3828192/checking-if-a-directory-exists-in-unix-system-call

    rat4, 23 Декабря 2013

    Комментарии (295)
  5. Си / Говнокод #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)
  6. Си / Говнокод #14256

    +143

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    string=(char*)malloc(N);
     k=fread(string,sizeof(char),N,f);
     while (k==N)
     {
     free(string);
     N=N*2;
     rewind(f);//возращает в начало файла
     string =(char*)malloc(N);
     k=fread(string,sizeof(char),N,f);
     }
     fclose (f);

    Сегодня зачоты ставил...
    студенты читают из файла. В буфер. Я придираюсь к тому, что размер файла может быть больше размера буфера....

    Исправили...

    klavdiev, 22 Декабря 2013

    Комментарии (106)
  7. Си / Говнокод #14248

    +143

    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
    const int index64[64] = {
        0,  1, 48,  2, 57, 49, 28,  3,
       61, 58, 50, 42, 38, 29, 17,  4,
       62, 55, 59, 36, 53, 51, 43, 22,
       45, 39, 33, 30, 24, 18, 12,  5,
       63, 47, 56, 27, 60, 41, 37, 16,
       54, 35, 52, 21, 44, 32, 23, 11,
       46, 26, 40, 15, 34, 20, 31, 10,
       25, 14, 19,  9, 13,  8,  7,  6
    };
     
    /**
     * bitScanForward
     * @author Martin Läuter (1997)
     *         Charles E. Leiserson
     *         Harald Prokop
     *         Keith H. Randall
     * "Using de Bruijn Sequences to Index a 1 in a Computer Word"
     * @param bb bitboard to scan
     * @precondition bb != 0
     * @return index (0..63) of least significant one bit
     */
    int bitScanForward(U64 bb) {
       assert (bb != 0);
       return index64[((bb & -bb) * 0x03f79d71b4cb0a89) >> 58];
    }

    нашёл на кывте

    TarasB, 19 Декабря 2013

    Комментарии (96)
  8. Си / Говнокод #14236

    +141

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    if (connfailed) {
    			KSOCKET_CALLBACK(so, disconnected, error);
    		} else {
    			KSOCKET_CALLBACK(so, connectfailed, error);
    		}

    https://github.com/joyent/illumos-joyent/blob/master/usr/src/uts/common/fs/sockfs/socknotify.c

    myaut, 17 Декабря 2013

    Комментарии (8)
  9. Си / Говнокод #14224

    +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
    void permutate(int a[10], int n) {
        // God bless mr. Donald E. Knuth;
        // Tons of oil to English bell ringers!
    
        // WARNING: It's dangerous to go alone, take this^H read this shit
        int c[10], o[10], j, s, q;
        for (j = 1; j <= n; j++) {
            c[j] = 0;
            o[j] = 1;
        }
        while (1) {
            check(a, n);
            j = n;
            s = 0;
            while (1) {
                do {
                    q = c[j] + o[j];
                    if (q < 0) { o[j] = -o[j]; --j; }
                } while (q < 0);
                if (q == j) {
                    if (j == 1) return; else ++s;
                    o[j] = -o[j];
                    --j;
                    continue;
                }
                int t = a[j - c[j] + s];
                a[j - c[j] + s] = a[j - q + s];
                a[j - q + s] = t;
                c[j] = q;
                break;
            }
        }
    }

    Реализация алгоратма "простых изменений" по описанию из Кнута (т4. Комбинаторный поиск, генерация всех перестановок).
    Напрашивающиеся goto раздражают, было бы приятно увидеть менее пахучие реализации. Не смог нагуглить, забугорного названия этого алгоритма не знаю, а про "простые изменения" тинай вики молчит.

    vistefan, 13 Декабря 2013

    Комментарии (95)
  10. Си / Говнокод #14174

    +139

    1. 1
    2. 2
    byteL = (length & (0x00ff));
    byteH = (length - byteL)>>BITS_IN_BYTE;

    Вдруг биты справа полезут прямо из компьютера, давайте вычтем!
    Макрос BITS_IN_BYTE особенно радует!

    sermp, 04 Декабря 2013

    Комментарии (19)