Exemple #1
0
/**
  @param recebe uma string que é o nome do ficheiro
  @return retorna 1 se o ficheiro for guardado com sucesso
*/
int cmd_gravar (char * args)
{
   if(ja_existe_sequencia()==NAO_EXISTE) return mensagem_de_erro(E_NO_SEQ);
   else if(proteina.tem_coordenadas==NAO) return mensagem_de_erro(E_NAO_COLOC);
   else if(numero_de_argumentos(args)!=1) return mensagem_de_erro(E_ARGS);
   else gravar(args);
   return 1;
}
Exemple #2
0
/**
  @param recebe uma string que é o nome do ficheiro com o qual vamos invocar a função criar_latex
  @return retorna 1 se tudo correr bem
*/
int cmd_latex (char * args)
{
   if(ja_existe_sequencia()==NAO_EXISTE) return mensagem_de_erro(E_NO_SEQ);
   else if(proteina.esta_colocada==NAO) return mensagem_de_erro(E_NAO_COLOC);
   else if(numero_de_argumentos(args)!=1) return mensagem_de_erro(E_ARGS);
   criar_latex(args);
   return 1;
}
Exemple #3
0
/**
 @param não recebe nada, opera com uma string de A's e B's na sua forma mais extensa
 @return salvo erros que possam surgir, imprime no ecrã a sequencia na forma mais compactada
*/
int cmd_compactar (char * args)
{
   if(args!=NULL) return mensagem_de_erro(E_ARGS);
   else if(ja_existe_sequencia()==NAO_EXISTE) return mensagem_de_erro(E_NO_SEQ);
   else{
        if(proteina.tamanho==1) return printf("%s\n", obtem_sequencia()); /*3 casos em que a seq é a mesma na forma compactada*/
        else if(proteina.tamanho==2 && proteina.seq[0]!=proteina.seq[1]) return printf("%s\n", obtem_sequencia());
        else if((proteina.tamanho==3 && proteina.seq[0]!=proteina.seq[1]) && (proteina.seq[1]!=proteina.seq[2])) return printf("%s\n", obtem_sequencia());
        else compactar_sequencia();
   }
   return printf("%s\n", obtem_seq_compactada());
}
Exemple #4
0
/**
  @param recebe instrucoes de dobragem
  @return quando utilizado com argumentos nao devolve nada, sem argumentos devolve as coordenadas alteradas
*/
int cmd_dobrar (char * args)
{
   if(args!=NULL){
     if(ja_existe_sequencia()==NAO_EXISTE) return mensagem_de_erro(E_NO_SEQ);
     else{
          if(instrucoes_dobragem_validas(args)==PASSOU) dobra_e_guarda_coordenadas(args);
     }
   }
   else if(ja_existe_sequencia()==NAO_EXISTE) return mensagem_de_erro(E_NO_SEQ);
   else return mensagem_de_erro(E_ARGS);

   return 1;
}
Exemple #5
0
/**
  @param recebe instruçõe de dobragem inválidas (F, D, E)
  @return repara as instruções de dobragem de modo a obtermos uma configuração válida próxima da introduzida
*/  
int cmd_reparar (char * dobragens)
{
   if(dobragens==NULL) return mensagem_de_erro(E_INVARGS);
   else if(ja_existe_sequencia()!=1) return mensagem_de_erro(E_NAO_COLOC);
   else{
        if(c_validar(NULL)==SIM) return printf("%s\n", dobragens);/*dobragens validas devolve as mesmas*/
         else if(instrucoes_dobragem_validas(dobragens)==1){
                 procura_erro_repara(dobragens);
                 cmd_dobrar(dobragens);
         }
         else return mensagem_de_erro(E_INVARGS);
   }
 return 1;
}
Exemple #6
0
/**
  @param nao recebe argumentos
  @return retorna SIM caso a sequencia esteja bem colocada, retorna NAO caso contrário
*/
int cmd_validar (char * args)
{
   if(args==NULL){
     if(ja_existe_sequencia()==NAO_EXISTE) return mensagem_de_erro(E_NO_SEQ);
     else if(proteina.tem_coordenadas==SIM && testa_coordenadas_sao_validas()==PASSOU && proteina.tamanho>1){
             proteina.esta_colocada=SIM;
             return printf("SIM\n");
          }
     else if(proteina.tem_dobra==SIM && testa_coordenadas_sao_validas()==PASSOU){
             proteina.esta_colocada=SIM;
             return printf("SIM\n");
          }
     else return printf("NAO\n");
   }
   else return mensagem_de_erro(E_ARGS);
}
Exemple #7
0
/**
  @param recebe uma string que são as instruções de dobragem
  @return devolve uma mensagem de erro caso sejam inválidas, retorna 1 caso contrário
*/
int instrucoes_dobragem_validas(char * arg)
{
   int i;
   int s=strlen(arg);
   int t=proteina.tamanho;

   if(s<t){
           for(i=0;arg[i]!='\0';i++){
              if(arg[i]=='F'||arg[i]=='D'||arg[i]=='E');
              else return mensagem_de_erro(E_INVARGS);
           }     
   }
   else return mensagem_de_erro(E_ARGS); /*caso o tamanho das instruções exceda a sequencia de A's e B's*/

   return PASSOU;
}
Exemple #8
0
/**
 * A função executa_comando é uma das funções mais importantes pois é ela que vai reagir aos comandos dados pelo utilizador.
 * A função irá receber a linha de comando separa la em dois, no comando e nos argumentos do comando, e passa los para as funções associadas aos comandos.
 * @param Tab Tabuleiro do jogo
 * @param DIM dimensão do tabuleiro
 * @param linha Recebe uma string que corresponde á linha lida da shell.
 * @returns torna um inteiro que verifica se foi ou não bem sucedida a função. 
 */
int executa_comando(char *linha,int *DIM,Elem **Tab) {
  char cmd[1025];
  char args[1025];

	int nargs=sscanf(linha, "%s %[^\n]", cmd, args);

	if((strcmp(cmd, "b") == 0 || strcmp(cmd, "p") == 0 || strcmp(cmd, "i") == 0))
		return executaJogada(args,cmd,DIM,Tab);
	if(strcmp(cmd, "cr") == 0 )
		return executaCriaJogo(args,DIM,Tab);	
	if(strcmp(cmd,"gr")==0 )
		return executaGravaJogo(args,DIM,Tab);  
	if(strcmp(cmd,"?")==0 && nargs==1)
		return ajuda();	
	if(strcmp(cmd,"trp")==0 && nargs==1)
		return trp(Tab,DIM);
	if(strcmp(cmd,"snd")==0 && nargs==1)
		return snd(Tab,DIM);
	if(strcmp(cmd,"pis")==0 && nargs==1)
		return pis(Tab,DIM);
	if(strcmp(cmd,"pds")==0 && nargs==1)
		return pds(Tab,DIM);
	if(strcmp(cmd,"vb")==0 && nargs==1)
		return vb(Tab,DIM);
	if(strcmp(cmd,"vp")==0 && nargs==1)
		return vp(Tab,DIM);
	if(strcmp(cmd,"vl")==0 && nargs==1)
		return vl(Tab,DIM);
	if(strcmp(cmd,"q")==0)
		exit(0);

	return mensagem_de_erro(E_COMMAND);
}	
Exemple #9
0
int guardar_bd(char *output, long long *id) {
	//gravar_id;
        FILE *fw=fopen(output,"w+");
	User_h **lista=NULL;
	char idstr[MAXUSERSTR];
	int i=0;

        if(!fw){ 
                return mensagem_de_erro(E_CREATE_FILE);
        }

	converte_ll_str(*id,idstr);
        guardar_str(idstr,MAXUSERSTR,fw);

        while(i<MAXNODES){
		lista=&hash_nome[i];
		while (*lista) {
			guarda_user(fw,(*lista)->user);
			lista=&((*lista)->next);
		}
		i++;
      	}
	fclose(fw);
	return 1;
}
Exemple #10
0
int ler_user_ficheiro(FILE *fp, Perfil **ptr, int count) {

        char idstr[MAXUSERSTR], apgdstr[MAXAPAGADO], nifstr[MAXNIF], endstr[END];
        Perfil *p = malloc(sizeof(Perfil));

        ler_parametro_f(fp,count,MAXUSERSTR,idstr);
        count+=MAXUSERSTR;
        ler_parametro_f(fp,count,MAXNIF,nifstr);
        count+=MAXNIF;
        ler_parametro_f(fp,count,MAXNOME,p->nome);
        count+=MAXNOME;
        ler_parametro_f(fp,count,MAXCIDADE,p->cidade);
        count+=MAXCIDADE;
        ler_parametro_f(fp,count,MAXESTADOCIV,p->estado_civil);
        count+=MAXESTADOCIV;
        ler_parametro_f(fp,count,MAXEMAIL,p->email);
        count+=MAXEMAIL;
        ler_parametro_f(fp,count,MAXAPAGADO,apgdstr);
        count+=MAXAPAGADO;
        ler_parametro_f(fp,count,END,endstr);
        count+=END;

       
        if (strcmp(endstr,".")!=0) {
                free(p);
                return mensagem_de_erro(E_OPEN_FILE);
        }

        p->id=ler_numero_ll(idstr);
        if (p->id==-1) {
                free(p);
                return mensagem_de_erro(E_OPEN_FILE);
        }
        p->nif=ler_numero_ll(nifstr);
        if (p->nif==-1) {
                free(p);
                return mensagem_de_erro(E_OPEN_FILE);
        }
        p->apagado=ler_numero_int(apgdstr);
        if (p->apagado==-1) {
                free(p);
                return mensagem_de_erro(E_OPEN_FILE);
        }
        (*ptr)=p;

        return count;
}
Exemple #11
0
/**
  @param o comando coords quando utilizado com argumentos guarda as coordenadas na forma de interiros caso sejam válidas
  @return quando utilizado sem argumentos imprime no ecrã as coordenadas na forma (x, y)
*/
int cmd_coords (char * args)
{
   if (args!=(NULL)) {
      if ((ja_existe_sequencia())!=1)
         return mensagem_de_erro(E_NO_SEQ);
      else{
           if (conta_coordenadas(args)!=(2*proteina.tamanho))
              return mensagem_de_erro (E_ARGS);
           else if (verifica_coordenadas(args)==PASSOU) guarda_coordenadas(args);
           else mensagem_de_erro(E_COORDS);
      }
   }
   else if ((ja_existe_sequencia())==NAO_EXISTE)
           return mensagem_de_erro (E_NAO_COLOC);
   else if (proteina.tem_coordenadas==SIM)
           imprime_coordenadas();
   return 1;
}
Exemple #12
0
/**
   @param recebe uma sequencia de A's e B's na forma extensa ou compactada se esta esta compactada guarda-a na forma mais extensa
   @return quando utilizado sem argumentos imprime a sequencia na forma mais extensa
*/
int cmd_seq(char *args)
{
   if (args!=(NULL)){
      if(numero_de_argumentos(args)!=1)
         return mensagem_de_erro(E_ARGS);
      else{
            if(nao_tem_so_A_B(args)==NAO_PASSOU) return mensagem_de_erro(E_SEQ_INV);
            else if(testa_compactada_valida(args)==PASSOU) descompactar_e_guardar(args);
            else return mensagem_de_erro(E_SEQ_INV);                   
            return 1;
      }            
   }
   else{
        if(ja_existe_sequencia()==EXISTE)
          return printf("%s\n", obtem_sequencia());
        else return mensagem_de_erro(E_NO_SEQ);
   }
}
Exemple #13
0
/**A função executaGravaJogo recebe os argumentos da linha de comando e vai verificar se tem os argumetos certos, se tal for verdade, executa gravaJogo com o nome do argumento no formato ".ltr".
 * @param Tab Tabuleiro do jogo
 * @param DIM dimensão do tabuleiro 
 * @param args Recebe uma string com os argumentos associados ao comando em questão("gr").
 * @returns torna um inteiro que verifica se foi ou não bem sucedida a função.
 */
