112 lines
4.3 KiB
C
112 lines
4.3 KiB
C
#include <string.h>
|
|
#include <stdio.h>
|
|
#include "messagerie.h"
|
|
|
|
|
|
/// @brief Remplit chaine_texte avec les données du message présentées en ascii
|
|
/// @param message structure de transfert entre les cartes
|
|
/// @param chaine_texte doit être allouée, prévoir 64 octets. Attention ce ne sera pas suffisant dans tous les cas
|
|
/// @return 0 si tout s'est bien passé, 1 sinon
|
|
char message_to_string(struct message_t message, char * chaine_texte){
|
|
if(message.type == 'r' || message.type == 'w' || message.type == 'd'){
|
|
if(message.type == 'd' || message.type == 'w' ){
|
|
sprintf(chaine_texte, "%c: registre: %d, id_carte: %d, taille: %d", message.type, message.id_carte, message.taille_donnees);
|
|
}else if(message.type == 'r'){
|
|
sprintf(chaine_texte, "%c: registre: %d, taille: %d", message.type, message.taille_donnees);
|
|
}else{
|
|
return 1;
|
|
}
|
|
|
|
if(message.type == 'r' || message.type == 'w' ){
|
|
char value[5];
|
|
strcat(chaine_texte, ", données: ");
|
|
for(int i=0; i< message.taille_donnees; i++){
|
|
sprintf(value, "%d ", message.donnees[i]);
|
|
strcat(chaine_texte, value);
|
|
}
|
|
}
|
|
|
|
strcat(chaine_texte, "\n");
|
|
return 0;
|
|
}
|
|
if(message.type == '>'){
|
|
chaine_texte[0] = '>';
|
|
chaine_texte[1] = '\0';
|
|
strcat(chaine_texte, message.donnees);
|
|
strcat(chaine_texte, "\n");
|
|
return 0;
|
|
}
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
struct message_t messagerie_read_message(const char * chaine, unsigned int * position_chaine){
|
|
struct message_t message;
|
|
unsigned int position_sous_chaine;
|
|
message.type = 0;
|
|
|
|
switch(chaine[*position_chaine]){
|
|
case '>':
|
|
// copier les données tant qu'on ne trouve pas un retour à la ligne ou de fin de chaine
|
|
position_sous_chaine = 0;
|
|
message.type = '>';
|
|
while(*position_chaine + position_sous_chaine < 1024 && position_sous_chaine < 254){
|
|
message.donnees[position_sous_chaine] = chaine[*position_chaine + position_sous_chaine];
|
|
|
|
if(message.donnees[position_sous_chaine] == '\n' || message.donnees[position_sous_chaine] == '\0'){
|
|
break;
|
|
}
|
|
position_sous_chaine++;
|
|
}
|
|
if(message.donnees[position_sous_chaine-1] != '\0'){
|
|
message.donnees[position_sous_chaine] == '\0';
|
|
}
|
|
*position_chaine = *position_chaine + position_sous_chaine;
|
|
break;
|
|
|
|
case 'd':
|
|
if(*position_chaine + 4 < 1024){
|
|
if(chaine[*position_chaine + 4] == '\0'){
|
|
message.type = chaine[*position_chaine];
|
|
message.id_carte = chaine[*position_chaine + 1];
|
|
message.adresse_registre = chaine[*position_chaine + 2];
|
|
message.taille_donnees = chaine[*position_chaine + 3];
|
|
}
|
|
|
|
}
|
|
|
|
case 'r':
|
|
if(*position_chaine + 2 < 1024){
|
|
// Read size
|
|
message.taille_donnees = chaine[*position_chaine + 2];
|
|
position_sous_chaine = 2 + message.taille_donnees + 1;
|
|
if(*position_chaine + position_sous_chaine < 1024){
|
|
if(chaine[*position_chaine + position_sous_chaine] == '\0'){
|
|
message.type = chaine[*position_chaine];
|
|
message.adresse_registre = chaine[*position_chaine + 1];
|
|
message.taille_donnees = chaine[*position_chaine + 2]; // déjà fait plus haut
|
|
memcpy(message.donnees, &(chaine[*position_chaine + 3]), message.taille_donnees);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 'w':
|
|
if(*position_chaine + 3 < 1024){
|
|
// Read size
|
|
message.taille_donnees = chaine[*position_chaine + 3];
|
|
position_sous_chaine = 3 + message.taille_donnees + 1;
|
|
if(*position_chaine + position_sous_chaine < 1024){
|
|
if(chaine[*position_chaine + position_sous_chaine] == '\0'){
|
|
message.type = chaine[*position_chaine];
|
|
message.id_carte = chaine[*position_chaine + 1];
|
|
message.adresse_registre = chaine[*position_chaine + 2];
|
|
message.taille_donnees = chaine[*position_chaine + 3]; // déjà fait plus haut
|
|
memcpy(message.donnees, &(chaine[*position_chaine + 4]), message.taille_donnees);
|
|
}
|
|
}
|
|
}
|
|
default:
|
|
}
|
|
} |