Greetings,
J'ai l'habitude de faire des outils de test en TUI (Terminal User Interface) et je me base sur une librairie que j'ai conçu pour mes besoins personnels.
Cette librairie essentiellement permet de dessiner des fenêtres en mode "drawbox" dans la zone unicode prévue à cet effet (U2500).
Donc à priori elle ne devrait pas générer d'effets de bords et puis je l'utilise depuis un moment sans avoir vraiment de gros soucis.
Mais récemment j'ai observé quelque chose de bizarre et j'ignore comment contourner la problématique.
Contexte: mon application va lire un texte et déterminer -- sur base de l'alphabet latin -- de quelle langue il s'agit, en fonction de données statistiques sur les occurences de certaines lettres contenues dans ces textes.
Pour l'écriture je me suis basé sur un texte en anglais assez court (296 octets) que j'ai placé dans une variable globale juste pour -- au minimum -- mettre en place le mécanisme d'analyse du texte et effectuer le calcul des occurences des lettres contenues dans le texte.
J'ai réservé 512 octets pour cette chaîne de caractères.
Quand je lance l'application, je n'ai aucun soucis, ça fonctionne (un petit bug avec les regex qui "laissent passer" des caractères de ponctuation alors que j'ai spécifié la classe [:alpha:] mais bon je contourne le soucis et je m'y appliquerais après)
Par contre lorsque je cherche à "injecter" (rediriger) un fichier texte, là, ça part en sucette.
Le fichier texte en question contient 324 bytes, la zone mémoire réservée pour le cas où il y aurait une "redirection détectée" est de 4Mb.
Pourtant j'observe un "effet de bord", en effet les variables permettant de déterminer le nombre de lignes et de colonnes contiennent des valeurs absurdes.
Comme je fais l'appel de la fonction en tout début de programme, même avec gdb, je ne peux que constater qu'effectivement ces valeurs sont absurdes.
En mode "normal" ma console (Konsole, virtuelle) mes logs indiquent en plein écran des valeurs comme 235x59... alors qu'en mode "redirigé" j'obtiens notamment 65341x21744, ou 11430x21744, ou 62000x9456.
Comme les valeurs sont aléatoires je supposes qu'il s'agit d'un écrasement de ces variables à un moment donné par je ne sais quelle instruction.
Voici la fonction incriminée, c'est celle-ci qui montre un certain "non déterminisme" (j'essaye d'utiliser des termes qui me donnent un air de scientifique) dans les valeurs récupérées en fonction du "mode":
Code:
1
2
3
4
5
6
7
8 void GetConsoleDimensions(unsigned int *colonnes,unsigned int *lignes) { struct winsize Dimensions; ioctl(0, TIOCGWINSZ, &Dimensions); *lignes=Dimensions.ws_row; *colonnes=Dimensions.ws_col-2; }
Je me base sur ioctl() pour récupérer les dimensions du terminal en terme de lignes et de colonnes.
Il y a une légère différence dans les types entre unsigned short dans la structure winsize et unsigned int dans mes paramètres de fonction.
Voici la partie des instructions qui sont inciriminées:
Pièce jointe 619084Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 ClearScreen(); GetConsoleDimensions(&uiWidth,&uiHeight); sprintf(Debug,"Dimensions de la console: %03u,%03u",uiWidth,uiHeight); Log(Logs,Debug); char inputfromcommand=nbgetchEx(); if(inputfromcommand!=-1) { sprintf(Debug,"Redirection détectée !!"); Log(Logs,Debug); txtFromCommand[position]=inputfromcommand; position++; do { inputfromcommand=nbgetchEx(); txtFromCommand[position]=inputfromcommand; position++; }while(inputfromcommand!=-1 && position<CHUNKSIZE); sprintf(Debug,"Texte redirigé (taille: %05d)",position); Log(Logs,Debug); } Fenetre=DrawTitledBoxWithRGB(1,1,uiHeight-3,uiWidth,getRGB(200,200,200,true),"[Déterminer la langue]",(struct s_RGB){0},COLORED_BOTH); AlphabetLatin=DrawTitledBoxWithRGB(Fenetre.Width-16,2,26,16,getRGB(200,200,200,true),"[Analyse]",(struct s_RGB){0},COLORED_BOTH);
En gros c'est ce que je suis censé obtenir de manière idéale...
Je ne saurais pas afficher évidemment le résultat lorsque je fais une redirection vu les valeurs absurdes que j'obtiens en sortant de GetConsoleDimensions().
Voici ce que j'obtiens quand je passe par gdb... en "mode redirigé"...
Pièce jointe 619086
Je ne sais pas faire grand chose... du fait que cela se passe via ioctl() au tout début de mon programme.
Question: que peut-il bien se passer ?
Pistes: je pourrais laisser tomber la détection d'une redirection et passer par des paramètres en ligne de commande...
Peut-être que le "mode" TUI ne convient pas pour les redirections (je n'ai pas d'exemples de TUI en tête qui effectivement acceptent la redirection de fichiers)