ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Macro Funktion in Ruby verfügbar?
BeitragVerfasst: 04 Dez 2014, 17:27 
Offline
Nuby

Registriert: 04 Dez 2014, 16:48
Beiträge: 1
Hallo zusammen,

ich habe folgendes Problem:
Ich verwende Macros in C und würde diese mit Hilfe von Ruby abändern.
Die Macros sind in einem separaten H-File abgelegt.

Beispiel:
MacroA(Param_1, Param_2, Param_3)
MacroB(Param_1, Param_2, Param_3)
rufen im original H-File unterschiedliche Funktionen mit den entsprechenden Parametern auf.
Es existieren leider etliche Macros, so dass ich gerne ein manuelles Erstellen verweinden möchte.

Nun möchte ich gerne diese mit Hilfe von Ruby ändern/anpassen.
D.h. ich würde gerne die Macros dahingegen ändern, das die Funktionsaufrufe abgeändert werden (andere Funktionen sollen verwendet warden).
Diese Änderung soll in eine neue H-Datei abgelegt warden.

Hat jemand eine Idee wie ich das bewerkstelligen könnte?

Für jeden Hinweis bin ich dankbar!


Nach oben
 Profil  
 
BeitragVerfasst: 07 Dez 2014, 12:07 
Offline
Novize
Benutzeravatar

Registriert: 24 Aug 2004, 12:55
Beiträge: 10
Wohnort: Nürnberg
Hallo NenadP, ich würde die Headerdatei Zeile für Zeile lesen und gleichzeitig eine neue Datei mit den Änderungen schreiben:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/ruby -w
# vim:ai:nu:et:sta:sts=4:sw=4

header_file = 'mathinline.h'
header_path = "/usr/include/bits/#{header_file}"

count = 0
lines_changed = 0

o = File.open("modified_#{header_file}", 'w')

File.open(header_path).each_line do |l|
count += 1
l.chomp!

m = l.match(/^(\s*#\s*define\s*)([a-z0-9_]+)(\s*\(.*\).*)$/i)
if m
l = m[1] + "my_#{m[2]}_debug" + m[3]
lines_changed += 1
end
o.puts l
end

o.close

puts " Lines read: #{count}"
puts "Lines changed: #{lines_changed}"


Der Dreh- und Angelpunkt ist der reguläre Ausdruck in Zeile 16, der versucht, jede gelesene Zeile an 5 Stellen zu »matchen«:
  • ^ -- Zeilenbeginn
  • (\s*#\s*define\s*) -- Space, Raute, Space, "define"-Schlüsselwort, Space
  • ([a-z0-9_]+) -- Funktionsname
  • (\s*\(.*\).*) -- Space, öffnende Klammer, Funktionsargumente, schließende Klammer, Rest der Zeile
  • $ -- Zeilenende

Im Beispiel ändere ich jeden zu definierenden Funktionsnamen ab in my_..._debug. Beispiel: Die Zeile aus Headerdatei /usr/include/bits/mathinline.h



#    define __libc_sqrtl(n) __sqrtl (n)

wird in der vom Script generierten Datei modified_mathinline.h zu:



#    define my___libc_sqrtl_debug(n) __sqrtl (n)


Wie Du siehst, bleiben Einrückungen und bereits definierte Namen unverändert (etwa __sqrtl). Die in Headerdefinitionen erlaubten Spaces sind jeweils optional: Die vielen \s* in Zeile 16 bedeuten 0 oder mehrere Tabs/Leerzeichen.

Zeile 2 kannst Du weglassen, das sind nur Einstellungen für meinen Lieblingseditor. :)


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron