Hyalma est le shell (coquillage) des Hauts Elfes. Son code se situe dans apps/hyalma/
Hyalma utilise flex pour générer son lexer à partir de lexer.lpp et bison pour générer son parser à partir de parser.ypp.
La documentation sur l'utilisation de flex et bison avec C++ (et non C) étant quasi-inexistante, nous sommes partis de la configuration proposée dans https://github.com/ezaquarii/bison-flex-cpp-example.
Une classe Command (dans command.hpp, command.cpp) représente les commandes. Sont notables :
vector<string> argv<, >, 2>, <<, >>, 2>>);, &&, ||, |)Pas de subtilité particulière dans lexer.lpp. Actuellement, les guillemets n'expandent pas les variables.
La classe Scanner (scanner.hpp) est la déclaration du lexer généré par flex.
Le bloc de base est subst_word, une concaténation de mots (WORD) et de variables substituées (VAR).
Une simple_command ne contient pas de séquence.
Les BLANK sont gérés de manière à éviter les conflits :
BLANK contient une quantité arbitraire de blancsBLANK optionnels sont développés directement dans la règle sans utiliser opt_blank (bison ne semble pas permettre d'inliner des règles)simple_command ne commence ni ne finit par un BLANK, alors que command permet les BLANK en début et en finLe parser appelle la fonction exec du shell, avec éventuellement un paramètre background pour gérer &.
shell.cpp gère la lecture et l'exécution des commandes, le prompt et le Ctrl+C.
Plusieurs niveaux :
fd à utiliser pour stdin,stdout,stderram=cd, export, exit)|, les deux en même tempsexec()exec_complex() en passant les fds par défaut (stdin,stdout,stderr)$?Le handler se contente de passer un booléen à true. Selon là où en est le shell (prompt, exécution d'une commande), le signal est transmis à un fils ou le buffer est vidé.
Nous ne supportons pas les read non bloquants sur un pipe, ce qui empêche de vider stdin lors d'un Ctrl+C : on bufferise donc l'entrée (voir bigbuf). Ce n'est pas suffisant : actuellement, si on tape du texte pendant l'exécution d'une commande, il ne sera pas vidé.