int executaGravaJogo(char *args,int *DIM,Elem **Tab) {
	char buf[1024];
	char nome[256];
	
  int nargs = sscanf(args, "%s %[^\n]", nome, buf);


  if(nargs != 1) {
      return mensagem_de_erro(E_ARGS);
  }
	
	if(Tab){	
		strcat(nome,".ltr");
		gravaJogo(nome,DIM,Tab);
	}
	else return mensagem_de_erro(E_NO_BOARD);
return 0;
}
Exemple #14
0
int inserir_info_user(long long id, long long nif, Info **inf) {
        (*inf) = malloc(sizeof(struct info));
        if ((*inf)==NULL) {
                return mensagem_de_erro(E_MEM);
        }
        (*inf)->nif=nif;
        (*inf)->adjacentes=NULL;
        return 1;
}
Exemple #15
0
int ler_id(FILE *fp, int count, long long *id) {
	char idstr[MAXUSERSTR];
	ler_parametro_f(fp,count,MAXUSERSTR,idstr);
        count+=MAXUSERSTR;
	*id=ler_numero_ll(idstr);
        if (*id==-1) {
                return mensagem_de_erro(E_OPEN_FILE);
        }
	return count;
}
Exemple #16
0
/**A função executajogada recebe os argumentos da linha de comandos e a cor que vai passar para a jogada.
 * Vai verificar se tem os argumetos certos, e se tal vou verdade, chama a função jogada, para que esta se possa realizar.
 * @param args Recebe ums string com os argumentos do comando do utilizador. 
 * @param cor Corresponde ao próprio comado que irá ser utilizado como a cor que se pretende mudar.
 * @param Tab Tabuleiro do jogo
 * @param DIM dimensão do tabuleiro
 * @returns Retorna um inteiro que verifica se foi ou não bem sucedida a função.
 */
