klammern einbauen

Post Reply
Message
Author
rattengift

klammern einbauen

#1 Post by rattengift »

Hallo,

ich hab hier einen batzen legacy-C-code, der auf einer merkwürdigen embedded-plattform entwickelt worden ist. auf dieser plattform arbeitet "sizeof" anders als in iso-c:
sizeof liefert die zahl der elemente eines arrays anstatt dessen bytezahl: unsigned int variable [10]; --> "sizeof variable" liefert 10!

nun soll der code auch auf einer normalen plattform laufen (iso-C). dazu ersetze ich alle "sizeof"s durch ein makro, mysizeof(), das die grösse entsprechend umrechnet. (es werden im ganzen projekt ausschliesslich unsigned ints verwendet, kein char etc, also ist der umrechnungsfaktor immer gleich).
<font face="Courier New">auf legacy-plattform: #define mysizeof(x) sizeof(x)
auf iso-c-plattform: #define mysizeof(x) (sizeof(x) / sizeof(unsigned int))</font><!--fixed-->

soweit wäre das kein problem, (mit elementarem sed lösbar). allerdings wird im code sizeof sehr oft ohne klammern verwendet. zur erinnerung:
sizeof (typ) --> klammern erforderlich
sizeof variable --> klammern optional

ich muss also "sizeof variable" immer durch "mysizeof (variable)" ersetzen, muss also um die variable noch klammern drumrumbauen.
sicher hat einer von den awk-akrobaten (Jochen?) eine idee, wie man das umsetzen kann.

die .c-files liegen alle im gleichen verzeichnis. ausserdem wäre es schön (aber nicht zwingend erforderlich), wenn die klammern nur dann eingebaut werden, wenn sie wirklich nötig sind, also nur dann, wenn nicht schon welche dastehen. also:
sizeof (x) --> mysizeof(x)
sizeof x --> mysizeof(x)

schonmal dank im voraus,
rattengift.

ratte

Re: klammern einbauen

#2 Post by ratte »

eh hier keiner postet, schreibe ich mal meine Ueberlegungen hier auf.

Hier geht es um Pattern matching, dafuer ist natuerlich sed in Bash geeignet, aber das kann ich nicht, ich wuerde's mit Perl machen. Das erinnert mich daran, dass hier mal danach gefragt wurde, im lokalen Verzeichnis (vielleicht auch in Unterverzeichnungen?) Ersetzungen bestimmter Zeilen in Dateien zu machen, und dafuer wurde eine Perl-Loesung (u.a.) gepostet.

mir ist zu warm zum suchen, aber wenn du den Perlcode gefunden hast, dann helfe ich dir gerne beim Pattern Matching.

ratte

ratte

Re: klammern einbauen

#3 Post by ratte »

ah, die Renovierungsarbeiten sind auf morgen vertagt, also habe ich doch Zeit, und hier habe ich's fuer dich gefunden:
<a href="http://www.pl-forum.de/cgi-bin/UltraBoa ... 0&Session=" target="_blank"><!--auto-->http://www.pl-forum.de/cgi-bin/UltraBoa ... <!--auto-->

der betreffende Perlcode ist:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
find . -name "*.html -print0 | xargs -0 perl -p -i.orig -e 's/asdf/fdsa/g'

Fuer deinen Fall muss das dann wohl so aussehen:

find . -name "*.c -print0 | xargs -0 perl -p -i.orig -e 's/sizeof (\w)/mysizeof\($1\)/g'
</font><hr></pre></blockquote>

sofern variable immer nur aus Buchstaben besteht.

ratte

rattengift

Re: klammern einbauen

#4 Post by rattengift »

hallo ratte,

danke für die anregungen. perl ginge natürlich auch, aber du hast mich auf die idee gebracht, dass hier ja tatsächlich einfaches pattern matching genügen sollte. das argument (die variable oder der typ) steht ja maximal in einfachen klammern. verschachtelt geklammterte argumente -- so sachen wie <font face="Courier New">"sizeof ((a+b)/2)"</font><!--fixed--> -- können bei sizeof ja gar nicht vorkommen. man muss also nicht die klammerungtiefe berücksichtigen, und damit kommt man dann wohl auch mit sed aus. ich werd mir das mal so überlegen, aber vielleicht auch erst in der abendlichen kühle.

