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

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
void Attr::setConvertedValue(std::string pValue)
{
    /* ............. - BEGIN - Place the HTML code instead of the */
    /* plain values. This is needed since special XML characters      */
    /* might exist.                                                   */
    for(int i = 0; i < pValue.length(); i++)
    {
        int ascii = (int)pValue[i];

        if(!( (ascii == 32 ) ||
              (ascii >= 48 && ascii <= 57) ||
              (ascii >= 65 && ascii <= 90) ||
              (ascii >= 97 && ascii <= 122) ) )
        {
            if( ascii < 0 )
                ascii += 256;

            std::ostringstream stream;
            stream << ascii;

            std::string newString = stream.str();
            newString = "&#" + newString + ';';

            pValue.replace(i, 1, newString);

            i += newString.length() - 1;
        }
    }
    /* ............. - END - Place the HTML code instead of the */
    /* plain values. This is needed since special XML characters      */
    /* might exist.                                                   */
    mConvertedValue = pValue;
}

я стою на асфальте, ноги в лыжы абуты.

мы эскайпим значения для ХМЛ.

вы тут посмейтесь, а я пошел головой об стенку стучатся.

ЗЫ пысано в Бразилии.

Запостил: Dummy00001 Dummy00001, (Updated )

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

  • > if(!( (ascii == 32 ) ||
    (ascii >= 48 && ascii <= 57) ||
    (ascii >= 65 && ascii <= 90) ||
    (ascii >= 97 && ascii <= 122) ) )

    Бедняги, у них же нет возможности написать
    if not (ascii in [32, 48..57, 65..90, 97..122]) then...
    Ответить
    • собственно такая возможность и не нужна, потому что следует использовать isalpha(), isdigit() и прочее, а не привязываться к конкретной таблице.
      Ответить
      • На все символы однострочных функций не напасёшься.
        А попки у сишников болят, я смотрю... Больной вопрос у них - убогость некоторых конструкций.
        Ответить
        • киса, ASCII это кусок семибитного говна из 1980ых, и вообще, set constructors субоптимальны с точки зрения производительности
          Ответить
          • Киса, какие конструкторы, i in [s] для константного S компилируется в простую проверку i-го бита у константы.
            Это как лиса и виноград, сишники сочиняют сказки о неоптимальности конструкций, которых у них нет.
            Ответить
            • >>>i in [s] для константного S компилируется в простую проверку i-го бита у константы

              да ты что?
              Т.е. if (65534 in [65533, 65534, 65535]) будет создавать в памяти константу на 64 кбит?
              Ответить
              • Да я что.
                Это не скомпилится. Только для перечислимых типов и чисел до 255.
                Ответить
                  • В большинстве случаев множества из перечислимых типов и составляются.
                    Хочешь больше - используй свои карты.
                    Либо пиши
                    if i-65500 in [33,34,35]
                    Ответить
                    • Вы так утверждаете, что как будто в Си нельзя так сделать. Можно создать эту табличку, только потребность в этом не настолько велика ,чтобы делать это как в паскале. Иными словами в подавляющем числе случаев имеются более подходящие решения.
                      Ответить
                      • Конечно, можно.
                        Берёшь, и пишешь
                        if ((1 << i) & ((1 << 32)|(1<<48)|итд))
                        Только писанины намного больше.
                        Ещё можно написать так:
                        case i of
                        65533, 65534, 65535: begin
                        ...
                        end;
                        end;
                        Ответить
                    • а если нужно [1,2, 512, 30000..32000, 12541212..12545000] че писать будешь?
                      Ответить
                    • >В Delphi это не скомпилится. Только для перечислимых типов и чисел до 255.
                      >Хочешь больше - используй свои карты.

                      В С++ так же можно. 🙂
                      Раз есть ограничение в 255, то скорее всего и там и там придётся писать велосипед, так что эта дельфовская возможность не защитана...

                      Тем более, в С++ есть готовые удобные оптимизированные и проверенные годами тестирования и эксплуатации библиотеки.

                      В дельфи, если и удастся найти компонент, то он будет очень не проверенный и написаный абы как. (Так называемая проблема языка из не крупнопроизводственных отраслей).
                      Ответить
                      • >в С++ есть готовые удобные "библиотеки".
                        Оговорился. Не только С++, а во всех крупнопроизводственных меинстримовых языках (к коим дельфи, наверное к счастью, не относится).

                        Впрочем, думаю, это было и так понятно, извиняюсь за КЭПерство.
                        Ответить
                      • > В С++ так же можно. 🙂

                        Ага,
                        if ((1 << i) & ((1 << 32)|(1<<48)|итд))
                        Ответить
                        • Вам сто раз писали, что можно сделать по нормальному, а не так как вы показываете.
                          Ответить
                          • Ну что-ж Вы. Приведите пример. Человек не верит. 🙂
                            Ответить
                            • char check_mas[] = { 0, 0, 0, 1, 0, 1 };
                              
                              if (mas[val])
                              {
                              ...
                              }

                              не удобно, но без глупых ограничений...

                              можно еще тоже самое сделать на битовых таблицах, будет медленнее но съест меньше памяти и опять таки без ограничений
                              Ответить
                              • ага, иногда помогает еще так не совсем в тему говнокода, но все же:
                                int tbl[] = {1056, 8701, 1800, 29, 889, 7769, 9105};
                                if(mas[tbl[val]] == number) //вот для этого в паскале тоже нет стандартных средств
                                {
                                //...
                                }
                                Ответить
                                • if mas[tbl[val]] = number then
                                  Чем не стандартное средство? 🙂
                                  Ответить
                                  • Я имел ввиду нечто подобное как любит пользоваться TarasB . Ну то есть тоже придется вручную писать.
                                    Ответить
                    • >(65534 in [65533, 65534, 65535])
                      Часто такое решается на более высоком уровне, например фабриками или полиморфизмом.

                      Эта конструкция просто становится не нужна.
                      Ответить
                      • На более высоком уровне писанины лишней много, не кажется?
                        Ответить
                        • Как раз наоборот, а главное легче потом разобрать и серьёзно исправить свой код через 10ток лет за 5 минут.

                          А если Вам понадобиться исправить этот код в будующем - с вашим подходом потратите несколько недель, отлаживая код и разбираясь в нем.
                          Ответить
                            • Да. Лучше просто его выкинуть и переписать полностью заного, если понадобится его отрефакторить или найти в нём ошибки. Многостраничные кейсы разрушают нервные клетки быстрее, чем те успевают востанавливаться. Понимаю. 🙂
                              Ответить
                              • Ну конечно, одна строчка в кейсе намного страшнее, чем многострочный набор условий в if
                                Ответить
                                • Я говорил про многостраничный кейс, кои могут получаться в тех случаях, когда лучше применить другой более подходящий паттерн.
                                  Ответить
                                  • А в таких случаях действительно лучше применить что-то ещё.
                                    Но вот вместо if ((i > 1 && i<1000) || итд
                                    куда проще сделать нормальный паскалевский case
                                    Ответить
              • Бля, сишники, вы реально дебилы. Пиздоболите тут, о чём не знаете, минусы ставите за правильные посты. Хоть бы проверяли свой пиздёж.
                Ответить
                • а в питоне можно так
                  if i in [float(x*y+x/y) for x in range(0,10,2) for y in range(2,5)]:
                  что еще раз доказывает что паскаль - говно!
                  Ответить
                    • которое в 1.7 раза производителнее. а когда нужна именно производительность, то выбор невелик и паскаль в этом выборе не участвует...
                      Ответить
                      • >в 1.7 раза
                        Откуда такие цифры? Всё зависит от задачи, компилятора и метода её решения.

                        На С++ можно так наговнякать... И легче, чем в дельфи.
                        Ответить
                        • и на делфи можно так наговнячить... так наговнячить можно даже на питоне и пхп...
                          цифра от Тараса, он в последнее время жирнеет продвигая делфи...
                          Ответить
                          • >Тарас в последнее время жирнеет продвигая делфи...
                            Помоему он просто над нами стебётся, естественно зная, что дельфи УГ.
                            Ответить
                            • Дельфи7 действительно УГ, даже битовые сдвиги неправильные делает. Но проблема в том, что большая часть сишников делится на 2 группы - те, кто думают, что Паскаль - это только Д7 (Пушков из таких), и ещё более дремучие, кто думает, что Паскаль - это ТП7.
                              На самом деле Паскаль, как язык, превосходит Си/Си++ во всех отношениях. То, что слов больше надо писать - это полная фигня по сравнению со временем отладки. Отсутствие мощных оптимизирующих компиляторов - тоже не вина языка.
                              Распространение Си - это большая историческая ошибка. Надо было убить Ритчи в 70м.
                              Ответить
                              • >Надо было убить Ритчи в 70м.
                                Изобретите машину времени и исправьте эту досадную ошибку. 😀
                                Ответить
                              • >Дельфи7 действительно УГ
                                >На самом деле Паскаль, как язык, превосходит Си/Си++ во всех отношениях
                                Вывод из ваших слов:
                                Си++ - УГешное УГ?

                                😀
                                Ответить
                      • Разница в производительности такая только из-за политики Ботланда. Паскаль - это не скриптовый язык с динамической типизацией, у него нет объективных причин тормозить.
                        Ответить
        • >На все символы однострочных функций не напасёшься.
          Тем более, что это не требуется. Если нужен конкретный символ, то его и следует проверить, обычным символьным сравнением, а не через ascii-коды. А если нужен диапазон, то в адекватных случаях используются функции, о которых я говорил выше.
          Такие же варианты как в ГК или в твоем примере изобилуют магическими числами, что не есть гуд.
          Ответить
            • В том-то и дело, что буквы могут НЕ лежать в одном диапазоне.
              Ответить
              • лол) а какого болта прогер должен об этом задумываться? есть инварианты 'a' < 'b' < ...< 'z' и они должны выполняться независимо от того, как они хранятся.
                Ответить
                • Как раз чтоб не задумываться и есть функции типа isalpha().
                  Инварианты такие от лукавого, особенно для символов, не принадлежащих латинице.
                  Ответить
                • Такого не видел, но мне интересно. Давайте порассуждаем.

                  1)Есть ли такие языки, где это реализовано, при этом для различных лингвистических языков и для разных платформ?

                  2)Как выглядит такой инвариант при сравнении, скажем, 'а' и 'A' или латинской 'A' и русской 'А'?

                  (xXx_totalwar, Вы, наверное, помните о моём хобби, поэтому знаете, что мне это может пригодиться. 🙂
                  Ответить
                  • >Такого не видел, но мне интересно. Давайте порассуждаем.
                    в лингвистике как бы не поощряется рассуждать. это вполне формально определенная область.
                    1) конечно есть. любой язык имеющий алфавит (с логографией отдельные истории). все идет с времен зарождения письменностей, когда литерам соответствовали еще и числовые значения. следовательно, порядок следования важен или господа отрицают, что числовые множества обладают отношением порядка?
                    странно, что многие не стесняясь называющие себя программистами, не знают даже тривиальных основ лингвистики.
                    2) по большому счету эти величины не могут быть сравнимы, т.к. принадлежат разным множествам. но на практике это может быть реализовано, например в соответствии с ISO-14651 / DUCET
                    Ответить
                    • >1)конечно есть
                      Вы же понимаете, что я жду примера языка программирования, где реализован данный порядок?
                      Ответить
                      • вообще любой имеющий символьный тип. в чем проблемы?
                        python
                        >>> 'a' < 'b' < 'c'
                        True

                        ml
                        # 'a' < 'b' && 'b' < 'c';;
                        - : bool = true

                        haskell
                        > 'a' < 'b' &&  'b' < 'c'
                        True
                        Ответить
                        • 1)Хоть один из них используется на встроенных платформах?

                          >'a' < 'b' && 'b' < 'c'
                          2)Подобное сравнение верно и для национальных алфавитов на всех платформах?
                          Ответить
                          • 1) 'a' < 'b' это и в pure c верное выражение
                            2) проблемы разработчиков платформ. если не способны для алфавита реализовать отношение порядка, нечего им в этой профессии ошиваться.
                            Ответить
                            • >в pure c верное выражение
                              Насколько я помню, в стандарте языка Си это не указано, значит не верное.
                              Ответить
                              • си - все-таки низкоуровненый язык, у него и система типов крайне слабая.
                                Ответить
                              • ISO C использует ASCII, т.е. верно.

                                В С 'a'/'b'/etc это есть просто целочисленные константы, со значением соответствующим коду символа в ASCII. (В С++ - char константы, но с тем же значением.)
                                Ответить
                                • >C использует ASCII, т.е. верн
                                  Верно лишь утверждение 1)
                                  2)ое не верно, т к для национальных алфавитов аски не стандартизирует такое.
                                  Ответить
                                  • "2)ое не верно, т к для национальных алфавитов аски не стандартизирует такое."

                                    верно, потому что по стандарту ты и не можешь написать например 'ё'. С и С++ гарантируют только ASCII. в новых версиях языков для этого есть U'~'/L'~' (U'' - 32bit Unicode, L'' - 16bit Unicode).

                                    Для С, смотри в стандарте 6.4.4.4 - Character constants. Для С++ - 2.14.3 - Character literals. К слову, рекомендую почитать, сам много нового узнал 😉
                                    Ответить
                                    • >ты и не можешь написать например 'ё'
                                      Что-то мне кажется, что могу.
                                      Даже если не могу, но в char лежит "йо" и мне его надо сравнить с другими символами, то что тогда? Где выполняется?
                                      Или Вы предлагаете выкинуть интернациональные кодовые страницы только из-за того, что в Си по стандарту только ASCII?
                                      Ответить
                        • поэкспериментируйте с буквой "йо" (на мак клаве нет символа е с двумя точками)...
                          Ответить
                • Например Юникод для всех русских символов
                  Ответить
                • Это реалии компьютерного мира; наследие, от которого, теперь, уйти очень тяжело. Привыкайте.
                  Ответить
  • в строке 24 надо 1 заменить на newString.length() или закомментить строку 26

    а так на говнокод не тянет. задора нет
    Ответить
    • ага. куча ненужного копирования. два ненужных (пере)выделения памяти. потому что в XML в принципе только три символа имеют специальное значение: &, >, <.

      ну и самое главное достижение этого кода: превращение utf-8 в мусор. как собственно этот шедевр и попал мне на радар.
      Ответить
  • еще используя unsigned можно было бы не писать if( ascii < 0 ) ascii += 256;
    Ответить

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

Переведи на "PHP", guest!

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


    8