int executaJogada(char *args,char *cor,int *DIM,Elem **Tab) {
  char buf[1024];
  int x, y;
	char teste1[1024],teste2[1024];
	
	int nargs = sscanf(args, "%s %s %[^\n]", teste1,teste2, buf);
	if(!isdigit(teste1[0]) || !isdigit(teste2[0])) {
     return mensagem_de_erro(E_INVARGS);
  }
	
	nargs = sscanf(args, "%d %d %[^\n]", &x, &y, buf);

  if(nargs != 2) {
     return mensagem_de_erro(E_ARGS);
  }

  jogada(*cor,x,y,DIM,Tab);

return 0;
}
Exemple #17
0
int remover_relacao(long long nif1, long long nif2, Grafo *g) {
        Perfil *p1=findByNif(nif1);
        Perfil *p2=findByNif(nif2);
        Info *inf1, *inf2;

        if (p1==NULL || p2==NULL) {
                return mensagem_de_erro(E_NO_NIF);
        }
        inf1=g->nodos[p1->id];
        inf2=g->nodos[p2->id];
        if (inf1==NULL || inf2==NULL) {
                return mensagem_de_erro(E_NO_NIF);
        }
        if (remove_nodos(&(inf1->adjacentes),nif2)) {
                remove_nodos(&(inf2->adjacentes),nif1);
        }
        else return 0;
return 1;

}
/* 
 * O comando ajuda 
 */
BOARD *cmd_help(char *args, BOARD *brd) {
	int i;
	if (strlen(args)==0) {
		args = NULL;

		for(i = 0; command[i].name != NULL; i++)
			printf("%s: %s\n", command[i].name, command[i].doc);
	}
	else
		mensagem_de_erro(E_INVARGS) ;
	return brd;
}
Exemple #19
0
/**
   @param pode receber três valores que posteriormente são atribuídos às variáveis energéticas (e1, e2, e3), ou não receber nada, eventualmente consideramos os valores pré-defenidos para as variáveis energéticas
   @return retorna o valor da energia da proteína considerada ou pode circunstancialmente retornar uma mensagem de erro
*/
int cmd_energia (char * args)
{
   if(args==NULL){
     if(ja_existe_sequencia()==NAO_EXISTE) return mensagem_de_erro(E_NO_SEQ);
     else if(proteina.esta_colocada==SIM){
            if(proteina.tem_dobra==NAO) return printf("0\n");      
            else calcula_imprime_energia(args);
     }
     else return mensagem_de_erro(E_NAO_COLOC);
   }
   else if(args!=NULL){
          if(ja_existe_sequencia()==0) return mensagem_de_erro(E_NO_SEQ);
          else if(proteina.esta_colocada==SIM){
                  if(proteina.tem_dobra==NAO) return printf("0\n");
                  else if(numero_de_argumentos(args)!=3) return mensagem_de_erro(E_ARGS);
                  else if(testa_argumentos(args)==NAO_PASSOU) return mensagem_de_erro(E_INVARGS);
                  else calcula_imprime_energia(args);
          }
   }
   return 1;
}
Exemple #20
0
/**A função executaCriaJog recebe os argumentos da linha de comando, vai verificar se tem os argumentos, certos se tal ocorre, executa criarJogo com o nome do argumento no formato ".ltr".
 * @param args Recebe uma string com os argumentos associados ao comando em questão ("cr").
 * @param Tab Tabuleiro do jogo
 * @param DIM dimensão do tabuleiro
 * @returns torna um inteiro que verifica se foi ou não bem sucedida a função.
 */
