gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r1241 - Extractor-python


From: grothoff
Subject: [GNUnet-SVN] r1241 - Extractor-python
Date: Mon, 4 Jul 2005 08:17:30 -0700 (PDT)

Author: grothoff
Date: 2005-07-04 08:17:20 -0700 (Mon, 04 Jul 2005)
New Revision: 1241

Added:
   Extractor-python/AUTHORS
   Extractor-python/ChangeLog
   Extractor-python/Extractor.py
   Extractor-python/NEWS
   Extractor-python/README
   Extractor-python/bootstrap
   Extractor-python/configure.ac
   Extractor-python/extract.py
   Extractor-python/libextractor_python.c
   Extractor-python/libextractor_python_setup.py
Log:
update

Added: Extractor-python/AUTHORS
===================================================================
--- Extractor-python/AUTHORS    2005-07-04 15:12:52 UTC (rev 1240)
+++ Extractor-python/AUTHORS    2005-07-04 15:17:20 UTC (rev 1241)
@@ -0,0 +1,2 @@
+Heiko Wundram <address@hidden>
+Christian Grothoff <address@hidden>

Added: Extractor-python/ChangeLog
===================================================================
--- Extractor-python/ChangeLog  2005-07-04 15:12:52 UTC (rev 1240)
+++ Extractor-python/ChangeLog  2005-07-04 15:17:20 UTC (rev 1241)
@@ -0,0 +1,4 @@
+Mon Jul  4 17:19:33 CEST 2005
+        Moved python binding into seperate package.
+
+       
\ No newline at end of file

