Lecture de fichier de configuration ?
yoann
Membre
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 :
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...
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 'yoann.gini' there with password 'myW0nderfu1P@swd' is 'yoann' here<br />
poll example.com proto pop3:<br />
user "joesoap", with password "XXX", is "jsoap" here;<br />
user "andrea", with password "XXXX";<br />
poll example2.net proto imap:<br />
user "john", with password "XXXXX", is "myth" 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...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
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.
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 ?
Je ferais plutôt :
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:).