Загрузить файлы в «/»

This commit is contained in:
2025-05-07 19:32:26 +00:00
parent af54fc98b2
commit 7fd6c03c03
5 changed files with 195 additions and 0 deletions

49
LICENSE Normal file
View File

@ -0,0 +1,49 @@
#### 3. LICENSE
Файл с текстом лицензии MIT, стандартной для open-source проектов.
```markdown
MIT License
Copyright (c) 2025 <Grannik>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
Лицензия MIT
Copyright (c) 2025 <Grannik>
Настоящим предоставляется бесплатное разрешение любому лицу, получившему копию
данного программного обеспечения и связанных с ним документационных файлов
(далее — "Программное обеспечение"), использовать Программное обеспечение без
ограничений, включая, но не ограничиваясь, права на использование, копирование,
изменение, слияние, публикацию, распространение, сублицензирование и/или продажу
копий Программного обеспечения, а также разрешение лицам, которым Программное
обеспечение предоставляется, при соблюдении следующих условий:
Вышеуказанное уведомление об авторских правах и данное уведомление о разрешении
должны быть включены во все копии или значительные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ,
ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ
ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ В КОЕМ
СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ЛЮБЫМ ПРЕТЕНЗИЯМ,
УЩЕРБУ ИЛИ ИНОЙ ОТВЕТСТВЕННОСТИ, БУДЬ ТО В РАМКАХ ДОГОВОРА, ДЕЛИКТА ИЛИ ИНОГО,
ВОЗНИКАЮЩИМ ИЗ, В СВЯЗИ С ИЛИ В ОТНОШЕНИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ
ИСПОЛЬЗОВАНИЯ ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.

18
Makefile Normal file
View File

@ -0,0 +1,18 @@
CC = gcc
CFLAGS = -Wall -Wextra -O2
TARGET = complex_modules_clock
SOURCES = complex_modules_clock.c $(wildcard module_*.c) common.c
OBJECTS = $(SOURCES:.c=.o)
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -o $(TARGET)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJECTS) $(TARGET)

25
module_00.c Normal file
View File

@ -0,0 +1,25 @@
#include <stdio.h>
#include <string.h>
int module_00_run(const char *arg) {
if (arg == NULL || strcmp(arg, "mh") != 0) {
return 0;
}
const char *white = "\033[1;37m";
const char *gray = "\033[90m";
const char *reset = "\033[0m";
printf("Available arguments:\n");
printf(" %smh%s: %sDisplay this help message.%s\n", white, reset, gray, reset);
printf(" %sms%s: %sPrint the current date and time in a static format.%s\n", white, reset, gray, reset);
printf(" %smu%s: %sRun a dynamic clock that updates every second.%s\n", white, reset, gray, reset);
printf(" %sm3%s: %sRun a pseudographic clock (3x3 font) that updates every second.%s\n", white, reset, gray, reset);
printf(" %sm5%s: %sRun a pseudographic clock (5x5 font) that updates every second.%s\n", white, reset, gray, reset);
printf(" %sm7%s: %sRun a pseudographic clock (8x8 font) that updates every second.%s\n", white, reset, gray, reset);
// Финальный сброс форматирования
printf("\033[0m\n");
return 0;
}

36
module_01.c Normal file
View File

@ -0,0 +1,36 @@
#include <stdio.h>
#include <time.h>
#include <string.h>
#include "common.h"
int module_01_run(const char *arg) {
// Проверяем, соответствует ли аргумент ключу модуля
if (arg == NULL || strcmp(arg, "ms") != 0) {
return 0; // Аргумент не соответствует, ничего не делаем
}
// Логика модуля
time_t rawtime;
struct tm * timeinfo;
// Получаем текущее время
time(&rawtime);
timeinfo = localtime(&rawtime);
const char* season = get_season(timeinfo->tm_mon + 1);
const char* month_name = get_month_name(timeinfo->tm_mon + 1);
const char* weekday_name = get_weekday_name(timeinfo->tm_wday);
// Вывод в одну строку с отступом слева (4 пробела)
printf(" %d/%s/%s | %d/%s | %02d:%02d:%02d\n",
timeinfo->tm_year + 1900,
season,
month_name,
timeinfo->tm_mday,
weekday_name,
timeinfo->tm_hour,
timeinfo->tm_min,
timeinfo->tm_sec);
return 0;
}

67
module_02.c Normal file
View File

@ -0,0 +1,67 @@
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h> // для sleep() и usleep()
#include <signal.h> // для обработки сигналов
#include "common.h"
// Переменная для отслеживания, был ли установлен обработчик SIGINT
static volatile int handler_set = 0;
// Обработчик сигнала SIGINT (Ctrl+C)
void handle_sigint(int sig) {
(void)sig; // Подавляем предупреждение о неиспользуемом параметре
// Показываем курсор обратно и делаем перенос строки
printf("\033[?25h\n");
fflush(stdout);
// Выход из программы
_exit(0);
}
int module_02_run(const char *arg) {
// Проверяем, соответствует ли аргумент ключу модуля
if (arg == NULL || strcmp(arg, "mu") != 0) {
return 0; // Аргумент не соответствует, ничего не делаем
}
// Устанавливаем обработчик сигнала SIGINT только один раз
if (!handler_set) {
signal(SIGINT, handle_sigint);
handler_set = 1;
}
// Скрываем курсор
printf("\033[?25l");
fflush(stdout);
// Основной цикл
while (1) {
time_t rawtime;
struct tm *timeinfo;
// Получаем текущее время
time(&rawtime);
timeinfo = localtime(&rawtime);
const char* season = get_season(timeinfo->tm_mon + 1);
const char* month_name = get_month_name(timeinfo->tm_mon + 1);
const char* weekday_name = get_weekday_name(timeinfo->tm_wday);
// Возвращаем курсор в начало строки
printf("\r %d\033[90m/\033[0m%s\033[90m/\033[0m%s \033[90;1m|\033[0m %d\033[90m/\033[0m%s \033[90;1m|\033[0m %02d\033[90m:\033[0m%02d\033[90m:\033[0m%02d",
timeinfo->tm_year + 1900,
season,
month_name,
timeinfo->tm_mday,
weekday_name,
timeinfo->tm_hour,
timeinfo->tm_min,
timeinfo->tm_sec);
fflush(stdout);
sleep(1); // Спим одну секунду
}
return 0;
}