From a6b879bb1e37cf1f5a19da99dae9bcd670dbe298 Mon Sep 17 00:00:00 2001 From: Alnotz <fredh0001@net-c.fr> Date: Sun, 3 Oct 2021 00:47:53 +0200 Subject: [PATCH] Version C++ sale --- WeBashCLILogo.cpp | 474 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 474 insertions(+) create mode 100644 WeBashCLILogo.cpp diff --git a/WeBashCLILogo.cpp b/WeBashCLILogo.cpp new file mode 100644 index 0000000..cc82284 --- /dev/null +++ b/WeBashCLILogo.cpp @@ -0,0 +1,474 @@ +/* Logo dynamique WeBash + * Par Alnotz ! + * Version 1.2 (31/17/2020) + */ +/* + _______________________________ + /._____________________. ._. ._.\ + / |_____________________| |_| |_| \ +/___________________________________\ +| | +| _____ _____ | +| / / / / | +| _____/ /____/ /____ | __ __ __ _ ___ +| / / | \ \ / / / / | | \\ +| /____ _____ _____/ | \ \ / / / / | | || | +| / / / / | \ \ / / / / ___ | |__// ___ ___ |__ +| _____/ /____/ /____ | \ \ / /\ / / /___\ | | \\ ___\ / | \ +| / / | \ \/ /\ \/ / | | | || / | `--, | | +| /____ _____ _____/ | \_\/ \_\/ \___/ |_|__// \___| ___/ | | +| / / / / | +| /____/ /____/ | +| | +\ / + \_________________________________/ + */ +/* g++ -Wall -Wextra -c WeBashLogo.cpp && g++ -Wall -Wextra WeBashLogo.o -o WeBashLogo */ +#include <stdio.h>//I/O en C +#include <iostream>//I/O en C++. +#include <string.h>//Caractères C. +#include <string>//Caractères C++. +#include <stdlib.h>//Fonctions complémentaires en C. +#include <unistd.h>//Non standard en C de GNU pour 'usleep()'. +#include <time.h>//Non standard en C de GNU pour 'nanousleep()'. +/* En ce qui concerne les dimensions des symboles et lettres. */ +#define LOGO_LIGNES 19 +#define LOGO_COLONNES 80 +#define LETTRES_LIGNES 19 +#define LETTRES_COLONNES 23 +#define SORTIE_LIGNES 19 +#define SORTIE_COLONNES 100 +/* Temps de pause (microsecondes). */ +#define TEMPS_L 800000 +#define TEMPS_C 200000 +#define TEMPS_TC 50000 +/* Fonction d'aide. */ +void help_info(char *commName) +{ + printf( + "Aide pour %s :\n\ + Commandes : %s [-h | --help | -v | --verbose] [SYMBOLE]\n\n\ + -h --help\t\tInformation sur les commandes.\n\n\ + -v --verbose\t\tMode bavard pour les tests. Ajouter une valeur\ + SYMBOLE affiche le symbole correspondant.\n\n\ + SYMBOLE\t\tUne des valeurs de 1 à 6 pour les 6 lettres de WeBash\ + ou 0 pour le logo initial ou encore N pour une fenêtre sans croisillon.\n", + commName,commName); +} +/* Le logo seul. */ +char logo0[LOGO_LIGNES][LOGO_COLONNES] = +{ + " _______________________________ \n", + " /._____________________. ._. ._.\\ \n", + " / |_____________________| |_| |_| \\ \n", + "/___________________________________\\\n", + "| |\n", + "|\x1b[0;31;40m _____ _____ \x1b[0m|\n", + "|\x1b[0;31;40m / / / / \x1b[0m|\n", + "|\x1b[0;31;40m _____/ /____/ /____ \x1b[0m|\n", + "|\x1b[0;31;40m / / \x1b[0m|\n", + "|\x1b[0;31;40m /____ _____ _____/ \x1b[0m|\n", + "|\x1b[0;31;40m / / / / \x1b[0m|\n", + "|\x1b[0;31;40m _____/ /____/ /____ \x1b[0m|\n", + "|\x1b[0;31;40m / / \x1b[0m|\n", + "|\x1b[0;31;40m /____ _____ _____/ \x1b[0m|\n", + "|\x1b[0;31;40m / / / / \x1b[0m|\n", + "|\x1b[0;31;40m /____/ /____/ \x1b[0m| \x1b[5;39;40m######\x1b[0;0;0m\n", + "|\x1b[0;31;40m \x1b[0m|\n", + "\\ /\n", + " \\_________________________________/ \n" +}; +/* Le logo vide. */ +char logoN[LOGO_LIGNES][LOGO_COLONNES] = +{ + " _______________________________ \n", + " /._____________________. ._. ._.\\ \n", + " / |_____________________| |_| |_| \\ \n", + "/___________________________________\\\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "\\ \x1b[5;31;40m#############################\x1b[0m /\n", + " \\_________________________________/ \n" +}; +/* La lettre 'W'. */ +char logo1[LETTRES_LIGNES][LETTRES_COLONNES] = +{ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "__ __ __\n", + "\\ \\ / / / /\n", + " \\ \\ / / / / \n", + " \\ \\ / / / / \n", + " \\ \\ / /\\ / / \n", + " \\ \\/ /\\ \\/ / \n", + " \\_\\/ \\_\\/ \n", + "\n", + "\n", + "\n", + "\n", + "\n" +}; +/* La lettre 'e'. */ +char logo2[LETTRES_LIGNES+4][LETTRES_COLONNES+4] = +{ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "__ __ __\n", + "\\ \\ / / / /\n", + " \\ \\ / / / / \n", + " \\ \\ / / / / ___ \n", + " \\ \\ / /\\ / / /___\\\n", + " \\ \\/ /\\ \\/ / | \n", + " \\_\\/ \\_\\/ \\___/\n", + "\n", + "\n", + "\n", + "\n", + "\n" +}; +/* La lettre 'B'. */ +char logo3[LETTRES_LIGNES][LETTRES_COLONNES] = +{ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " _ ___ \n", + "| | \\\\\n", + "| | ||\n", + "| |__//\n", + "| | \\\\\n", + "| | ||\n", + "|_|__//\n", + "\n", + "\n", + "\n", + "\n", + "\n" +}; +/* La lettre 'a'. */ +char logo4[LETTRES_LIGNES][LETTRES_COLONNES] = +{ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " ___ \n", + " ___\\\n", + "/ |\n", + "\\___|\n", + "\n", + "\n", + "\n", + "\n", + "\n" +}; +/* La lettre 's'. */ +char logo5[LETTRES_LIGNES][LETTRES_COLONNES] = +{ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " ___\n", + "/ \n", + "`--,\n", + "___/\n", + "\n", + "\n", + "\n", + "\n", + "\n" +}; +/* La lettre 'h'. */ +char logo6[LETTRES_LIGNES][LETTRES_COLONNES] = +{ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + "| \n", + "|__ \n", + "| \\\n", + "| |\n", + "| |\n", + "\n", + "\n", + "\n", + "\n", + "\n" +}; +void essai(int argc, char **argv, char **envp) +{ + std::cout << "=================\n===== Tests =====\n=================" << std::endl; + printf("Hello C world !\n"); + std::cout << "Hello C++ World too !" << std::endl; + std::cout << "Name : " << argv[0] << std::endl; + std::cout << "Arg. count : " << argc << std::endl; + std::cout << "Argument : "; + if(argc <= 1){std::cout << "Null";}else{std::cout << argv[argc-1];} + std::cout << std::endl; + std::cout << "\t== Terminal ==" << std::endl; + if(isatty(0)) + { + std::cout << "Current teletyper : " << ttyname(0) << std::endl; + } + else + { + std::cout << "Without teletyper." << std::endl; + } + /* Variables d'environnement. */ + int i = 0; + std::cout << "\t== Environnement envp ==" << std::endl; + for(i=0;envp[i]!=NULL;i++){std::cout << envp[i] << std::endl;} + std::cout << "\t== Environnement getenv() ==" << std::endl; + char *environ = getenv(""); + std::cout << environ << std::endl; + std::cout << "\tLogo :" << std::endl; + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logo0[i]; + } + std::cout << std::endl; + std::cout << "\t== Test ligne dynamique ==" << std::endl; + std::cout << "Que Du Teeeeeexte !" << std::endl; + usleep(500000); + std::cout << "\x1b[1A\x1b[0K" << "Juste du texte." << std::endl; + char *argument = argv[argc-1]; + /* Pour vérifier les caractères, ajouter un numéro de 1 à 6. + * La lettre 'N' correspond à une fenêtre vide, le chiffre '0' + * au logo de WeBash. + */ + std::cout << "\t== Symboles ==" << std::endl; + if(!strcmp(argument,"N")) + { + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logoN[i]; + } + } + if(!strcmp(argument,"0")) + { + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logo0[i]; + } + } + if(!strcmp(argument,"1")) + { + for(i=0;i<LETTRES_LIGNES;i++) + { + std::cout << logo1[i]; + } + } + if(!strcmp(argument,"2")) + { + for(i=0;i<LETTRES_LIGNES+4;i++) + { + std::cout << logo2[i]; + } + } + if(!strcmp(argument,"3")) + { + for(i=0;i<LETTRES_LIGNES+4;i++) + { + std::cout << logo3[i]; + } + } + if(!strcmp(argument,"4")) + { + for(i=0;i<LETTRES_LIGNES;i++) + { + std::cout << logo4[i]; + } + } + if(!strcmp(argument,"5")) + { + for(i=0;i<LETTRES_LIGNES;i++) + { + std::cout << logo5[i]; + } + } + if(!strcmp(argument,"6")) + { + for(i=0;i<LETTRES_LIGNES;i++) + { + std::cout << logo6[i]; + } + } + std::cout << std::endl; + std::cout << "=================\n=================\n=================" << std::endl; +} +void logoAnimation(void) +{ + const char *titre = "\x1b[4;31;40mWeBash\x1b[0;31;40m CLI logo\x1b[0m"; + /* La fenêtre vide. */ + std::cout << "\x1b[0J" << std::endl; + std::cout << titre << std::endl; + int i=0; + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logoN[i]; + } + std::cout << std::endl; + usleep(TEMPS_L); + /* La fenêtre avec un croisillon. */ + std::cout << "\x1b[22A\x1b[0K" << std::endl; + std::cout << titre << std::endl; + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logo0[i]; + } + std::cout << std::endl; + usleep(TEMPS_L); + /* Calque de la lettre 'W'. */ + std::cout << "\x1b[22A\x1b[0K" << std::endl; + std::cout << titre << std::endl; + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logo0[i] << "\x1b[1A\x1b[40C" << logo1[i]; + } + std::cout << "\x1b[4A\x1b[39C" << "\x1b[0K\x1b[18C\x1b[5;39;40m######\x1b[0;0;0m" << "\x1b[4B\x1b[62D"; + std::cout << std::endl; + usleep(TEMPS_C); + /* Calque de la lettre 'e'. */ + std::cout << "\x1b[22A\x1b[0K" << std::endl; + std::cout << titre << std::endl; + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logo0[i] << "\x1b[1A\x1b[40C" << logo2[i]; + } + std::cout << "\x1b[4A\x1b[39C" << "\x1b[0K\x1b[26C\x1b[5;39;40m######\x1b[0;0;0m" << "\x1b[4B\x1b[70D"; + std::cout << std::endl; + usleep(TEMPS_L); + /* Calque de la lettre 'B'. */ + std::cout << "\x1b[22A\x1b[0K" << std::endl; + std::cout << titre << std::endl; + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logo0[i]; + std::cout << "\x1b[1A\x1b[65C" << logo3[i]; + } + std::cout << "\x1b[4A\x1b[39C" << "\x1b[0K\x1b[34C\x1b[5;39;40m######\x1b[0;0;0m" << "\x1b[4B\x1b[78D"; + std::cout << std::endl; + usleep(TEMPS_C); + /* Calque de la lettre 'a'. */ + std::cout << "\x1b[22A\x1b[0K" << std::endl; + std::cout << titre << std::endl; + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logo0[i]; + std::cout << "\x1b[1A\x1b[73C" << logo4[i]; + } + std::cout << "\x1b[4A\x1b[39C" << "\x1b[0K\x1b[41C\x1b[5;39;40m######\x1b[0;0;0m" << "\x1b[4B\x1b[85D"; + std::cout << std::endl; + usleep(TEMPS_C); + /* Calque de la lettre 's'. */ + std::cout << "\x1b[22A\x1b[0K" << std::endl; + std::cout << titre << std::endl; + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logo0[i]; + std::cout << "\x1b[1A\x1b[79C" << logo5[i]; + } + std::cout << "\x1b[4A\x1b[39C" << "\x1b[0K\x1b[46C\x1b[5;39;40m######\x1b[0;0;0m" << "\x1b[4B\x1b[90D"; + std::cout << std::endl; + usleep(TEMPS_C); + /* Calque de la lettre 'h'. */ + std::cout << "\x1b[22A\x1b[0K" << std::endl; + std::cout << titre << std::endl; + for(i=0;i<LOGO_LIGNES;i++) + { + std::cout << logo0[i]; + std::cout << "\x1b[1A\x1b[84C" << logo6[i]; + } + std::cout << "\x1b[4A\x1b[38C" << "\x1b[0K\x1b[52C\x1b[5;39;40m######\x1b[0;0;0m" << "\x1b[4B\x1b[95D"; + std::cout << std::endl; + usleep(TEMPS_L); + /* Curseur clignotant effacé. */ + std::cout << "\x1b[5A\x1b[38C" << "\x1b[0K" << "\x1b[4B\x1b[95D" << std::endl; + /* Signature finale. */ + std::cout << "\t\x1b[1A\x1b[1;31;40m"; + std::cout << "\x1b[5;31;40m_\x1b[0m" << std::endl; + usleep(TEMPS_L); + const char *signature = "By Alnotz ;-)"; + int n = 0; + for(n=0;n<14;n++) + { + usleep(TEMPS_TC); + std::cout << "\t\x1b[1A\x1b[1D\x1b[" << n+1 << "C\x1b[1;31;40m"; + std::cout << signature[n] << "\x1b[5;31;40m_\x1b[0m" << std::endl; + } +} +/* Fonction principale. */ +int main(int argc, char **argv, char **envp) +{ + /* Suite d'essais si "--verbose" ou "-v" en premier argument. */ + /* Affiche d'aide si "--help" ou "-h" en premier argument. */ + if(argc > 1) + { + if((!strcmp(argv[1],"-h") | !strcmp(argv[1],"--help"))) + { + help_info(argv[0]); + exit(EXIT_SUCCESS); + } + else if((!strcmp(argv[1],"-v") | !strcmp(argv[1],"--verbose"))) + { + essai(argc, argv, envp); + exit(EXIT_SUCCESS); + } + else + { + std::cerr << argv[0] << " : Mauvaise commande. Taper \'"; + std::cerr << argv[0] << " -h\' pour l'aide." << std::endl; + exit(EXIT_FAILURE); + } + } + else//Le cas normal où WeBash est animé. + { + std::cerr << "\x07"; + logoAnimation(); + } + return EXIT_SUCCESS; +}