From 9cbc6286708cf7a17854510c110d3e80ec4e3a2d Mon Sep 17 00:00:00 2001
From: pifou <pifou@zabeth28>
Date: Wed, 20 Dec 2023 18:46:05 +0000
Subject: [PATCH] =?UTF-8?q?RM=20corrig=C3=A9,=20TYPE=20bugg=C3=A9=20pour?=
 =?UTF-8?q?=20fichier?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 SD/picofs.c | 180 ++++++++++++++++++++++++++++------------------------
 1 file changed, 98 insertions(+), 82 deletions(-)

diff --git a/SD/picofs.c b/SD/picofs.c
index 9cc3640..9d7fd4c 100755
--- a/SD/picofs.c
+++ b/SD/picofs.c
@@ -32,7 +32,7 @@ void readBlock(SD_info *sd, unsigned int numBlock, int offset, char *storage, in
 
 void writeBlock(SD_info *sd, unsigned int numBlock, int offset, char *source, int size) {
 
-    char buffer_write[BLOCK_SIZE/2];
+    char buffer_write[BLOCK_SIZE];
     readData(sd, numBlock, 0, size, (uint8_t *)buffer_write);
     if(offset + size > 512 )
     {
@@ -51,22 +51,35 @@ void writeBlock(SD_info *sd, unsigned int numBlock, int offset, char *source, in
 
 }
 
+// void eraseSD(SD_info *sd){ //met des 0 partout dans la carte SD
+//     char zeros[BLOCK_SIZE];
+//     for(int i = 0; i< BLOCK_SIZE-1;i++){
+//         zeros[i] = '0';
+//     }
+//         zeros[BLOCK_SIZE-1] = '\0';
+//
+//     for (int blockNum = 0; blockNum < 5000; blockNum ++){
+//         //printf("erase\n");
+//         writeBlockSD(sd,blockNum,zeros);
+//     }
+//     return;
+// }
+
 void LS(SD_info *sd) {
     char buffer[MAX_FILENAME_LENGTH];
     int fileCount = 0;
     printf("\n");
-    // Parcourir les blocs multiples de 16 à partir de 0 jusqu'à MAX_BLOCKS_IN_SUPERBLOCK
+    // // 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);
+         readBlock(sd,blockNum, 0, buffer, MAX_FILENAME_LENGTH);
 
-        // Vérifier si le nom de fichier est vide
-        if (buffer[0] != 0) {
-            // Afficher le nom du fichier
+         // Vérifier si le nom de fichier est vide
+         if (buffer[0] != 0) {
+         // Afficher le nom du fichier
             printf("%s\n", buffer);
             fileCount++;
-        }
-    }
-
+         }
+     }
     if (fileCount == 0) {
         printf("\nAucun fichier trouvé.\n");
     }
@@ -105,10 +118,18 @@ int min(int a, int b) {
     return a < b ? a : b;
 }
 
+// Fonction qui reconstitue le numéro de bloc à partir du tableau
+int reconstituteNumber(char blockNumberBuffer[2]) {
+    char octet1 = blockNumberBuffer[0];
+    char octet2 = blockNumberBuffer[1];
+    int dataBlockNum = (octet1 << 8) | octet2;
+    return dataBlockNum;
+}
+
 void RM(SD_info *sd, char *filename) {
     int fileFound = -1;
     int offset;
-    char fileBuffer[BLOCK_SIZE];
+    char fileBuffer[CHUNK_SIZE];
     
     // Parcourir les blocs réservés pour la description des fichiers (superbloc)
     for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) {
@@ -139,25 +160,26 @@ void RM(SD_info *sd, char *filename) {
             startOffset = MAX_FILENAME_LENGTH;
         }
 
-        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 chunkStart = startOffset; chunkStart < BLOCK_SIZE/2; chunkStart += CHUNK_SIZE) {
+        //    int chunkSize = min(CHUNK_SIZE, BLOCK_SIZE/2 - chunkStart);
+            int chunkSize = 0;
+            int chunkStart = 0;
+            readBlock(sd,blockNum, 0, fileBuffer, chunkSize);
 
-            for (int i = 0; i < chunkSize; i += 2) {
-                int blockNumData = (fileBuffer[i] << 8) | fileBuffer[i + 1];
-                
+            //for (int i = 0; i < chunkSize; i += 2) {
+            //    int blockNumData = (fileBuffer[i] << 8) | fileBuffer[i + 1];
+            int blockNumData = reconstituteNumber(fileBuffer);
                 if (blockNumData == 0) {
-                    writeBlock(sd,blockNum, chunkStart, fileBuffer, chunkSize); 
+                    writeBlock(sd,blockNum, chunkStart, fileBuffer, chunkSize);
                     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
-                fileBuffer[i] = 0;
-                fileBuffer[i + 1] = 0;
-            }
-
+                else setBlockAvailability(sd,blockNumData, 0); // Marquer le bloc comme disponible
+                //fileBuffer[i] = 0;
+                //fileBuffer[i + 1] = 0;
+            //}
             writeBlock(sd,blockNum, chunkStart, fileBuffer, chunkSize);
-        }
+        //}
     }
 
     printf("\nLe fichier \"%s\" a été supprimé avec succès.\n", filename);
@@ -171,7 +193,7 @@ void MV(SD_info *sd, char *old_filename, char *new_filename) {
     int fileFound = 0;
     
     // Parcourir les blocs réservés pour la description des fichiers (superbloc)
-    for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) {
+    for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 1) {
         
         readBlock(sd,blockNum, 0, filenameBuffer, MAX_FILENAME_LENGTH);
         
@@ -181,14 +203,15 @@ void MV(SD_info *sd, char *old_filename, char *new_filename) {
             if (sizeNew_filename < MAX_FILENAME_LENGTH) {
                 sizeNew_filename+=1;
             }
-            
+
             // Écrire le nom du fichier dans l'emplacement
             writeBlock(sd,blockNum, 0, new_filename, sizeNew_filename);
-            
+
             fileFound=1;
 
             break; // Nom modifié, sortir de la boucle
         }
+
     }
     if (fileFound == 1) {
         printf("\nLe nom du fichier \"%s\" a été renommé avec succès.\n", old_filename);
@@ -232,13 +255,7 @@ int findAvailableBlock(SD_info *sd) {
     return -1;
 }
 
-// Fonction qui reconstitue le numéro de bloc à partir du tableau
-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
@@ -256,12 +273,12 @@ void TYPE(SD_info *sd, char *filename, char *data) {
     int index_in_descrBlock = 0;
     int offset;
 
-    
+
     if (sizeFilename > MAX_FILENAME_LENGTH) {
         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_BLOCKS_IN_SUPERBLOCK; blockNum += 16) {
         readBlock(sd,blockNum, 0, buffer, MAX_FILENAME_LENGTH);
@@ -273,59 +290,58 @@ void TYPE(SD_info *sd, char *filename, char *data) {
             }
             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
-            
+
             char chunkBuffer[CHUNK_SIZE];
             size_t bytesRead;
-            
 
-                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
-                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
-                    // 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++;
+            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
+            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
+            // Ecriture du numéro de bloc utilisé dans les blocs de description
+            if (index_description_block == 0) {
+                offset = MAX_FILENAME_LENGTH;
+            } else {
+                offset = 0;
+            }
 
-                    dataBlockNum = findAvailableBlock(sd); // Passer au bloc suivant
-                    blockSizeUsed = 0; // Réinitialiser la taille utilisée
-                    
-                    // Passage au bloc de description suivant
-                    if (block_counter == (BLOCK_SIZE/2-offset)) {
-                        index_description_block++;
-                        index_in_descrBlock=0;
-                    }
-                        
-                    // Compteur de nombre de blocs utilisés
-                    block_counter++;
-                    
-                    // Vérifie si on a atteint le nombre maximal de blocs par fichier
-                    if (block_counter >= 2040) {
-                        printf("Le fichier a atteint sa taille maximale\n");
-                        return;
-                    }
+            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
+
+            // Passage au bloc de description suivant
+            if (block_counter == (BLOCK_SIZE/2-offset)) {
+                index_description_block++;
+                index_in_descrBlock=0;
+            }
+
+            // Compteur de nombre de blocs utilisés
+            block_counter++;
+
+            // Vérifie si on a atteint le nombre maximal de blocs par fichier
+            if (block_counter >= 2040) {
+                printf("Le fichier a atteint sa taille maximale\n");
+                return;
+            }
 
-            
             break; // Fichier créé, sortir de la boucle
         }
     }
-    
+
     if (placeFound != -1) {
         printf("Le fichier \"%s\" a été créé avec succès.\n", filename);
     } else {
@@ -361,9 +377,9 @@ void CAT(SD_info *sd, char *filename) {
                 // Lecture des octets deux par deux
                 for (int i=0; i<BLOCK_SIZE;i+=2) {
                     readBlock(sd,descrBlockNum+blockNum, offset+i, byteBuffer, 2);
-                
+                    printf("\nByte buffer: %s\n", byteBuffer);
                     // Lire les numéros de blocs associés à ce fichier depuis les blocs de description
-                    int dataBlockNum = reconsituteNumber(byteBuffer);
+                    int dataBlockNum = reconstituteNumber(byteBuffer);
                     // Vérifier si le numéro de bloc est valide (non nul)
                     if (dataBlockNum == 0) {
                         return; // Fin du fichier
@@ -372,7 +388,7 @@ void CAT(SD_info *sd, char *filename) {
                     //for (int chunkStart = 0; chunkStart < BLOCK_SIZE; chunkStart += CHUNK_SIZE) {
                         // Lire et afficher le contenu du bloc de données
                         readBlock(sd,dataBlockNum, 0, dataBuffer, CHUNK_SIZE);
-                        printf("\n%s\n",dataBuffer );
+                        printf("\n%s\n",dataBuffer);
                     //}
                 }
             }
@@ -445,7 +461,7 @@ void CP(SD_info *sd, char *source_filename, char *destination_filename) {
             readBlock(sd,source_offset + i, offset + byteNum, numBuffer, 2);
             
 
-            numDataBlock = reconsituteNumber(numBuffer);
+            numDataBlock = reconstituteNumber(numBuffer);
             if (numDataBlock == 0) {
                 printf("\nLa copie de \"%s\" sous le nom \"%s\" a été créée avec succès.\n", source_filename, destination_filename);
                 return;
@@ -493,10 +509,10 @@ int main(int argc, char *argv[]) {
 
     printf("Pico ordinateur OK\n\n");
     // char current_cmd[CMD_SIZE + 1]; // +1 pour le caractère nul
-    erase(&sd, 0, 15000);
+    erase(&sd,0,15000);
     current_cmd[0] = '\0'; // Initialise la chaîne vide
     printf("PicoOrdi>");
-
+    //eraseSD(&sd);
     while (1) {
 
         _delay_ms(10);
-- 
GitLab