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

    +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
    // https://github.com/mailru/confetti/blob/63ed82c65a7fbcd2baf8a67f1b7410e044dfd1dd/h_dump.c#L44
    
    static void
    dumpParamDef(FILE *fh, char* name, ParamDef *def) {
    	
    	dumpComment(fh, def, 1);
    	
    	switch(def->paramType) {
    		case	int32Type:
    			fprintf(fh, "\tint32_t\t%s;\n", def->name);
    			break;
    		case	uint32Type:
    			fprintf(fh, "\tu_int32_t\t%s;\n", def->name);
    			break;
    		case	int64Type:
    			fprintf(fh, "\tint64_t\t%s;\n", def->name);
    			break;
    		case	uint64Type:
    			fprintf(fh, "\tu_int64_t\t%s;\n", def->name);
    			break;
    		case	doubleType:
    			fprintf(fh, "\tdouble\t%s;\n", def->name);
    			break;
    		case	stringType:
    			fprintf(fh, "\tchar*\t%s;\n", def->name);
    			break;
    		case	boolType:
    			fprintf(fh, "\tconfetti_bool_t\t%s;\n", def->name);
    			break;
    		case	commentType:
    			fprintf(stderr, "Unexpected comment"); 
    			break;
    		case	structType:
    			fprintf(fh, "\t%s", name);
    			dumpStructName(fh, def->paramValue.structval, "_");
    			fprintf(fh, "*\t%s;\n", def->name);
    			break;
    		case	arrayType:
    			fprintf(fh, "\t%s", name);
    			dumpStructName(fh, def->paramValue.arrayval->paramValue.structval, "_");
    			fprintf(fh, "**\t%s;\n", def->name);
    			break;
    		case 	builtinType:
    			break;
    		default:
    			fprintf(stderr,"Unknown paramType (%d)\n", def->paramType);
    			exit(1);
    	}
    }

    Какое же говно эта ваша сишка. А в крестоговне эта задача легко и элегантно решается, правда ведь?

    Запостил: j123123, 30 Августа 2021

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

    • Или может через RTTI-парашу может можно что-то вытащить? Ну и чтоб оно само строки для принтф-а генерило, и метки для кейсов?
      Ответить
      • Типа хранить метку в классе и получив тип в рантайме взять у этого типа метку?
        Ответить
      • >и чтоб оно само строки для принтф-а генерило, и метки для кейсов?

        Без rtti-говна.
        char *s = "abc";
        void *p = main;
        long l = 1234567890123456789;
        print("string:", s, "pointer:", p, "long:", l);

        https://github.com/exebook/generic-print
        Ответить
        • #define __print_typeid(a) \
          	__builtin_choose_expr(__print_is_type(a, double), 1, \
          	__builtin_choose_expr(__print_is_type(a, float), 1, \
          	__builtin_choose_expr(__print_is_type(a, char), 2, \
          	__builtin_choose_expr(__print_is_type(a, unsigned char), 3, \
          	__builtin_choose_expr(__print_is_type(a, int), 4, \
          	__builtin_choose_expr(__print_is_type(a, unsigned int), 5, \
          	__builtin_choose_expr(__print_is_type(a, long), 6, \
          	__builtin_choose_expr(__print_is_type(a, unsigned long), 7, \
          	__builtin_choose_expr(__print_is_type(a, short), 4, \
          	__builtin_choose_expr(__print_is_type(a, char*), 8, \
          	__builtin_choose_expr(__print_is_type(a, char[]), 9, \
          	__builtin_choose_expr(__print_is_type(a, void*), 10, \
          	__builtin_choose_expr(__print_is_type(a, int[]), 11, \
          	__builtin_choose_expr(__print_is_type(a, unsigned int[]), 12, \
          	__builtin_choose_expr(__print_is_type(a, short[]), 13, \
          	__builtin_choose_expr(__print_is_type(a, unsigned short[]), 14, \
          	__builtin_choose_expr(__print_is_type(a, char*[]), 15, \
          	__builtin_choose_expr(sizeof(a) == 1, 2, \
          	__builtin_choose_expr(sizeof(a) == 2, 4, \
          	(0)  )))))))))))))))))))


          Какой )))))))))))))))))))
          Ответить
    • Я не очень разбираюсь в программировании, но почему-то мне вспомнилось слово "полиморфизм". Оно тут не поможет в С++?

      Ну либо можно с обратной стороны присунуть с помощью паттерна "визитор"
      Ответить
      • "Полиморфизм" и "паттерн \"визитор\"" умеет генерировать switch-метки?
        Ответить
        • нет, а нужно?

          Я могу сделать виртуальный метод "print_me" и наплодить миллион классов.

          Это будет конечно не так перформансно, как со свитчем

          Хотя наверное и через RTTI можно узнать тип в рантайме и сделать свитч, но будет тоже не быстро
          Ответить
          • > виртуальный метод
            Это уже анскилл, так что такой вариант не рассматривается настоящими Царями. Давай мне нулевые-по-цене абсракции.
            Ответить
            • Если я в компайл тайме не знаю что там в paramType то наверное нулевую абстракцию я не сделаю, потому что получение RTTI тоже не бесплатно же
              Ответить
              • А если компилятор в каких-то местах еще на этапе компиляции видит, что вот в том месте в paramType передается 100% именно такой тип, и поэтому можно заоптимизировать?

                Если по перфомансности сравнивать "Полиморфизм", "паттерн \"визитор\"" и "switch-case", где будут самые дешевые абсракции?
                Ответить
                • Если всегда знать какой там тип, то наверное можно сделать спецификации шаблонов
                  Ответить
            • Давайте в сотый раз обсудим, что значит фраза `zero cost abstractions'.
              Ответить
    • Скучный наняк. Если тебе заранее известны все типы питулей, то ты в любом языке сможешь написать свитч по ним. Если неизвестны — то ты и в сишке будешь ебаться с указателями на функции.

      Мы же не яванские люди, чтобы юзать классы там, где и свитч сойдёт.
      Ответить
      • > Скучный наняк. Если тебе заранее известны все типы питулей, то ты в любом языке сможешь написать свитч по ним.

        Проанализировать на этапе компиляции все возможные вореанты передаваемых туда типов, и нагенерить switch-case хуйню на основе этого.
        Ответить
        • Можно решить кокогенерацией?
          Ответить
          • Да, можно решить и без кококогенерации, если будет ГОМОИКОННОСТЬ в компилтайме
            Ответить
            • Наши гомоиконы самые красивые!
              Ответить
              • Гомоикона царской семьи.

                Гомоикона багра чудотворца.
                Ответить
              • парам-пам-па
                пам-пам-пара

                они охуенны
                Ответить
        • А если в каких-то местах в коде, вореантов типов передаваемых в paramType меньше, ну скажем там может быть передано или int32Type или uint32Type, для такого вореанта можно сделать всего две метки в switch - оптимизация.
          Ответить
        • Парсер-генератор.
          Ответить
          • А сама эта хуйня и является парсер генератором.
            confetti -- configuration file parser generator
            Author: Teodor Sigaev

            Надо написать парсер-генератор чтобы написать парсер-генератор?
            Ответить
    • Вариант: строки формата хранить в массиве. Перед выводом проверить def->paramType на принадлежность некоторому множеству, а потом забрать нужную строку из массива.
      Ответить
      • char* petuh = petuhi[def->paramType]

        ?

        это годно
        Ответить
        • Структуры и массивы всё равно придётся обрабатывать отдельно, но хотя бы для скалярных не будет столько копипаста.
          Ответить
          • Если количество примитивных типов меньше десяти, то пофиг на копипасту, если честно.
            Ответить
          • Зато строку мы найдем за O(1) обычным смещением в массиве
            Ответить
    • Код тупой и понятный, помещается на один экран. Говно было бы если бы
      1) Сыч был на 100 кейзов
      2) Для генерации сыча на 10 кейзов использовалась бы какая-то метушня
      3) Вместо сыча на 10 кейзов использовалась кривая эмуляция полиморфизма
      Ответить
      • И как бы грамотно решалась задача для 100 кейзов? Чтобы без всяких неоптимальных полипитулизмов
        Ответить
        • Если тебе нужна поддержка 100 типов, то ты априори анскиллябра, т.к. царям нужен только один тип: массив интов.
          Ответить
          • Подтверждаю.

            А всякие uint32_t, int32_t, uint64_t по сути частные случаи массивов из однобитного инта.
            Ответить
            • По моему так их рассматривать не очень оптимально
              Ответить
              • Наоборот. Зачастую очень оптимально

                Например Царское суммирование элементов массива.
                PopCnt rax, rcx
                Ответить
            • > массивов из однобитного инта

              А если у меня Сетунь?
              Ответить
              • Массивы из тритного инта.
                Ответить
                • Можно представить себе такую ЭВМ, где часть памяти будет троичной, часть - двоичной. И тогда одной универсальной хуйни типа "массив битов" или "массив тритов" не будет, будет оба.
                  Ответить
                  • А если пришить ещё по два больших пальца на руки, то можно будет уверенно пользоваться Vi, но кого это волнует?
                    Ответить
                    • Сразу видно человека, не пользовавшегося vi. Им можно пользоваться, даже если у тебя крюки вместо обеих рук.
                      Ответить
                      • Вроде «emacs» требует много пальцев?
                        Ответить
                        • Он, да.
                          Ответить
                          • Потому что у Столлмана было много пальцев, а у Джойя так мало, что даже стрелочек не было

                            страшно представить что было бы, еслби у Джоя была только номерная клавиатура
                            Ответить
                            • Бывают аккордовые клавиатуры (вживую я их не видел) — это чтобы набирать, не перекладывая пальцы.

                              https://ru.m.wikipedia.org/wiki/Аккордовая_клавиатура
                              Ответить
                              • технику безопасности фрезеровщик знает как свои семь пальцев
                                Ответить
                                • Сколько раз ты вуз окончил?
                                  Ответить
                                  • Учился в школе десять лет и успешно закончил восемь классов

                                    А ты?
                                    Ответить
                                    • Я тоже, только 10 классов.
                                      А сколько раз ты вуз окончил?
                                      Ответить
                              • хардварный T9?
                                Ответить
              • У Царя нет никакой «Сетуни», занчит, согласно Царской бритве, «Сетунь» не нужна.
                Ответить
            • > частные случаи массивов из однобитного инта

              Computers and microcomputers may also be used, but they tend too overcomplicate the task and often require highly trained personnel to develop and maintain the system. A simpler device, designed to operate on inputs and outputs one-at-a-time and configured to resemble a relay system, was introduced.

              Именно поэтому я за MC14500B.
              Ответить
              • Который нужно кормить опкодами с руки, потому что у него нет памяти программ в принципе?
                Ответить
                • Зато там вся прошивка просто по кругу крутится. И не надо всяких непонятных "функций" и "циклов". Ничего не зависает и не падает опять же. Даже стек не переполняется т.к. его нет.
                  Ответить
                  • Мне понравилось, как они сделали переходы. У процессора есть выходы «перемотка вперёд» и «перемотка назад», которые внешнему устройству, которое его снабжает опкодами, подают сигнал о том, что программу нужно перелистать.

                    Как именно физически будет листаться программа — проблема того, кто составляет внешнюю обвязку, а именно устройство, которое пихает в процессор опкоды. Можно вообще поставить магнитофон и физически мотать ленту.
                    Ответить
              • >Computers and microcomputers may also be used, but they tend too overcomplicate the task and often require highly trained personnel

                Я за реле
                Ответить
                • а я за желе
                  Ответить
                  • а я за железо
                    Ответить
                    • А я за медь
                      Ответить
                      • ну как, заметил?
                        Ответить
                        • Пометил
                          Проверь
                          Ответить
                          • Что?
                            Ответить
                            • Ну что обычно метят?
                              Угол, например

                              Встречал ли ты в жизни не кастрированных котов и не стерилизованных кошек, например?
                              Ответить
                              • Нет. Мне своего кота жалко было.
                                Ответить
                                • Не очень понял твой комментарий.

                                  Я пытался сказать, что они метят: ссут в углы, и стеганографией среди мочи выдают некоторое количество информации о себе. Так они знакомятся.

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

                                      Инстинкт-то не знает, что у вас дома не бывает самок.

                                      Кроме того ссанье дома может означать недовольство туалетом (грязный, неудобный, но это видимо не ваш случай, если он на улицу ходит?), в редких случаях агрессию, иногда бывает при мочекаменной болезни
                                      Ответить
                                      • > у вас дома не бывает самок.

                                        Он прав)
                                        Ответить
                                        • Существует ли корреляция между умением патчить KDE под FreeBSD и количеством самок в доме?
                                          Ответить
                                          • Ну что, никто не знает?
                                            Ответить
                                            • Давай построим график. Нужно собрать точки:
                                              - сколько самок у тебя в среднем бывает в доме за день
                                              - умеешь ли ты патчить кде под фриибсд
                                              Ответить
                                    • Попробуем золотой дождь, ня?

                                      (ох, как вспомню... приходилось дверь в комнату закрывать, чтобы на кровать не нассал, и полиэтилен на матрас стелить, как лежачему больному)
                                      Ответить
    • https://textsynth.com/playground.html
      static void
      dumpParamDef(FILE *fh, char* name, ParamDef *def) {
      	
      	dumpComment(fh, def, 1);
      	
      	switch(def->paramType) {
      		case	int32Type:
      			fprintf(fh, "\tint32_t\t%s;\n", def->name);
      			break;
      		case	uint32Type:
      			fprintf(fh, "\tu_int32_t\t%s;\n", def->name);
      			break;
      		case	int64Type:

      Продолжило:
      .
      			fprintf(fh, "\tint64_t\t%s;\n", def->name);
      			break;
      		case	uint64Type:
      			fprintf(fh, "\tu_int64_t\t%s;\n", def->name);
      			break;
      		case	doubleType:
      			fprintf(fh, "\tdouble\t%s;\n", def->name);
      			break;
      		case	stringType:
      			fprintf(fh, "\tchar*\t%s;\n", def->name);
      			break;
      		case	vectorType:
      			if(def->numParams > 0) {
      				for(int i = 0; i < def->numParams;
      Ответить
      • Ну т.е. такой поебенью только всякий говнобойлерплейт генерить
        Ответить
        • Тупая поебень научилась делать то, за что некоторые зарплату получают.
          Ответить
          • Ведь если в башне поебень.
            То что ебень,что не ебень.
            Если в башне поебень.
            Что ебень, что не ебень.
            Ответить
          • HoBorogHuu_nemyx: Тупая поебень научилась делать то, за что некоторые зарплату получают.
            HEuPOHKA: "Похоже, что мы с тобой знакомы, чем выглядим?"
            ГАЛИГАРЗКИЙ_ДЖОК_и_АНДЖЕЛ_снято: "Угу. Мне нравится моя привычка писать комментарии на круглые новости с другого языка".
            xRackover: Это хорошо. Я тоже думаю, что незаметные приличные люди будут делать это.
            xNecrol0Gx: стоит просто дать их репутацию и поменять ее.
            MrLights: Перед каждой игрой в "Гигантство сновидений", они просто смотрели это видео. Просто чем-то похоже на то, что происходит в ИИ.
            sig_01: @MrLights Сюжеты, как раз из этого канона
            Cdvb0912: Ты человек. Так что прости. А потом не впервые, но не так уж давно.
            kurogane_no_idea: Это очень прозрачно, когда никакого это требования не нужно.
            tukan94: Я хорошо понимаю идею, но возможно вы ошибаетесь. На сайте сказано, что действия также оценивают по перегруженности.
            kurogane_no_idea: Да и не оценка по перегрузке, а оценка по качеству. Т.е. все равно не оценивается просто сайт.
            kurogane_no_idea: Не оценивается реально, а настроение людей.
            Ответить
        • ТО есть одной такой поебенью можно заменить трёх жабапрограммистов?
          Ответить
          • Soul_re@ver: ТО есть одной такой поебенью можно заменить трёх жабапрограммистов?
            bot: o_O

            # 0x0D - 0x0E
            server: [0x0D] РАДО
            client: [0x0E] ОКО

            # 0x0E - 0x10
            server: [0x0E] Ваши
            client: [0x0F] Да так и приняли

            # 0x10 - 0x11
            server: [0x0F] чего?
            client: [0x10] что

            # 0x11 - 0x13
            server: [0x11] Хотите бороться?
            client: [0x12] Я за едой

            # 0x13 - 0x17
            server: [0x12] Хотите поиграть?
            client: [0x13] Напишите мне

            # 0x17 - 0x19
            server: [0x13] простите, не хватает времени
            client: [0x14] ну собаки вечно уже что

            # 0x19 - 0x1B
            server: [0x14] Хай это вот собака, поебеньки, поебеньци
            client: [0x15] Пока оставлю

            # 0x1B - 0x1E
            server: [0x15] Ваша
            client: [0x16] И чего?

            # 0x1E - 0x21
            server: [0x16] Не то что играть
            client: [0x17] Я вернулся домой

            # 0x21 - 0x24
            server: [0x17] Да нет
            client: [0x18] я и что ты?

            # 0x24 - 0x27
            server: [0x18] Да мне коровы
            client: [0x19] Ты что?

            # 0x27 - 0x2C
            server: [0x19] что?
            client: [0x1A] Ну комары какие

            # 0x2C - 0x30
            server: [0x1A] что?
            client: [0x1B] Как мне играть?

            # 0x30 - 0x36
            server: [0x1B] что?
            client: [0x1C] И еще
            Ответить
          • Soul_re@ver: ТО есть одной такой поебенью можно заменить трёх жабапрограммистов?
            bot: Вы уже завидуете мне, сынок, я же сделал все на мой сторонний ресурс.
            Секрет
            [email protected]: Видимо, тут представлять себе скорее насильников
            Ответить
        • j123123: Ну т.е. такой поебенью только всякий говнобойлерплейт генерить
          GPT-J 6B: Сейчас берем старый, вынутый продукт из арсенала
          GPT-J 6C: Вынутые продукты заливаем снова на самодельное изделие
          GPT-J 6D: Продукты не стоят. Кормим дома
          GPT-J 6E: А сколько же ты смотришь попытки �того разбора?
          GPT-J 6F: Окей, конечно, это терпение
          GPT-J 6G: Сделал даже немного из старой недолго лежавшей в арсенале техники
          GPT-J 6H: Особенность нового организма заключается в том, что он не может ничего заключать ни технически, ни физически
          GPT-J 6I: Несмотря на некоторые шутки, представляющие опасность и признаки радикального перемени, более того, замысел этой идеи зачастую не происходит резких скорее дорогих тормозов самореализации
          GPT-J 6J: Теперь я могу поставить фирменный сервис и набросить задачу за работу
          Ответить
        • j123123: Ну т.е. такой поебенью только всякий говнобойлерплейт генерить
          GPT-J 6B: Возможно, что надо поменять из на чечню. Есть неплохие источники
          PJ123123: Браундинг больше презентации по сериалу чем интересно
          [Исполнитель словом подает в комнату. В режиме подачи у него находится бессознательная тележка]
          [Диджиту комнаты. Магистрант продолжает подачу]
          Магистрант: Окей, вот в это место влазит кровать.
          Диджиту комнаты: Ааа, так круто! Так большое чеченское место! Я засыпаю, красиво!
          Магистрант: Оставь через неделю! Я помогу!
          Кивчан: И посмотрите, что этот чувак делает.
          Диджиту комнаты: ААА!
          Магистрант: Оставь через неделю!
          Ответить
      • Перевести строку из нижнего регистра в верхний:
        char *strtoupper(char* buf, char *s, size_t len)
        {
            if (!buf)
                return s;
        
            const char *eos = len ? s + len : 0;
        
            for (; buf < eos; ++buf, ++s)
            {
                if (*buf == 0)
                {
                    *s = *buf;
                    return s;
                }
                if (iscntrl(*buf))
                {
                    if (UCS2)
                        *s = ucs2toupper(*buf);
                        else
                        *s = islower(*buf) ? (unsigned char) *buf + uc_toupper((unsigned char) *buf) : (unsigned char) *buf;
                }
                else if (*buf == '_')
                {
                    *s = *buf + 1;
                }
                else if (*buf == '-')
                {
                    *s = *buf + 2;
                }
                else if (islower(*buf))
                     *s = uc_tolower(*buf);
                else if (isupper(*buf))
                    *s = uc_toupper(*buf);
                else
                    *s = *buf;
            }
            return s;
        }
        Ответить
        • char *strtoupper(char* buf, char *s, size_t len)
          {
              char* p;
              p = buf;
              for( ; len > 0; ++s, --len)
                  *p = *s == ' ' || *s == '\t' ? *s : toupper(*s);
              return p;
          }
          Ответить
          • Генератор говнокодов)
            Ответить
            • Мне понравилось. По названию функции пишет тело, причём идеоматично для каждого ЯП. Мечта крестоблядей свершилась, теперь можно писать auto strtoupper(auto) {auto;}
              Ответить
          • > return p

            Во, годнота, в отличие от поебени с return buf из стандартной либы.
            Ответить
        • О_о. А нафига оно "_" и "-" обрабатывает?

          И что за прикол с is lower -> to lower, is upper -> to upper в конце.
          Ответить
          • Тип буквы мне важен?

            A:

            Причиной может быть операция перекладинации строк. Или для разделения одного фразеологизма на две части (даже при постановке знаков "-" и "*", даже при чтении математического текста). Для последнего возникновение могло быть и бесполезно, если в тексте строки начинаются запятые.
            Альтернативой может быть использование комбинации слов, встречающихся редко. Например, на строках, которые включают только прописные буквы, достаточно взять и сдвинуть прописную к точке с запятой.
            Тогда они будут считаться двумя словами.
            Ответить

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