diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5568e2c --- /dev/null +++ b/Makefile @@ -0,0 +1,33 @@ +ARCH ?= x86 +CC := gcc +ifeq ($(ARCH),arm64) +CC := aarch64-linux-gnu-gcc +endif + +CFLAGS += -Wall -Wextra -O2 -flto=auto -ffunction-sections -fdata-sections -Iinclude -MMD -MP + +LDFLAGS += -static -flto=auto -O2 -Wl,--gc-sections -s +LDLIBS := -lreadline -ltinfo + +B := build/$(ARCH) +SRCDIRS := src ant_bin +SRC := $(shell find $(SRCDIRS) -name "*.c") +OBJ := $(patsubst %.c,$(B)/%.o,$(SRC)) + +all: $(B)/ant_sh + +$(B)/ant_sh: $(OBJ) + $(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) + +$(B)/%.o: %.c + @mkdir -p $(@D) + $(CC) $(CFLAGS) -c $< -o $@ + +run: + ./build/x86/ant_sh + +clean: + rm -rf build + +.PHONY: all clean analyze +-include $(OBJ:.o=.d) diff --git a/ant_bin/antf.c b/ant_bin/antf.c new file mode 100644 index 0000000..2311fd3 --- /dev/null +++ b/ant_bin/antf.c @@ -0,0 +1,19 @@ +#include "moroz.h" +#include "ANTbin.h" + +int ANTbin_antf(char **args) { + (void)args; + prt(stderr, "- ANTFetch 0.6\n"); + prt(stderr, " .--. \n"); + prt(stderr, " |o_o | \n"); + prt(stderr, " |:_/ | \n"); + prt(stderr, " // \\\\ \n"); + prt(stderr, " (| |) \n"); + prt(stderr, " /'\\_ _/`\\ \n"); + prt(stderr, " \\___)=(___/ \n"); + prt(stderr, "- ANTarktida Shell "ANT_VER"\n"); + prt(stderr, "- MoRoZ "ANT_BIN_VER"\n"); + prt(stderr, "- GNU/Linux "); + system("uname -r"); + return 0; +} diff --git a/ant_bin/help.c b/ant_bin/help.c new file mode 100644 index 0000000..d690c41 --- /dev/null +++ b/ant_bin/help.c @@ -0,0 +1,13 @@ +#include "moroz.h" +#include "ANTbin.h" + +int ANTbin_help(char **args) { + (void)args; + prt(stderr, "\n- ANTbin v"ANT_BIN_VER"\n"); + prt(stderr, "- MoRoZ v"MOROZ_VER"\n\n"); + prt(stderr, "The Command:\n"); + prt(stderr, "- exit\n"); + prt(stderr, "- ver\n"); + prt(stderr, "- antf\n\n"); + return 0; +} diff --git a/ant_bin/ptest.c b/ant_bin/ptest.c new file mode 100644 index 0000000..e2dd265 --- /dev/null +++ b/ant_bin/ptest.c @@ -0,0 +1,16 @@ +#include "ANTbin.h" +#include "moroz.h" + +int ANTbin_ptest(char **args) { + (void)args; + prt(stderr, TXT_RED "TEST\n"); + prt(stderr, TXT_BLUE "TEST\n"); + prt(stderr, TXT_YELLOW "TEST\n"); + prt(stderr, TXT_GREEN "TEST\n\n"); + + MRZ_CFILE("test.mrz"); + MRZ_CDIR("test"); + + prt(stderr, "\n"); + return 0; +} diff --git a/ant_bin/ver.c b/ant_bin/ver.c new file mode 100644 index 0000000..b7a0d43 --- /dev/null +++ b/ant_bin/ver.c @@ -0,0 +1,8 @@ +#include "moroz.h" +#include "ANTbin.h" + +int ANTbin_ver(char **args) { + (void)args; + prt(stderr, TXT_CYAN "ANTarktida Shell " TXT_RESET ANT_VER " \n"); + return 0; +} diff --git "a/ant_bin/\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260\321\206\320\270\321\217/Moroz_\320\272\320\276\320\274\320\260\320\275\320\264\321\213.txt" "b/ant_bin/\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260\321\206\320\270\321\217/Moroz_\320\272\320\276\320\274\320\260\320\275\320\264\321\213.txt" new file mode 100644 index 0000000..3bb3a9e --- /dev/null +++ "b/ant_bin/\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260\321\206\320\270\321\217/Moroz_\320\272\320\276\320\274\320\260\320\275\320\264\321\213.txt" @@ -0,0 +1,40 @@ +Здравствуй ! +Это спикос всех команд библиотеки Мороз (MoRoZ) +Ну и во всех программах обезательно надо + +#include "moroz.h" + +Ну а теперь к списку: + +prt(stderr, TXT_PRM "ТВОЙ ТЕКСТ\n" TXT_RESET); +/* prt это printf (или же fprintf). */ + +А теперь что за TXT_PRM ? Ну скажу что такой команды НЕТУ, то это простой пример. +Вот список всех TXT параметров: + +TXT_RESET /* Сброс всех стилей (И еще желательно его всегда ставить в конце) */ + +TXT_BOLD /* Жирный или же Яркий */ +TXT_DIM /* Тусклый */ +TXT_ITALIC /* Курсив */ +TXT_UNDERLINE /* Подчёркнутый */ +TXT_BLINK /* Мигающий */ +TXT_REVERSE /* Инверсия */ +TXT_HIDDEN /* Скрытый */ +TXT_STRIKE /* Перечёркнутый */ + +TXT_RED /* Красный */ +TXT_GREEN /* Зеленный */ +TXT_YELLOW /* Желтый */ +TXT_BLUE /* Синий */ +TXT_PURPLE /* Фиолетовый */ +TXT_CYAN /* Сине-зеленый */ +TXT_WHITE /* Белый */ + +TXT_BG_RED /* Фоновый красный */ +TXT_BG_GREEN /* Фоновый зеленный */ +TXT_BG_YELLOW /* Фоновый желтый */ +TXT_BG_BLUE /* Фоновый синий */ +TXT_BG_PURPLE /* Фоновый фиолетовый */ +TXT_BG_CYAN /* Фоновый сине-зеленый */ +TXT_BG_WHITE /* Фоновый белый */ diff --git "a/ant_bin/\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260\321\206\320\270\321\217/\320\230\320\275\321\201\321\202\321\200\321\203\320\272\321\206\320\270\321\217_\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\262\320\275\321\203\321\202\321\200\320\270\320\275\320\265\320\271_\320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274\321\213_\320\264\320\273\321\217_ANTbin.txt" "b/ant_bin/\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260\321\206\320\270\321\217/\320\230\320\275\321\201\321\202\321\200\321\203\320\272\321\206\320\270\321\217_\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\262\320\275\321\203\321\202\321\200\320\270\320\275\320\265\320\271_\320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274\321\213_\320\264\320\273\321\217_ANTbin.txt" new file mode 100644 index 0000000..23dda6d --- /dev/null +++ "b/ant_bin/\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260\321\206\320\270\321\217/\320\230\320\275\321\201\321\202\321\200\321\203\320\272\321\206\320\270\321\217_\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\262\320\275\321\203\321\202\321\200\320\270\320\275\320\265\320\271_\320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274\321\213_\320\264\320\273\321\217_ANTbin.txt" @@ -0,0 +1,68 @@ +Здравствуй! +Это инструкция по созданию программы для внутренней базы ANTbin для Антарктида Шелл (Antarktida Shell). +Так как АНТ Шелл написан на Си, то тебе, товарищ, тоже надо знать Си. + +Ну что ж, смотри... + +Для начала перейди в папку исходников АНТ Шелл, в директорию ant_bin, и там создай файл "PROGA.c" (Обязательно называть программу латиницей, а то компилятор GCC откажется её компилировать). +В самой программе у тебя должно быть примерно по такому шаблону: + +#include /* <-- ОБЯЗАТЕЛЬНО!!! */ +#include "config.h" // Нужно, если ты используешь макросы или спец. функции АНТ Шелл'а +#include "ANTbin.h" /* <-- ОБЯЗАТЕЛЬНО!!! */ +// #include <ваши_библиотеки.h> // Необязательно + +/* Тут может быть что угодно: локальные макросы, функции, переменные. Никто тебе не запрещает. */ + +/* PROGA — то есть твоё название программы */ +int ANTbin_PROGA(char **args) { + + /* Ваша основная программа... */ + + (void)args; + return 0; +} + + +Когда ты написал свою программу, её нужно «зарегистрировать» в ANTbin, то есть указать в заголовке. +Для начала зайди в Antarktida_Shell/include/ANTbin.h +И добавь туда объявление: + +/* PROGA — то есть твоё название программы */ +int ANTbin_PROGA(char **args); + + +Затем зайди в Antarktida_Shell/src/ANTbin.c +И добавь запись в массив: + +/* Сначала обязательно убедись, что ты добавляешь свою прогу внутри +const ANTbin_t ANTbin[] = {... */ + +/* PROGA — то есть твоё название программы */ +{ "PROGA", ANTbin_PROGA }, + +/* И да! Важно: добавлять нужно ДО терминатора массива: + +{ NULL, NULL } +}; + +*/ + +Ну, вроде всё... +А теперь всё это дело скомпилируем. + +Для начала убедись, что у тебя в GNU/Linux (или другой Unix-подобной ОС, например GNU Hurd; macOS не рекомендуется) есть компилятор GCC и утилита make — без них никак. Clang или иные компиляторы для Си лично я КРАЙНЕ не рекомендую. + +Дальше в терминале нужно ввести простую команду: + +make + +Только нужно обязательно находиться в директории исходников АНТ Шелл'а. +После успешной сборки запусти: + +./build/x86/ant_sh + +и внутри самого АНТ Шелл'а уже проверяй свою программу. + + +Удачи вам! И спасибо, что выбрали развивать Антарктида Шелл (Antarktida Shell) вместе! diff --git a/include/ANTbin.h b/include/ANTbin.h new file mode 100644 index 0000000..ecc6d3a --- /dev/null +++ b/include/ANTbin.h @@ -0,0 +1,21 @@ +#ifndef ANTBIN_H +#define ANTBIN_H + +typedef int (*ANTbin_fn)(char **args); + +typedef struct { + const char *name; + ANTbin_fn fn; +} ANTbin_t; + +extern const ANTbin_t ANTbin[]; + +ANTbin_fn ANTbin_find(const char *name); + +int ANTbin_ver(char **args); +int ANTbin_help(char **args); +int ANTbin_antf(char **args); +int ANTbin_ptest(char **args); + + +#endif diff --git a/include/config.h b/include/config.h new file mode 100644 index 0000000..ecb6a8a --- /dev/null +++ b/include/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#define ANT_VER "PRE-Alpha 0.5.2" +#define ANT_BIN_VER "0.4" +#define MAX_ARGS 64 + +#endif diff --git a/include/moroz.h b/include/moroz.h new file mode 100644 index 0000000..c16ac8f --- /dev/null +++ b/include/moroz.h @@ -0,0 +1,55 @@ +#ifndef MOROZ_H +#define MOROZ_H + +#define MOROZ_VER "0.2" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" + +#define TXT_RESET "\033[0m" /* Сброс всех стилей */ + +#define TXT_BOLD "\033[1m" /* Жирный или же Яркий */ +#define TXT_DIM "\033[2m" /* Тусклый */ +#define TXT_ITALIC "\033[3m" /* Курсив */ +#define TXT_UNDERLINE "\033[4m" /* Подчёркнутый */ +#define TXT_BLINK "\033[5m" /* Мигающий */ +#define TXT_REVERSE "\033[7m" /* Инверсия */ +#define TXT_HIDDEN "\033[8m" /* Скрытый */ +#define TXT_STRIKE "\033[9m" /* Перечёркнутый */ + +#define TXT_RED "\033[0;31m" /* Красный */ +#define TXT_GREEN "\033[0;32m" /* Зеленный */ +#define TXT_YELLOW "\033[0;33m" /* Желтый */ +#define TXT_BLUE "\033[0;34m" /* Синий */ +#define TXT_PURPLE "\033[0;35m" /* Фиолетовый */ +#define TXT_CYAN "\033[0;36m" /* Сине-зеленый */ +#define TXT_WHITE "\033[0;37m" /* Белый */ + +#define TXT_BG_RED "\033[41m" /* Фоновый красный */ +#define TXT_BG_GREEN "\033[42m" /* Фоновый зеленный */ +#define TXT_BG_YELLOW "\033[43m" /* Фоновый желтый */ +#define TXT_BG_BLUE "\033[44m" /* Фоновый синий */ +#define TXT_BG_PURPLE "\033[45m" /* Фоновый фиолетовый */ +#define TXT_BG_CYAN "\033[46m" /* Фоновый сине-зеленый */ +#define TXT_BG_WHITE "\033[47m" /* Фоновый белый */ + +#define prt(stream, ...) fprintf(stream, __VA_ARGS__) + +void MRZ_CFILE(const char *filename); +#define MRZ_CFILE(filename) MRZ_CFILE(filename) + +void MRZ_CDIR(const char *dirname); +#define MRZ_CDIR(dirname) MRZ_CDIR(dirname) + + +#endif diff --git a/src/ANTbin.c b/src/ANTbin.c new file mode 100644 index 0000000..131d14f --- /dev/null +++ b/src/ANTbin.c @@ -0,0 +1,17 @@ +#include +#include "ANTbin.h" + +const ANTbin_t ANTbin[] = { + { "ver", ANTbin_ver }, + { "help", ANTbin_help }, + { "antf", ANTbin_antf }, + { "ptest", ANTbin_ptest }, + { NULL, NULL } +}; + +ANTbin_fn ANTbin_find(const char *name) { + for (int i = 0; ANTbin[i].name != NULL; i++) + if (strcmp(ANTbin[i].name, name) == 0) + return ANTbin[i].fn; + return NULL; +} diff --git a/src/init.c b/src/init.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/init.c diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..0d1b333 --- /dev/null +++ b/src/main.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "ANTbin.h" + +char *usr_name = "PIN"; + +char **parse_line(char *line) { + char **args = malloc(MAX_ARGS * sizeof(char *)); + + if (args == NULL) { + perror("ant_sh: malloc failed"); + return NULL; + } + + int i = 0; + char *token = strtok(line, " \t\n"); + while (token != NULL && i < MAX_ARGS - 1) { + args[i++] = token; + token = strtok(NULL, " \t\n"); + } + args[i] = NULL; + return args; +} + +int main(void) { + char prompt[128]; + + snprintf(prompt, sizeof(prompt), "\033[1;36m%s@ant_sh -> \033[0m", usr_name); + + while (1) { + + char *line = readline(prompt); + + if (line == NULL) { + fprintf(stderr, "\033[1;36m\nDosvidanie...\033[0m\n"); + break; + } + + if (*line == '\0') { + free(line); + continue; + } + + add_history(line); + + char **args = parse_line(line); + if (args == NULL || args[0] == NULL) { + if (args) free(args); + continue; + } + + if (strcmp(args[0], "sys") == 0) { + if (args[1]) system(args[1]); + free(args); + free(line); + continue; + } + + ANTbin_fn fn = ANTbin_find(args[0]); + if (fn) { + fn(args); + free(args); + free(line); + continue; + } + + if (strcmp(args[0], "exit") == 0) { + fprintf(stderr, "\033[1;36mDosvidanie...\033[0m\n"); + free(args); + free(line); + break; + } + + pid_t pid = fork(); + if (pid == 0) { + execvp(args[0], args); + perror("ant_sh"); + _exit(127); + } else if (pid > 0) { + int status; + waitpid(pid, &status, 0); + } + + free(args); + free(line); + } + + return 0; +} diff --git a/src/moroz/moroz.c b/src/moroz/moroz.c new file mode 100644 index 0000000..74388e6 --- /dev/null +++ b/src/moroz/moroz.c @@ -0,0 +1,29 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "moroz.h" + +void MRZ_CFILE(const char *filename) { + int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0644); + + if (fd != -1) { + close(fd); + } else { + fprintf(stderr, TXT_RED "ERROR !\n" TXT_RESET); + } +} + +void MRZ_CDIR(const char *dirname) { + if (mkdir(dirname, 0755) != 0) { + prt(stderr, TXT_RED "ERROR !\n" TXT_RESET); + } +} +