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

    +1

    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
    // https://github.com/layerfsd/WorkPlatForm/blob/f14a8cdd2bc3772ea4bd37a0381f5f8305a0a2c2/Common/BuilDefine.h
    
    // source file build_defs.h
    
    #ifndef BUILD_DEFS_H
    
    #define BUILD_DEFS_H
    
    #define VERSION_MAJOR 1
    // Example of __DATE__ string: "Jul 27 2012"
    //                              01234567890
    
    #define BUILD_YEAR_CH0 (__DATE__[ 7])
    #define BUILD_YEAR_CH1 (__DATE__[ 8])
    #define BUILD_YEAR_CH2 (__DATE__[ 9])
    #define BUILD_YEAR_CH3 (__DATE__[10])
    
    
    #define BUILD_MONTH_IS_JAN (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n')
    #define BUILD_MONTH_IS_FEB (__DATE__[0] == 'F')
    #define BUILD_MONTH_IS_MAR (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r')
    #define BUILD_MONTH_IS_APR (__DATE__[0] == 'A' && __DATE__[1] == 'p')
    #define BUILD_MONTH_IS_MAY (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y')
    #define BUILD_MONTH_IS_JUN (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n')
    #define BUILD_MONTH_IS_JUL (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l')
    #define BUILD_MONTH_IS_AUG (__DATE__[0] == 'A' && __DATE__[1] == 'u')
    #define BUILD_MONTH_IS_SEP (__DATE__[0] == 'S')
    #define BUILD_MONTH_IS_OCT (__DATE__[0] == 'O')
    #define BUILD_MONTH_IS_NOV (__DATE__[0] == 'N')
    #define BUILD_MONTH_IS_DEC (__DATE__[0] == 'D')
    
    
    #define BUILD_MONTH_CH0 \
    	((BUILD_MONTH_IS_OCT || BUILD_MONTH_IS_NOV || BUILD_MONTH_IS_DEC) ? '1' : '0')
    
    #define BUILD_MONTH_CH1 \
    	( \
    	(BUILD_MONTH_IS_JAN) ? '1' : \
    	(BUILD_MONTH_IS_FEB) ? '2' : \
    	(BUILD_MONTH_IS_MAR) ? '3' : \
    	(BUILD_MONTH_IS_APR) ? '4' : \
    	(BUILD_MONTH_IS_MAY) ? '5' : \
    	(BUILD_MONTH_IS_JUN) ? '6' : \
    	(BUILD_MONTH_IS_JUL) ? '7' : \
    	(BUILD_MONTH_IS_AUG) ? '8' : \
    	(BUILD_MONTH_IS_SEP) ? '9' : \
    	(BUILD_MONTH_IS_OCT) ? '0' : \
    	(BUILD_MONTH_IS_NOV) ? '1' : \
    	(BUILD_MONTH_IS_DEC) ? '2' : \
    	/* error default */    '?' \
    	)
    
    #define BUILD_DAY_CH0 ((__DATE__[4] >= '0') ? (__DATE__[4]) : '0')
    #define BUILD_DAY_CH1 (__DATE__[ 5])
    
    
    #define BUILD_HOUR_CH0 (__TIME__[0])
    #define BUILD_HOUR_CH1 (__TIME__[1])
    
    #define BUILD_MIN_CH0 (__TIME__[3])
    #define BUILD_MIN_CH1 (__TIME__[4])
    
    #define BUILD_SEC_CH0 (__TIME__[6])
    #define BUILD_SEC_CH1 (__TIME__[7])
    
    
    #if VERSION_MAJOR > 100
    
    #define VERSION_MAJOR_INIT \
    	((VERSION_MAJOR / 100) + '0'), \
    	(((VERSION_MAJOR % 100) / 10) + '0'), \
    	((VERSION_MAJOR % 10) + '0')
    
    #elif VERSION_MAJOR > 10
    
    #define VERSION_MAJOR_INIT \
    	((VERSION_MAJOR / 10) + '0'), \
    	((VERSION_MAJOR % 10) + '0')
    
    #else
    
    #define VERSION_MAJOR_INIT \
    	(VERSION_MAJOR + '0')
    
    #endif
    
    
    #endif // BUILD_DEFS_H

    Генерация даты через разковыривание макроса __DATE__

    Запостил: j123123, 03 Сентября 2021

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

    • Такая срань для генерации даты достаточно распространена
      https://github.com/luqmanhakimpens/air-quality-monsys/blob/7e2e47b7576d129c39dbb19d526db27178ece467/src/esp_build_defs.h


      const char build_date[] =
      {
          BUILD_YEAR_CH2,
      	BUILD_YEAR_CH3,
      
          BUILD_MONTH_CH0,
      	BUILD_MONTH_CH1,
      
          BUILD_DAY_CH0,
      	BUILD_DAY_CH1,
          '-',
          BUILD_HOUR_CH0,
      	BUILD_HOUR_CH1,
      
          BUILD_MIN_CH0,
      	BUILD_MIN_CH1,
      	'\0'
      };


      А в крестоговне можно без макросов, в constexpr-функцию скармливать __DATE__ и там ее парсить.
      Ответить
    • какой пиздец)) Это чтобы красиво дату компиялции написать?
      А нельзя как-то посчитать системой сборки и передать?
      Ответить
      • Зачем мне система сборки, у меня нет времени, чтобы ебаться с ней, лучше напишу скопипащу макроговна.
        Ответить
        • А что еще можете сделать в компайлтайме макросами?
          Можете заставить крестошаблонщиков плакать от зависти?
          Ответить
    • А _DATE_ может быть другой в другой строчке? Как _LINE_
      Ответить
      • Может быть другой в другом TU, потому что раздельная компиляция. В теории precompiled headers могут поднасрать тоже.
        Ответить
    • Да пошли они няхуй, воспроизводимые билды няканные.
      Ответить
      • Сразу видно гентушника)
        Ответить
        • Поклонение вприсядку на воспроизводимые билды — это в Nix.
          Ответить
    • > Example of __DATE__ string: "Jul 27 2012"

      Формат всегда одинаковый?
      Ответить
      • 6.10.8 Predefined macro names
        The following macro names shall be defined by the implementation:
        __DATE__ The date of translation of the preprocessing translation unit: a character string literal of the form "Mmm dd yyyy", where the names of the months are the same as those generated by the asctime function, and the first character of dd is a space character if the value is less than 10. If the date of translation is not available, an implementation-defined valid date shall be supplied.
        ---
        The asctime function converts the broken-down time in the structure pointed to by timeptr into a string in the form
        Sun Sep 16 01:03:52 1973\n\0
        using the equivalent of the following algorithm.
        char *asctime(const struct tm *timeptr)
        {
        static const char wday_name[7][3] = {
        "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
        };
        static const char mon_name[12][3] = {
        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
        };
        static char result[26];
        sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
        wday_name[timeptr->tm_wday],
        mon_name[timeptr->tm_mon],
        timeptr->tm_mday, timeptr->tm_hour,
        timeptr->tm_min, timeptr->tm_sec,
        1900 + timeptr->tm_year);
        return result;
        }
        Ответить
    • // Example of __DATE__ string: "Jul 27 2012"
      А потом какой-нибудь модный и стильный компилятор передаст ему "Сен 03 2021". Получится месяц номер "0?".
      Ответить
    • Вспомнил кстати вот такое чудо
      https://babbage.cs.qc.cuny.edu/courses/cs701/Handouts/rcs_keywords.html

      Во времена CVS было очень часто
      Ответить
      • Помню, во времена $RCS$ и $CVS$ шапки всех исходников были засраны такими $словами$.
        Ответить

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