Lecture de fichier de configuration ?

Salut la compagnie,



Je suis en train de me replonger dans un vieux projet d'outil d'édition de fichier de config de FetchMail, j'aurais aimé votre avis sur comment lire correctement un fichier de config.



Fetchmail est hyper permissif en terme de syntaxe de config et j'aimerais être capable d'importer des fichier gérer à  la main. Pour vous donner une idée voici une idée de conf possible :


<br />
set daemon 300<br />
poll pop3.oleane.fr with protocol POP3 user &#39;yoann.gini&#39; there with password &#39;myW0nderfu1P@swd&#39; is &#39;yoann&#39; here<br />
poll example.com proto pop3:<br />
user &quot;joesoap&quot;, with password &quot;XXX&quot;, is &quot;jsoap&quot; here;<br />
user &quot;andrea&quot;, with password &quot;XXXX&quot;;<br />
poll example2.net proto imap:<br />
user &quot;john&quot;, with password &quot;XXXXX&quot;, is &quot;myth&quot; here;<br />




Ce fichier est parfaitement valide et permet de vous montrer le coté chiant à  la lecture...



Il y a deux type de ligne, les set truc qui permettent de régler des options globales et il y a le reste...



Le reste commence par un poll indiquant les infos du serveur et peut être suivis par une ou plusieurs définition d'utilisateur qui se finisse ou non par un point-virgule...



En fait fetchmail supporte un grand nombre de mot clef inutile, des choses qui ne sont pas interprété et qui sont présent uniquement pour le style...



J'aurais aimé avoir votre avis sur comment interpréter ça en Cocoa sans avoir à  finir à  coup de YACC...

Réponses

  • AlakAlak Membre
    Personnellement je commencerai par virer les mots clef non interprété.

    Et donc d'essayer de repartir d'un model strict et épuré.

    Après je penses que pour finir il n'y a pas 36 façons, avec des syntaxes aussi permissives.
  • Pas évident. J'avais eu l'occasion de traiter des fichiers de config. mais moins compliqués que le tiens.

    J'ai abondemment utilisé NSScanner et NSCharacterSet (par exemple pour traiter des données du style {x,y,z} ou { x, y, z} ou { 'x x x', 'y y y', 'z z z'} qui sont toutes valides).



    Je m'en suis bien sorti en fin de compte.
  • yoannyoann Membre
    Je vais jeter un oe“il du côté de NSScanner, je n'ai pas encore bien regardé.



    D'un point de vue algo de lecture que pensez-vous de ceci :



    " chargement du fichier sous forme de NSString unique ;

    " suppression de tout le sucre syntaxique ;

    " remplacement des espaces cumulé et tabulation par simple espace ;

    " suppression des espaces de début et fin de ligne ;

    " récupération et interprétation des lignes set ;



    Ne reste plus que les config de serveur / utilisateur, j'envisage un truc du genre :

    " découpage par mot clef poll et interprétation du serveur et protocole associer ;

    " pour le subset en cours, découpage par mot clef user et interprétation des options associer.



    Ce qui me semble couvrir l'ensemble des problématiques du fichier... Qu'en pensez-vous ?
  • AliGatorAliGator Membre, Modérateur
    Moi je ne ferai pas forcément de nettoyage préalable.



    Je ferais plutôt :
    • Lecture du fichier ligne par ligne, passage de chaque ligne à  une méthode "parseLine:withContext:"
    • "parseLine:withContext:" découpe ta ligne en mots ("componentsSeparatedByCharactersInSet:" + nettoyage éléments vides), puis regarde si le premier mot est "set", "poll" ou "user", et dispatch vers "parseSet:withContext:" ou "parsePoll:withContext:" ou "parseUser:withContext:"
    • les méthodes "parseXXX:withContext:" analysent le reste de la ligne, mot par mot. Elles ignorent les mots inconnus. Elles peuvent faire appel à  d'autres méthodes, par exemple "parsePoll:withContext:" peut analyser chaque mot, et quand il tombe sur un mot "user" appelle "parseUser:withContext:" avec le reste des mots
    • le context passé en second paramètre sert à  :
      • véhiculer les "variables d'environnement" qui sont définies au fur et à  mesure par les commandes "set"
      • savoir dans quel contexte tu te trouves au moment du parsing, en particulier par exemple l'objet représentant une configuration "poll" courante si tu es en train de parser les lignes de configuration "user" associées qui suivent, etc

  • Pareil qu'Ali.



    Je chargeais toutefois tout le fichier dans un NSString comme tu l'as suggéré.



    En revanche je ne faisais pas de nettoyage préalable : je lisais ensuite chaque ligne via un NSScanner propre à  ma classe. Puis c'est sur chacune des lignes que je procédais au nettoyage et à  l'analyse, en combinant l'utilisation d'un scanner spécifique (avec principalement les méthodes : scanUpToCharactersFromSet: , scanUpToString: , scanString:) et des méthodes de NSString du style stringByTrimmingCharactersInSet: , componentsSeparatedByString:).
Connectez-vous ou Inscrivez-vous pour répondre.