From f827e94fb192dbfd4776d7a8d8e1cbc149713099 Mon Sep 17 00:00:00 2001 From: dling <dylan.ling.etu@univ-lille.fr> Date: Tue, 19 Dec 2023 22:22:33 +0100 Subject: [PATCH] Ecriture et lecture partiellement partiellement fonctionnelle --- SD/picofs.c | 236 ++++++++++++++++++++++++++++------------------------ 1 file changed, 128 insertions(+), 108 deletions(-) diff --git a/SD/picofs.c b/SD/picofs.c index 6cdb132..9cc3640 100755 --- a/SD/picofs.c +++ b/SD/picofs.c @@ -13,35 +13,30 @@ #define CHUNK_SIZE 64 #define CMD_SIZE 100 -#define BLOC_NO 16 + #define BLOCK_SIZE 512 #define MAX_FILENAME_LENGTH 16 #define MAX_BLOCKS_PER_FILE 16 -#define MAX_FILES_IN_DIRECTORY 1024 +#define MAX_FILES_IN_DIRECTORY 64 +#define MAX_BLOCKS_IN_SUPERBLOCK 1024 #define FILESYSTEM_SIZE (8 * 1024 * 1024) // 8 Mo #define FIRST_DISPONIBILITY_CARD_BLOCK 1024 #define MAX_BLOCKS_PER_FILE_DESCRIPTION 16 #define FIRST_DATA_BLOCK 1040 -void readBlock(SD_info *sd, unsigned int numBlock, int offset, unsigned char *storage, int size) { - //lire à un endroit spécifique du bloc de la carte SD - - //uint8_t * buffer_read = malloc (sizeof(char)*BLOCK_SIZE); - //if(buffer_read == NULL) printf("erreur malloc read"); - readData(sd,numBlock,offset, size, storage); - //strcpy(storage,(unsigned char *)buffer_read); - //free(buffer_read); +void readBlock(SD_info *sd, unsigned int numBlock, int offset, char *storage, int size) { + + readData(sd,numBlock,offset, size, (uint8_t*) storage); } -void writeBlock(SD_info *sd, unsigned int numBlock, int offset, unsigned char *source, int size) { - //écrire à un endroit spécifique du bloc de la carte SD - uint8_t * buffer_write = malloc (sizeof(char)*BLOCK_SIZE); //sauve les données du bloc - if(buffer_write == NULL) printf("erreur malloc write"); - readData(sd, numBlock, 0, size, buffer_write); +void writeBlock(SD_info *sd, unsigned int numBlock, int offset, char *source, int size) { + + char buffer_write[BLOCK_SIZE/2]; + readData(sd, numBlock, 0, size, (uint8_t *)buffer_write); if(offset + size > 512 ) { - printf("data to write is too big"); + printf("data to write is too big\n"); return; } for (int i = size - 1; i >= 0; i--) { @@ -51,16 +46,17 @@ void writeBlock(SD_info *sd, unsigned int numBlock, int offset, unsigned char *s for (int j = 0; j < offset; j++) { source[j] = buffer_write[j]; } + //free(buffer_write); writeBlockSD(sd,numBlock, (uint8_t *)source); - free(buffer_write); + } void LS(SD_info *sd) { - unsigned char buffer[MAX_FILENAME_LENGTH]; + char buffer[MAX_FILENAME_LENGTH]; int fileCount = 0; - - // Parcourir les blocs multiples de 16 à partir de 0 jusqu'à MAX_FILES_IN_DIRECTORY - for (int blockNum = 0; blockNum < MAX_FILES_IN_DIRECTORY; blockNum += 16) { + printf("\n"); + // Parcourir les blocs multiples de 16 à partir de 0 jusqu'à MAX_BLOCKS_IN_SUPERBLOCK + for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { readBlock(sd,blockNum, 0, buffer, MAX_FILENAME_LENGTH); // Vérifier si le nom de fichier est vide @@ -72,7 +68,7 @@ void LS(SD_info *sd) { } if (fileCount == 0) { - printf("Aucun fichier trouvé.\n"); + printf("\nAucun fichier trouvé.\n"); } } @@ -80,17 +76,18 @@ void LS(SD_info *sd) { void setBlockAvailability(SD_info *sd, int blockNum, int availability) { int byteIndexInCard = blockNum / 8; //Numéro d'octet dans la carte des blocs libres - int blockIndexInCard = byteIndexInCard / 256; //Numéro du bloc dans la carte des blocs libres - int byteIndexInBlock = byteIndexInCard % 256; //Numéro d'octet dans le bloc contenant le bit de disponibilité + int blockIndexInCard = byteIndexInCard / 512; //Numéro du bloc dans la carte des blocs libres + int byteIndexInBlock = byteIndexInCard % 512; //Numéro d'octet dans le bloc contenant le bit de disponibilité int bitOffset = blockNum % 8; //Numéro du bit dans l'octet n°byteIndexInBlock du bloc blockIndexInCard //indice du bloc contenant le bit à mettre à jour dans le bloc de description int availabilityBlockNum = FIRST_DISPONIBILITY_CARD_BLOCK + blockIndexInCard; // Lire l'octet existant dans le bloc de disponibilité du super bloc - unsigned char buffer; - readBlock(sd, availabilityBlockNum, byteIndexInBlock, &buffer, 1); - + char buffer512[BLOCK_SIZE/2]; + char buffer; + readBlock(sd, availabilityBlockNum, byteIndexInBlock, buffer512, 1); + buffer = buffer512[0]; // Mettre à jour le bit d'offset correspondant : if (availability==1) { // indisponible buffer |= (1 << bitOffset); // Mettre le bit à 1 @@ -100,25 +97,26 @@ void setBlockAvailability(SD_info *sd, int blockNum, int availability) { } // Écrire l'octet mis à jour dans le bloc de disponibilité du super bloc - writeBlock(sd,availabilityBlockNum, byteIndexInBlock, &buffer, 1); + writeBlock(sd,availabilityBlockNum, byteIndexInBlock, buffer512, 1); + } int min(int a, int b) { return a < b ? a : b; } -void RM(SD_info *sd, const char *filename) { +void RM(SD_info *sd, char *filename) { int fileFound = -1; int offset; - unsigned char fileBuffer[BLOCK_SIZE]; + char fileBuffer[BLOCK_SIZE]; // Parcourir les blocs réservés pour la description des fichiers (superbloc) - for (int blockNum = 0; blockNum < MAX_FILES_IN_DIRECTORY; blockNum += 16) { - unsigned char filenameBuffer[MAX_FILENAME_LENGTH]; + for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { + char filenameBuffer[MAX_FILENAME_LENGTH]; readBlock(sd,blockNum, 0, filenameBuffer, MAX_FILENAME_LENGTH); // Vérifier si le bloc contient le nom du fichier recherché - if (strncmp((const char *)filenameBuffer, filename, MAX_FILENAME_LENGTH) == 0) { + if (strncmp(filenameBuffer, filename, MAX_FILENAME_LENGTH) == 0) { // Effacer le nom du fichier dans le superbloc memset(filenameBuffer, 0, MAX_FILENAME_LENGTH); writeBlock(sd,blockNum, 0, filenameBuffer, MAX_FILENAME_LENGTH); @@ -130,27 +128,27 @@ void RM(SD_info *sd, const char *filename) { // Fin de fonction si fichier inexistant if (fileFound == -1) { - printf("Le fichier \"%s\" n'a pas été trouvé.\n", filename); + printf("\nLe fichier \"%s\" n'a pas été trouvé.\n", filename); return; } - for (int blockNum = offset; blockNum < offset + 16; blockNum++) { + for (int blockNum = offset+1; blockNum < offset + 16; blockNum++) { int startOffset = 0; if (blockNum == offset) { startOffset = MAX_FILENAME_LENGTH; } - for (int chunkStart = startOffset; chunkStart < BLOCK_SIZE; chunkStart += CHUNK_SIZE) { - int chunkSize = min(CHUNK_SIZE, BLOCK_SIZE - chunkStart); + for (int chunkStart = startOffset; chunkStart < BLOCK_SIZE/2; chunkStart += CHUNK_SIZE) { + int chunkSize = min(CHUNK_SIZE, BLOCK_SIZE/2 - chunkStart); readBlock(sd,blockNum, chunkStart, fileBuffer, chunkSize); for (int i = 0; i < chunkSize; i += 2) { int blockNumData = (fileBuffer[i] << 8) | fileBuffer[i + 1]; - printf("blockNumData=%d\n",blockNumData); + if (blockNumData == 0) { writeBlock(sd,blockNum, chunkStart, fileBuffer, chunkSize); - printf("Le fichier \"%s\" a été supprimé avec succès.\n", filename); + printf("\nLe fichier \"%s\" a été supprimé avec succès.\n", filename); return; // Sortir des boucles } setBlockAvailability(sd,blockNumData, 0); // Marquer le bloc comme disponible @@ -162,30 +160,30 @@ void RM(SD_info *sd, const char *filename) { } } - printf("Le fichier \"%s\" a été supprimé avec succès.\n", filename); + printf("\nLe fichier \"%s\" a été supprimé avec succès.\n", filename); } // Fonction qui modifie le nom du fichier -void MV(SD_info *sd, const char *old_filename, const char *new_filename) { +void MV(SD_info *sd, char *old_filename, char *new_filename) { size_t sizeNew_filename = strlen(new_filename); - size_t sizeOld_filename = strlen(old_filename); - unsigned char filenameBuffer[MAX_FILENAME_LENGTH]; + //size_t sizeOld_filename = strlen(old_filename); + char filenameBuffer[MAX_FILENAME_LENGTH]; int fileFound = 0; // Parcourir les blocs réservés pour la description des fichiers (superbloc) - for (int blockNum = 0; blockNum < MAX_FILES_IN_DIRECTORY; blockNum += 16) { + for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { readBlock(sd,blockNum, 0, filenameBuffer, MAX_FILENAME_LENGTH); // Vérifier si le bloc contient le nom du fichier recherché - if (strncmp((const char*)filenameBuffer, old_filename, MAX_FILENAME_LENGTH) == 0) { + if (strncmp(filenameBuffer, old_filename, MAX_FILENAME_LENGTH) == 0) { if (sizeNew_filename < MAX_FILENAME_LENGTH) { sizeNew_filename+=1; } // Écrire le nom du fichier dans l'emplacement - writeBlock(sd,blockNum, 0, (const unsigned char *)new_filename, sizeNew_filename); + writeBlock(sd,blockNum, 0, new_filename, sizeNew_filename); fileFound=1; @@ -193,15 +191,15 @@ void MV(SD_info *sd, const char *old_filename, const char *new_filename) { } } if (fileFound == 1) { - printf("Le nom du fichier \"%s\" a été renommé avec succès.\n", old_filename); + printf("\nLe nom du fichier \"%s\" a été renommé avec succès.\n", old_filename); } else { - printf("Le fichier \"%s\" n'a pas été trouvé.\n", old_filename); + printf("\nLe fichier \"%s\" n'a pas été trouvé.\n", old_filename); } } // Renvoie le premier bloc de donné disponible int findAvailableBlock(SD_info *sd) { - unsigned char availabilityBuffer[BLOCK_SIZE]; + char availabilityBuffer[BLOCK_SIZE]; int offset; // Lire la carte de disponibilité (à partir du bloc 1) @@ -216,7 +214,7 @@ int findAvailableBlock(SD_info *sd) { // Parcourir les octets de la carte de disponibilité for (int byteIndex = offset; byteIndex < BLOCK_SIZE; byteIndex++) { - unsigned char byte = availabilityBuffer[byteIndex]; + char byte = availabilityBuffer[byteIndex]; // Parcourir les bits de chaque octet for (int bitIndex = 0; bitIndex < 8; bitIndex++) { @@ -235,37 +233,37 @@ int findAvailableBlock(SD_info *sd) { } // Fonction qui reconstitue le numéro de bloc à partir du tableau -int reconsituteNumber(unsigned char blockNumberBuffer[2]) { - unsigned char octet1 = blockNumberBuffer[0]; - unsigned char octet2 = blockNumberBuffer[1]; +int reconsituteNumber(char blockNumberBuffer[2]) { + char octet1 = blockNumberBuffer[0]; + char octet2 = blockNumberBuffer[1]; int dataBlockNum = (octet1 << 8) | octet2; return dataBlockNum; } // Fonction qui réparti un numéro de bloc sur deux octets -void createNumberBuffer(int dataBlockNum, unsigned char blockNumberBuffer[2]) { +void createNumberBuffer(int dataBlockNum, char blockNumberBuffer[2]) { blockNumberBuffer[0] = (dataBlockNum >> 8) & 0xFF; blockNumberBuffer[1] = dataBlockNum & 0xFF; } -void TYPE(SD_info *sd, const char *filename) { +void TYPE(SD_info *sd, char *filename, char *data) { size_t sizeFilename = strlen(filename); - unsigned char buffer[MAX_FILENAME_LENGTH]; + char buffer[MAX_FILENAME_LENGTH]; int placeFound = -1; - int index_description_block = 0; // indice du bloc de descrption + int index_description_block = 1; // indice du bloc de descrption int block_counter = 1; //compteur de blocs utilisés int index_in_descrBlock = 0; int offset; - int first_loop=1; + if (sizeFilename > MAX_FILENAME_LENGTH) { - printf("Impossible de créer le fichier, nom trop long\n"); + printf("\nImpossible de créer le fichier, nom trop long\n"); return; } // Parcours des blocs réservés pour la description des fichiers (superbloc) - for (int blockNum = 0; blockNum < MAX_FILES_IN_DIRECTORY; blockNum += 16) { + for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { readBlock(sd,blockNum, 0, buffer, MAX_FILENAME_LENGTH); // Vérifier si le bloc est vide (pas de nom de fichier) if (buffer[0] == 0) { @@ -273,42 +271,38 @@ void TYPE(SD_info *sd, const char *filename) { if (sizeFilename < MAX_FILENAME_LENGTH) { sizeFilename += 1; // Ajouter '\0' s'il y a de la place } - writeBlock(sd,blockNum, 0, (const unsigned char *)filename, sizeFilename); + writeBlock(sd,blockNum, 0, filename, sizeFilename); placeFound = blockNum; // Lire les données depuis l'entrée standard et écrire dans le fichier int dataBlockNum = findAvailableBlock(sd); // Premier bloc de données à partir du bloc 1040 int blockSizeUsed = 0; // Compteur d'octets dans le bloc actuel - unsigned char chunkBuffer[CHUNK_SIZE]; + char chunkBuffer[CHUNK_SIZE]; size_t bytesRead; + - while ((bytesRead = fread(chunkBuffer, 1, CHUNK_SIZE, stdin)) > 0) { - + bytesRead = strlen(data); + strcpy(chunkBuffer,data); // Écrire le chunk dans le bloc de données writeBlock(sd,dataBlockNum, blockSizeUsed, chunkBuffer, bytesRead); setBlockAvailability(sd,dataBlockNum, 1); - // Écrire le numéro du bloc actuel dans la description du fichier - unsigned char blockNumberBuffer[2]; + char blockNumberBuffer[64]; createNumberBuffer(dataBlockNum,blockNumberBuffer); - blockSizeUsed += bytesRead; // Si le bloc actuel est plein, passer au bloc suivant OU si c'est le premier tour dans la boucle - if (blockSizeUsed == BLOCK_SIZE || first_loop == 1) { - - first_loop = -1; - // Ecriture du numéro de bloc utilisé dans les blocs de description if (index_description_block == 0) { offset = MAX_FILENAME_LENGTH; } else { offset = 0; } + writeBlock(sd,placeFound + index_description_block, offset + index_in_descrBlock*2, blockNumberBuffer, 2); index_in_descrBlock++; - + dataBlockNum = findAvailableBlock(sd); // Passer au bloc suivant blockSizeUsed = 0; // Réinitialiser la taille utilisée @@ -326,8 +320,7 @@ void TYPE(SD_info *sd, const char *filename) { printf("Le fichier a atteint sa taille maximale\n"); return; } - } - } + break; // Fichier créé, sortir de la boucle } @@ -338,25 +331,27 @@ void TYPE(SD_info *sd, const char *filename) { } else { printf("Plus de place dans le système de fichier pour créer ce fichier.\n"); } + + } -void CAT(SD_info *sd, const char *filename) { - unsigned char filenameBuffer[MAX_FILENAME_LENGTH]; - unsigned char byteBuffer[2]; - unsigned char dataBuffer[CHUNK_SIZE]; +void CAT(SD_info *sd, char *filename) { + char filenameBuffer[MAX_FILENAME_LENGTH]; + char byteBuffer[CHUNK_SIZE]; + char dataBuffer[CHUNK_SIZE]; int offset; // Parcours des blocs réservés pour la description des fichiers (superbloc) - for (int blockNum = 0; blockNum < MAX_FILES_IN_DIRECTORY; blockNum += 16) { + for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { readBlock(sd,blockNum, 0, filenameBuffer, MAX_FILENAME_LENGTH); // Vérifier si le bloc contient le nom du fichier recherché - if (strncmp((const char *)filenameBuffer, filename, MAX_FILENAME_LENGTH) == 0) { + if (strncmp(filenameBuffer, filename, MAX_FILENAME_LENGTH) == 0) { // Le nom du fichier a été trouvé // Parcours les blocs de description - for (int descrBlockNum=0; descrBlockNum<MAX_BLOCKS_PER_FILE_DESCRIPTION; descrBlockNum++) { + for (int descrBlockNum=1; descrBlockNum<MAX_BLOCKS_PER_FILE_DESCRIPTION; descrBlockNum++) { if (descrBlockNum==0) { offset=MAX_FILENAME_LENGTH; } else { @@ -369,17 +364,16 @@ void CAT(SD_info *sd, const char *filename) { // Lire les numéros de blocs associés à ce fichier depuis les blocs de description int dataBlockNum = reconsituteNumber(byteBuffer); - // Vérifier si le numéro de bloc est valide (non nul) if (dataBlockNum == 0) { return; // Fin du fichier } - for (int chunkStart = 0; chunkStart < BLOCK_SIZE; chunkStart += CHUNK_SIZE) { + //for (int chunkStart = 0; chunkStart < BLOCK_SIZE; chunkStart += CHUNK_SIZE) { // Lire et afficher le contenu du bloc de données - readBlock(sd,dataBlockNum, chunkStart, dataBuffer, CHUNK_SIZE); - fwrite(dataBuffer, 1, CHUNK_SIZE, stdout); - } + readBlock(sd,dataBlockNum, 0, dataBuffer, CHUNK_SIZE); + printf("\n%s\n",dataBuffer ); + //} } } @@ -393,11 +387,11 @@ void CAT(SD_info *sd, const char *filename) { // Fonction pour copier un fichier existant du système de fichier -void CP(SD_info *sd, const char *source_filename, const char *destination_filename) { - unsigned char source_filenameBuffer[MAX_FILENAME_LENGTH]; - unsigned char destination_filenameBuffer[MAX_FILENAME_LENGTH]; - unsigned char descriptionBuffer[CHUNK_SIZE]; - unsigned char numBuffer[2]; +void CP(SD_info *sd, char *source_filename, char *destination_filename) { + char source_filenameBuffer[MAX_FILENAME_LENGTH]; + char destination_filenameBuffer[MAX_FILENAME_LENGTH]; + char descriptionBuffer[CHUNK_SIZE]; + char numBuffer[64]; int destination_offset; int source_offset; int offset; @@ -406,24 +400,24 @@ void CP(SD_info *sd, const char *source_filename, const char *destination_filena // Recherche du fichier source source_offset = -1; - for (int blockNum = 0; blockNum < MAX_FILES_IN_DIRECTORY; blockNum += 16) { + for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { readBlock(sd,blockNum, 0, source_filenameBuffer, MAX_FILENAME_LENGTH); // Vérifier si le bloc contient le nom du fichier source - if (strncmp((const char *)source_filenameBuffer, source_filename, MAX_FILENAME_LENGTH) == 0) { + if (strncmp(source_filenameBuffer, source_filename, MAX_FILENAME_LENGTH) == 0) { source_offset = blockNum; break; } } if (source_offset == -1) { - printf("Le fichier source \"%s\" n'a pas été trouvé.\n", source_filename); + printf("\nLe fichier source \"%s\" n'a pas été trouvé.\n", source_filename); return; } // Recherche d'un emplacement libre pour le fichier destination destination_offset = -1; - for (int blockNum = 0; blockNum < MAX_FILES_IN_DIRECTORY; blockNum += 16) { + for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { readBlock(sd,blockNum, 0, destination_filenameBuffer, MAX_FILENAME_LENGTH); // Vérifier si le bloc est vide (pas de nom de fichier) @@ -434,12 +428,12 @@ void CP(SD_info *sd, const char *source_filename, const char *destination_filena } if (destination_offset == -1) { - printf("Plus de place dans le système de fichier pour créer la copie de \"%s\".\n", source_filename); + printf("\nPlus de place dans le système de fichier pour créer la copie de \"%s\".\n", source_filename); return; } // Copie du nom de la copie dans le bloc de description - writeBlock(sd,destination_offset, 0, (const unsigned char *)destination_filename, strlen(destination_filename)); + writeBlock(sd,destination_offset, 0, destination_filename, strlen(destination_filename)); // Copier les blocs de données associés au fichier source dans de nouveaux blocs de données pour le fichier destination for (int i = 0; i < MAX_BLOCKS_PER_FILE_DESCRIPTION; i++) { @@ -453,7 +447,7 @@ void CP(SD_info *sd, const char *source_filename, const char *destination_filena numDataBlock = reconsituteNumber(numBuffer); if (numDataBlock == 0) { - printf("La copie de \"%s\" sous le nom \"%s\" a été créée avec succès.\n", source_filename, destination_filename); + printf("\nLa copie de \"%s\" sous le nom \"%s\" a été créée avec succès.\n", source_filename, destination_filename); return; } @@ -495,15 +489,20 @@ int main(int argc, char *argv[]) { printf("erreur=%x\n",sd.errorCode_); printf("type=%x\n",sd.type_); uint32_t size=cardSize(&sd); - printf("taille=%ld\n",size); + printf("taille=%ld\n\n",size); - //char current_cmd[CMD_SIZE + 1]; // +1 pour le caractère nul + printf("Pico ordinateur OK\n\n"); + // char current_cmd[CMD_SIZE + 1]; // +1 pour le caractère nul erase(&sd, 0, 15000); current_cmd[0] = '\0'; // Initialise la chaîne vide + printf("PicoOrdi>"); while (1) { + _delay_ms(10); + user_data = get_serial(); + if (user_data == '\b'){ current_cmd[strlen(current_cmd) - 1] = '\0'; // retirer le dernier charactère de la chaine actuelle printf("%c", user_data); @@ -514,7 +513,8 @@ int main(int argc, char *argv[]) { strncat(current_cmd, &user_data, 1); // Ajoute le caractère à la fin de la chaîne if (user_data == '\r') { - char delim = ' '; //espace délimite les arguments + + char delim = ' '; // espace délimite les arguments current_cmd[strlen(current_cmd) - 1] = '\0'; // Retire le retour à la ligne if (strncmp(current_cmd, "LS", 2) == 0) { // Compare les deux premiers caractères LS(&sd); //lister les fichiers @@ -526,31 +526,51 @@ int main(int argc, char *argv[]) { strcpy(filenameRm, tokenRm); RM(&sd, filenameRm); // efface le fichier - } else if (strncmp(current_cmd, "TYPE", 2) == 0){ + } else if (strncmp(current_cmd, "TYPE", 4) == 0){ char filenameType[MAX_FILENAME_LENGTH]; - char delimType = ' '; + + char dataType[CHUNK_SIZE]; char * tokenType = strtok(current_cmd, &delim); tokenType = strtok(NULL, &delim); strcpy(filenameType, tokenType); - TYPE(&sd, filenameType); //crée le fichier + tokenType = strtok(NULL, &delim); + strcpy(dataType, tokenType); + TYPE(&sd, filenameType,dataType); //crée le fichier } else if (strncmp(current_cmd, "MV", 2) == 0){ char filename_old[MAX_FILENAME_LENGTH]; char filename_new[MAX_FILENAME_LENGTH]; - char delim = ' '; + char * tokenMv = strtok(current_cmd, &delim); tokenMv = strtok(NULL, &delim); //prend ancien nom strcpy(filename_old, tokenMv); tokenMv = strtok(NULL, &delim); //prend nouveau nom strcpy(filename_new, tokenMv); MV(&sd,filename_old, filename_new); // renommer le fichier - } + } else if (strncmp(current_cmd, "CAT", 3) == 0){ + char filenameCat[MAX_FILENAME_LENGTH]; + char * tokenCat = strtok(current_cmd, &delim); + tokenCat = strtok(NULL, &delim); //prend nouveau nom + strcpy(filenameCat, tokenCat); + CAT(&sd,filenameCat); //afficher le fichier + + } else if (strncmp(current_cmd, "CP", 2) == 0){ + char filename_origin[MAX_FILENAME_LENGTH]; + char filename_copy[MAX_FILENAME_LENGTH]; + + char * tokenCp = strtok(current_cmd, &delim); + tokenCp = strtok(NULL, &delim); //prend ancien nom + strcpy(filename_origin, tokenCp); + tokenCp = strtok(NULL, &delim); //prend nouveau nom + strcpy(filename_copy, tokenCp); + CP(&sd,filename_origin, filename_copy); // copier le fichier + } else { - printf("La commande entree %s, n'a pas été reconnue\n", current_cmd); + printf("\nLa commande entree %s, n'a pas été reconnue\n", current_cmd); } - + printf("\nPicoOrdi>"); current_cmd[0] = '\0'; // Réinitialise la chaîne } } -- GitLab