diff --git a/module_03.c b/module_03.c new file mode 100644 index 0000000..b70139d --- /dev/null +++ b/module_03.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include +#include "pseudographic_font_3.h" + +// Флаг для корректного завершения +static volatile sig_atomic_t keep_running = 1; + +// Переменная для отслеживания обработчика SIGINT +static volatile int handler_set = 0; + +// Обработчик сигнала SIGINT (Ctrl+C) +static void handle_sigint(int sig) { + (void)sig; + keep_running = 0; + printf("\033[2J\033[H\033[?25h"); + fflush(stdout); + _exit(0); +} + +// Функция для вывода псевдографического времени +static void print_pseudographic_time(int hours, int mins, int secs) { + if (hours < 0 || hours > 23 || mins < 0 || mins > 59 || secs < 0 || secs > 59) { + printf("\033[H\033[1mInvalid time: %02d:%02d:%02d\033[0m\n", hours, mins, secs); + fflush(stdout); + return; + } + + char time_str[9]; + snprintf(time_str, 9, "%02d:%02d:%02d", hours, mins, secs); + + const char** chars[8]; + for (int i = 0; i < 8; i++) { + chars[i] = get_pseudographic_char_3(time_str[i]); + } + + printf("\033[H"); + for (int row = 0; row < 3; row++) { + for (int i = 0; i < 8; i++) { + if (i == 2 || i == 5) { + printf("\033[1m\033[90m%s\033[0m", chars[i][row]); + } else { + printf("\033[1m\033[37m%s\033[0m", chars[i][row]); + } + } + printf("\n"); + } + fflush(stdout); +} + +int module_03_run(const char *arg) { + if (arg == NULL || strcmp(arg, "m3") != 0) { + return 0; + } + + if (!handler_set) { + signal(SIGINT, handle_sigint); + handler_set = 1; + } + + printf("\033[?25l\n\n\n"); + fflush(stdout); + + while (keep_running) { + time_t rawtime; + struct tm *timeinfo; + + if (time(&rawtime) == (time_t)-1) { + printf("\033[H\033[1mFailed to get time\033[0m\n"); + fflush(stdout); + sleep(1); + continue; + } + timeinfo = localtime(&rawtime); + if (timeinfo == NULL) { + printf("\033[H\033[1mFailed to parse time\033[0m\n"); + fflush(stdout); + sleep(1); + continue; + } + + print_pseudographic_time(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + sleep(1); + } + + return 0; +} diff --git a/module_05.c b/module_05.c new file mode 100644 index 0000000..a8c85c9 --- /dev/null +++ b/module_05.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include +#include "pseudographic_font_5.h" + +// Флаг для корректного завершения +static volatile sig_atomic_t keep_running = 1; + +// Переменная для отслеживания обработчика SIGINT +static volatile int handler_set = 0; + +// Обработчик сигнала SIGINT (Ctrl+C) +static void handle_sigint(int sig) { + (void)sig; + keep_running = 0; + printf("\033[2J\033[H\033[?25h"); + fflush(stdout); + _exit(0); +} + +// Функция для вывода псевдографического времени +static void print_pseudographic_time(int hours, int mins, int secs) { + if (hours < 0 || hours > 23 || mins < 0 || mins > 59 || secs < 0 || secs > 59) { + printf("\033[H\033[1mInvalid time: %02d:%02d:%02d\033[0m\n", hours, mins, secs); + fflush(stdout); + return; + } + + char time_str[9]; + snprintf(time_str, 9, "%02d:%02d:%02d", hours, mins, secs); + + const char** chars[8]; + for (int i = 0; i < 8; i++) { + chars[i] = get_pseudographic_char_5(time_str[i]); + } + + printf("\033[H"); + for (int row = 0; row < 5; row++) { + for (int i = 0; i < 8; i++) { + if (i == 2 || i == 5) { + printf("\033[1m\033[90m%s\033[0m", chars[i][row]); + } else { + printf("\033[1m\033[37m%s\033[0m", chars[i][row]); + } + } + printf("\n"); + } + fflush(stdout); +} + +int module_05_run(const char *arg) { + if (arg == NULL || strcmp(arg, "m5") != 0) { + return 0; + } + + if (!handler_set) { + signal(SIGINT, handle_sigint); + handler_set = 1; + } + + printf("\033[?25l\n\n\n\n\n"); + fflush(stdout); + + while (keep_running) { + time_t rawtime; + struct tm *timeinfo; + + if (time(&rawtime) == (time_t)-1) { + printf("\033[H\033[1mFailed to get time\033[0m\n"); + fflush(stdout); + sleep(1); + continue; + } + timeinfo = localtime(&rawtime); + if (timeinfo == NULL) { + printf("\033[H\033[1mFailed to parse time\033[0m\n"); + fflush(stdout); + sleep(1); + continue; + } + + print_pseudographic_time(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + sleep(1); + } + + return 0; +} diff --git a/module_07.c b/module_07.c new file mode 100644 index 0000000..c2d61b4 --- /dev/null +++ b/module_07.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include +#include "pseudographic_font_7.h" + +// Флаг для корректного завершения +static volatile sig_atomic_t keep_running = 1; + +// Переменная для отслеживания обработчика SIGINT +static volatile int handler_set = 0; + +// Обработчик сигнала SIGINT (Ctrl+C) +static void handle_sigint(int sig) { + (void)sig; + keep_running = 0; + printf("\033[2J\033[H\033[?25h"); + fflush(stdout); + _exit(0); +} + +// Функция для вывода псевдографического времени +static void print_pseudographic_time(int hours, int mins, int secs) { + if (hours < 0 || hours > 23 || mins < 0 || mins > 59 || secs < 0 || secs > 59) { + printf("\033[H\033[1mInvalid time: %02d:%02d:%02d\033[0m\n", hours, mins, secs); + fflush(stdout); + return; + } + + char time_str[9]; + snprintf(time_str, 9, "%02d:%02d:%02d", hours, mins, secs); + + const char** chars[8]; + for (int i = 0; i < 8; i++) { + chars[i] = get_pseudographic_char_7(time_str[i]); + } + + printf("\033[H"); + for (int row = 0; row < 8; row++) { + for (int i = 0; i < 8; i++) { + if (i == 2 || i == 5) { + printf("\033[1m\033[90m%s\033[0m", chars[i][row]); + } else { + printf("\033[1m\033[37m%s\033[0m", chars[i][row]); + } + } + printf("\n"); + } + fflush(stdout); +} + +int module_07_run(const char *arg) { + if (arg == NULL || strcmp(arg, "m7") != 0) { + return 0; + } + + if (!handler_set) { + signal(SIGINT, handle_sigint); + handler_set = 1; + } + + printf("\033[?25l\n\n\n\n\n\n\n\n"); + fflush(stdout); + + while (keep_running) { + time_t rawtime; + struct tm *timeinfo; + + if (time(&rawtime) == (time_t)-1) { + printf("\033[H\033[1mFailed to get time\033[0m\n"); + fflush(stdout); + sleep(1); + continue; + } + timeinfo = localtime(&rawtime); + if (timeinfo == NULL) { + printf("\033[H\033[1mFailed to parse time\033[0m\n"); + fflush(stdout); + sleep(1); + continue; + } + + print_pseudographic_time(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + sleep(1); + } + + return 0; +} diff --git a/pseudographic_font_3.h b/pseudographic_font_3.h new file mode 100644 index 0000000..1ab4a18 --- /dev/null +++ b/pseudographic_font_3.h @@ -0,0 +1,95 @@ +#ifndef PSEUDOGRAPHIC_FONT_3_H +#define PSEUDOGRAPHIC_FONT_3_H + +// Псевдографический шрифт для цифр 0-9 и разделителя (:). +// Каждый символ представлен 3 строками по 3 символа (UTF-8). +// Используемые символы: ┌ ─ ┐ └ ┘ ┤ и пробел. + +// Определение псевдографического шрифта (3x3 символа) +static const char* font_3[11][3] = { + // 0 + { + "┌─┐", + "│ │", + "└─┘" + }, + // 1 + { + " ┌┐", + " │", + " ┘" + }, + // 2 + { + "┌─┐", + "┌─┘", + "└─┘" + }, + // 3 + { + "┌─┐", + " ─┤", + "└─┘" + }, + // 4 + { + "┌ ┐", + "└─┤", + " ┘" + }, + // 5 + { + "┌─┐", + "└─┐", + "└─┘" + }, + // 6 + { + "┌─┐", + "├─┐", + "└─┘" + }, + // 7 + { + "┌─┐", + " ┤", + " ┘" + }, + // 8 + { + "┌─┐", + "├─┤", + "└─┘" + }, + // 9 + { + "┌─┐", + "└─┤", + "└─┘" + }, + // : (разделитель) + { + " ┌┐ ", + " ├┤ ", + " └┘ " + } +}; + +// Пустой символ для некорректных входных данных +static const char* empty_char[3] = { + " ", + " ", + " " +}; + +// Функция для получения псевдографического символа по значению +const char** get_pseudographic_char_3(char c) { + if (c >= '0' && c <= '9') { + return font_3[c - '0']; + } else if (c == ':') { + return font_3[10]; + } + return empty_char; +} + +#endif diff --git a/pseudographic_font_5.h b/pseudographic_font_5.h new file mode 100644 index 0000000..e59ccfe --- /dev/null +++ b/pseudographic_font_5.h @@ -0,0 +1,119 @@ +#ifndef PSEUDOGRAPHIC_FONT_5_H +#define PSEUDOGRAPHIC_FONT_5_H + +// Псевдографический шрифт для цифр 0-9 и разделителя (:). +// Каждый символ представлен 5 строками по 5 символов (UTF-8). +// Используемые символы: ╔ ═ ╗ ╚ ╝ ╣ и пробел. + +// Определение псевдографического шрифта (5x5 символа) +static const char* font_5[11][5] = { + // 0 + { + "╔═══╗", + "║ ║", + "║ ║", + "║ ║", + "╚═══╝" + }, + // 1 + { + " ╔═╗", + " ║ ║", + " ║", + " ║", + " ═╝" + }, + // 2 + { + "╔═══╗", + " ║", + "╔═══╝", + "║ ", + "╚═══╝" + }, + // 3 + { + "╔═══╗", + " ║", + " ══╣", + " ║", + "╚═══╝" + }, + // 4 + { + "╔ ╗", + "║ ║", + "╚═══╣", + " ║", + " ╝" + }, + // 5 + { + "╔═══╗", + "║ ", + "╚═══╗", + " ║", + "╚═══╝" + }, + // 6 + { + "╔═══╗", + "║ ", + "╠═══╗", + "║ ║", + "╚═══╝" + }, + // 7 + { + "╔═══╗", + " ║", + " ══╣", + " ║", + " ╝" + }, + // 8 + { + "╔═══╗", + "║ ║", + "╠═══╣", + "║ ║", + "╚═══╝" + }, + // 9 + { + "╔═══╗", + "║ ║", + "╚═══╣", + " ║", + "╚═══╝" + }, + // : (разделитель) + { + " ╔═╗ ", + " ╚═╝ ", + " ╔═╗ ", + " ╚═╝ ", + " " + } +}; + +// Пустой символ для некорректных входных данных +static const char* empty_char[5] = { + " ", + " ", + " ", + " ", + " " +}; + +// Функция для получения псевдографического символа по значению +const char** get_pseudographic_char_5(char c) { + if (c >= '0' && c <= '9') { + return font_5[c - '0']; + } else if (c == ':') { + return font_5[10]; + } + return empty_char; +} + +#endif