Und heute mal wieder ein kleines skript, welches wohl der größte teil der menschheit überflüssig wie einen kropf finden wird. Wer MAME unter windohs benutzt, der hat meist ein gutes frontend und kann die texte in der history.dat
komfortabel lesen. Und auch die meisten linuxer werden MAME wohl mit einem frontend benutzen und eine entsprechende möglichkeit haben. (Letzteres weiß ich allerdings nicht so genau, da ich eben kein MAME-frontend benutze.) Nur ich bin wie immer ein wackerer streiter an der kommandozeile und tippe lieber in einer komfortablen bash
herum, bevor ich zur maus greife.
Deshalb hatte ich ein leichtes bedürfnis, mir ein kleines programm zu schreiben, das mir gewünschte informationen aus der history.dat
an der kommandozeile verfügbar macht. Weil es (in dieser form) ein programm für einen eher engen anwenderkreis ist, ist es ein flüchtiger häck geblieben. Wie beinahe alle meine flüchtigen häcks habe ich das schnell in Python gemacht. Das program setzt übrigens kein installiertes MAME voraus, kann also auch allein mit der history.dat
verwendet werden, um informatzjonen zu einer vielzahl von älteren arcarde-spielen schnell zur hand zu haben.
import sys import os import re import locale from codecs import EncodedFile from formatter import AbstractFormatter, DumbWriter from subprocess import Popen, PIPE locale.setlocale(locale.LC_ALL, "") PAGER = os.getenv("PAGER", "less") DATFILE = os.getenv("HISTORYDAT", "/usr/share/games/xmame/history.dat") LOCALENC = locale.getpreferredencoding() if len(sys.argv) 2: exit("Too many arguments") else: term = sys.argv[1] inf_re = re.compile(r"\$info\=([0-9a-z]*)", re.I) bio_re = re.compile(r"\$bio", re.I) end_re = re.compile(r"\$end", re.I) state = 0 hfh = open(DATFILE, "rU") pro = None of = None af = None for line in hfh: if state == 0: m = inf_re.match(line) if m: found = m.group(1) games = found.split(",") if term in games: state = 1 elif state == 1: if bio_re.match(line): state = 2 pro = Popen(PAGER, stdin=PIPE, shell=True) of = EncodedFile(pro.stdin, "iso-8859-1", LOCALENC) af = AbstractFormatter(DumbWriter(of)) elif state == 2: if end_re.match(line): break line = line.strip() if len(line) == 0: af.end_paragraph(1) else: af.add_flowing_data(line) if pro: of.close() pro.wait() else: sys.exit("No %s in the history.dat\n" % (term,))
Wie man das mit den beiden variablen PAGER
und DATFILE
an die eigene arbeitsumgebung anpasst, beschreibe ich hier nicht weiter — und wohl jeder an dieses skript interessierte wird wohl wissen, wie man eine umgebungsvariable in seiner lieblingsshell definiert. Dieses skript einfach irgendwo in den $PATH
legen, ausführbar machen und mit dem ROM-namen als parameter aufrufen.