62. Look als Modul I

Um uns das Leben zunächst maximal einfach zu machen, wollen wir jetzt einfach look.c:main durch einen Wrapper ersetzen, der das, was wir von main brauchen, tut und dann das alte look.c:look aufruft.

static PyObject *look1_look(PyObject *self, PyObject *args)
{
  struct stat sb;
  int fd;
  void *res;
  char *file;
  char *front, *back;

  if (!PyArg_ParseTuple(args, "ss", &file, &string)) {
    return NULL;
  }
  if ((fd = open(file, O_RDONLY, 0)) < 0 || fstat(fd, &sb)) {
    PyErr_SetFromErrno(PyExc_IOError);
    return NULL;
  }
  /* ... weitgehend wie gehabt ... */
  res = look(front, back);
  munmap(front, sb.st_size);
  close(fd);
  if (res!=NULL) {
    Py_INCREF(Py_None);
    res = Py_None;
  }
  return res;
}

Änderungen:

  • Wir wollen Fehler von Python behandeln lassen. Deshalb haben wir den alten err-Aufruf durch das Setzen einer Exception ersetzt.
  • Gleiches gilt für Fehler, die in look selbst auftreten. Deshalb gibt look NULL zurück, wenn etwas schiefgeht.
  • Das alte look verließ sich auf das Betriebssystem, um aufzuräumen (den map rückgängig machen und die Datei schließen). Da Python nach dem Funktionsaufruf weiter läuft, müssen wir jetzt selbst aufräumen.
  • Alle globalen Variablen wurden statisch definiert.

Den veränderten Quellcode gibt es auf der Vorlesungsseite. Um alle Änderungen am Code zu sehen, könnt ihr das Unix-Kommando diff look.c look1module.c laufen lassen.

Dateien zu diesem Abschnitt


Markus Demleitner

Copyright Notice