Кресты / Говнокод #27810 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  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 j123123, (Updated )

Комментарии (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?
      Ответить
        • Можно попросить добавить интерпретатор жабаскрипта, там парсер ЖСОНА из коробки.
          Ответить
          • А добавьте лучше туда JVM, в нем же есть Рино.

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

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

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

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

                                Вот только 99% кода полагается на деструктор в успешной ветке...
                                Ответить
                          • Скорее всего с деструкторами — это главная проблема с RAII в крестах — если освобождение ресурса может привести к ошибке, то её репортить нормально не получится. Только через errno и подобное.
                            Ответить
  • не надо заглядывать в кишки стандартной либы любого языка
    серьезно

    Ребята не стоит вскрывать эту тему. Вы молодые, шутливые, вам все легко. Это не то. Это не Чикатило и даже не архивы спецслужб. Сюда лучше не лезть. Серьезно, любой из вас будет жалеть. Лучше закройте тему и забудьте что тут писалось. Я вполне понимаю что данным сообщением вызову дополнительный интерес, но хочу сразу предостеречь пытливых - стоп. Остальных просто не найдут.
    Ответить
      • Дяденька Страйкер, это ребята флудили, а я просто рядом стоял!
        Ответить
      • Забанил? Ой-вэй, какой плохой гой Страйко!
        Нехуй было выкачивать сайт. За это нельзя не забанить.
        Невольно вспоминаю соседку, которую выпиздили на днях. Спускала воду кубометрами.
        Ответить
        • Кстати, а из-за чего возникает подмес горячей воды в холодную? Один счетчик крутится по часовой, второй - против.
          Ответить
          • Счетчик говно.

            А подмес идёт из-за разницы давлений. Где-то у тебя горячая и холодная вода встречаются напрямую. Если открыть краны и заткнуть выход на смесителе такая ситуация возникнет, к примеру.
            Ответить
            • А в фильтрах перед счетчиками разве нет обратного клапана?
              Ответить
              • В фильтрах нет, он там не нужен. Клапан ставится либо отдельно, либо встроен в счетчик. Либо не встроен и счетчик тупо не считает в обратку. Или счетчик — говно.
                Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8