- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 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;
}
#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 это системозависимые библиотеки.". Это верно лишь отчасти. Некоторые компиляторы предоставляют необходимые обертки, например взгляните на это:
и хедер unistd.h там тоже есть
так что таким компилятором оно нормально скомпилируется и на винде, и будет это вполне нативный виндовый бинарь
Или обёрткой ты называешь любой код из сишных библиотек? Ну тогда и printf нельзя использовать, потому что это обёртка над WriteConsoleA.
Похоже, что используется вшитое в библиотеку определение терминала, если TERMCAP и TERMINFO отсутствуют.
- Support for Terminals attached via a serial port (via terminfo)
- Support for networked Terminal connections (via terminfo)
Для всего этого говна придётся подставлять другие костыли.
А если бы в Винде был аналог ANSI.SYS, это всё бы не понадобилось...
> накрылся еще до появления unix
Я тут напедивикил, что его последняя версия в 92 гаду вышла.
README.MinGW:
Короче, отсутствие переменной TERM — это специальный случай.
>> #define msleep(msec) usleep(msec*1000)
Да, макросы — это зло.
Кстати, если обёртку сделать как функцию с атрибутом inline, то оптимизатор уберёт лишний код.
>> Вторая хуйня в getstr() - эта хуйня настолько же небезопасна, как и gets().
int getnstr(char *str, int n) — это тоже немножко костыльное решение. Сколько я должен выделить байт, чтобы не обидеть пользователя? Выделю я 30 букв под ФИО, а ко мне придёт Филипп Ауреол Теофраст Бомбаст фон Гогенгейм.
На мой взгляд нужна функция, которая сама умеет реаллоцировать место под строку, если его не хватает. Вызов realloc для маленькой строки на гигагерцовых машинах может занимать намного больше времени, чем интервал между нажатием клавиш?
Вот pdcurses были и под Borland C, и под MSVC, и ещё под кучу компиляторов, а за порт ncurses мало кто брался.
В Windows 3.11 консольных функций вообще нет, там консоль исключительно для запуска досовских программ. Даже под Win32s консольные программы запускаются... без консоли, т. е. в файлы писать могут, а на экран ничего не выводят. Для Windows 3.11 нужно писать отдельный эмулятор терминала, который открывает окно и рисует в нём текст (и такие эмуляторы уже существуют).
А PDCurses не требует поддержки ESC-последовательностей, там такой же хак, как и в ncurses для MinGW.
%TERM% нет, но conemu поддерживает какой-то набор ESC-последовательностей, типа того, который поддерживал ANSI.SYS. По крайней мере, какое-то прыщеговно при запуске из-под conemu раскрашивает экран.
https://github.com/wmcbrine/PDCurses/blob/master/wincon/README.md
А вот ncurses, вероятно, есть только под MinGW и подобное.
CharToOemBuff
В общем, ненужное прыщеговно.
Так что запомни: wgetstr — это ввод из окна, get_wstr — ввод «широкого» символа, wget_wstr — ввод «широкого» символа из окна.
Правда, легко запомнить, в какой позиции буква «w» что означает? Не то, что виндоблядские и макоблядские функции с длинными именами.
А ещё заметили, что в ncurses.h некоторые идентификаторы со знаком подчёркивания, а некоторые без?
> вшений идентифайр
А какие по твоему находятся в хедерах?
Советую тебе убраться обратно, на xyz.
Вот, например, все эти говно-A и говно-W функции: по-хорошему, от первых надо вообще избавиться и течь (в сисколлах и ядре, кстати, так и сделали: там теперь только UNICODE_STRING), но увы. Я, кстати, где-то в прошлом году даже кидал описание апишки, которая, по словам из документации, не рекомендуется к использованию и нужна только для поддержки 16-битного софта, лол.
Уёбище, пэсдуй обратно, на xyz
На XYZ, гость.
https://www.datalounge.com/thread/14382637-what-is-the-psychological-need-to-suck-a-man-s-cock-