[shell linux] modifier des fichiers C automat

Résolu/Fermé
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 3 mai 2011 à 10:12
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 3 mai 2011 à 16:26
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.


A voir également:

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
3 mai 2011 à 11:07
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 ;-)
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 mai 2011 à 12:37
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.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
3 mai 2011 à 12:46
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 ;-)
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 mai 2011 à 14:31
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).
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
3 mai 2011 à 14:35
;-((

Sinon, si ça peut servir en réponse à la demande initiale :

sed '/\bstruct/{:z;N;/}MACRO_STR(.*)\;$/! bz;s/\([^{]*\){\(.*(\)\([^)]*\));/\1 _\3{\2\3);/}'


;-))
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 mai 2011 à 14:56
merci. Je vais essayé de comprendre tout ça maintenant, et je pense rajouter quelques conditions d'espaces éventuelles.
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.
encore merci.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
3 mai 2011 à 15:01
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
Modifié par Char Snipeur le 3/05/2011 à 16:12
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"
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
Modifié par zipe31 le 3/05/2011 à 16:17
à 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...
0