rattengift

Re: klammern einbauen

#5 Post by rattengift »

tja, da warst du wohl eine minute schneller (als ich geantwortet habe, hatte ich dein 2.posting noch gar nicht gelesen).
danke für das skript. das sind jedenfalls schon mal genug anregungen für eine lösung. ich melde mich, wenn es geklappt hat.

danke!
rattengift.

rattengift

Re: klammern einbauen

#6 Post by rattengift »

hallo ratte,

das skript werd ich mir merken, ist echt praktisch. es hat nur beim (\w) noch das "+" gefehlt, ansonsten lief es auf anhieb. praktisch ist, dass das skript die fälle, wo die klammern schon da sind, sowieso ignoriert (man muss nachher nur noch s/sizeof/mysizeof/ machen). mir ist allerdings noch eingefallen, dass das argument von sizeof nicht immer nur aus Buchstaben besteht, zb: "sizeof variable [0]". jetzt sieht es also so aus:<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2"># 1. "sizeof var --> sizeof (var)" und "sizeof var [a] --> sizeof (var [a])" ---- "sizeof (type)" wird ignoriert:
find . -name *.c -print0 | xargs -0 perl -p -i.orig -e 's/sizeof\s+(\w+\s*[<!--no-->?\w*<!--no-->]?)/sizeof \($1\)/g'

# 2. sizeof --> mysizeof
find . -name *.c -print0 | xargs -0 perl -p -i.orig -e 's/sizeof/mysizeof/g'</font><hr></pre></blockquote>
jetzt muss ich perl nur noch klar machen, dass es sizeof nur als ganzes wort berücksichtigen soll, zb soll <font face="Courier New">"int thesizeof = a"</font><!--fixed--> nicht bearbeitet werden. das sollte auch kein grosses prob mehr sein, aber ich habe jetzt noch nicht gesucht. vielleicht kannst du mir da ja auch noch aushelfen.

vielen dank für deine hilfe,
rattengift.

PS: das skript würde auch fälle erlauben , wo nur eine klammer "[<!--no-->" bzw "<!--no-->]" gesetzt ist oder zb "sizeof a 0", aber solche fälle brauche ich nicht zu berücksichtigen, da sie in C (natürlich) nicht vorkommen.

rattengift

Re: klammern einbauen

#7 Post by rattengift »

oops, da sind natürlich ein paar backslashes vor den klammern [ , ] verlorengegangen:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2"># 1. "sizeof var --> sizeof (var)" und "sizeof var [a] --> sizeof (var [a])" ---- "sizeof (type)" wird ignoriert:
find . -name *.c -print0 | xargs -0 perl -p -i.orig -e 's/sizeof\s+(\w+\s*\<!--no-->[?\w*\<!--no-->]?)/sizeof \($1\)/g'

# 2. sizeof --> mysizeof
find . -name *.c -print0 | xargs -0 perl -p -i.orig -e 's/sizeof/mysizeof/g'</font><hr></pre></blockquote>

rattengift

Re: klammern einbauen

#8 Post by rattengift »

die sache mit dem ganzen wort ist auch ganz einfach durch einschliessen in "\b" zu lösen. also:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2"># 1. "sizeof var --> sizeof (var)" und "sizeof var [a] --> sizeof (var [a])" ---- "sizeof (type)" wird ignoriert:
find . -name *.c -print0 | xargs -0 perl -p -i.orig -e 's/\bsizeof\b\s*(\w+\s*\<!--no-->[?\w*\<!--no-->]?)/sizeof \($1\)/g'

# 2. sizeof --> mysizeof
find . -name *.c -print0 | xargs -0 perl -p -i.orig -e 's/\bsizeof\b/mysizeof/g'</font><hr></pre></blockquote>

ratte

Re: klammern einbauen

#9 Post by ratte »

