Bonjour à tous.
Je développe actuellement une version simplifié de la GNU Readline (Chet Ramey).
Pour se faire j'utilise la librarie termcap.
Je rencontre plusieurs problèmes:
Le premier est lié au fait que je dois constamment connaître la position de mon curseur de manière à pouvoir naviguer (via tgoto) au sein de ma ligne d’édition (left arrow, right arrow, page up, page down, home, end etc..). Termcap ne met rien à disposition pour ça..
Je souhaiterai donc savoir s'il n'y a vraiment rien de plus propre (sans utilisation d'autres librairie) que de la demander au terminal à l'entrée du programme via la séquence CSI 6n, pour parser sa réponse? Et ensuite la mettre à jour selon mes déplacements et affichage..
EDIT:
Problème (erroné de ma part), résolu par Matt_Houston.
Le second est lié au fait que les fonctions tgetstr, tgoto, tparm et tputs utilisent des buffers internes qu'il m'est impossible (je pense) de free.. Cela signifie t-il qu'à la longue tout programme utilisant ma Readline aura pour vocation de bouffer toute la mémoire?.. Si oui (toujours sans utilisation d'autres librairie) la seule solution qu'il me reste est-elle de générer moi même toutes les séquences CSI que ces fonctions génèrent? (Si c'est bien ce qu'elle font? ^^).You describe the output buffer by its address, buffer, and its size in bytes, size. If the buffer is not big enough for the data to be stored in it, tparam calls malloc to get a larger buffer. In either case, tparam returns the address of the buffer it ultimately uses. If the value equals buffer, your original buffer was used. Otherwise, a new buffer was allocated, and you must free it after you are done with printing the results.
FIN EDIT.
La dernière est lié à la gestion du redimensionnement en cours d’exécution, par l'utilisateur du terminal. Pour le moment je catch le signal SIGWINCH et j'appelle ioctl avec TIOCGWINSZ pour réinitialiser mes valeurs "nombre de ligne affichable" et "nombre de colonne affichable" ainsi que la réponse de la séquence CSI 6n pour la nouvelle position du curseur.
Seulement ça implique au minimum un iocl(), un write(), et un (voir plus) read() au sein du sighandler... En plus du ré-affichage de la partie visible de ma ligne d'édition, le repositionnement du curseur etc... Et je ne suis vraiment pas sur que se soit une bonne pratique..? (POSIX compliance etc...).
On va en rester là pour le moment ^^.
Merci beaucoup à ceux qui se pencheront sur ces questions.
PS: J'ai cherché durant de longues heures et en vain à comprendre l'implémentation de la GNU Readline Library (via ses sources: GNU Readline Source)...
Si quelqu'un aurait un lien (s'il existe) vers une analyse, une discussion, ou autre relative à cette implémentation, je lui en serait très reconnaissant! J'ai lu et relu la doc mais je n'arrive toujours pas à me faire une idée (même simpliste) sur la manière dont elle est pensée/organisée/implémentée etc...
Encore merci.
Partager