// Program potrosac  potrosi poruke koje mu j eproizvodjac poslao , ako j eporuka veca nego sto stane u red poruka, da bi osigurali da se slijedno primi cijela
// poruka morali bi to korigirati jos jednim brojackim semaforom

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <string.h>


#define MAX_VELICINA	100


struct msgbuf{
	long mtype;
	char mtext;
};


// definiram dohvat slova od proizvodjaca 

char d_slovo(int msqid, int flag_wait){
	struct msgbuf msgbuf;
	int flag = (flag_wait)?0:IPC_NOWAIT;  // da li je postavljena zastavica cekanja?

//Sustavski poziv msgrcv poziva primalac poruke. msgsz mora biti velicina najvece poruke koja može stati u prostor na koji pokazuje msgp. 
//Obzirom da primljena poruka može biti manja od toga, ovaj poziv vraca velicinu poruke ili -1 ako dode do greške. Ako primalac želi odredenu vrstu poruke onda je stavi u 
//msgtyp. Inace se stavi 0 cime se uzima najstarija poruka iz reda (bez obzira na vrstu poruke). Ako je red prazan ili u njemu nema poruka tražene vrste onda ce se msgrcv 
//zablokirati, osim ako je msgflg (msgflg je obicno 0) IPC_NOWAIT u kojem slucaju ce se odmah vratiti -1 (greška).
	if(msgrcv(msqid, (struct msgbuf *)&msgbuf, (sizeof(char) + 1), 0, flag) == -1){ // primi poruke 
		if (flag_wait == 0){
			return 0;
		} else{
			fprintf(stderr, "Greska u primanju poruke\n");
			exit(1);
		}
	}
	return msgbuf.mtext;
}


int main(int argc, char *argv[]){
	key_t uid;
	int msqid;
	int br_slova=0;
	char poruka[MAX_VELICINA];   // max velicina poruke koju moze primiti 
	char slovo;

	if (argc != 1) {
		printf("Ne mogu pokrenuti program potrosaca\n");
		exit(1);
	}

	
	uid = ftok("./tmp",'m'); // na jednak nacin kao i u proizvodjacu i u glavnom programu dobijem isti kljuc
	if((msqid = msgget(uid, IPC_CREAT |0666)) == -1){ // spajam se na red poruka
		printf("ne mogu se spojiti na red poruka\n");// ako ne mogu se spojiti na red poruka
		exit(1);
	}

	strcpy(poruka, ""); 
	while(1){ // prima i dohvca poruke dok ne primi cijelu poruku tj dok nije procito * koja oznacava kraj poruke
		slovo = d_slovo(msqid, 1);
		if (slovo == '*'){
			poruka[br_slova]= '\0';
			printf("Primio sam cijelu poruku: %s\n", poruka); // ispise cijelu poruku koju je primio
			sleep(2);

			slovo = d_slovo(msqid, 0);
			if (slovo == 0){ // cekam novu poruku
				printf("Cekam na novu poruku\n");
				sleep(2);

				slovo =d_slovo(msqid, 0); // ako nema novih poruka u redu zavrsava se s radom
				if (slovo == 0){
					printf("Nema novih poruka u redu poruka\n");
					break;
				} 
				else{
					br_slova=0;
					poruka[br_slova++] = slovo; //inace ide dalje
				}
			} 
			else{
				br_slova=0;
				poruka[br_slova++] = slovo;

			}
		} 
		else{
			poruka[br_slova++] = slovo;

		}
	}
	exit(0);
	return 0;
}


