Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
klammern einbauen

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
rattengift
Gast





BeitragVerfasst am: 09. Aug 2003 11:16   Titel: klammern einbauen

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).
auf legacy-plattform: #define mysizeof(x) sizeof(x)
auf iso-c-plattform: #define mysizeof(x) (sizeof(x) / sizeof(unsigned int))


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
Gast





BeitragVerfasst am: 09. Aug 2003 17:12   Titel: Re: klammern einbauen

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
Gast





BeitragVerfasst am: 09. Aug 2003 17:41   Titel: Re: klammern einbauen

ah, die Renovierungsarbeiten sind auf morgen vertagt, also habe ich doch Zeit, und hier habe ich's fuer dich gefunden:
http://www.pl-forum.de/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=003&Post=521&Idle=10&Sort=0&Order=Descend&Page=0&Session=

der betreffende Perlcode ist:

code:

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'



sofern variable immer nur aus Buchstaben besteht.

ratte
 

rattengift
Gast





BeitragVerfasst am: 09. Aug 2003 17:42   Titel: Re: klammern einbauen

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 "sizeof ((a+b)/2)" -- 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
Gast





BeitragVerfasst am: 09. Aug 2003 17:48   Titel: Re: klammern einbauen

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
Gast





BeitragVerfasst am: 09. Aug 2003 22:57   Titel: Re: klammern einbauen

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:
code:
# 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*[?\w*]?)/sizeof \($1\)/g'

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


jetzt muss ich perl nur noch klar machen, dass es sizeof nur als ganzes wort berücksichtigen soll, zb soll "int thesizeof = a" 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 "[" bzw "]" 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
Gast





BeitragVerfasst am: 09. Aug 2003 23:24   Titel: Re: klammern einbauen

oops, da sind natürlich ein paar backslashes vor den klammern [ , ] verlorengegangen:
code:
# 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*\[?\w*\]?)/sizeof \($1\)/g'

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

 

rattengift
Gast





BeitragVerfasst am: 10. Aug 2003 13:23   Titel: Re: klammern einbauen

die sache mit dem ganzen wort ist auch ganz einfach durch einschliessen in "\b" zu lösen. also:
code:
# 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*\[?\w*\]?)/sizeof \($1\)/g'

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

 

ratte
Gast





BeitragVerfasst am: 10. Aug 2003 19:55   Titel: Re: klammern einbauen

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
Gast





BeitragVerfasst am: 10. Aug 2003 20:39   Titel: Re: klammern einbauen

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 \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: \bsizeof\b\s*(\w+(\s*\[\w+\])*). 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
Gast





BeitragVerfasst am: 10. Aug 2003 21:48   Titel: Re: klammern einbauen

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

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

ratte
 

rattengift
Gast





BeitragVerfasst am: 10. Aug 2003 23:13   Titel: Re: klammern einbauen

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

ja, ich hab mich auch schon gewundert, wo Jochen bleibt

> 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
Gast





BeitragVerfasst am: 10. Aug 2003 23:22   Titel: Re: klammern einbauen

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.

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
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy