1. C++ / Говнокод #27810

    0

    1. 001
    2. 002
    3. 003
    4. 004
    5. 005
    6. 006
    7. 007
    8. 008
    9. 009
    10. 010
    11. 011
    12. 012
    13. 013
    14. 014
    15. 015
    16. 016
    17. 017
    18. 018
    19. 019
    20. 020
    21. 021
    22. 022
    23. 023
    24. 024
    25. 025
    26. 026
    27. 027
    28. 028
    29. 029
    30. 030
    31. 031
    32. 032
    33. 033
    34. 034
    35. 035
    36. 036
    37. 037
    38. 038
    39. 039
    40. 040
    41. 041
    42. 042
    43. 043
    44. 044
    45. 045
    46. 046
    47. 047
    48. 048
    49. 049
    50. 050
    51. 051
    52. 052
    53. 053
    54. 054
    55. 055
    56. 056
    57. 057
    58. 058
    59. 059
    60. 060
    61. 061
    62. 062
    63. 063
    64. 064
    65. 065
    66. 066
    67. 067
    68. 068
    69. 069
    70. 070
    71. 071
    72. 072
    73. 073
    74. 074
    75. 075
    76. 076
    77. 077
    78. 078
    79. 079
    80. 080
    81. 081
    82. 082
    83. 083
    84. 084
    85. 085
    86. 086
    87. 087
    88. 088
    89. 089
    90. 090
    91. 091
    92. 092
    93. 093
    94. 094
    95. 095
    96. 096
    97. 097
    98. 098
    99. 099
    100. 100
    // https://github.com/gcc-mirror/gcc/blob/b0c83d59f44bf677c8d74acae228acf32719acb3/libstdc%2B%2B-v3/include/bits/regex_compiler.tcc#L446
      template<typename _TraitsT>
      template<bool __icase, bool __collate>
        bool
        _Compiler<_TraitsT>::
        _M_expression_term(pair<bool, _CharT>& __last_char,
    		       _BracketMatcher<_TraitsT, __icase, __collate>& __matcher)
        {
          if (_M_match_token(_ScannerT::_S_token_bracket_end))
    	return false;
    
          const auto __push_char = [&](_CharT __ch)
          {
    	if (__last_char.first)
    	  __matcher._M_add_char(__last_char.second);
    	else
    	  __last_char.first = true;
    	__last_char.second = __ch;
          };
          const auto __flush = [&]
          {
    	if (__last_char.first)
    	  {
    	    __matcher._M_add_char(__last_char.second);
    	    __last_char.first = false;
    	  }
          };
    
          if (_M_match_token(_ScannerT::_S_token_collsymbol))
    	{
    	  auto __symbol = __matcher._M_add_collate_element(_M_value);
    	  if (__symbol.size() == 1)
    	    __push_char(__symbol[0]);
    	  else
    	    __flush();
    	}
          else if (_M_match_token(_ScannerT::_S_token_equiv_class_name))
    	{
    	  __flush();
    	  __matcher._M_add_equivalence_class(_M_value);
    	}
          else if (_M_match_token(_ScannerT::_S_token_char_class_name))
    	{
    	  __flush();
    	  __matcher._M_add_character_class(_M_value, false);
    	}
          else if (_M_try_char())
    	__push_char(_M_value[0]);
          // POSIX doesn't allow '-' as a start-range char (say [a-z--0]),
          // except when the '-' is the first or last character in the bracket
          // expression ([--0]). ECMAScript treats all '-' after a range as a
          // normal character. Also see above, where _M_expression_term gets called.
          //
          // As a result, POSIX rejects [-----], but ECMAScript doesn't.
          // Boost (1.57.0) always uses POSIX style even in its ECMAScript syntax.
          // Clang (3.5) always uses ECMAScript style even in its POSIX syntax.
          //
          // It turns out that no one reads BNFs ;)
          else if (_M_match_token(_ScannerT::_S_token_bracket_dash))
    	{
    	  if (!__last_char.first)
    	    {
    	      if (!(_M_flags & regex_constants::ECMAScript))
    		{
    		  if (_M_match_token(_ScannerT::_S_token_bracket_end))
    		    {
    		      __push_char('-');
    		      return false;
    		    }
    		  __throw_regex_error(
    		    regex_constants::error_range,
    		    "Unexpected dash in bracket expression. For POSIX syntax, "
    		    "a dash is not treated literally only when it is at "
    		    "beginning or end.");
    		}
    	      __push_char('-');
    	    }
    	  else
    	    {
    	      if (_M_try_char())
    		{
    		  __matcher._M_make_range(__last_char.second, _M_value[0]);
    		  __last_char.first = false;
    		}
    	      else if (_M_match_token(_ScannerT::_S_token_bracket_dash))
    		{
    		  __matcher._M_make_range(__last_char.second, '-');
    		  __last_char.first = false;
    		}
    	      else
    		{
    		  if (_M_scanner._M_get_token()
    		      != _ScannerT::_S_token_bracket_end)
    		    __throw_regex_error(
    		      regex_constants::error_range,
    		      "Character is expected after a dash.");
    		  __push_char('-');
    		}
    	    }
    	}

    Читаю тут реализацию стандартной говнокрестовой библиотеки из GCC
    Какой багор )))

    Запостил: j123123, 10 Ноября 2021

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

    • https://en.cppreference.com/w/cpp/regex/basic_regex/constants
      static constexpr std::regex_constants::syntax_option_type icase =
          std::regex_constants::icase;
      static constexpr std::regex_constants::syntax_option_type nosubs =
          std::regex_constants::nosubs;
      static constexpr std::regex_constants::syntax_option_type optimize =
          std::regex_constants::optimize;
      static constexpr std::regex_constants::syntax_option_type collate =
          std::regex_constants::collate;
      static constexpr std::regex_constants::syntax_option_type ECMAScript =
          std::regex_constants::ECMAScript;
      static constexpr std::regex_constants::syntax_option_type basic =
          std::regex_constants::basic;
      static constexpr std::regex_constants::syntax_option_type extended =
          std::regex_constants::extended;
      static constexpr std::regex_constants::syntax_option_type awk =
          std::regex_constants::awk;
      static constexpr std::regex_constants::syntax_option_type grep =
          std::regex_constants::grep;
      static constexpr std::regex_constants::syntax_option_type egrep =
          std::regex_constants::egrep;

      awk, grep, egrep, ECMAScript... нахуя им столько вореантов регекспов в стандартной библиотеке?
      Ответить
      • Зачем вообще в С++ регулярки в stdlib? Это что, руби?
        А JSON там есть с OAuth?
        Ответить
        • Напиши пропозал в комитет, добавят.
          Ответить
        • JSON-а очень не хватает
          Ответить
          • и клиента Воцапа еще..
            Ответить
          • Можно попросить добавить интерпретатор жабаскрипта, там парсер ЖСОНА из коробки.
            Ответить
            • А добавьте лучше туда JVM, в нем же есть Рино.

              Более миллиорда устройств по всему миру используют Джава.
              Если вы не добавите поддержку Джава в свой язык, то скоро окажетесь на свалке истории!
              Ответить
      • Чтобы на ней можно было реализовать систему. А то получится - либа как бы есть, но каждая утилита использует что-то свое...
        Ответить
    • Где смеяться? Все код стандартной либы - говно. Долбоебы обмазались подчёркиваниями, ещё бы с десяти подчеркиваний все идентификаторы называли.
      Ответить
      • Почему он говно? Притом в какую стандартную библиотеку не глянь - всюду говно какое-то. Как эту хуйню вообще умудряются поддерживать и что-то там улучшать?
        Ответить
        • Может они не вручную так пишут, а есть какой-то обфускатор?
          Ответить
        • В funcii.php тоже смотрел?
          Ответить
        • Умные - держат в голове проект, берут и поддерживают. Сейчас наблюдается противная тенденция называть любой код с сайд-эффектами сложнее 20 строчек из кубиков Лего, говнокодом.
          Ответить
      • > Долбоебы обмазались подчёркиваниями
        Это из-за уёбищной системы хедеров, которые тупо копипастят текст, и ёбнутых макросов, которые просто производят полнотекстовую замену, не глядя на контекст.

        Поэтому все имена, кроме тех, которые являются частью публичного интерфейса либы приходится именовать так, чтобы никакой питух легально их задефайнить не мог. А это оставляет джва варианта: подчёркивание+заглавная буква в начале, либо двойное подчёркивание.
        Ответить
        • _Какой_уёбищный_код_стайл
          Ответить
        • Что делать разработчикам других либ (не стандартных)?
          Ответить
          • Страдать...

            Вообще, если макросы называть капсом, а всё остальное не называть капсом, то проблем особо и нет. Весь твой код в неймспейсах, а макросы с префиксами. Главное чтобы все это соглашение соблюдали...

            Надо добавить в стандарт такие правила: "макрос не капсом -- UB" и "не макрос капсом -- UB". И все будут счастливы.

            К сожалению в стандартной либе уже куча макросов не капсом (((
            Ответить
            • Там еще есть такая фишка, что некоторые функции могут быть функциями, а могут быть и макросами
              Ответить
              • Да даже errno макрос. И древнее говно, которое юзало его как extern int errno, в один прекрасный день перестало собираться.
                Ответить
                • errno конечно такой копролит, такой плевок в вечность из 1972-м года, что я ебу. Хуже только когда у тебя у каждой либы свой errno/GetLastError()

                  Вот правда исключения удобнее
                  Ответить
                  • Да исключения тоже говно, попробуй их между разными процессами покидать...

                    Тлен и безысходность.
                    Ответить
                    • Исключения безусловно говно, но меньшее говно, чем errno.
                      Я не должен вручную перекладывать говно из вызова в вызов.

                      if (! petushok()) {
                       perror("блядь petushok");
                       return 1;
                      }
                      if (! petushok_()) {
                       perror("блядь petushok_");
                       return 2;
                      }
                      
                      if (! zolotoy()) {
                       perror("блядь zolotoy");
                       return 3;
                      }

                      Это я еще не позакрывал всё обратно


                      Так-то я за Either всякие
                      Ответить
                      • > позакрывал

                        А некоторые либы ещё любят возвращать ошибки при закрытии...

                        Кривой дизайн, имхо, но часто встречается.
                        Ответить
                        • Нужно ли чекать возврат от CloseHandle?
                          Ответить
                          • Ну а если, например, закрытие файла делает flush, который может и обломаться... Тут что-то подобное обсуждали, но не помню, с чем было связано - то ли с finally, то ли с деструкторами.
                            Ответить
                            • Проще флашнуть заранее и забить на ошибку от close на самом деле...
                              Ответить
                              • да, там жопа была в том, что если ошибка будет при close, то может не флашнуться?

                                Удобно если ты база данных
                                Ответить
                              • Ну да. Но в общем виде непонятно. Типа, если файл - то Flush, если что-то другое - то еще какой-нибудь хуяшForceSyncWithHardware... Правда, ситуация, когда неизвестный хэндл придется закрывать, маловероятна, но всё же.
                                Ответить
                                • Не, ну так то можно в успешной ветке явно звать close и обрабатывать ошибку, а в неудачной забивать на неё.

                                  Вот только 99% кода полагается на деструктор в успешной ветке...
                                  Ответить
                            • Скорее всего с деструкторами — это главная проблема с RAII в крестах — если освобождение ресурса может привести к ошибке, то её репортить нормально не получится. Только через errno и подобное.
                              Ответить
                              • > если освобождение ресурса может привести к ошибке
                                а ха ха
                                https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/IOUtils.html#closeQuietly(java.io.Closea ble)
                                Ответить
                                • It should not be used to replace the close statement(s) which should be present for the non-exceptional case.
                                  It is only intended to simplify tidying up where normal processing has already failed and reporting close failure as well is not necessary or useful.
                                  Ответить
    • не надо заглядывать в кишки стандартной либы любого языка
      серьезно

      Ребята не стоит вскрывать эту тему. Вы молодые, шутливые, вам все легко. Это не то. Это не Чикатило и даже не архивы спецслужб. Сюда лучше не лезть. Серьезно, любой из вас будет жалеть. Лучше закройте тему и забудьте что тут писалось. Я вполне понимаю что данным сообщением вызову дополнительный интерес, но хочу сразу предостеречь пытливых - стоп. Остальных просто не найдут.
      Ответить
    • почему эта жопа не отправляет сообщения?
      Ответить
      • Потому что пидор сракер забанил часть интернета. В частности всю подсеть МТС, меня, и 1024--: https://github.com/wiistriker/govnokod.ru/issues/57#issuecomment-905638279
        Ответить
        • Дяденька Страйкер, это ребята флудили, а я просто рядом стоял!
          Ответить
        • Забанил? Ой-вэй, какой плохой гой Страйко!
          Нехуй было выкачивать сайт. За это нельзя не забанить.
          Невольно вспоминаю соседку, которую выпиздили на днях. Спускала воду кубометрами.
          Ответить
          • Кстати, а из-за чего возникает подмес горячей воды в холодную? Один счетчик крутится по часовой, второй - против.
            Ответить
            • Из-за клапанов.
              Ответить
            • Счетчик говно.

              А подмес идёт из-за разницы давлений. Где-то у тебя горячая и холодная вода встречаются напрямую. Если открыть краны и заткнуть выход на смесителе такая ситуация возникнет, к примеру.
              Ответить
              • Уёбку ответил.
                Ответить
              • А в фильтрах перед счетчиками разве нет обратного клапана?
                Ответить
                • В фильтрах нет, он там не нужен. Клапан ставится либо отдельно, либо встроен в счетчик. Либо не встроен и счетчик тупо не считает в обратку. Или счетчик — говно.
                  Ответить
        • А меня не забанил (
          Ответить
      • Oi mate, have you got a loicense for them posts?
        Ответить
    • я хакнул систему - теперь могу постить
      Ответить

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