int executaCriaJogo(char *args,int *DIM,Elem **Tab) {
	char buf[1024];
	char nome[256];

	int nargs = sscanf(args, "%s %[^\n]", nome, buf);


  if(nargs != 1) {
      return mensagem_de_erro(E_INVARGS);
  }
	
	strcat(nome,".ltr");
	criarTabuleiro(nome,DIM,Tab);

return 0;
}
Exemple #21
0
int criar_relacao(long long nif1, long long nif2, int peso, Grafo *g){

        Perfil *p1=findByNif(nif1);
        Perfil *p2=findByNif(nif2);

        if(p1==NULL || p2==NULL){
                return mensagem_de_erro(E_NO_NIF );
        } 

        if (g->nodos[p1->id]==NULL) {
                if (inserir_info_user(p1->id,nif1,&(g->nodos[p1->id]))==0) return 0;
        }
        if (g->nodos[p2->id]==NULL) {
                if (inserir_info_user(p2->id,nif2,&(g->nodos[p2->id]))==0) return 0;
        }
        if (inserir_relacao(p1->id,p2->id,nif2,peso,g)) {
                if (inserir_relacao(p2->id,p1->id,nif1,peso,g)) {
                        return 1;
                }
        }
        return 0;
}
/**
  * A função main é um ciclo que apenas termina quando o utilizador insere o comando "q".
  * Esta função vai então ser responsável iniciar o programa e receber os comandos que o utilizador lhe introduz.
  * Vai imprimir os resultados do jogo enquanto este decorrer. 
  */
int main() {
	char *cmd = NULL;
	FUNCTION *fun = NULL;
	BOARD * brd = NULL;

	srand(time(NULL));
	brd = initialize_state();

	while(rl_gets() != NULL) {
		int i, j;

		/* Ignorar os espacos no inicio do comando */
		for(i = 0; line_read[i] && whitespace(line_read[i]); i++);

		/* Saltar a primeira palavra da linha */
		for(j = i; line_read[j] && !whitespace(line_read[j]); j++);

		/* Delimitar o nome do comando */
		if(line_read[j])
			line_read[j++] = 0;

		 /* Saltar os espacos mais uma vez */
		for(; line_read[j] && whitespace(line_read[j]); j++);

		cmd = line_read + i;

		fun = find_command(cmd);
		if(fun != NULL) {
			brd = fun(line_read + j, brd);
			print_state(brd);
		} else {
			mensagem_de_erro(E_COMMAND);
		}
	}

	return 0;
}
/**Função que executa o comando dado o valor retornado na função que identifica que comando foi introduzido pelo utilizador.
 *@param jogo Referencia-se a onde se encontra guardado as dimensões do tabuleiro.
 *@param arg1 Variável onde está guardada o primeiro argumento dado pelo utilizador aquando a introdução do comando.
 *@param arg2 Variável onde está guardada o segundo argumento dado pelo utilizador aquando a introdução do comando.
 *@param comando Refere-se à opção que vai ser executada pelo utilizador.
 *@param argumentos Número de argumentos introduzidos pelo utilizador.
 *@return 1 a 7. Execução de comandos bem sucedida.
 *@return 0. Execução de comandos mal sucedida.
 */
