| Qui est en ligne ? |
| Il y a : 17 utilisateurs en ligne, consultez le détail |
Forum » Serveur, Réseaux et Programmation » [coding] Préprocesser un fichier - Analyse de text |
Forum modéré par : jblecanard |
| Même auteur |
|
Score ( voter ) : |
|
| Page : [1] |
| Auteur | Message |
|---|---|
|
|
#0 Message posté le : 13-12-2006 à 01:00:55 |
Petit scarabée Forum : Inscrit Association : Arrivé(e) le : 27-02-2003 Nombre de messages : 29 |
Salut à tous, Voici ma petite question: je suis à la recherche de solutions pour effectuer des traitements sur des fichiers sources. En particulier, je voudrais faire un petit outil qui permette d'enlever le contenu des #ifdef dans un source. Une sorte de nettoyage. L'exemple: A #idef XXX B #endif // XXX C deviendrait: A C Vers quoi m'orienter ?? un script (shell, Perl, ruby ??), un petit soft, un préprocesseur genre m4? |
|
|
#1 Message posté le : 13-12-2006 à 05:42:45 |
Naboo Forum : Inscrit Association : Arrivé(e) le : 22-07-2003 Nombre de messages : 2128 |
Je vais tenter de répondre à ta question concernant les #ifdef XXX. Bon : je ne suis pas un expert dans les instructions préprocessorielles (néologisme !), mais en ce qui a trait au traitements de chaînes de caractères dans un fichier, je suis pas pire. Le langage dans le lequel tu veux faire ça, c'est lequel ? Personnellement, j'aime beaucoup Perl, donc mes exemples se baseront sur ce langage, mais ce n'est pas obligé... Premièrement, si tu dis #ifdef XXX, tu dois supposer que XXX est défini ou non. Donc, d'après moi, à chaque fois que tu rencontres un #define <qqchose>, tu dois garder en mémoire le nom de ce qui a été défini. Ensuite, lorsque tu rencontres un #ifdef XXX, tu peux vérifier si le XXX est défini, et tu fait les actions en conséquences jusqu'à ce que tu rencontres un #endif. J'écris rapidement, car je vais le tester pour voir si ça se tient, et je te reviendrai là-dessus le plus tôt possible. ------------------------------------- GNU/Linux? Il y a moins bien, mais c'est plus cher! Mon blog (pas très souvent updaté, mais tout de même...) : http://guimauve2.blogspot.com/ |
|
|
#2 Message posté le : 13-12-2006 à 09:38:56 |
Hobbit Forum : Inscrit Association : Arrivé(e) le : 17-10-2003 Nombre de messages : 1067 |
Ca dépend du contexte. Un #ifdef ... (les macros) servent souvent à éviter l'inclusion multiple (et inutile) de headers et aussi à rendre certaines parties du code dépendantes d'une variable macro (comme un code qui doit être compilé et pris en compte uniquement sur linux, un autre sur solaris, ....). Donc si tu supprimes les macros, tu risques de rendre le code inutilisable à moins d'utiliser un preprocessing qui nettoie intelligemment (mais quel intérêt ? le préprocesseur cpp/c++ dans gcc est là pour ça) . ------------------------------------- If you don't know, ask manpage ! |
|
|
#3 Message posté le : 13-12-2006 à 11:56:07 |
Petit scarabée Forum : Inscrit Association : Arrivé(e) le : 27-02-2003 Nombre de messages : 29 |
Guimauve2: Mon premier but est de retirer simplement les #ifdef et leur contenu. Cependant si dans un deuxième temps l'outil peut devenir un peu plus intelligent... pourquoi pas! En effet dans la majorité des cas je rencontre des 'XXX' définis. Ainsi je me disais qu'il serait bien avant de supprimer du code de vérifier que tel #ifdef XXX correspond bien à tel #endif //XXX (voire meme vérifier qu'un #endif correspondant existe) tamiel: Je suis d'accord avec toi sur les risques. Cependant ce n'est pas vraiment la situation que je rencontre, mes #ifdef sont ici un bricolage qui permet d'utiliser le code avec un vieux compilateur et je n'en ai plus besoin par la suite. Cette manip a pour but de me simplifier la vie temporairement et son résultat n'est pas sauvegardé en base. |
|
|
#4 Message posté le : 13-12-2006 à 13:07:38 |
Naboo Forum : Inscrit Association : Arrivé(e) le : 22-07-2003 Nombre de messages : 2128 |
En effet ! Comme j'arrivais pas à dormir hier soir car j'avais une boisson énergisante trop tard Pour être parfaitement conforme, le programme doit être capable d'identifier les bons niveaux de #ifdef. L'implantation de cela n'est pas impossible, bien qu'elle demande réflexion. ------------------------------------- GNU/Linux? Il y a moins bien, mais c'est plus cher! Mon blog (pas très souvent updaté, mais tout de même...) : http://guimauve2.blogspot.com/ |
|
|
#5 Message posté le : 13-12-2006 à 15:57:14 |
Naboo Forum : Inscrit Association : Arrivé(e) le : 22-07-2003 Nombre de messages : 2128 |
Bon, voici le code en Perl. Là, j'ai fait afficher les #define. Si tu ne les veux pas, commente la ligne en italiques.
#!/usr/bin/perl -w
use strict;
my %definitions;
my $nomFichier = "fichierC.txt";
my $ligne;
my @tAffichage;
my $onEntreDansLeIf = 1;
my $niveauDeIf = 0;
my $ifPresent = 0;
my $ifAncien = 0;
my @tIfEntree;
my $element;
my $pasOK = 0;
my $niveauPasOK = 99999;
open(FP, $nomFichier) || die("Erreur");
while($ligne = <FP>) {
chomp($ligne);
if($ligne =~ /^#define ([^\s]+) ([^\s+])$/) {
$definitions{$1} = $2;
push @tAffichage, $ligne;
} elsif($ligne =~ /^#ifdef ([^\s]+)$/) {
$niveauDeIf++;
if(exists($definitions{$1})) {
# La définition existe
$tIfEntree[$niveauDeIf] = 1;
} else {
# La définition n'existe pas
$tIfEntree[$niveauDeIf] = 0;
$pasOK = 1;
$niveauPasOK = $niveauDeIf;
}
} elsif($ligne =~ /^#endif/) {
if($niveauDeIf == $niveauPasOK) {
$pasOK = 0;
}
$niveauDeIf--;
} else {
if(($tIfEntree[$niveauDeIf] && !$pasOK) || $niveauDeIf == 0) {
push @tAffichage, $ligne;
}
}
}
foreach $element (@tAffichage) {
print $element."\n";
}
close(FP);
--Message édité par Guimauve2 le 13-12-2006 à 15:57:41-- ------------------------------------- GNU/Linux? Il y a moins bien, mais c'est plus cher! Mon blog (pas très souvent updaté, mais tout de même...) : http://guimauve2.blogspot.com/ |
|
|
#6 Message posté le : 13-12-2006 à 16:17:10 |
Scarabée Forum : Inscrit Association : Arrivé(e) le : 08-09-2003 Nombre de messages : 978 |
STOP!!!!! IL Y A SED LE MERVEILLEUX POUR CA!!!! www.student.northpark.edu/pemente/sed/sed1 ou sed.sourceforge.net/sed1line.txt il touche pas le fichier original il l ouvre meme pas (donc il peut etre tTREES gros) il peut balancer a l ecran ou balancer sur un autre fichier ( >>) en gros,si je pige bien, ton fichier TOTO contient des #ifdef et tu veux virer ceux ci il faudrait d abord les remplacer par des blancs avec sed 's/cequejeveuxremplacer/parquoijeveuxleremplacer/g' s pour substitute et /g pour global (dans tout le ficheir) ou alors detecter les lignes qui commencent par ca, (c est ton cas?), et les virer. ca se fait en console en une ligne j ai pas trop le temps. dsl j essaierai de t aider si tu t en sors pas. pour effacer les blank lines from file TOTO, tu fais ceci sed '/./!d' (d pour delete) ca renverra l info sur l ecran mais sed '/./!d' TOTO >> tata.teixté te renverra le resultat sur le fichier tata.teixté --Message édité par greg le 13-12-2006 à 16:18:30-- |
|
|
#7 Message posté le : 13-12-2006 à 17:32:29 |
Hobbit Forum : Inscrit Association : Arrivé(e) le : 08-06-2004 Nombre de messages : 1239 |
Ouaip, bon normalement les fichiers de sources sont pas sensés faire plusieurs mégas Edit : tadam :
#!/usr/bin/gawk -f
BEGIN {
niveau_imbrication = 0
}
/^#ifdef/ {
niveau_imbrication += 1
}
!/^#ifdef.*$/ && !/^#endif.*$/ && niveau_imbrication == 0 {
print $0
}
/^#endif/ {
niveau_imbrication -= 1
}
edit 2 : Ça gère l'indentation maintenant. Sans dénigrer le code de guimauve, je pense que ça sera plus rapide. edit 3 : Maj du code --Message édité par Kangourou le 25-04-2007 à 12:29:54-- |
|
|
#8 Message posté le : 13-12-2006 à 23:36:46 |
Naboo Forum : Inscrit Association : Arrivé(e) le : 22-07-2003 Nombre de messages : 2128 |
Peut-être, mais que faire si le macro n'est pas défini? Mon code le gère, ça! ------------------------------------- GNU/Linux? Il y a moins bien, mais c'est plus cher! Mon blog (pas très souvent updaté, mais tout de même...) : http://guimauve2.blogspot.com/ |
|
|
#9 Message posté le : 14-12-2006 à 00:30:29 |
Hobbit Forum : Inscrit Association : Arrivé(e) le : 08-06-2004 Nombre de messages : 1239 |
C'est parce que j'ai pas tout compris Puis en fait quand je dis que ça peut être plus rapide, en fait j'en sais rien. Ça serai interessant de tester. edit : J'ai l'impression (mais je suis fatigué --Message édité par Kangourou le 14-12-2006 à 00:41:37-- |
|
|
#10 Message posté le : 14-12-2006 à 00:45:58 |
Petit scarabée Forum : Inscrit Association : Arrivé(e) le : 27-02-2003 Nombre de messages : 29 |
Merci à tous! Je teste tout ça demain!! ps: J'avais pensé à sed, mais je l'avais vu en tant que traitement ligne/ligne ce qui ne convenait pas. Mais si effectivement on lui fait absorber les fins de ligne ça peut le faire!! |
|
|
#11 Message posté le : 14-12-2006 à 00:48:05 |
Hobbit Forum : Inscrit Association : Arrivé(e) le : 08-06-2004 Nombre de messages : 1239 |
Attend t'en va pas, j'ai dis que j'avais pas tout compris et je vais pas en dormir Enfin sinon awk fais du traitement ligne par ligne et ça a l'air de convenir, en seulement 8 lignes (je compte pas les } qui ferment les blocs comme du code). Le code de guimauve fait egalement du traitement ligne par ligne (while($ligne = <FP>)) En fait je vois mal comment faire autrement --Message édité par Kangourou le 14-12-2006 à 00:53:16-- |
|
|
#12 Message posté le : 14-12-2006 à 00:58:15 |
Petit scarabée Forum : Inscrit Association : Arrivé(e) le : 27-02-2003 Nombre de messages : 29 |
Euh en fait qd je disais ligne par ligne et que je pensais que ça me convenait pas c car une forme #ifdef XXX blablablabla #endif prend plusieurs lignes. J'ai essayé de me plonger dans m4 (que je ne connaissais que de nom) comme le traitement s'aparente à du préprocess, mais j'en ai pas tiré grand chose. (enfin pour l'instant) Mais pour l'instant faut bien chercher dans les lignes les unes apres les autres. |
| Page : [1] |
Forum » Serveur, Réseaux et Programmation » [coding] Préprocesser un fichier - Analyse de text |
Forum modéré par : jblecanard |
| Même auteur |
|
Score ( voter ) : |
|
- Petit scarabée : 0 pastille, moins de 100 messages
- Scarabée : 0 pastille, plus de 100 messages
- Hobbit : 1 pastille, plus de 1000 messages
- Naboo : 2 pastilles, plus de 2000 messages
- Elfe : 3 pastilles, plus de 3000 messages
- Jedi : 4 pastilles, plus de 4000 messages
- Maître Jedi : 5 pastilles, plus de 5000 messages