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

    +319

    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
    template<typename OpeningBracketRange,
    	typename ClosingBracketRange,
    	typename StopTokenRange,
    	typename CommentBlockRangePairRange,
    	typename RecursiveCommentBlockRangePairRange>
    
    Meta::EnableIf<
    	IsFiniteForwardRange<OpeningBracketRange>::_ &&
    	IsFiniteForwardRange<ClosingBracketRange>::_ &&
    	IsFiniteForwardRange<StopTokenRange>::_ &&
    	IsFiniteForwardRange<CommentBlockRangePairRange>::_ &&
    	IsFiniteForwardRange<RecursiveCommentBlockRangePairRange>::_,
    
    decltype(Meta::Val<R>().Take(0))> ReadRecursiveBlock(int& counter, size_t* ioIndex,
    	OpeningBracketRange openingBracket, ClosingBracketRange closingBracket, StopTokenRange stopToken,
    	CommentBlockRangePairRange commentBlocks, RecursiveCommentBlockRangePairRange recursiveCommentBlocks)
    {
    	R start = me();
    	size_t index = 0;
    	const size_t openingBracketLen = openingBracket.Count();
    	const size_t closingBracketLen = closingBracket.Count();
    	const size_t stopTokenLen = stopToken.Count();
    	while(!me().Empty() && counter!=0)
    	{
    		if(openingBracketLen!=0 && me().StartsWith(openingBracket))
    		{
    			counter++;
    			me().PopFrontExactly(openingBracketLen);
    			index += openingBracketLen;
    			continue;
    		}
    
    		if(closingBracketLen!=0 && me().StartsWith(closingBracket))
    		{
    			counter--;
    			me().PopFrontExactly(closingBracketLen);
    			index += closingBracketLen;
    			continue;
    		}
    
    		if(stopTokenLen!=0 && me().StartsWith(stopToken))
    		{
    			me().PopFrontExactly(stopTokenLen);
    			index += stopTokenLen;
    			break;
    		}
    
    		bool commentFound = false;
    		for(auto& commentBlock: commentBlocks)
    		{
    			commentFound = me().StartsWith(commentBlock.Get<0>());
    			if(!commentFound) continue;
    
    			const size_t commentBlockOpeningLen = commentBlock.Get<0>().Count();
    			const size_t commentBlockClosingLen = commentBlock.Get<1>().Count();
    			me().PopFrontN(commentBlockOpeningLen);
    			index += commentBlockOpeningLen;
    			me().FindAdvance(commentBlock.Get<1>(), &index);
    			me().PopFrontN(commentBlockClosingLen);
    			index += commentBlockClosingLen;
    			break;
    		}
    		if(commentFound) continue;
    
    		for(auto& commentBlock: recursiveCommentBlocks)
    		{
    			commentFound = me().StartsWith(commentBlock.Get<0>());
    			if(!commentFound) continue;
    
    			int commentCounter = 1;
    			ReadRecursiveBlock(commentCounter, &index, commentBlock.Get<0>(), commentBlock.Get<1>(), null, null);
    			break;
    		}
    		if(commentFound) continue;
    
    		me().PopFront();
    	}
    	if(ioIndex!=null) (*ioIndex) += index;
    	return start.Take(index);
    }

    Это мои последние достижения в написании сверх универсального обобщённого кода.
    Начиналось всё с функции, которая парсила блок кода до закрывающей фигурной скобки, учитывая встречающиеся открывающие скобки. Затем появилась поддержка комментариев и строк. Позже я решил, что нечего привязываться к какому-то конкретному языку, ведь можно же таким же образом парсить другой язык, где вместо скобок begin end и комментарии по-другому оформляются.
    А потом я подумал, зачем вообще привязывать типы параметров к строкам и массивам строк? И почему код, который парсится, вообще должен быть строкой, хранящейся в памяти непрерывно? В итоге мои размышления привели к такой реализации, которая способна парсить всё подряд, в том числе и связные списки, причём необязательно состоящие из символов. При этом открывающуюся скобку можно передать связным списком, закрывающуюся - массивом, а блоки комментариев передавать как массивом кортежей, так и хеш-таблицей.

    При этом эта функция относится к классу примеси и наследованием её можно подмешать к любому классу, имеющему нужные методы.

    gammaker, 15 Августа 2016

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

    +261

    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
    /* load config */
            for (i = 0; ; i++) {
                    conf[0] = '\0';
                    switch (i) {
                    case 0:
                            /* ~ */
                            snprintf(conf, sizeof conf, "%s/.%s",
                                pwd->pw_dir, SWM_CONF_FILE);
                            break;
                    case 1:
                            /* global */
                            snprintf(conf, sizeof conf, "/etc/%s",
                                SWM_CONF_FILE);
                            break;
                    case 2:
                            /* ~ compat */
                            snprintf(conf, sizeof conf, "%s/.%s",
                                pwd->pw_dir, SWM_CONF_FILE_OLD);
                            break;
                    case 3:
                            /* global compat */
                            snprintf(conf, sizeof conf, "/etc/%s",
                                SWM_CONF_FILE_OLD);
                            break;
                    default:
                            goto noconfig;
                    }
    
                    if (strlen(conf) && stat(conf, &sb) != -1)
                            if (S_ISREG(sb.st_mode)) {
                                    cfile = conf;
                                    break;
                            }
            }

    Вот так spectrwm грузит конфиги.

    codemonkey, 15 Августа 2016

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

    +273

    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
    #include <math.h>
    #include <stdio.h>
    
    double  DoubleToTheInt(double base, int power) {
        return pow(base, power);
    }
    
    int main() {
        // приводим к указателю на функуцию с обратным порядком аргументов
        double (*IntPowerOfDouble)(int, double) =
            (double (*)(int, double))&DoubleToTheInt;
    
        printf("(0.99)^100: %lf \n", DoubleToTheInt(0.99, 100));
        printf("(0.99)^100: %lf \n", IntPowerOfDouble(100, 0.99));
    }

    "Изящный способ отстрелить себе ногу по самую голову."
    Утащено с Хабры.

    Vindicar, 15 Августа 2016

    Комментарии (182)
  4. PHP / Говнокод #20680

    +341

    1. 1
    2. 2
    $dom = new DOMDocument;
    $dom->loadHTML('<?xml encoding="UTF-8">' . $document);

    Выжал самое интересное.

    Кто угадает, зачем к документу прилепляется строка '<?xml encoding="UTF-8">', тому ничего. Но без неё не работает. Точнее, работает, но неправильно.

    inkanus-gray, 13 Августа 2016

    Комментарии (9)
  5. Java / Говнокод #20541

    +111

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    @AutoValidated
        public void remove(
                @NotNull PaymentProviderConfiguration paymentProviderConfiguration
        ) {
            paymentProviderConfiguration.setDeleted(true);
            paymentProviderConfiguration.setDisabled(true);
            paymentProviderConfiguration.setEditable(false);
            paymentProviderConfigurationDAO.update(paymentProviderConfiguration);
            context.getHibernate().evict(paymentProviderConfiguration);
            context.getHibernate().flush();
        }

    интересно еще и то, что внутри paymentProviderConfigurationDAO.update(p aymentProviderConfiguration); есть еще один flush

    vorozhtsov, 12 Августа 2016

    Комментарии (25)
  6. C# / Говнокод #20540

    +9

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    var actualCharCount = DisplayCharactersCount;
    while (DisplayCharactersCount != actualCharCount)
      {
        Thread.Sleep(500);
      }

    и такое бывает

    ewenso, 12 Августа 2016

    Комментарии (6)
  7. PHP / Говнокод #20525

    +4

    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
    // Change the color of the displayed status
    		if ($status == "active") {
    			$status_display = '<font color="white">' . $status . '</font>';
    		} elseif ($status == "sold") {
    			$status_display = '<font color="green">' . $status . '</font>';
    		} elseif ($status == "emis") {
    			$status_display = '<font color="orange">' . $status . '</font>';
    		} elseif ($status == "alert") {
    			//
    		} elseif ($status == "deleted") {
    			$status_display = '<font color="white">' . $status . '</font>';
    			//$style="text-decoration: line-through;";
    		} elseif ($status == "closed") {
    			$status_display = '<font color="closed">' . $status . '</font>';
    		} elseif ($status == "options_sent") {
    			$status_display = '<font color="yellow">' . $status . '</font>';
    		}
    		if ($trip_type == "one_way") {
    			$one_way = "SELECTED";
    			$round_trip = "";
    			$trip_type = '<font color="DarkBlue">One Way</font>';
    		} else {
    			$one_way = "";
    			$round_trip = "SELECTED";
    			$trip_type = '<font color="#348017">Round Trip</font>';
    		}
    		if ($cabin_class == "economy_class") {
    			$eco_class = "SELECTED";
    			$bus_class = "";
    			$ooo_class = "";
    		} elseif ($cabin_class == "business_class") {
    			$eco_class = "";
    			$bus_class = "SELECTED";
    			$ooo_class = "";
    		} elseif ($cabin_class == "o_class") {
    			$eco_class = "";
    			$bus_class = "";
    			$ooo_class = "SELECTED";
    		}
    		if ($num_pass == "1") {
    			$n1 = "SELECTED";
    			$n2 = "";
    			$n3 = "";
    			$n4 = "";
    			$n5 = "";
    			$n6 = "";
    			$n7 = "";
    			$n8 = "";
    			$n9 = "";
    			$n10 = "";
    		} elseif ($num_pass == "2") {
    			$n1 = "";
    			$n2 = "SELECTED";
    			$n3 = "";
    			$n4 = "";
    			$n5 = "";
    			$n6 = "";
    			$n7 = "";
    			$n8 = "";
    			$n9 = "";
    			$n10 = "";
    		} elseif ($num_pass == "3") {
    			$n1 = "";
    			$n2 = "";
    			$n3 = "SELECTED";
    			$n4 = "";
    			$n5 = "";
    			$n6 = "";
    			$n7 = "";
    			$n8 = "";
    			$n9 = "";

    Вот почему не надо мелочиться. И нанимать нормальных программистов.

    OMD, 11 Августа 2016

    Комментарии (13)
  8. PHP / Говнокод #20521

    +4

    1. 1
    var options = [<?php echo implode(',', range(App\Service\Service::CONSTANT_MIN, App\Service\Service::CONSTANT_MAX)); ?>];

    Diwms, 11 Августа 2016

    Комментарии (1)
  9. C++ / Говнокод #20503

    +8

    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
    #include <vector>
    #include <iostream>
    
    template<class T>
    struct reverse_view_impl {
    	const T& cont;
    	reverse_view_impl(const T& cont): cont(cont) {}
    	using iterator = typename T::const_reverse_iterator;
    };
    template<class T>
    reverse_view_impl<T> reverse_view(const T& cont) {
    	return reverse_view_impl<T>(cont);
    }
    
    template<class T>
    typename reverse_view_impl<T>::iterator begin(const reverse_view_impl<T>& view) {
    	return view.cont.crbegin();
    }
    template<class T>
    typename reverse_view_impl<T>::iterator end(const reverse_view_impl<T>& view) {
    	return view.cont.crend();
    }
    
    std::vector<int> one_two_three() { return { 1, 2, 3 }; }
    
    int main() {
    	for (auto i : reverse_view(one_two_three())) {
    		std::cout << i << std::endl;
    	}
    }

    // Surprise, motherfucker

    Bobik, 10 Августа 2016

    Комментарии (22)
  10. C# / Говнокод #20501

    +4

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    bool shift = keys.Shift;
    
    if (keys.Control)
    {
    	return SelectNextControl(shift ? false : true);
    }

    Телерик опять жжот. Цветёт и пахнет.

    kerman, 10 Августа 2016

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