int executa_comando(Tabuleiro jogo, int comando, int argumentos, char * arg1, char * arg2)
{
  switch(comando)
    {
    case 2: /*Se for 2 usa o carrega*/
      if(argumentos == 2) /*Recebe 2 args pois recebe o cr e o tabuleiro tipo ex1(Exemplificar: cr ex1)*/
      {
	 		carrega_tab(jogo, arg1); /*Um argumento pois só precisa do ex1, por exemplo*/
	  		return 0;
      }
      else
      {
	  		return mensagem_de_erro(E_ARGS);
      }
      break;
      
    case 3: /*Se for 3 usa o comando grava*/
      if(argumentos == 2) /*Recebe o gr e o tabuleiro que o utilizador quer*/
      {
	  		grava_tab(jogo, arg1);
	  		return 0;
      }
      else
		{
	  		return mensagem_de_erro(E_ARGS);
		}
      break;
      		
    case 4:
      if(argumentos == 3)
		{
	  		if(testa_inteiro(arg1) && testa_inteiro(arg2))
	    	{
	      	joga(jogo, atoi(arg1), atoi(arg2));
	      	jogo->n_comando++;
	    	}
	  		else
	    	{
	      	mensagem_de_erro(E_INVARGS);
	    	}
		}
      else
		{
	  		mensagem_de_erro(E_ARGS);
		}
      break;
    
    case 5:
      if(argumentos == 1)
		{
	  		estrategia1(jogo);
	  		jogo->n_comando++;
	  		impressao_ecra(jogo);
		}
      else
      {
	  		mensagem_de_erro(E_ARGS);
		}
      break;
      	
    case 6:
      if(argumentos == 1)
		{
	  		estrategia2(jogo);
	  		jogo->n_comando++;
	  		impressao_ecra(jogo);
		}
      else
		{
	  		mensagem_de_erro(E_ARGS);
		}	
      break;
      	
    case 7:
      if(argumentos == 3)
		{
	  		if(testa_inteiro(arg1) && testa_inteiro(arg2))
	    	{
	      	marca(jogo, atoi(arg1), atoi(arg2)); /*atoi significa converter uma string em inteiros*/
	      	jogo->n_comando++;
	    	}
	  		else
	    	{
	      	mensagem_de_erro(E_INVARGS);
	    	}
		}
      else
		{
	  		mensagem_de_erro(E_ARGS);
		}
      break;
      	
    case 8:
      if(argumentos == 1)
		{
	  		estrategia3(jogo);
	  		jogo->n_comando++;
	  		impressao_ecra(jogo);
		}
      else
		{
	  		mensagem_de_erro(E_ARGS);
		}	
      break;
      	
    case 9:
      if(argumentos == 1)
		{
	  		anula(jogo);
		}
      else
		{
	  		mensagem_de_erro(E_ARGS);
		}	
      break;
      	
    case 10:
      if(argumentos == 1)
		{
	  		estrategia4(jogo);
	  		jogo->n_comando++;
	  		impressao_ecra(jogo);
		}
      else
		{
	  		mensagem_de_erro(E_ARGS);
		}		
      break;
      	
    case 11:
      if(argumentos == 1)
		{
	  		estrategia5(jogo);
	  		jogo->n_comando++;
	  		impressao_ecra(jogo);
		}
      else
		{
	  		mensagem_de_erro(E_ARGS);
		}	
      break;
    
    case 12:
      if(argumentos == 1)
		{
	  		resolve(jogo);
	  		jogo->n_comando++;
	  		impressao_ecra(jogo);
		}
      else
		{
	  		mensagem_de_erro(E_ARGS);
		}	
      break;
    }
  return 0;
}
Exemple #24
0
int grava_mensagem(long long nif2,long long nif1,char *mensagem,Lista_destinatario *ld){
	
	Perfil *user1=findByNif(nif1);
	Perfil *user2=findByNif(nif2);
	long long id1;
	long long id2;
	
	
	if(!user1 || !user2){
		return mensagem_de_erro(E_NO_NIF);
		}
		
	if (nif1==nif2) {
		return mensagem_de_erro(E_NO_NIF);
		}
	
	Mensagens *mensagem1=malloc(sizeof(Mensagens));
	strcpy(mensagem1->mensagem,mensagem);
	mensagem1->next=NULL;
	
	
	id1=user2->id;
	id2=user1->id;
	
	
	if (!(ld->L_mensagens[id2])) {
		Destinatario *dest = malloc(sizeof(Destinatario));
		dest->total_mensagens = 0;
		dest->remetentes = NULL;
		ld->L_mensagens[id2]=dest;
		}
	
	(ld->L_mensagens[id2]->total_mensagens)++;
	
	mais_popular (ld->L_mensagens[id2]->total_mensagens, user1->nif, ld);
	
	
	Remetente *aux_remetente=ld->L_mensagens[id2]->remetentes;
	Remetente *aux_ant=ld->L_mensagens[id2]->remetentes;
	
	while ((ld->L_mensagens[id2]->remetentes)!=NULL) {
		aux_ant=ld->L_mensagens[id2]->remetentes;
		if ((ld->L_mensagens[id2]->remetentes->id) == id1) break;
		ld->L_mensagens[id2]->remetentes = ld->L_mensagens[id2]->remetentes->next;
	}
	
	
	if (ld->L_mensagens[id2]->remetentes==NULL) {
		Remetente *rem = malloc(sizeof(Remetente));
		rem->id=id1;
		rem->n_mensagens=1;
		rem->nif = nif2;
		rem->msg = mensagem1;
		rem->next=NULL;
		ld->L_mensagens[id2]->remetentes = aux_ant;
		if ((ld->L_mensagens[id2]->remetentes)==NULL) ld->L_mensagens[id2]->remetentes = rem;
		else  {
			ld->L_mensagens[id2]->remetentes->next = rem;
			ld->L_mensagens[id2]->remetentes=aux_remetente;
		}
		return 1;
		}
		
	if ((ld->L_mensagens[id2]->remetentes->n_mensagens)>19) {
		Mensagens *m_aux = ld->L_mensagens[id2]->remetentes->msg;
		ld->L_mensagens[id2]->remetentes->msg = ld->L_mensagens[id2]->remetentes->msg->next;
		free(m_aux);
		(ld->L_mensagens[id2]->remetentes->n_mensagens)--;
		}
	
	Mensagens *auxiliar = ld->L_mensagens[id2]->remetentes->msg;
	
	while (ld->L_mensagens[id2]->remetentes->msg->next!=NULL) {
		ld->L_mensagens[id2]->remetentes->msg=ld->L_mensagens[id2]->remetentes->msg->next;
	}
	
	
	ld->L_mensagens[id2]->remetentes->msg->next = mensagem1;
	
	(ld->L_mensagens[id2]->remetentes->n_mensagens)++;
	
	ld->L_mensagens[id2]->remetentes->msg=auxiliar;
	
	ld->L_mensagens[id2]->remetentes=aux_remetente;
		
return 1;
}
int main()
{
	char command[10], params[20], comando[30];

	LRect L = NULL;
	LArea A = NULL;	
	LRestr R = NULL;
	Stack S = NULL;
	DIM D = NULL; 
	L = (LRect) malloc (sizeof (NodoR));
	A = (LArea) malloc (sizeof (NodoA));
	R = (LRestr) malloc (sizeof (NodoRestr));
	S = (Stack) malloc (sizeof (NStack));	
	D = (DIM) malloc (sizeof (struct sDIM));
	
	
	while (fgets(comando, 30, stdin) != NULL)
		{
			sscanf(comando, "%s %[^\n]", command, params);
			
			if (strcmp(command,"DIM")==0)
			cDIM(params,D);
			
			else  if (strcmp(command,"RECT")==0)
				  cRECT(params,L,D);
		          
		          else  if (strcmp(command,"COL")==0)				  
					    cCOL(params,L,A,D,R,&S);
					    
					    else  if (strcmp(command,"DIR")==0)				  
					    cDIR(params,L,R);
					    
								else  if (strcmp(command,"ESQ")==0)				  
								cESQ(params,L,R);
					    
										else  if (strcmp(command,"CIM")==0)				  
										cCIM(params,L,R);
					    
												else  if (strcmp(command,"BX")==0)				  
												cBX(params,L,R);
					
														else  if (strcmp(command,"COLR")==0)				  
														cCOLR(params,L,A,D,R,&S);
														
															  else  if (strcmp(command,"CLD")==0)				  
															  cCLD(params,L,R);
																	 else  if (strcmp(command,"SEP")==0)				  
																	 cSEP(params,L,R);
																	
																			else  if (strcmp(command,"AREA")==0)				  
																		    cAREA(params,A,D,&S);
																					
																				  else  if (strcmp(command,"DENTRO")==0)				  
																						cDENTRO(params,L,R,A,D);
																
																						else  if (strcmp(command,"FORA")==0)				  
																							  cFORA(params,L,R,A,D);
																			
																							  else if (strcmp(command,"ESTADO")==0)
																								   cESTADO(L);
																								   else if (strcmp(command,"DESF")==0)
																								   cDESF(&S,&A,&L);					
																								   else if (strcmp(command,"RSV")==0)
																								   {
																										if(cRSV(L,L,R,R,A,D,&S,0))
																										printf ("SIM\n");
																										else
																										printf ("NAO\n");
																										mensagem_de_erro (13);
																									}																												   								  
								
																				else mensagem_de_erro (1);					 
		}
	return 0;
       
}