Added: Extractor-python/Extractor.py
===================================================================
--- Extractor-python/Extractor.py       2005-07-04 15:12:52 UTC (rev 1240)
+++ Extractor-python/Extractor.py       2005-07-04 15:17:20 UTC (rev 1241)
@@ -0,0 +1,112 @@
+"""Extractor.py
+
+     This file is part of libextractor.
+     (C) 2002, 2003, 2004, 2005 Vidyut Samanta and Christian Grothoff
+
+     libextractor is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 2, or (at your
+     option) any later version.
+
+     libextractor is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with libextractor; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+
+libextractor is a simple library for keyword extraction.  libextractor
+does not support all formats but supports a simple plugging mechanism
+such that you can quickly add extractors for additional formats, even
+without recompiling libextractor. libextractor typically ships with a
+dozen helper-libraries that can be used to obtain keywords from common
+file-types.  
+
+libextractor is a part of the GNU project (http://www.gnu.org/).     
+"""
+
+import _extractor
+
+__all__ = ["Extractor","Keyword"]
+__author__ = "Christian Grothoff, Heiko Wundram"
+__version__ = "0.5.0"
+__license__ = "GPL"
+__date__ = "5/5/2005"
+
+class Extractor(object):
+    """
+    Main class for extracting meta-data with GNU libextractor.
+
+    You may create multiple instances of Extractor to use
+    different sets of plugins.  Initially each Extractor
+    will start with the default set of plugins.
+
+    Use the extract method to obtain keywords from a file.
+
+    Use the load and unload methods to change the list of
+    plugins that should be used.
+    """
+    
+    def __init__(self):
+        self.__plugins = _extractor.loadDefaultLibraries()
+    def __del__(self):
+        _extractor.removeAll(self.__plugins)        
+    def load(self,plugs):
+        """
+        Load certain plugins.  Invoke with a string with the names
+        of the plugins that should be loaded.  For example,
+        
+        'libextractor_filename:-libextractor_split'
+
+        will prepend the extractor that just adds the filename as a
+        keyword and append (runs last) the extractor that splits
+        keywords at whitespaces and punctuations.
+
+        No errors are reported if any of the listed plugins are not
+        found.
+        """
+        self.__plugins = _extractor.load(self.__plugins, plugs)
+        return None
+    def unload(self,plugs):
+        """
+        Unload a plugin.  Pass the name of the plugin that is to
+        be unloaded.  Only one plugin can be unloaded at a time.
+        For example,
+
+        'libextractor_pdf'
+
+        unloads the PDF extractor (if loaded).  No errors are
+        reported if no matching plugin is found.
+        """
+        self.__plugins = _extractor.unload(self.__plugins, plugs)
+        return None
+    def extract(self,filename):
+        """Pass a filename to extract keywords.
+
+        This function returns a list of Keyword objects.
+        If the file cannot be opened or cannot be found,
+        the list will be empty.  The list can also be empty
+        if no metadata was found for the file.
+        """
+        return _extractor.extract(self.__plugins, filename, Keyword)
+
+class Keyword(object):
+    def __init__(self,type,value):
+        self.__type = type
+        self.__value = value.decode("utf-8")
+    def __repr__(self):
+        return u"%s(%i,%r)" % 
(self.__class__.__name__,self.__type,self.__value)
+    def __str__(self):
+        return u"%s: %s" % (self.__getType(), self.__getValue())
+    def __getType(self):
+        return _extractor.getKeywordTypeAsString(self.__type).decode("utf-8")
+    def __getValue(self):
+        return self.__value
+    def __hash__(self):
+        return hash(self.__value)+self.__type
+
+    type = property(__getType,None,None,"Type of the Keyword (i.e. author, 
title)")
+    value = property(__getValue,None,None,"Value of the Keyword (i.e. 'The GNU 
GPL')")

Added: Extractor-python/NEWS
===================================================================
--- Extractor-python/NEWS       2005-07-04 15:12:52 UTC (rev 1240)
+++ Extractor-python/NEWS       2005-07-04 15:17:20 UTC (rev 1241)
@@ -0,0 +1 @@
+See ChangeLog.
\ No newline at end of file

Added: Extractor-python/README
===================================================================
--- Extractor-python/README     2005-07-04 15:12:52 UTC (rev 1240)
+++ Extractor-python/README     2005-07-04 15:17:20 UTC (rev 1241)
@@ -0,0 +1 @@
+This is the python binding for libextractor.

Added: Extractor-python/bootstrap
===================================================================
--- Extractor-python/bootstrap  2005-07-04 15:12:52 UTC (rev 1240)
+++ Extractor-python/bootstrap  2005-07-04 15:17:20 UTC (rev 1241)
@@ -0,0 +1,5 @@
+#!/bin/sh
+autoreconf -f -i
+cd libltdl
+autoreconf -f -i
+cd ..


Property changes on: Extractor-python/bootstrap
___________________________________________________________________
Name: svn:executable
   + *

Copied: Extractor-python/configure.ac (from rev 1237, Extractor/configure.ac)
===================================================================
--- Extractor/configure.ac      2005-07-04 09:08:05 UTC (rev 1237)
+++ Extractor-python/configure.ac       2005-07-04 15:17:20 UTC (rev 1241)
@@ -0,0 +1,56 @@
+# Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.57)
+AC_INIT([libextractor-python], [0.5.1], address@hidden)
+AC_REVISION($Revision: 1.67 $)
+AM_INIT_AUTOMAKE([libextractor-python], [0.5.1])
+
+AC_PROG_AWK
+AC_PROG_CC
+
+AC_PYTHON_DEVEL
+AC_MSG_CHECKING(for python)
+if test -z "$python_path";
+then
+  AC_MSG_RESULT(yes)
+  AM_CONDITIONAL(HAVE_PYTHON,false)
+else
+  AC_MSG_RESULT(no)
+  AM_CONDITIONAL(HAVE_PYTHON,true)
+fi
+
+# test for libextractor
+extractor=0
+AC_MSG_CHECKING(for libextractor)
+AC_ARG_WITH(extractor,
+   [  --with-extractor=PFX    Base of libextractor installation],
+   [AC_MSG_RESULT([$with_extractor])
+    case $with_extractor in
+      no)
+        ;;
+      yes)
+        AC_CHECK_HEADERS(extractor.h,
+          AC_CHECK_LIB([extractor], [EXTRACTOR_loadDefaultLibraries],
+            extractor=1))
+        ;;
+      *)
+        LDFLAGS="-L$with_extractor/lib $LDFLAGS"
+        CPPFLAGS="-I$with_extractor/include $CPPFLAGS"
+        AC_CHECK_HEADERS(extractor.h,
+          AC_CHECK_LIB([extractor], [EXTRACTOR_loadDefaultLibraries],
+            EXT_LIB_PATH="-L$with_extractor/lib $EXT_LIB_PATH"
+            extractor=1))
+        ;;
+    esac
+   ],
+   [AC_MSG_RESULT([--with-extractor not specified])
+    AC_CHECK_HEADERS(extractor.h,
+     AC_CHECK_LIB([extractor], [EXTRACTOR_loadDefaultLibraries],
+      extractor=1))])
+if test "$extractor" != 1
+then
+ AC_MSG_ERROR([libextractor-python requires libextractor])
+fi
+
+
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT

