commit 4278e41e7b6a44e17cf8e66067ac7bee5c38bfbb
parent 5abde7af8f55660bccbae492cdc4a4964fe193e8
Author: Florian Ragwitz <rafl@debian.org>
Date: Sun, 13 Nov 2005 21:32:21 +0000
r19541@ata: rafl | 2005-11-13 21:43:23 +0100
* Fixed some leaks, cleaned up a bit.
* Functions that modify an extractor list don't have a return value anymore
because they do this by reference, not by value.
Diffstat:
3 files changed, 63 insertions(+), 33 deletions(-)
diff --git a/pextract.c b/pextract.c
@@ -56,3 +56,23 @@ pextract_get_extractor_list(SV* extractor) {
return *hv_fetch(hv, "extractor_list", 14, 0);
}
+void
+pextract_hv_store_extractor_list_noinc(SV* extractor, SV* list) {
+ HV* hv = pextract_get_hv_from_file_extract_obj(extractor);
+ if (hv) {
+ hv_store(hv, "extractor_list", 14, list, 0);
+ } else {
+ croak("bar");
+ }
+}
+
+void
+pextract_hv_store_extractor_list_inc(SV* extractor, SV* list) {
+ HV* hv = pextract_get_hv_from_file_extract_obj(extractor);
+ if (hv) {
+ SvREFCNT_inc(list);
+ hv_store(hv, "extractor_list", 14, list, 0);
+ } else {
+ croak("bar");
+ }
+}
diff --git a/pextract.h b/pextract.h
@@ -12,6 +12,11 @@ void* pextract_get_object(SV* sv, const char* package);
HV* pextract_get_hv_from_file_extract_obj(SV* hvref);
SV* pextract_get_extractor_list(SV* extractor);
+void pextract_hv_store_extractor_list_inc(SV* extractor, SV* list);
+void pextract_hv_store_extractor_list_noinc(SV* extractor, SV* list);
+
+#define pextract_hv_store_extractor_list pextract_hv_store_extractor_list_inc
+
void _pextractor_call_XS(pTHX_ void (*subaddr) (pTHX_ CV*), CV* cv, SV** mark);
#define PEXTRACTOR_CALL_BOOT(name) \
diff --git a/xs/Extract.xs b/xs/Extract.xs
@@ -6,76 +6,80 @@ void
init(extractor)
SV* extractor
PREINIT:
- HV* hv;
SV* list = NULL;
- PPCODE:
- list = newSvEXTRACTOR_ExtractorList_ornull(NULL);
- hv = pextract_get_hv_from_file_extract_obj(extractor);
- if (hv) {
- SvREFCNT_inc(list);
- hv_store(hv, "extractor_list", 14, list, 0);
- } else {
- croak("foo");
- }
+ CODE:
+ list = newSvEXTRACTOR_ExtractorList_ornull((EXTRACTOR_ExtractorList*)NULL);
+ pextract_hv_store_extractor_list(extractor, list);
-SV*
+void
EXTRACTOR_loadDefaultLibraries(extractor)
SV* extractor
PREINIT:
- EXTRACTOR_ExtractorList* list = NULL;
+ SV* list = NULL;
+ EXTRACTOR_ExtractorList* foo = NULL;
CODE:
- list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
- RETVAL = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_loadDefaultLibraries());
- OUTPUT:
- RETVAL
+ foo = EXTRACTOR_loadDefaultLibraries();
+ list = newSvEXTRACTOR_ExtractorList_ornull(foo);
+ pextract_hv_store_extractor_list(extractor, list);
-SV*
+void
EXTRACTOR_loadConfigLibraries(extractor, config)
SV* extractor
const char* config
PREINIT:
EXTRACTOR_ExtractorList* list = NULL;
+ SV* result = NULL;
CODE:
list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
- RETVAL = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_loadConfigLibraries(list, config));
- OUTPUT:
- RETVAL
+ result = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_loadConfigLibraries(list, config));
+ pextract_hv_store_extractor_list(extractor, result);
-SV*
+void
EXTRACTOR_addLibrary(extractor, library)
SV* extractor
const char* library
PREINIT:
EXTRACTOR_ExtractorList* list = NULL;
+ SV* result = NULL;
CODE:
list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
- RETVAL = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_addLibrary(list, library));
- OUTPUT:
- RETVAL
+ result = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_addLibrary(list, library));
+ pextract_hv_store_extractor_list(extractor, result);
-SV*
+void
EXTRACTOR_addLibraryLast(extractor, library)
SV* extractor
const char* library
PREINIT:
EXTRACTOR_ExtractorList* list = NULL;
+ SV* result = NULL;
CODE:
list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
- RETVAL = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_addLibraryLast(list, library));
- OUTPUT:
- RETVAL
+ result = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_addLibraryLast(list, library));
+ pextract_hv_store_extractor_list(extractor, result);
+
+# TODO: debug!
+#
+# perl -MExtUtils::testlib -MData::Dumper -MFile::Extract -e'$e = File::Extract->new(); $e->loadConfigLibraries("libextractor_mime"); $e->loadConfigLibraries("libextractor_png"); print Dumper({$e->getKeywords("/home/rafl/map_50.823448_12.930446_10000_4000_3000.png")}); $e->removeLibrary("libextractor_png"); print Dumper({$e->getLibraries()})'
+#
+# segfaults
+#
+# perl -MExtUtils::testlib -MData::Dumper -MFile::Extract -e'$e = File::Extract->new(); $e->loadDefaultLibraries(); $e->loadConfigLibraries("libextractor_mime"); $e->loadConfigLibraries("libextractor_png"); print Dumper({$e->getKeywords("/home/rafl/map_50.823448_12.930446_10000_4000_3000.png")}); $e->removeLibrary("libextractor_png"); print Dumper({$e->getLibraries()})'
+#
+# shows unwanted results. Looks like a memory corruption. Most probably caused by libextractor itself.
+#
-SV*
+void
EXTRACTOR_removeLibrary(extractor, library)
SV* extractor
const char* library
PREINIT:
EXTRACTOR_ExtractorList* list = NULL;
+ SV* result = NULL;
CODE:
list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
- RETVAL = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_removeLibrary(list, library));
- OUTPUT:
- RETVAL
+ result = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_removeLibrary(list, library));
+ pextract_hv_store_extractor_list(extractor, result);
void
EXTRACTOR_removeAll(extractor)
@@ -85,6 +89,7 @@ EXTRACTOR_removeAll(extractor)
CODE:
list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
EXTRACTOR_removeAll(list);
+ pextract_hv_store_extractor_list(extractor, &PL_sv_undef);
void
EXTRACTOR_getKeywords(extractor, filename)
@@ -137,7 +142,7 @@ getLibraries(extractor)
list = SvEXTRACTOR_ExtractorList(pextract_get_extractor_list(extractor));
for (i = list; i != NULL; i = i->next) {
XPUSHs(sv_2mortal(newSVpv(i->libname, strlen(i->libname))));
- XPUSHs(sv_2mortal(newSVpv(i->options, strlen(i->libname))));
+ XPUSHs(sv_2mortal(newSVpv(i->options, strlen(i->options))));
}
#BOOT: