MAME history.dat lesen

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.