J ai reçu un fichier texte hier que j ai ouvert dans un terminal.
Le problème est que le fichier est a peut prés illisible puisqu'il est remplit de multiples '^H'.
Il se trouve que j ai utilisé un petit scan généré par flex pour découvrir que ces '^H' sont en fait des caractères backspace (code ascii 8) et effectivement si je fait l effort de les interpréter moi même le fichier commence a être a peut prés lisible, seulement il fait quelques centaines de pages. Du coup j aimerai que mon pc fasse l effort pour moi.
J ai donc utilisé un scan flex construit a partir de
c est mieux mais pas top.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 %% \x08 {printf("");}
J ai donc fait un test et ai compilé un petit programme en c :
Quand je compile et exécute ce dernier programme j obtient bien ce que j espere, c est a dire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #include <stdio.h> int main() {printf ("%c",'3') ; printf("%c",'4') ; printf("%c",8);}
plus mon invite collée évidemment puisque j ai pas mis de retour chariot...
j ai donc decide de reprendre le scanner précédent en le modifiant un peu :
Résultat quand je passe mon fichier texte a la moulinette de ce scanner ben j obtient le même fichier que l original... sauf si je l affiche directement sur stdout.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 %% \x08 {printf("%c",8);}
Conclusion, (désolé je pense tout haut...), stdout 'interprète' le caractère backspace.
J aimerais donc faire un scanner qui interprète ce caractère, malheureusement j ai l impression de partir vers un truc bien compliqué et tous les essais que j ai fait jusqu’à présent se soldent par un échec.
Je mets ici le dernier en date, ne soyez pas trop méchants
Dans ma tête ce scan devrait pouvoir gerer ce qui se passe pour au maximum dix backspaces successifs, dans les faits, il marche presque, je dis bien presque :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 %{ char textbuff[11]="0123456789\0"; int myindex = 0 ; int mustAppend = 0; void decIndex() { if (myindex >0) { myindex-- ; mustAppend = 0;} } void incIndex() { myindex++; if (myindex== 10) { mustAppend = 1 ; myindex = 0 ;} } void putBuff( const char c) { if (mustAppend == 1 ) { printf("%s",textbuff); mustAppend = 0; putBuff(c);} else {textbuff[myindex] = c ; incIndex();}} void flushBuff() { textbuff[myindex+1]='\0'; printf("%s",textbuff);} %} %% \x08 { decIndex() ;} . { putBuff(*yytext) ;} <<EOF>> {flushBuff();}
1) il y a un problème manifeste avec les retours chariots.
2) quand je passe mon fichier texte par la moulinette de ce scan... l analyse ne se termine pas, me produit un fichier astronomiquement grand, contenant en son debut l approximation de ce que devrait etre mon fichier final modulo la remarque précédente.
Du coup j ai plusieurs questions :
- J ai l impression qu il n est pas possible de gérer un nombre indéterminé de backspaces successifs en une seul passe, ai-je tord ?
- Y a t il une méthode (une option a passer a vim par exemple...) pour le forcer a interpréter ces satanés backspaces ? (je sens que je vais pleurer mais j voulais quand même essayer avec flex...)
- Est ce que ma méthode vous parait censée ?
- Est ce que vous voyez ce qui cloche dans la définition de mon scanner pour éviter les deux problèmes ?
Partager