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

Signaler
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
-
Messages postés
36266
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
18 janvier 2021
-
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
36266
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
18 janvier 2021
5 850
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 ;-)
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 247
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.
Messages postés
36266
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
18 janvier 2021
5 850
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
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 247
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).
Messages postés
36266
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
18 janvier 2021
5 850
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
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 247
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"
Messages postés
36266
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
18 janvier 2021
5 850
à 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...
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 247
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 ;-)
Messages postés
36266
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
18 janvier 2021
5 850
Pour l'exception, ça devrait faire l'affaire :

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