22
Feb

In letzter Zeit habe ich mich mit Skriptsprachen, hauptsächlich aus dem Grund Testskripte für Cpp Programme zu entwerfen, beschäftigt. Dabei ist ein kleines Python Skript entstanden das automatisch einen kleinen Informationsheader in bestehende Quelldateien hinzufügt.
Das Skript iteriert durch das ausgewählte Verzeichnis und stellt eine Dateiliste, gefiltert durch die angegebenen Dateierweiterungen, zusammen. Der Header, in meinem Fall die Datei: header, siehe unten, enthält Tags die entsprechend ersetzt werden (Zeile 31-36). Weitere Tags können beliebig hinzugefügt werden. Das Skript fügt natürlich nicht wahllos einen Header zur Datei, sondern löscht den bestehenden Header. Dieser Algorithmus wird umgesetzt indem in der Quelldatei nach der ersten Raute gesucht wird und der Dateiinhalt oberhalb der Raute einfach gelöscht wird.

import os
import sys
import datetime

def ls_dir(path, pattern):
	filelist = [os.path.normcase(f) for f in os.listdir(path)]
	filelist = [os.path.join(path, f)
		for f in filelist
			if os.path.splitext(f)[1] in pattern]
	print filelist		
	return filelist

if __name__ == "__main__":

	if len(sys.argv) < 3:
		print "usage: " + sys.argv[0] + " path pattern_1 to pattern_n)"
		sys.exit(0)

	directory = sys.argv[1]

	if sys.argv[2] == "source":
		pattern = [".cpp", ".h"]
	else:
		pattern = [os.path.splitext(p)[1] for p in sys.argv]
		del pattern[:3]

	header_info = open("header", "r").read();
	# format header
	header_info = header_info.replace(
		"{project}", 
		"add header example project")
	header_info = header_info.replace(
		"{date}", 
		datetime.datetime.now().isoformat())

	for filename in ls_dir(directory, pattern):
		i = open(filename, "r").read().find("#")
		with file(filename, "r") as src: 
			src.seek(0 if i == -1 else i)
			tmp = src.read()
			with file(filename, "w") as des:
				# format header
				header_info = header_info.replace("{filename}", filename[2:])
				# write new file
				des.write(header_info + tmp)

Beispielheader

//
// {project}
//
// file: {filename}
// date: {date}
// autor: michael miller < sec21 at pb-miller.de >
//

Beispiel: python add_header.py src/ *.cpp *.hpp *.h

Als nächstes werde ich mich intensiver mit Lua auseinandersetzen und dann geht es an die Cpp Anbindung, dabei ist mir Boost Python und LuaBind ins Auge gefallen.

Add reply