libextractor-perl

GNU libextractor
Log | Files | Refs | README

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:
Mpextract.c | 20++++++++++++++++++++
Mpextract.h | 5+++++
Mxs/Extract.xs | 71++++++++++++++++++++++++++++++++++++++---------------------------------
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: