[Python-de] Python als Makroersatz, und was zum Lachen

Fritz Cizmarov fritz at sol.at
Mit Jul 30 20:46:06 EDT 2003


Am Wed, 30 Jul 2003 17:07:15 +0200
Schrieb Gerson.Kurz at t-online.de (Gerson Kurz):

> Gegeben einen C-Header, der aus Zeug wie dem folgenden besteht:
> 
> DECLARE_STRING(IDS_XYZ_STATUS_BUSY, "Busy")
> DECLARE_STRING(IDS_XYZ_STATUS_COVER_OPEN, "Cover open")
> DECLARE_STRING(IDS_XYZ_STATUS_DOOR_OPEN, "Door open")
> ....(usw, viele hundert Zeilen lang)...
> 
> möchte ich eine Datei erzeugen, die so ausschaut:
> 
> [IDS_XYZ_STATUS_BUSY]
> "Busy"
> 
> [IDS_XYZ_STATUS_COVER_OPEN]
> "Cover open"
> 
> [IDS_XYZ_STATUS_DOOR_OPEN]
> "Door open"...
> 

#!/usr/bin/env python

import sys, xreadlines

if len(sys.argv) == 1 or sys.argv[1] in ["-h", "--help"]:
    print "usage : %s infile [outfile]" (sys.argv[0])
    sys.exit(0)
if len(sys.argv) == 3:
    out = open(sys.argv[2])
else:
    out = sys.stdout

hfile = open(sys.argv[1])

for line in xreadlines.xreadlines(hfile):
    if line.find("DECLARE_STRING(") >= 0:
        p1 = line.find("(")+1
        p2 = line.find(",")
        p3 = line.find('"',p2)
        p4 = line.find('"',p3+1)+1
        out.write("["+(line[p1:p2].strip())+"]\n")
        out.write(line[p3:p4]+"\n\n")
hfile.close()

if out != sys.stdout:
    out.close()

> Dachte ich mir, kopierst du den Auszug in ein Pythonscript und
> schreibst
> 
> def DECLARE_STRING(irgendwas, blabla):
> 
> aber das ist ein Schmarrn, weil, die IDs sind nicht natürlich - äh -
> natürlich nicht definiert. Nun bin ich ja, die Herren Gläubigen des
> Templategötzens mögen es mir verzeihen, Senior-Makrologe und schreibe
> gerne Sachen wie
> 
> #ifdef IMPORT_BUILD
> 
> #define DECLARE_STRINGS(__NAME__,__CONTENT__) \
> extern const char* __NAME__;
> 
> #else
> 
> #define DECLARE_STRINGS(__NAME__,__CONTENT__) \
> const char* __NAME__ =
> __CONTENT;
> 
> #endif
> 
> Nun heisst es ja immer, mit Python könne man alles Makromäßige
> umsetzen

> wie aber mache ich sowas? Ich will ja praktisch auf der Fliege ("on
> the fly"), neue Variablen erzeugen.
> 
> Wäre es möglich, sich in den Name Lookup der Variablen zu hängen, so
> daß man z.B. bei Undeclared Identifier die Möglichkeit hat, sich 'ne
> neue anzuschaffen?
> 

Du könntest ein (temporäres) Modul ins aktuelle Verzeichnis schreiben
lassen, mit den Deklarationen, z.B. 'IDS_XYZ_STATUS_BUSY = "Busy"' und
dieses Modul dann importieren mit "from declarations import *"


Gruß

Fritz