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

    0

    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
    #include <ncurses.h>
    
    #if defined(_WIN32) || defined(_WIN64) 
        #include <windows.h>
        #define msleep(msec) Sleep(msec)
    #else
        #include <unistd.h>
        #define msleep(msec) usleep(msec*1000)
    #endif
    
    int main()
    {
        initscr();
    
        char str[100];
        addstr("Enter string: ");
        getstr(str); //Считваем строку
        curs_set(0); //"Убиваем" курсор, чтобы не мешался
        while ( true )
        {
        //Перемещаем х-координату как можно дальше вправо, и будем уменьшать её, пока она != 0
            for ( unsigned x = getmaxx(stdscr); x; x-- ) 
            {
                clear();
                mvaddstr(getmaxy(stdscr) / 2, x, str);
                refresh();
                msleep(200);
            }
        }
    
        endwin();
        return 0;
    }

    https://code-live.ru/post/ncurses-input-output/#getstr-
    Сколько хуйни вы можете найти в этом примере?

    Запостил: j123123, 04 Октября 2019

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

    • >> Возможность комментировать эту статью отключена автором. Возможно, во всем виновата её провокационная тематика или большое обилие флейма от предыдущих комментаторов.
      Ответить
    • Хуйня первая:
      #include <ncurses.h>
      Должно быть:
      #include <ncurses/ncurses.h>
      Ответить
    • Первая хуйня в хуевом макросе
      #define msleep(msec) usleep(msec*1000)
      Если сделать usleep(2 + 2) то эта хуйня раскроется в usleep(2 + 2 * 1000) что явно не то, что надо. Да и вообще на кой хер делать функциеподобный макрос с маленькой буквы? Почему эту хуйню не сделать как функцию?

      Вторая хуйня в getstr() - эта хуйня настолько же небезопасна, как и gets().
      https://linux.die.net/man/3/getstr
      Вот что пишут про int getstr(char *str) :
      > The function getstr is equivalent to a series of calls to getch, until a newline or carriage return is received (the terminating character is not included in the returned string). The resulting value is placed in the area pointed to by the character pointer str.
      Т.е. если много хуйни написать, то можно переполнить буфер и попортить память. Чтоб такой хуйни не было, можно и нужно использовать int getnstr(char *str, int n)

      Еще одна н хуйня - а на кой хер собственно нужно после вечного цикла while(true) делать endwin(); ? Цикл никогда не завершится штатным способом, так что это нахрен не надо.

      Еще одна хуйня - в статье по ссылке написано "Но функцию задержки нам придётся придётся прописывать для каждой платформы отдельно, потому что unistd.h, как и windows.h это системозависимые библиотеки.". Это верно лишь отчасти. Некоторые компиляторы предоставляют необходимые обертки, например взгляните на это:
      https://github.com/Alexpux/mingw-w64/blob/d0d7f784833bbb0b2d279310ddc6afb52fe47a46/mingw-w64-crt/misc/mingw_usleep.c

      и хедер unistd.h там тоже есть
      https://github.com/Alexpux/mingw-w64/blob/d0d7f784833bbb0b2d279310ddc6afb52fe47a46/mingw-w64-headers/crt/unistd.h#L52

      так что таким компилятором оно нормально скомпилируется и на винде, и будет это вполне нативный виндовый бинарь
      Ответить
      • не нормальный, пушо будет не под вин32ап,а под обертку и следовательно не будет без обертки работать
        Ответить
        • MinGW — это не Cygwin. MinGW, если не использовать MSYS, генерирует бинарники, которые не требуют дополнительных библиотек (типа cygwin1.dll).

          Или обёрткой ты называешь любой код из сишных библиотек? Ну тогда и printf нельзя использовать, потому что это обёртка над WriteConsoleA.
          Ответить
          • Вероятнее всего я просто тупой еблан, и конечно всё перепутал.

            Так как крусы зробят под винду? Курсы же юзают termcap, или там обертка чтобы uзать console api?
            Ответить
            • Да, в порте ncurses есть ссылка на переменные окружения TERMCAP и TERMINFO, но если их нет, то всё работает. И даже из каталога mingw никаких файлов не требуется.

              Похоже, что используется вшитое в библиотеку определение терминала, если TERMCAP и TERMINFO отсутствуют.
              Ответить
              • И какое же это определение, если conhost не умеет в esc коды?
                Ответить
                • Там хак: в исходниках есть файл ncurses/win32con/win_driver.c, который не генерирует ESC-кодов, а напрямую вызывает функции WinAPI. Из-за этого у них в TODO:
                  - Support for Terminals attached via a serial port (via terminfo)
                  - Support for networked Terminal connections (via terminfo)
                  Для всего этого говна придётся подставлять другие костыли.

                  А если бы в Винде был аналог ANSI.SYS, это всё бы не понадобилось...
                  Ответить
                  • > Support for Terminals attached via a serial port (via terminfo)
                    > Support for networked Terminal connections (via terminfo)
                    лолшто? на винде?

                    >А если бы в Винде был аналог ANSI.SYS, это всё бы не понадобилось...
                    Если бы винда была сусом (как макось, например) то вообще жопной боли в мире было бы в разы меньше.

                    Для Дейва Катлера (при всем моем уважении к NT) есть отдельный котелок под управлением VMS в аду
                    Ответить
                    • Если бы не было UNIX, то всё было бы совместимо с Виндой. Прыщебляди соснули!
                      Ответить
                      • Интересно вообще, что было бы, если бы не было unix.
                        Ответить
                        • Был бы Multics.
                          Ответить
                          • Причем тут Multics? Он накрылся еще до появления unix
                            Ответить
                            • Не знаю, помню что читал, что уникс — это попытака сделать лучше мультикс.

                              > накрылся еще до появления unix
                              Я тут напедивикил, что его последняя версия в 92 гаду вышла.
                              Ответить
                              • AT&T делали Multics, затем проект свернули, а оставшиеся чуваки сделали юникс. игра слов: мульти/юни.
                                Ответить
                              • Удивительно, что ядро системы Multics, находившееся постоянно в памяти компьютера и в те далёкие годы часто высмеивавшееся за свой размер и сложность, занимало всего 135 Килобайт кода.
                                Ответить
            • http://repo.msys2.org/mingw/sources/mingw-w64-i686-ncurses-6.0.20150627-2.src.tar.gz

              README.MinGW:
              This is work in progress, but it's in an state where one can see it
              works at least on the Windows Console.
              
              ...
              
              The TERM environment variable must be set specially to active the Windows
              console-driver.  The driver checks if TERM is set to "#win32con" (explicit
              use) or if TERM is unset or empty (implicit).
              
              ...
              
              This code requires WindowsNT 5.1 or better, which means on the client
              Windows XP or better, on the server Windows Server 2003 or better.
              
              ...
              
              All the options above are - like the whole Windows support -
              experimental.
              
              A lot is still TODO, e.g.:
              
                - Wide Character support (display is workable, but input untested)
                  The Win32Con driver should actually only use Unicode in the
                  future.
                - Thread support (locking). If using TDM toolchain this is done by
                  configuring pthreads.
                - A GUI console driver
                - Support for Terminals attached via a serial port (via terminfo)
                - Support for networked Terminal connections (via terminfo)
                - Workarounds for MinGW's filesystem access are necessary to make infocmp
                  work (though tic works).
              
              To support terminfo, we would need to have an ioctl() simulation for the
              serial and networked terminals.


              Короче, отсутствие переменной TERM — это специальный случай.
              Ответить
              • ааа, охуясе

                Так у них свои нкурсы

                > - Wide Character support
                ахааха
                Сёмаопять скажет, что прыщебляди соснуууле
                Ответить
      • >> Первая хуйня в хуевом макросе
        >> #define msleep(msec) usleep(msec*1000)

        Да, макросы — это зло.

        Кстати, если обёртку сделать как функцию с атрибутом inline, то оптимизатор уберёт лишний код.

        >> Вторая хуйня в getstr() - эта хуйня настолько же небезопасна, как и gets().

        int getnstr(char *str, int n) — это тоже немножко костыльное решение. Сколько я должен выделить байт, чтобы не обидеть пользователя? Выделю я 30 букв под ФИО, а ко мне придёт Филипп Ауреол Теофраст Бомбаст фон Гогенгейм.

        На мой взгляд нужна функция, которая сама умеет реаллоцировать место под строку, если его не хватает. Вызов realloc для маленькой строки на гигагерцовых машинах может занимать намного больше времени, чем интервал между нажатием клавиш?
        Ответить
        • >На мой взгляд нужна функция, которая сама умеет реаллоцировать место под строку
          std::string ?
          Ответить
      • В общем, #if defined(_WIN32) в этом коде — уже говно, потому что ncurses портировали только под MinGW, а там и <unistd.h> есть.

        Вот pdcurses были и под Borland C, и под MSVC, и ещё под кучу компиляторов, а за порт ncurses мало кто брался.
        Ответить
        • https://github.com/microsoft/terminal

          Только для белых людей.
          Пользователи Vista, XP и прочих 3.11 сосут хуй
          Ответить
          • А это что такое?
            Ответить
            • The Windows Terminal is a new, modern, fast, efficient, powerful, and productive terminal application for users of command-line tools and shells like Command Prompt, PowerShell, and WSL. Its main features include multiple tabs, Unicode and UTF-8 character support, a GPU accelerated text rendering engine, and custom themes, styles, and configurations.

              Понимает-ли он ансы-- хз, ывероятно нет
              Ответить
              • Тогда вообще не понимаю, зачем ты его сюда притащил и какое отношение он имеет к этой ветке обсуждения. Просто, чтобы показать, что он опенсорсный и в его кишках можно поковыряться?
                Ответить
                • Я постоянно пишу что-то не в тему, тупо чтобы повыебываться. Ты впервые заметил что-ли?

                  Сёма например эту фишку давно просёк
                  Ответить
          • Ты про поддержку ANSI-последовательностей? Так есть же ConEmu, Console2, TCC (бывший 4NT, наследник 4DOS, не путать с компилятором), которые работают на этих ваших XP.

            В Windows 3.11 консольных функций вообще нет, там консоль исключительно для запуска досовских программ. Даже под Win32s консольные программы запускаются... без консоли, т. е. в файлы писать могут, а на экран ничего не выводят. Для Windows 3.11 нужно писать отдельный эмулятор терминала, который открывает окно и рисует в нём текст (и такие эмуляторы уже существуют).

            А PDCurses не требует поддержки ESC-последовательностей, там такой же хак, как и в ncurses для MinGW.
            Ответить
            • Кстати, при запуске FAR из-под ConEmu наблюдаются странные глюки. Видимо, и FAR, и ConEmu используют какие-то грязные приёмы, и в данном сочетании они мешают друг другу.
              Ответить
              • запустил тока что conemu
                1* фар в нем работает
                2* %TERM% я не вижу
                Ответить
                • Да, ФАР в conemu запускается и даже что-то можно в нём делать. Но иногда выскакивают глюки. Я уже точно не помню, какие, потому что хлебнув дерьма, перестал запускать ФАР из-под него.

                  %TERM% нет, но conemu поддерживает какой-то набор ESC-последовательностей, типа того, который поддерживал ANSI.SYS. По крайней мере, какое-то прыщеговно при запуске из-под conemu раскрашивает экран.
                  Ответить
    • ахахаха, я надеюсб, что слип это единственное, что мешает курсесам пд виндой?
      Ответить
      • Так слип же не в коде курсесов, а в мейне, поэтому не вижу между ними связи.
        Ответить
        • как в одном файле может быть curs_set и #if defined(_WIN32) || defined(_WIN64) ?
          Ответить
          • Кстати, нужно посмотреть, были ли попытки портировать ncurses подо что-нибудь, кроме MinGW и прочих портов gcc.
            Ответить
            • В позиксе (або в SUSе) есть стандарт, на который курсы опираются.

              Это termios:
              https://en.wikipedia.org/wiki/POSIX_terminal_interface

              Он, в свою очередь, линкусется с либой termcap или terminfo.
              а та умеет читать termcap или terminfo файлы.

              Потом termios умеет двигать курсор по экрану используя ыскейп коды, которые он получает из этой либы.

              А уже поверх этого вроде работают курсы.

              В конхосте нихуя этово нет, там тока ConsoleApi.

              В досе был ansi.sys, но он давно проёбан
              Ответить
          • PDCurses есть под Borland C, MSVC, Watcom C.

            https://github.com/wmcbrine/PDCurses/blob/master/wincon/README.md

            А вот ncurses, вероятно, есть только под MinGW и подобное.
            Ответить
    • показать все, что скрытоА можете получить с клавиатуры русскую букву?

      CharToOemBuff
      Ответить
    • Ещё одна хуйня: getstr из ncurses у каждого введённого символа оставляет только семь младших битов. Если набирать символы за пределами базовой латиницы, вводится мусор.

      В общем, ненужное прыщеговно.
      Ответить
      • wgetstr?
        не, не слышал
        Ответить
        • Буква «w» в названии wgetstr означает не «wide» (в том смысле, в котором wchar_t), а «window».
          Ответить
          • Спасибо, капитан.

            Ты написал "у каждого введённого символа оставляет только семь младших битов".
            Угадай, сколько битов оставляет wgetstr ?
            Ответить
            • Ровно столько же. Оттого, что мы вводим текст не со всей консоли, а из прямоугольного подмножества («window» в терминах ncurses), битность не меняется.
              Ответить
              • А wide там нету?
                Ответить
                • Нашёл: get_wch и get_wstr принимают параметр wint_t *. Тип wint_t определён так:
                  typedef unsigned int wint_t1;


                  Так что запомни: wgetstr — это ввод из окна, get_wstr — ввод «широкого» символа, wget_wstr — ввод «широкого» символа из окна.

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

                    А ещё заметили, что в ncurses.h некоторые идентификаторы со знаком подчёркивания, а некоторые без?
                    Ответить
                    • сишник сидел за терминалом со скоростью 9600 и латенси что у твоего модема.
                      И экран у него был 80 чаров шириной.
                      Ответить
                      • Именно поэтому я за «PHP».
                        Ответить
                        • Шутило прославился тем, что очень любил шутить. Самая любимая
                          его шутка заключалась в том, что он чуть ли не после каждого слова
                          прибавлял: "Не будь я Шутило, честное слово".
                          Ответить
                          • Прекрасный пример, не будь я Мудила, честное слово.
                            Ответить
                    • В С89 было ограничение на длину идентификатора в 6 символов.
                      Ответить
                      • пруф?
                        Ответить
                      • Это на вшений идентифайр, с которым линкушеся
                        Ответить
                        • http://port70.net/~nsz/c/c89/c89-draft.html#2.2.4.1

                          > вшений идентифайр
                          А какие по твоему находятся в хедерах?
                          Ответить
                          • На внешний идентификатор ограничение задаётся линкером. Были примеры языков программирования, в которых можно было использовать длинные идентификаторы, но при линковке они обрезались, поэтому иногда случались коллизии.
                            Ответить
                  • Сишерперы бы назвали GetWideCharFromWindows
                    Именно поэтому я за «C#».
                    Ответить
                    • Да любиые виндузятники бы так назвали.

                      У них даже сысколы называются типа

                      NtCreateFile
                      Ответить
                      • Вот почему Винда иногда так тормозит. Надо заменить «Create» на «Creat», тогда всё будет работать быстрее.
                        Ответить
                        • Кстати, винда умудряется иметь пиздецки запутанную рахитектуру даже не смотря на внятные названия функций с осмысленным префиксом.

                          Отличный пример оверинжениринга.
                          Ответить
                          • показать все, что скрытоЕсли ты не врубаешься, это не значит, что и другие - тупицы.
                            Советую тебе убраться обратно, на xyz.
                            Ответить
                          • Ну, это скорее не из-за оверинжининириниринга, а из-за необходимости поддерживать говнософт, написанный двадцать с хуем лет назад. По-хорошему, половину «винапи» надо просто выбросить на помойку — но нельзя, клиенты, у которых не запускается ПО для подсчёта куриного помёта из двухтысячного года, не поймут.
                            Вот, например, все эти говно-A и говно-W функции: по-хорошему, от первых надо вообще избавиться и течь (в сисколлах и ядре, кстати, так и сделали: там теперь только UNICODE_STRING), но увы. Я, кстати, где-то в прошлом году даже кидал описание апишки, которая, по словам из документации, не рекомендуется к использованию и нужна только для поддержки 16-битного софта, лол.
                            Ответить
                            • Оверинжиниринг это именно что последствия той самой необходимости.

                              В "Windows Internals" Руссинович так прямо и пишет: хотелось поддердживать и OS/2 и DOS и POSIX и Win16 и иметь еще свой API.

                              Хотелось поддеожать и x86 и Alpha.
                              И Sockets и NetBIOS.
                              И TCP/IP и IPX/SPX и NetBUI.

                              В итоге нагородили стопицот уровней абструкции.

                              А для w16 до сих пор (бля!) есть вот такой лул3
                              https://docs.microsoft.com/en-us/windows/win32/memory/global-and-local-functions

                              LocalAlloc / GlobalAlloc достались нам в наследство от LDT / GDT из достраничной эпохи
                              Ответить
                              • поэтому я за Си и ассемблер с микроконтроллерами - там никакую хуйню поддерживать не надо, кроме той хуйни которую ты сам туда всунуть хочешь. Можно свои недотреды на прерывании от таймера накостылить, без всяких там слоев обсракций.
                                Ответить
                            • "A" вообще нужны только чтобы ты свой софт мог запутсить и на НТ и на 9х

                              на NT жеп всегда был уникод
                              Ответить
                            • Почему бы просто не использовать ту часть апи, которая нинужна? Не хочешь поддерживать свой куриный помёт на «XP» - не поддерживай.
                              Ответить
                              • Три раза перечитал твой коммент , и не понял

                                Поясни
                                Ответить
                                • Ну вот например функция RegisterCalss зачем нужна в винапи, когда есть RegisterClassEx? Чтобы говно, написанное в 1998 году могло запускаться? Так не используй RegisterClass и теки. То, что придётся писать «Ex» и задумываться что делает не-«Ex» - это правда (и что будет сбивать с толку новичка).
                                  Ответить
                                  • > Так не используй RegisterClass и теки.

                                    Я не понимаю, к кому ты обращаешься.

                                    К программе, написанной в 1998 году?
                                    Ответить
                                    • показать все, что скрытоХуйню какую-то осуждаете. Когда будет депрекация старых функций от майков, тогда и поправят. А эти рассуждения ваньки из страны четвертого мира просто IP сотрясают.
                                      Ответить
                                    • К программисту в 2019
                                      Ответить
                                      • * У программиста в 2019 году может не быть сырцов
                                        * У начальника программиста может не быть денег и желания переписывать то, что не сломалось. Он лучше будет на XP сидеть.
                                        Ответить
                • Ещё багор: есть get_wstr(wint_t *), а вот mvadd_wstr нет, вместо неё mvadd_wchstr (легко запомнить, да?) и принимает она не wint_t*, а cchar_t*. Причём у wint_t и у cchar_t может быть разная кодировка. Т. е. чтобы вывести то, что мы ввели, ещё нужно перекодировать.
                  Ответить
                  • Интересно, как люди жили до появления тагов в vi?
                    Ответить
                    • Они сажали за компьютер обезьян и компилировали всё, что наберут эти животные, пока программа не скомпилируется без ошибок, не соберётся и не пройдёт тесты.
                      Ответить
          • LPCWSTR
            Ответить
    • CentOS восьмой вышел!!
      Ответить
      • Upgrades in place are not supported nor recommended by CentOS or TUV. A backup followed by a fresh install is the only recommended upgrade path. See the Migration Guide for more information.

        Чуваки, я верно понял, или красношляпые соснули с причмоком у каноникалов?
        Ответить

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