/*File term2_0.h*/
codice:
#include<stdio.h>
#include<stdlib.h>
#include<termios.h>
#include<unistd.h>

/*SOFTWARE sotto licenza gpl (oppure diesel) e' possibile la eventuale modifica del
codice senza la cancellazione dei commenti originali*/

/****
*Versione Finale della libreria che permette di usare i colori sulla
*Console Linux
*2.0+ final relase Carlesso Cristian //corretto l'errore del cls()
*****/

/*
[2.21.05.03 relase]

aggiunto gotoxy,//sposta il cursore in posizione x,y
retard(base,n)	//aspetta un tempo definito dall' utente con 2 variabili
e delay(n).	//aspetta un tempo uguale a 100000 cicli macchina per n

>>2.01.06.03 relase nome in codice Cattaratta
aggiunto: 
set_raw()	//modo non bufferizzato e sz echo
unset_raw()	//modo bufferizzato con echo
Getch()		//getch con echo
getche()	//getch senza echo
#allora|?
versione 2.17.03.04 codename DDT
>>aggiunto:
controlli di predefinizione
Gets(stringa,n)	//legge una stringa di n caratteri(n=\0)
isNatural(stringa) //controlla se una stringa e solo numerica
randomize()	//Randomizza il random
Random(max)	//random da 1 a max
Random0(max)	//random da 0 a max
cls() piu veloce 
quella vecchia rinominata fcls()
gotoxy risistemata
Normalizzate tutte le funzioni in modo che inizino tutte con lettera Maiuscola
Aggiunto Echoset_raw();

ALL Done by Cristian Carlesso Aka Kentaromiura

aggiunta randomxy(min,max) //random da min a max

*/

/***********************How to use
Semplicemente basta mettere il codice colore
davanti ad una stringa  printf(colore"Ciao");
poi se si vuole cambiare colore basta fare cosi'
printf(colore1"ciao "colore2"Mamma!!");
ovvero dopo la prima stringa mettere il 2 codice colore
e imettere successivamente la nuova stringa.
Ogni stringa deve essere racchiusa tra apici;
I modificatori restano attivi finche' si mette
un nor o un norm.funzionano come i colori.

esistono i colori di background(sfondo)che sono preceduti da una b
e i colori di foreground(scritta):
 ------------------------------------
|  Colore  | Foreground | Background |
 ------------------------------------
| NERo     |   nero     |   bnero    |
| ROSSo    |   rosso    |   brosso   |
| VERDe    |   verde    |   bverde   |
| GIALLo   |   giallo   |   bgiallo  |
| BLu      |   blu      |   bblu     |
| MAGENTa  |   magenta  |   bmagenta |
| ACQUa    |   acqua    |   bacqua   |
| BIANCo   |   bianca   |   bbianca  |
************+++++***********************/
/*DEFiNiZiONE Del tipo Bool + true e false *//*Aggiunto un paio di controlli*/

#ifndef true
#define true 1
#endif
#ifndef True
#define True 1
#endif

#ifndef false
#define false 0
#endif

#ifndef False
#define False 0
#endif

#ifndef bool
#define bool char
#endif

#ifndef Bool
#define Bool char
#endif


/*Funzioni nuove! aggiunte*/
struct termios old_attr,new_attr;
bool modo_gia_settato=0;
void set_raw()
{if (modo_gia_settato==0){
if(tcgetattr(STDIN_FILENO,&old_attr)<0)
    {
    perror("tcgetattr");
    exit(EXIT_FAILURE);
    }
    memcpy(&new_attr,&old_attr,sizeof(struct termios));
    new_attr.c_lflag &= ~(ICANON|ECHO); /*NON CANONICAL MODE*/
/*    new_attr.c_iflag &= 0xFF; */
    if(tcsetattr(STDIN_FILENO,TCSANOW,&new_attr)<0)
	{perror("tcsetattr");
	 exit(EXIT_FAILURE);
	}
modo_gia_settato=1;
}
}


#ifndef Set_raw
#define Set_raw() set_raw()
#endif

void Echoset_raw()
{if (modo_gia_settato==0){
if(tcgetattr(STDIN_FILENO,&old_attr)<0)
    {
    perror("tcgetattr");
    exit(EXIT_FAILURE);
    }
    memcpy(&new_attr,&old_attr,sizeof(struct termios));
    new_attr.c_lflag &= ~(ICANON); /*NON CANONICAL MODE*/
/*    new_attr.c_iflag &= 0xFF; */
    if(tcsetattr(STDIN_FILENO,TCSANOW,&new_attr)<0)
	{perror("tcsetattr");
	 exit(EXIT_FAILURE);
	}
modo_gia_settato=1;
}
}

void unset_raw()
{if (modo_gia_settato==1){
if(tcsetattr(STDIN_FILENO,TCSANOW,&old_attr)<0)
    {
    perror("tcsettattr");
    exit(EXIT_FAILURE);
    }
}
modo_gia_settato=0;
}

#ifndef Unset_raw
#define Unset_raw() unset_raw()
#endif

char Getch(){
char pippo;
    set_raw();
    pippo=getchar();
    unset_raw();
    printf("%c",pippo);
    return pippo;
}

char getche(){
char pippo;
    set_raw();
    pippo=getchar();
    unset_raw();
    return pippo;
}
#ifndef Getche
#define Getche() getche()
#endif

