[shell linux] modifier des fichiers C automat [Résolu/Fermé]

Signaler
Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
-
zipe31
Messages postés
38009
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
16 janvier 2020
-
Bonjour,
pour résumer, je cherche à faire un script permettant de modifier des fichiers sources C++.

J'ai un bon paquet de fichier ayant des structures anonymes sous cette forme :
struct{
// corps de la structure avec que des variables
}MACRO_STR(nomvar);

MACRO_STR est une macro qui peut modifier le nom de la variable selon l'OS (je l'ai mis car ça peut aider).
et je voudrais donner un nom à chaque structure pour pouvoir la réutiliser après :
struct _nomvar{
// corps de la structure avec que des variables
}MACRO_STR(nomvar);

comme ça serait trop simple, les espaces peuvent variés d'un fichier à l'autre.
Je ne vois pas de manière simple de faire avec les outils classique de Linux.
Peut être avec awk, mais je ne le maitrise pas du tout (j'ai awk 3.1.1).
Merci.


2 réponses

Messages postés
38009
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
16 janvier 2020
4484
Salut,

Je ne sais pas si c'est vraiment ça que tu attends, mais bon...

$ cat plop
struct{
// corps de la structure avec que des variables
}MACRO_STR(nomvar1);

struct{
// corps de la structure avec que des variables
}MACRO_STR(nomvar2);

struct{
// corps de la structure avec que des variables
}MACRO_STR(nomvar3);


$ sed '/^struct/{:z;N;/MACRO_STR(.*)\;$/! bz;s/\([^{]*\){\(.*(\)\([^)]*\));/\1 _\3{\2\3);/}' plop
struct _nomvar1{
// corps de la structure avec que des variables
}MACRO_STR(nomvar1);

struct _nomvar2{
// corps de la structure avec que des variables
}MACRO_STR(nomvar2);

struct _nomvar3{
// corps de la structure avec que des variables
}MACRO_STR(nomvar3);

$


A adapter si toutefois c'était bien tes espérances, je n'ai fait qu'avec les éléments fournis ;-)
Char Snipeur
Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
1118
Ba écoute... je ne sais pas trop comment te dire ça, mais...
C'est exactement ce que je cherchais à faire ;-D merci !
Une petite différence toutfois, c'est le "^" devant struct, je ne suis pas sur de sa définition... Je crois que ça veux dire que struct est le premier mot de la ligne, ce qui n'est pas forcément le cas. J'ai remplacé par "\b" qui semble fonctionné (si tu vois un problème éventuel n'hésite pas).
En revanche, j'ai un autre problème : MACRO_STR est utilisé à d'autres endroits du code. J'avais oublié cette contrainte dans mon premier message.
zipe31
Messages postés
38009
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
16 janvier 2020
4484
J'ai remplacé par "\b" qui semble fonctionné (si tu vois un problème éventuel n'hésite pas).
Non dans la mesure où on ne le retrouve qu'à l'intérieur d'un mot dans les autres cas et que c'est le seul cas susceptible de se présenter ;-\


En revanche, j'ai un autre problème : MACRO_STR est utilisé à d'autres endroits du code.
Il me faudrait des exemples précis afin d'optimiser le code au plus juste ;-\

Merci ;-)
Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
1118
un exemple plus concret :
struct{
    int j;
    double f;
}MACRO_STR(nomvar1);

struct{
    int n;
    int g;
    double lm;
}MACRO_STR(nomvar2);

class machin
{
     double MACRO_STR(variC1);
     double MACRO_STR(variC2);
//...
};

En fait, je viens de me rendre compte (après quelques essais bidouillé) que ce que je fais ne va pas.
En fait, il faut récupérer le bloc struct (avec un nom) et le mettre dans un autre fichier (en effet, il s'agit de fichier .c et non de .h, donc je ne peut pas récupérer les types définis).
zipe31
Messages postés
38009
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
16 janvier 2020
4484
Si je comprend bien, tu n'as pas d'idée pour extraire juste le bloc de structure afin de le mettre dans un autre fichier.
Si si, je croyais qu'en disant ça tu voulais faire totalement autre chose ;-((

sed -n '/\bstruct/{:z;N;/}MACRO_STR(.*)\;$/! bz;s/\([^{]*\){\(.*(\)\([^)]*\));/\1 _\3{\2\3);/p}' fich_entrée > fich_sortie
Char Snipeur
Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
1118
parfait ça fonctionne. à une exception pret, dans un fichier j'ai :
// extern "C" struct {
struct{
Mais c'est pas grave, pour un je modifie à la main.
Je ne comprend pas bien l'effet du "-n"
zipe31
Messages postés
38009
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
16 janvier 2020
4484
à une exception pret
Évidemment il fallait qu'il y en ait une ;-((


Le "-n" (no-print) marche de paire avec le flag "p" (en fin d'instruction). Il empêche l'affichage de s'effectuer, sauf si on le lui demande explicitement avec le flag "p" (print).

Voir dans la faq sur sed...
Char Snipeur
Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
1118
a y est, compris : ça permet d'afficher seulement la partie qui nous intéresse. Merci beaucoup pour ton aide. Même si ce que je fait ne servira à rien (les lubis des chefs...) au moins j'aurais appris des trucs ;-)
zipe31
Messages postés
38009
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
16 janvier 2020
4484
Pour l'exception, ça devrait faire l'affaire :

sed -n '/^\/\//d;/\bstruct/{...