Added: Extractor-python/extract.py
===================================================================
--- Extractor-python/extract.py 2005-07-04 15:12:52 UTC (rev 1240)
+++ Extractor-python/extract.py 2005-07-04 15:17:20 UTC (rev 1241)
@@ -0,0 +1,32 @@
+"""extract.py
+
+     This file is part of libextractor.
+     (C) 2002, 2003, 2004, 2005 Vidyut Samanta and Christian Grothoff
+
+     libextractor is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 2, or (at your
+     option) any later version.
+
+     libextractor is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with libextractor; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+
+Little demo how to use the libextractor Python binding.
+
+"""
+import Extractor
+import sys
+
+xtract = Extractor.Extractor()
+for arg in sys.argv[1:]:
+    print "Keywords from " + arg
+    keys = xtract.extract(arg);
+    for i in keys:
+        print i

Copied: Extractor-python/libextractor_python.c (from rev 1237, 
Extractor/src/main/libextractor_python.c)
===================================================================
--- Extractor/src/main/libextractor_python.c    2005-07-04 09:08:05 UTC (rev 
1237)
+++ Extractor-python/libextractor_python.c      2005-07-04 15:17:20 UTC (rev 
1241)
@@ -0,0 +1,527 @@
+/*
+     This file is part of libextractor.
+     (C) 2004, 2005 Vidyut Samanta and Christian Grothoff
+
+     libextractor is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 2, or (at your
+     option) any later version.
+
+     libextractor is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with libextractor; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+ */
+
+
+/* libextractor_python.c
+   ---------------------
+
+   Implements the Python wrapper for libextractor. The wrapper builds on the
+   Python type module, which wraps a single module, over extractor, which
+   implements the extractor from modules, up to keyword(list), which implements
+   keyword handling. */
+
+/* Includes. */
+
+#include <Python.h>
+#include <extractor.h>
+
+/* Typedefs. */
+
+typedef struct {
+  PyObject_HEAD
+  PyObject *mlist;
+  int locks;
+} ModuleList;
+
+typedef struct {
+  PyObject_HEAD
+  EXTRACTOR_ExtractorList *module;
+  ModuleList *mlist;
+} Module;
+
+/* Type objects. */
+
+static PyTypeObject ModuleListType;
+static PyTypeObject ModuleType;
+
+/* Module list type. */
+
+static inline int ModuleList_checkModule(Module *arg)
+{
+  if( !PyObject_IsInstance((PyObject*)arg,(PyObject*)&ModuleType) ) {
+    PyErr_SetString(PyExc_TypeError,"append only accepts a Module.");
+    return -1;
+  }
+
+  if( arg->mlist ) {
+    PyErr_SetString(PyExc_TypeError,"cannot take ownership of module.");
+    return -1;
+  }
+
+  return 0;
+}
+
+static PyObject *ModuleList_prepend(ModuleList *self, Module *arg)
+{
+  PyObject *rv = NULL;
+  Module *first = NULL;
+  int mlistlen = 0;
+
+  if( ModuleList_checkModule(arg) )
+    goto error;
+
+  mlistlen = PyList_GET_SIZE(self->mlist);
+  if( mlistlen ) {
+    first = (Module*)PyList_GET_ITEM(self->mlist,0);
+    arg->module->next = first->module;
+  }
+
+  if( PyList_Insert(self->mlist,0,(PyObject*)arg) )
+    goto error;
+  arg->mlist = self;
+  Py_INCREF(self);
+
+  rv = (PyObject*)arg;
+  Py_INCREF(rv);
+
+  goto finish;
+
+ error:
+  Py_XDECREF(rv);
+  rv = NULL;
+
+ finish:
+  return (PyObject*)rv;
+}
+
+static PyObject *ModuleList_append(ModuleList *self, Module *arg)
+{
+  PyObject *rv = NULL;
+  Module *last = NULL;
+  int mlistlen = 0;
+
+  if( ModuleList_checkModule(arg) )
+    goto error;
+
+  mlistlen = PyList_GET_SIZE(self->mlist);
+  if( mlistlen ) {
+    last = (Module*)PyList_GET_ITEM(self->mlist,mlistlen-1);
+    last->module->next = arg->module;
+  }
+
+  if( PyList_Append(self->mlist,(PyObject*)arg) )
+    goto error;
+  arg->mlist = self;
+  Py_INCREF(self);
+
+  rv = (PyObject*)arg;
+  Py_INCREF(rv);
+
+  goto finish;
+
+ error:
+  Py_XDECREF(rv);
+  rv = NULL;
+
+ finish:
+  return (PyObject*)rv;
+}
+
+static PyObject *ModuleList_new(PyTypeObject *type, PyObject *args,
+                               PyObject *kwargs)
+{
+  ModuleList *self = NULL;
+
+  if( !( self = (ModuleList*)type->tp_alloc(type,0) ) )
+    goto error;
+  self->locks = 0;
+
+  if( !( self->mlist = PyList_New(0) ) )
+    goto error;
+
+  goto finish;
+
+ error:
+  Py_XDECREF(self);
+  self = NULL;
+
+ finish:
+  return (PyObject*)self;
+}
+
+static int ModuleList_init(ModuleList *self, PyObject *args, PyObject *kwargs)
+{
+  PyObject *mod = NULL, *mod_iter = NULL, *mod_item = NULL;
+  EXTRACTOR_ExtractorList *elist = NULL, *ecur = NULL;
+  char *kwargs_list[] = {"modules",NULL};
+  int rv = 0;
+
+  if( !PyArg_ParseTupleAndKeywords(args,kwargs,"|O:__init__",kwargs_list,
+                                  &mod) )
+    goto error;
+
+  if( !mod || mod == Py_None || PyString_Check(mod) ) {
+    if( !mod || mod == Py_None )
+      elist = EXTRACTOR_loadDefaultLibraries();
+    else
+      elist = EXTRACTOR_loadConfigLibraries(NULL,PyString_AsString(mod));
+
+    ecur = elist;
+    while( ecur ) {
+      if( !( mod_item = (PyObject*)PyObject_GC_New(Module,&ModuleType) ) )
+       goto error;
+
+      elist = ecur;
+      ecur = elist->next;
+      elist->next = NULL;
+
+      ((Module*)mod_item)->module = elist;
+      ((Module*)mod_item)->mlist = NULL;
+
+      if( !ModuleList_append(self,(Module*)mod_item) )
+       goto error;
+      Py_DECREF(mod_item);
+      mod_item = NULL;
+    }
+  } else if( PyObject_IsInstance(mod,(PyObject*)&ModuleType) ) {
+    if( !ModuleList_append(self,(Module*)mod) )
+      goto error;
+  } else {
+    if( !( mod_iter = PyObject_GetIter(mod) ) )
+      goto error;
+
+    while( ( mod_item = PyIter_Next(mod_iter) ) ) {
+      if( !ModuleList_append(self,(Module*)mod_item) )
+       goto error;
+      Py_DECREF(mod_item);
+      mod_item = NULL;
+    }
+  }
+
+  goto finish;
+
+ error:
+  EXTRACTOR_removeAll(ecur);
+  Py_XDECREF(mod_item);
+  rv = -1;
+
+ finish:
+  Py_XDECREF(mod_iter);
+  return rv;
+}
+
+static PyObject *ModuleList_repr(ModuleList *self)
+{
+  return PyString_FromFormat("<ModuleList: %i modules>",
+                            PyList_GET_SIZE(self->mlist));
+}
+
+static int ModuleList_traverse(ModuleList *self, visitproc visit, void *arg)
+{
+#ifdef Py_VISIT
+  Py_VISIT(self->mlist);
+#endif
+  return 0;
+}
+
+static int ModuleList_clear(ModuleList *self)
+{
+#ifdef Py_CLEAR
+  Py_CLEAR(self->mlist);
+#endif
+  return 0;
+}
+
+static void ModuleList_dealloc(ModuleList *self)
+{
+  ModuleList_clear(self);
+  self->ob_type->tp_free((PyObject*)self);
+}
+
+static PyMethodDef ModuleList_methods[] = {
+  {"prepend",(PyCFunction)ModuleList_prepend,METH_O,
+   "Prepend a single module to the structure."},
+  {"append",(PyCFunction)ModuleList_append,METH_O,
+   "Append a single module to the structure."},
+  {NULL}  /* Sentinel */
+};
+
+static PyTypeObject ModuleListType = {
+    PyObject_HEAD_INIT(NULL)
+    0,                         /*ob_size*/
+    "extractor.ModuleList",    /*tp_name*/
+    sizeof(ModuleList),        /*tp_basicsize*/
+    0,                         /*tp_itemsize*/
+    (destructor)ModuleList_dealloc, /*tp_dealloc*/
+    0,                         /*tp_print*/
+    0,                         /*tp_getattr*/
+    0,                         /*tp_setattr*/
+    0,                         /*tp_compare*/
+    (reprfunc)ModuleList_repr, /*tp_repr*/
+    0,                         /*tp_as_number*/
+    0,                         /*tp_as_sequence*/
+    0,                         /*tp_as_mapping*/
+    0,                         /*tp_hash */
+    0,                         /*tp_call*/
+    0,                         /*tp_str*/
+    0,                         /*tp_getattro*/
+    0,                         /*tp_setattro*/
+    0,                         /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+    "ModuleList objects",      /* tp_doc */
+    (traverseproc)ModuleList_traverse, /* tp_traverse */
+    (inquiry)ModuleList_clear, /* tp_clear */
+    0,                        /* tp_richcompare */
+    0,                        /* tp_weaklistoffset */
+    0,                         /* tp_iter */
+    0,                        /* tp_iternext */
+    ModuleList_methods,        /* tp_methods */
+    0,                         /* tp_members */
+    0,                         /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    (initproc)ModuleList_init, /* tp_init */
+    0,                         /* tp_alloc */
+    ModuleList_new,            /* tp_new */
+};
+
+/* Module type. */
+
+static EXTRACTOR_KeywordList *Module_extractMethod(const char *filename,
+                                                  char *data, size_t filesize,
+                                                  EXTRACTOR_KeywordList *next,
+                                                  const char *options)
+{
+  Module *self = NULL;
+
+  self = (Module*)atoi(options); /* convert back from string repr of self. */
+
+  printf("In the extractor with object %i.",(int)self);
+  return next;
+}
+
+static PyObject *Module_new(PyTypeObject *type, PyObject *args,
+                           PyObject *kwargs)
+{
+  Module *self = NULL;
+  char *name = NULL, *options = NULL;
+  char *kwargs_list[] = {"name","options",NULL};
+  int namelen = 0, i;
+
+  if( !PyArg_ParseTupleAndKeywords(args,kwargs,"s#|z:__new__",kwargs_list,
+                                  &name,&namelen,&options) )
+    goto error;
+
+  i = 0;
+  while( name[i] )
+    if( name[i++] == '(' ) {
+      PyErr_SetString(PyExc_ValueError,"name may not contain (.");
+      goto error;
+    }
+
+  if( !( self = (Module*)type->tp_alloc(type,0) ) )
+    goto error;
+
+  /* Somewhat a HACK, creates a module structure from scratch. */
+  self->module = malloc(sizeof(EXTRACTOR_ExtractorList));
+  self->module->libraryHandle = NULL;
+  self->module->extractMethod = (ExtractMethod)&Module_extractMethod;
+  self->module->libname = strdup(name);
+  self->module->options = malloc(12); /* store self as string in options. */
+  sprintf(self->module->options,"%i",(int)self);
+  self->module->next = NULL;
+
+  goto finish;
+
+ error:
+  Py_XDECREF(self);
+  self = NULL;
+
+ finish:
+  return (PyObject*)self;
+}
+
+static int Module_init(Module *self, PyObject *args, PyObject *kwargs)
+{
+  char *name = NULL, *options = NULL, *optstring = NULL;
+  char *kwargs_list[] = {"name","options",NULL};
+  int namelen = 0, optionslen = 0, i, rv = 0;
+
+  if( !PyArg_ParseTupleAndKeywords(args,kwargs,"s#|z#:__init__",kwargs_list,
+                                  &name,&namelen,&options,&optionslen) )
+    goto error;
+
+  i = 0;
+  while( options && options[i] )
+    if( options[i++] == ')' ) {
+      PyErr_SetString(PyExc_ValueError,"option may not contain ).");
+      goto error;
+    }
+
+  EXTRACTOR_removeAll(self->module); /* slight crutch, was allocated in */
+  self->module = NULL; /* __new__, so that programmer can create subtype. */
+
+  optstring = malloc(namelen+optionslen+3);
+  if( options )
+    sprintf(optstring,"%s(%s)",name,options);
+  else
+    sprintf(optstring,"%s",name);
+  if( !( self->module = EXTRACTOR_loadConfigLibraries(NULL,optstring) ) ) {
+    PyErr_SetString(PyExc_ValueError,"could not load module.");
+    goto error;
+  }
+
+  goto finish;
+
+ error:
+  rv = -1;
+
+ finish:
+  if( optstring )
+    free(optstring);
+  return rv;
+}
+
+static PyObject *Module_getattr(Module *self, char *name)
+{
+  if( !strcmp(name,"libname") )
+    return PyString_FromString(self->module->libname);
+  else if( !strcmp(name,"options") )
+    return PyString_FromString(self->module->options);
+  else if( !strcmp(name,"mlist") )
+    return (PyObject*)self->mlist;
+  PyErr_SetString(PyExc_AttributeError,name);
+  return NULL;
+}
+
+static int Module_setattr(Module *self, char *name, PyObject *value)
+{
+  if( !strcmp(name,"libname") || !strcmp(name,"options") ||
+      !strcmp(name,"mlist") )
+    PyErr_Format(PyExc_AttributeError,"cannot set %s.",name);
+  else
+    PyErr_SetString(PyExc_AttributeError,name);
+  return -1;
+}
+
+static PyObject *Module_repr(Module *self)
+{
+  if( self->module->options )
+    return PyString_FromFormat("%s(\"%s\",\"%s\")",self->ob_type->tp_name,
+                              self->module->libname,self->module->options);
+  else
+    return PyString_FromFormat("%s(\"%s\")",self->ob_type->tp_name,
+                              self->module->libname);
+}
+
+static long Module_hash(Module *self)
+{
+  return (int)self->module;
+}
+
+static int Module_traverse(Module *self, visitproc visit, void *arg)
+{
+#ifdef Py_VISIT
+  Py_VISIT((PyObject*)self->mlist);
+#endif
+  return 0;
+}
+
+static int Module_clear(Module *self)
+{
+  printf("Removing module in clear: %s.\n",self->module->libname);
+#ifdef Py_CLEAR
+  Py_CLEAR(self->mlist);
+#endif
+  return 0;
+}
+
+static void Module_dealloc(Module *self)
+{
+  Module_clear(self);
+  printf("Removing module: %s.\n",self->module->libname);
+  self->module->next = NULL;
+  EXTRACTOR_removeAll(self->module);
+  self->ob_type->tp_free((PyObject*)self);
+}
+
+static PyMethodDef Module_methods[] = {
+  {NULL}  /* Sentinel */
+};
+
+static PyTypeObject ModuleType = {
+    PyObject_HEAD_INIT(NULL)
+    0,                         /*ob_size*/
+    "extractor.Module",        /*tp_name*/
+    sizeof(Module),            /*tp_basicsize*/
+    0,                         /*tp_itemsize*/
+    (destructor)Module_dealloc, /*tp_dealloc*/
+    0,                         /*tp_print*/
+    (getattrfunc)Module_getattr, /*tp_getattr*/
+    (setattrfunc)Module_setattr, /*tp_setattr*/
+    0,                         /*tp_compare*/
+    (reprfunc)Module_repr,     /*tp_repr*/
+    0,                         /*tp_as_number*/
+    0,                         /*tp_as_sequence*/
+    0,                         /*tp_as_mapping*/
+    (hashfunc)Module_hash,     /*tp_hash */
+    0,                         /*tp_call*/
+    0,                         /*tp_str*/
+    0,                         /*tp_getattro*/
+    0,                         /*tp_setattro*/
+    0,                         /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+    "Module objects",          /* tp_doc */
+    (traverseproc)Module_traverse, /* tp_traverse */
+    (inquiry)Module_clear,     /* tp_clear */
+    0,                        /* tp_richcompare */
+    0,                        /* tp_weaklistoffset */
+    0,                         /* tp_iter */
+    0,                        /* tp_iternext */
+    Module_methods,            /* tp_methods */
+    0,                         /* tp_members */
+    0,                         /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    (initproc)Module_init,     /* tp_init */
+    0,                         /* tp_alloc */
+    Module_new,                /* tp_new */
+};
+
+/* Module level. */
+
+static PyMethodDef Extractor_Module_methods[] = {
+  {NULL}  /* Sentinel */
+};
+
+PyMODINIT_FUNC initextractor(void)
+{
+  PyObject *m;
+
+  if( PyType_Ready(&ModuleListType) )
+    return;
+  if( PyType_Ready(&ModuleType) )
+    return;
+
+  m = Py_InitModule3("extractor",Extractor_Module_methods,"Extractor module.");
+  if (m == NULL)
+    return;
+
+  Py_INCREF(&ModuleListType);
+  Py_INCREF(&ModuleType);
+  PyModule_AddObject(m,"ModuleList",(PyObject*)&ModuleListType);
+  PyModule_AddObject(m,"Module",(PyObject*)&ModuleType);
+}

Copied: Extractor-python/libextractor_python_setup.py (from rev 1237, 
Extractor/src/main/libextractor_python_setup.py)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]