#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>

FILE *soubor;
enum {BUFF_MAX=82};			//sirka obrazovky+2
char Buffer[BUFF_MAX]="";
int xBuffer=0, sirka=27;	//sirka zarovnani+2
int konec;					//kam saha tistena cast

void put(char a){
	putc(a, stdout);
};

void Left_align(char *string, int celkem_mezer){	//vypisuje radek zarovnany doleva
	printf("%s", string);
};

void Right_align(char *string, int celkem_mezer){	//vypisuje radek zarovnany doprava
	int chyby=(sirka-2)-strlen(string);
	for (int i=0;i<chyby;i++) put(' ');
	printf("%s", string);
};

void Center_align(char *string, int celkem_mezer){	//vypisuje radek zarovnany doprostred
	int chyby=(sirka-2)-strlen(string);
	for (int i=0;i<chyby/2;i++) put(' ');
	printf("%s", string);
};

void Justify_align(char *string, int celkem_mezer){	//vypisuje radek zarovnany do bloku
	int delka=strlen(string);
	int chyby=(sirka-2)-delka;
	int i=0, kolikata=0, kolik;
	while (string[i]){
		if (string[i]==' '){	//je treba rozpalit
			kolikata++;
			kolik=kolikata*chyby/celkem_mezer;
			kolik+=1-(kolikata-1)*chyby/celkem_mezer;
			for(;kolik>0;kolik--) put(string[i]);
		}else{				//nemezera se jen vypisuje
			put(string[i]);
		};
		i++;
	};
};


void Rozpal(char *string, int celkem_mezer){	//vytiskne radku dle nastaveneho zarovnani
	if (Buffer[konec-1]=='\n'){			//(xBuffer<sirka-1)
		Left_align(string,celkem_mezer);
		printf("\n");
	}
	else {
		Justify_align(string, celkem_mezer);
		if (sirka<BUFF_MAX) printf("\n");
	};
};

void Tisk(){	//spocita mezery, vypise radek a zbytek sesune
	int mezer=0, zacatek=0, index=0;
	char k;	//posledni znak pri preteceni

	konec=0;
	while (Buffer[zacatek]==' ') zacatek++;			//najdi prvni nemezeru
	index=zacatek;
	while (Buffer[index]!=0){					//dokud neni konec bufferu
		if (Buffer[index]==' ') {
			mezer++;	//spocitej mezery
			konec=index;
		};
		index++;
	};

	if ((konec==0) || (Buffer[konec]==0)){	//pokud je to konec bufferu
		xBuffer=1;							//tak to jen vysyp
		k=Buffer[sirka-2];
		Buffer[sirka-2]=0;
		Rozpal(Buffer+zacatek, mezer-1);
		Buffer[0]=k;
		Buffer[1]=0;
	}
	else {									//jinak to jeste sesun
		Buffer[konec]=0;
		Rozpal(Buffer+zacatek,mezer-1);
		xBuffer-=konec+1;
		index=0;
		while (Buffer[++konec]) Buffer[index++]=Buffer[konec];
		Buffer[xBuffer]=0;
	};
};

/*************
Nacte ze souboru tolik znaku kolik se vejde do bufferu, pokud jich tam jiz tolik neni nacte jen ty.
*************/
void Napln(){
	int i;
	i=fread(Buffer+xBuffer,1,sirka-xBuffer-1,soubor);//dopln buffer o to co jde
	xBuffer+=i;
	
	if(xBuffer<sirka-1) {
		Buffer[xBuffer]=' ';
		Buffer[1+xBuffer]=0;
	};
};

/*************
Vypise soubor, jehoz jmeno dostane jako argument zarovnany do bloku na stdout.
*************/
void Vypis(char *sFile){
	if (soubor=fopen(sFile, "r")){	//otevri
		Napln();
		while (xBuffer>0){
			Tisk();
			Napln();
		};
		//fclose(soubor);
	} else printf("\nERROR: Soubor \"%s\" nelze otevrit!!!\n");
};

/*************
Postupne vola vypsani vsech souboru, jejichz jmena dostala jako argumenty
*************/
int main(int argc, char **argv){
	int i=1;
	//char s[100];
	while (argc>i){
		switch(argv[i][0]){
		case '/':
			if ((argv[i][1]!='w') || (argc<++i)){
				printf("\nERROR: Spatne pouziti parametru /w");
				return 100;
			}else{
				sirka=(int)strtod(argv[i++], argv)+2;
			};
			break;
		default:
			Vypis(argv[i++]);	//vypis vsechny files na vstupu

			printf("\n");		//paticka
			for(int j=0;j<sirka-2;j++) printf("-");
			if (sirka<BUFF_MAX )   printf("\n");
		};
	};

	system("PAUSE");
	return 0;
};