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:
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 direCode:
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...Code:3
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:
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:
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 ?