Ja, natuerlich, backslash b ist natuerlich die bessere Wahl. Oftmals werden Variablen aber gerne mit Zahlen und Unterstrichen verbunden, daher habe ich erstmal das backslash w ausgewaehlt, da ich noch nicht wusste, was da noch kommt. Pattern matching ist schon ne coole Sache, nicht wahr?

ratte

rattengift

Re: klammern einbauen

#10 Post by rattengift »

hi ratte,

na, fertig mit dem renovieren? (bei der hitze!)

> Ja, natuerlich, backslash b ist natuerlich die bessere Wahl. Oftmals werden Variablen aber gerne mit Zahlen und Unterstrichen verbunden,
> daher habe ich erstmal das backslash w ausgewaehlt, da ich noch nicht wusste, was da noch kommt.

das w war schon richtig für den variablennamen, das habe ich ja auch so gelassen. nur für das sizeof habe ich noch die \<!--no-->b's eingebaut.
ich hab dann jetzt noch ne andere kleinigkeit geändert, denn es könnten ja auch 2dimensionale arrays vorkommen ("sizeof var [0][0]"). also heisst das suchmuster jetzt: <font face="Courier New">\bsizeof\b\s*(\w+(\s*\<!--no-->[\w+\<!--no-->])*)</font><!--fixed-->. damit werden nun alle fälle richtig bearbeitet.

> Pattern matching ist schon ne coole Sache, nicht wahr?

ja, und perl ist auch cool. ich hab schon länger nichts mehr mit perl gemacht, jetzt aber wieder appetit bekommen.
danke und bis denne,
rattengift

ratte

Re: klammern einbauen

#11 Post by ratte »

Jochen u. ae. Konsorten machen wohl Urlaub oder schwimmen in Bier <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Ohne sed genau zu kennen, wuerde ich sagen, dass das Problem mit sed genauso gut geloest werden koennte. Als perl-monger bin ich aber froh, dass dir die Loesung (nicht mal von mir, aber free software, free information rulez) gefallen hat. Deswegen wuensche ich viel Erfolg mit Perl! Pattern matching ist eine Staerke, wenn man sich tiefer reinkniet, ist Perl sogar eine EWS <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

ratte

rattengift

Re: klammern einbauen

#12 Post by rattengift »

> Jochen u. ae. Konsorten machen wohl Urlaub oder schwimmen in Bier

ja, ich hab mich auch schon gewundert, wo Jochen bleibt <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

> Ohne sed genau zu kennen, wuerde ich sagen, dass das Problem mit sed genauso gut geloest werden koennte.

ich denke auch, würd mich auch interessieren, vielleicht probier ichs noch aus. aber wenn sogar Jochen (als sed/awk-fan) diesen ansatz vorzieht, hat er vielleicht gute gründe.

> wenn man sich tiefer reinkniet, ist Perl sogar eine EWS

eine was?????? ah, jetzt hab ichs: e-legende wmsau!

Jochen

Re: klammern einbauen

#13 Post by Jochen »

Tja, Wochenende bei *dem* Wetter ist halt Familienzeit. Der Rechner hat mal zwischendurch was zum Rippen gekommen, aber das war es dann auch gewesen an EDV-Kontakten am Wochenende. Ist ja typisch - da wird man sogar namentlich erwähnt und man ist nicht da... Aber wie man sieht, war's ja auch nicht nötig. Normalerweise ist die Kombination von Ratte und Rattengift ja eher destruktiv, aber in lowercase funktioniert's ja prima. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

perl nehme ich beim Suchen&Ersetzen in Dateien immer gerne, weil perl mit der Option -i in-place arbeitet. Bei sed/awk muss man das Ergebnis irgendwo zwischenspeichern und dann über das Original moven/kopieren, dabei dann die Zugriffsrechte/Eigentümerschaften usw. nicht verändern. Es ist echt erstaunlich, was man alles beachten muss, wenn man es sauber und korrekt machen will. Ausserdem sind die Regexps von perl noch um einiges mächtiger als die von awk oder gar sed.

Jochen

Post Reply