#include <unistd.h>
// #include <termios.h>
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
#define raport_major_version 0
#define raport_minor_version 7
#define raport_patchlevel 4


int errno;

void vitun_handleri (int huora)
{
  //puts("\x1b[0;37m\n");
  printf("\n\nloppu!huora=%d\n",huora);
  exit(0);
}

void pakko_olla_erikseen_kun_toi_kutsuu_exittia (void)
{
  puts("\x1b[0;37m\n");
}

void my_term_to_rawmode (void)
{
/*  struct termios myterm;
  tcgetattr ( 0, &myterm );
  myterm.c_lflag &= ~(ECHO|ECHONL|ICANON);
  tcsetattr ( 0, TCSAFLUSH, &myterm ); */
}

int my_input_line (char buf[], int i = 0)
{
	for(;;) {
	  //		char c; 
	  //	read (0, &c, 1);
	  //	buf[i++] = c;
		char c = buf [i++] = getchar();
		switch (c) {
			case '\n': buf[i] = 0; return i;
			case 8: i-=2; if (i < 0) i = 0;
		}
	  //	putchar (c);
		if (i > 74) {
			buf[i] = 0;
			int sav = i; 
			while (buf[i] != ' ' && i > 0) i--;
			if (i <= 0) return sav;
			else return i;
		}
	}
}

void my_gettimestr (char buf[])
{
	struct timeb temp1;
	ftime (&temp1);
	char *temp2 = ctime (&(temp1.time));
	int i;
	for (i = 0; temp2[i] != '\n'; i++) buf[i] = temp2[i];
	buf[i] = 0;
}

FILE *report;

int main (int argc, char *argv[])
{
  int weirdo,pilvimode=0;
  signal(SIGINT, vitun_handleri);
  atexit(pakko_olla_erikseen_kun_toi_kutsuu_exittia);

	if (argc > 1) {
		if(!strcmp(argv[1],"-PILVI") || !strcasecmp(argv[1], "--pilvi")) {
			printf("\n[0;32mlegalize cannabis! - www.brainlez.org for maximum joy joy joy joy happy joy"); 
			pilvimode=1;       
			report = fopen ("report.txt", "a");
	  } else report = fopen (argv[1], "a");
	}
  if (argc == 1) report = fopen ("report.txt", "a");
  if (report == 0) {
    printf("virrhe %d:",errno);
    switch(errno) {
			case E2BIG: printf(" Arg listz too longz! - Taist. listat liian pitkuloita\n"); break;
			case EACCES: printf(" Permission deniedz! - Ei ois oikkaa niinQ tonne..\n"); break;
   		case EAGAIN: printf(" Res0urcEs tEmp0rAl1ly unAvAilAblEz! - Nyt on breikki, ei voi kyeta resursseja handlailla\n"); break;
  		case EBADF: printf(" b4D f1lE di5krp1t0rZ! - paha juttu\n"); break;
  		case EBUSY: printf(" rEs0urcE bUzY! - apuapaeae situation!\n"); break;
  	 	case ECHILD: printf(" n0 cH1lD pr0cEsZ - ei beibsoja ylaosattomissa\n"); break;
  	 	case EDEADLK: printf(" y0 mU7haF4|<3N bI1I4tzz!\n\n  I\n||||,\n""""""""\nREz0rZE dEAdl0k f4G3n AV0ID3ddDD!!! - VITTU JEE!\n"); break;
  	 	case EDOM: printf(" d0m41n eRr0r! - toimialuetoiminimi virhe\n"); break;
  		case EFAULT: printf(" bad address vittu! - paha osote, fuck!\n"); break;
  		case EFBIG: printf(" file too lArge!! - tiedosto ihan liian iso, ei mahdu ei mahdu arrgh sattuu!\n"); break;
  		case EINVAL: printf(" invalid argument! - ei tossa taas ollut oikein pointtia \n"); break;
  		case EIO: printf(" io err0r! - ii oo ii oo ii oo virrhe\n"); break;
  		case EISDIR: printf(" file is a dirEktory! - tiedosto on kansio\n"); break;
  		case ENAMETOOLONG: printf(" filE namE to0 lonG! - liian pitkä tiedoston nimi, ei mahtus oikee.\n"); break;
  		case ENFILE: printf(" too many open system f1lEz! - liikaa sydeemifilejä auki.\n"); break;
  		case ENOMEM: printf(" not enough *space* *tweek* *space* *space* - ei o avaruutta tarpeeks\n"); break;
  		case ENOSPC: printf(" no space *left* *thud* *hihihi* on /dev/ice - avarruuuus loppuuu\n"); break;
  		case ENOSYS: printf(" function _not_ implemented. - toimintoa ei ole implementoitu\n"); break;
  		case ENXIO: printf(" no such device or address. - tommosta vänkyrää tai osotetta ei oikee o.\n"); break;
  		case EPERM: printf(" operation n0t pErmIttEd - operaatiolle ei nyt sais tota lupaa, et me dokaa siitä.\n"); break;
  		case EROFS: printf(" read-only fs - tää on joku lukupäävirhe, osta uus kovalevy\n"); break;
  		case ESPIPE: printf(" invalid f1lE sEEk!!1 - problematika teknika\n"); break;
  	} return(errno);	
  } //	my_term_to_rawmode();
	for (;;) {
		char buf[100];
		#ifndef __SMP__		
		printf ("\n\n[1;37mbC!report[1;32m%d.%d.%d [0;37m(c) 1999 [1;37mbrainlez c! [0;37m- read [1;37mCHANGES[0;37m for complete credits.\nKirjoita nimesi:\n",
						 raport_major_version,raport_minor_version,raport_patchlevel);
		#else
		printf ("\n\n[1;37mbC!report[1;32m%d.%d.%d[1;31m SMP VERSION [0;37m(c) 1999 [1;37mbrainlez c!\n [0;37m- read [1;37mCHANGES[0;37m for complete credits.\nKirjoita nimesi:\n",
						 raport_major_version,raport_minor_version,raport_patchlevel);
		#endif
		weirdo=my_input_line (buf,0);
		if (weirdo>2) {
			fprintf (report, "\n\n-------- %s", buf);
			my_gettimestr (buf);
			fprintf (report, "-- %s --\n\n", buf);
			puts ("Kirjoita juttusi [1;37m([0;37mtyhj&auml; linja lopettaa[1;37m)[0;37m:");
			int stpos = 0;
			do {
				int loppu = my_input_line (buf, stpos);
				stpos = 0;
				if (buf[loppu]) {
					buf[loppu++] = 0;
					fprintf (report, "%s\n", buf);
					while ((buf[stpos] = buf[loppu+stpos])) stpos++;
			  	//	fputs (buf, stdout);
				} else fputs (buf, report);
			} while (buf[0] != '\n');
			puts ("[H[2JKiiiiitos. Thank you. Taxi mykked.");
			if (pilvimode) { printf("\n[0;32m  _\\|/_ legalize it _\\|/_"); }
			my_gettimestr (buf);
			fprintf (report, "-- %s --\n\n", buf);
			fflush (report); 
		}
	}
}



















