#include #include #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: } }