/*Funzione nuova: GOTOXY :non piu bacata*/
void gotoxy(int X,int Y){printf("\e[%d;%dH",Y,X);}
#ifndef Gotoxy
#define Gotoxy(x,y) gotoxy(x,y)
#endif

/*Funzione nuova: DELAY*/
void delay(int t){int i;
while(t>0){
	    for (i=0;i<100000;i++);
	    t--;}
}
#ifndef Delay
#define Delay(t) delay(t)
#endif

/*Funzione nuova: RETARD*/
void retard(int t,int c){
int i;
while(t>0){
	    for (i=0;i<c;i++);
	    t--;}
}
#ifndef Retard
#define Retard(t,c) retard(t,c)
#endif

/*Funzione implementata per la gioia di fulvio*/
void Gets(char stringa[],int n){
int i=0;
while(n-1>i++){
stringa[i-1]=Getch();
if (stringa[i-1]==127){i-=2;
		      printf("\b \b");
		      }
if (stringa[i-1]=='\n'){i--;
		      break;
		}
}
printf("i-%d",i);
stringa[i]='\0';
}

/*riconosce se la stringa e' un intero(non fa il bounds control)*/
bool isNatural(char str[]){
int i;
for(i=0;;i++){
if (str[i]=='\0')return true;
if (str[i] > '9' || str[i] < '0') return false;
}
}
#ifndef Isnatural
#define Isnatural(s) isNatural(s)
#endif

/*>>aggiunto funzioni di random e randomize*/
#ifndef randomize
#define randomize() srand(time(NULL));
#endif
#ifndef Randomize
#define Randomize() randomize()
#endif

long Random(long max){
return rand()%max+1;
}/*random da 1 a max*/

long Random0(long max){
return rand()%max;
}/*random da 0 a max*/

long Randomxy(long min,long max){
return rand()%max+min;
}
/*random da min a max*/


/*Modificatori di stringa*/
#define nor  "\e[;m"
#define norm "\e[0m"/*Normale*/
#define lumi "\e[1m"/*Luminoso*/
#define sott "\e[4m"/*Sottolineato*/
#define inte "\e[5m"/*Intermittente*/
#define inve "\e[7m"/*Invertito*/
#define conc "\e[8m"/*Nascosto?*/

/*Definizione 7 colori di Backgroung*/
#define bnero "\e[40m"                /*NERO*/
#define brosso "\e[41m"               /*ROSSO*/
#define bverde "\e[42m"               /*VERDE*/
#define bgiallo "\e[43m"              /*GIALLO*/
#define bblu "\e[44m"                 /*BLU*/
#define bmagenta "\e[45m"             /*MAGENTA*/
#define bacqua "\e[46m"               /*ACQUA*/
#define bbianco "\e[47m"              /*BIANCO*/

/*Definizione 7 colori Foreground*/
#define nero "\e[30m"                 /*NERO*/
#define rosso "\e[31m"                /*ROSSO*/
#define verde "\e[32m"                /*VERDE*/
#define giallo "\e[33m"               /*GIALLO*/
#define blu "\e[34m"                  /*BLU*/
#define magenta "\e[35m"              /*MAGENTA*/
#define acqua "\e[36m"                /*ACQUA*/
#define bianco "\e[37m"               /*BIANCO*/

/**/
#define Nor  "\e[;m"
#define Norm "\e[0m"/*Normale*/
#define Lumi "\e[1m"/*Luminoso*/
#define Sott "\e[4m"/*Sottolineato*/
#define Inte "\e[5m"/*Intermittente*/
#define Inve "\e[7m"/*Invertito*/
#define Conc "\e[8m"/*Nascosto?*/

/*Definizione 7 colori di Backgroung*/
#define Bnero "\e[40m"                /*NERO*/
#define Brosso "\e[41m"               /*ROSSO*/
#define Bverde "\e[42m"               /*VERDE*/
#define Bgiallo "\e[43m"              /*GIALLO*/
#define Bblu "\e[44m"                 /*BLU*/
#define Bmagenta "\e[45m"             /*MAGENTA*/
#define Bacqua "\e[46m"               /*ACQUA*/
#define Bbianco "\e[47m"              /*BIANCO*/

/*Definizione 7 colori Foreground*/
#define Nero "\e[30m"                 /*NERO*/
#define Rosso "\e[31m"                /*ROSSO*/
#define Verde "\e[32m"                /*VERDE*/
#define Giallo "\e[33m"               /*GIALLO*/
#define Blu "\e[34m"                  /*BLU*/
#define Magenta "\e[35m"              /*MAGENTA*/
#define Acqua "\e[36m"                /*ACQUA*/
#define Bianco "\e[37m"               /*BIANCO*/
#ifndef Cls
#define Cls() printf("\e[2J\e[H")
#endif
#ifndef Fcls
#define Fcls() fprintf(stderr,"\033[2J\033[H")
#endif

/*Clear Screen!*/
#ifndef cls
#define cls() printf("\e[2J\e[H")
#endif
#ifndef fcls
#define fcls() fprintf(stderr,"\033[2J\033[H")
#endif

/**
      *  Real Programmers aren't afraid to use GOTO's.
 
      *  Real Programmers can write five-page-long DO  loops
         without getting confused.
 
      *  Real Programmers like  Arithmetic  IF  statements--
         they make the code more interesting.
 
      *  Real   Programmers   write   self-modifying   code,
         especially  if  they can save 20 nanoseconds in the
         middle of a tight loop.
 
      *  Real Programmers don't need comments--the  code  is
         obvious.
**/