Няшная / Говнокод #27629 Ссылка на оригинал

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
// 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 j123123, (Updated )

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

  • Или может через RTTI-парашу может можно что-то вытащить? Ну и чтоб оно само строки для принтф-а генерило, и метки для кейсов?
    Ответить
    • Типа хранить метку в классе и получив тип в рантайме взять у этого типа метку?
      Ответить
      • #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. Им можно пользоваться, даже если у тебя крюки вместо обеих рук.
                    Ответить
            • У Царя нет никакой «Сетуни», занчит, согласно Царской бритве, «Сетунь» не нужна.
              Ответить
          • > частные случаи массивов из однобитного инта

            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: Вы уже завидуете мне, сынок, я же сделал все на мой сторонний ресурс.
          Секрет
          Ponychu@vk.com: Видимо, тут представлять себе скорее насильников
          Ответить
      • 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:

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

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

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

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


    8