Bonjour,
Dans un buffer qui contient le fichier brut, je doit remplacer les CR par LF, les CRLF par LF, si il n'y a que LF je n'y touche pas.
Le principe c'est dès que je trouve un CR, je test si le prochain caractere est un LF, si oui, je décale (memove) le buffer d'une position vers la gauche, le CR disparait remplacé par le LF.
Si il y a un CR, je le remplace par LF, il ne peut pas y avoir de LF, comme je l'ai remplacé avant dans le cas d'un CR LF.
Si il y a un LF seul, je ne fait rien.
Sur le code ci-dessous, ca fonctionne sur un fichier idéal, un fichier normal avec des retour chariot (CRLF).
La ou cela se complique c'est si une ligne, en général la dernière ligne, n'a ni de LF, ni de CR et ni de CRLF.
il faut aussi que j'ajoute un LF si dans le dernier caractère de la dernière ligne, qui ne contient rien (pas CR, LF, CRLF).
Le fichier peut être un fichier binaire, donc pas de strlen et de '\0' etc.
Dans le code ci-dessous, je remplit le fichier dans un buffer en brut, donc le buffer contient chaque caractère du fichier. si le fichier fait 288 Bytes, la longueur est de 288 Bytes, sans le '\0'.
unsigned long dumpFileToBuffer(File file, byte * Buffer)
{
unsigned long i;
i = 0;
file.seek(0);
while (file.available()) {
byte ch = file.read();
Buffer[i++] = ch;
}
Buffer[i] = '\0';
return i;
}
Après je fait le traitement sur ce buffer, qui sera modifié, ajout de LF si il le faut ou suppression du CR pour le remplacer par un LF
A chaque fois que je décale vers gauche, la longueur du buffer diminue de 1, j'ai donc une variable décalage qui s'incrémente.
Si le fichier fait 288 Bytes qui contient deux lignes, au final j'ai 288 - 2, donc 286 bytes.
car j'ai remplacer 2 fois un CRLF par LF, donc deux décalage.
mais le problème c'est quand un fichier et que la dernière ligne n'a aucune terminaison, en ces là je doit ajouter un LF.
Et là ou il y le problème c'est quand il n'y a pas de terminaison, la taille du fichier ajoute 2 bytes je ne sais pas pourquoi.
unsigned long dumpFileToBufferWithOnlyLF(File file, unsigned long sizeArray, byte * Buffer)
{
long currentPos = 0;
byte *ptr = Buffer;
byte *mptr = ptr;
byte *endp = Buffer + sizeArray;
int decalage = 0;
while (mptr < endp)
{
mptr = &ptr[currentPos * 1];
if ( *mptr == CR && *(mptr + 1) == LF) {
memmove(mptr, mptr + 1, sizeArray - (currentPos + 1));
endp -= 1;
//currentPos++;
++decalage;
}
else if (*mptr == CR) {
*mptr = LF;
currentPos++;
} else currentPos++;
}
currentPos +=1;
SERDEBUG.printf("currentPos: %lu decalage: %d currentPos - decalage: %d\r\n", currentPos, decalage, currentPos - decalage);
if (decalage == 0) {
if (*((ptr+currentPos) - 2) != '\n') {
*((ptr+currentPos) - 2) = '\n';
}
}
else if (*((ptr+currentPos+1) - decalage) != '\n')
{
*((ptr+currentPos+1) - decalage) = '\n';
}
return currentPos - decalage;
}
Quand il n'y a pas de décalage dans le cas de la ligne qui ne contient aucune terminison, j'enlève 2 car ca m'ajoute 2 car., c'est la que je ne pige pas.
Si la taille du fichier est de 140 bytes, au final je devrait avoir 141 bytes, car ajout d'un LF.
mais là, en sortant de la fonction dumpFileToBufferWithOnlyLF, j'ai 142.
J'ai trouvé sur le net du code, mais qui remplace que les CRLF par LF, et ca ne m'aide pas.