libextractor-perl

GNU libextractor
Log | Files | Refs | README

Extract.xs (5253B)


      1 #include "pextract.h"
      2 
      3 MODULE = File::Extract	PACKAGE = File::Extract	PREFIX = EXTRACTOR_
      4 
      5 void
      6 init(extractor)
      7 		SV* extractor
      8 	PREINIT:
      9 		SV* list = NULL;
     10 	CODE:
     11 		list = newSvEXTRACTOR_ExtractorList_ornull((EXTRACTOR_ExtractorList*)NULL);
     12 		pextract_hv_store_extractor_list(extractor, list);
     13 
     14 void
     15 EXTRACTOR_loadDefaultLibraries(extractor)
     16 		SV* extractor
     17 	PREINIT:
     18 		SV* list = NULL;
     19 		EXTRACTOR_ExtractorList* foo = NULL;
     20 	CODE:
     21 		foo = EXTRACTOR_loadDefaultLibraries();
     22 		list = newSvEXTRACTOR_ExtractorList_ornull(foo);
     23 		pextract_hv_store_extractor_list(extractor, list);
     24 
     25 void
     26 EXTRACTOR_loadConfigLibraries(extractor, config)
     27 		SV* extractor
     28 		const char* config
     29 	PREINIT:
     30 		EXTRACTOR_ExtractorList* list = NULL;
     31 		SV* result = NULL;
     32 	CODE:
     33 		list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
     34 		result = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_loadConfigLibraries(list, config));
     35 		pextract_hv_store_extractor_list(extractor, result);
     36 
     37 void
     38 EXTRACTOR_addLibrary(extractor, library)
     39 		SV* extractor
     40 		const char* library
     41 	PREINIT:
     42 		EXTRACTOR_ExtractorList* list = NULL;
     43 		SV* result = NULL;
     44 	CODE:
     45 		list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
     46 		result = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_addLibrary(list, library));
     47 		pextract_hv_store_extractor_list(extractor, result);
     48 
     49 void
     50 EXTRACTOR_addLibraryLast(extractor, library)
     51 		SV* extractor
     52 		const char* library
     53 	PREINIT:
     54 		EXTRACTOR_ExtractorList* list = NULL;
     55 		SV* result = NULL;
     56 	CODE:
     57 		list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
     58 		result = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_addLibraryLast(list, library));
     59 		pextract_hv_store_extractor_list(extractor, result);
     60 
     61 # TODO: debug!
     62 # 
     63 #  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()})'
     64 # 
     65 # segfaults
     66 #
     67 # 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()})'
     68 #
     69 # shows unwanted results. Looks like a memory corruption. Most probably caused by libextractor itself.
     70 #
     71 
     72 void
     73 EXTRACTOR_removeLibrary(extractor, library)
     74 		SV* extractor
     75 		const char* library
     76 	PREINIT:
     77 		EXTRACTOR_ExtractorList* list = NULL;
     78 		SV* result = NULL;
     79 	CODE:
     80 		list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
     81 		result = newSvEXTRACTOR_ExtractorList_ornull(EXTRACTOR_removeLibrary(list, library));
     82 		pextract_hv_store_extractor_list(extractor, result);
     83 
     84 void
     85 EXTRACTOR_removeAll(extractor)
     86 		SV* extractor
     87 	PREINIT:
     88 		EXTRACTOR_ExtractorList* list = NULL;
     89 	CODE:
     90 		list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
     91 		EXTRACTOR_removeAll(list);
     92 		pextract_hv_store_extractor_list(extractor, &PL_sv_undef);
     93 
     94 void
     95 EXTRACTOR_getKeywords(extractor, filename)
     96 		SV* extractor
     97 		const char* filename
     98 	PREINIT:
     99 		EXTRACTOR_ExtractorList* list = NULL;
    100 		EXTRACTOR_KeywordList* result = NULL;
    101 		EXTRACTOR_KeywordList* i = NULL;
    102 		char* keyword_type;
    103 	PPCODE:
    104 		list = SvEXTRACTOR_ExtractorList(pextract_get_extractor_list(extractor));
    105 		result = EXTRACTOR_getKeywords(list, filename);
    106 		for (i = result; i != NULL; i = i->next) {
    107 			keyword_type = (char*)EXTRACTOR_getKeywordTypeAsString(i->keywordType);
    108 			XPUSHs (sv_2mortal(newSVpv(keyword_type, strlen(keyword_type))));
    109 			XPUSHs (sv_2mortal(newSVpv(i->keyword, strlen(i->keyword))));
    110 		}
    111 		EXTRACTOR_freeKeywords(result);
    112 
    113 void
    114 getKeywordsFromBuffer(extractor, buffer)
    115 		SV* extractor
    116 		SV* buffer
    117 	PREINIT:
    118 		EXTRACTOR_ExtractorList* list = NULL;
    119 		EXTRACTOR_KeywordList* result = NULL;
    120 		EXTRACTOR_KeywordList* i = NULL;
    121 		char* keyword_type;
    122 		size_t size;
    123 		const void* data;
    124 	PPCODE:
    125 		list = SvEXTRACTOR_ExtractorList(pextract_get_extractor_list(extractor));
    126 		data = SvPV(buffer, size);
    127 		result = EXTRACTOR_getKeywords2(list, data, size);
    128 		for (i = result; i != NULL; i = i->next) {
    129 			keyword_type = (char*)EXTRACTOR_getKeywordTypeAsString(i->keywordType);
    130 			XPUSHs (sv_2mortal(newSVpv(keyword_type, strlen(keyword_type))));
    131 			XPUSHs (sv_2mortal(newSVpv(i->keyword, strlen(i->keyword))));
    132 		}
    133 		EXTRACTOR_freeKeywords(result);
    134 
    135 void
    136 getLibraries(extractor)
    137 		SV* extractor
    138 	PREINIT:
    139 		EXTRACTOR_ExtractorList* list = NULL;
    140 		EXTRACTOR_ExtractorList* i = NULL;
    141 	PPCODE:
    142 		list = SvEXTRACTOR_ExtractorList_ornull(pextract_get_extractor_list(extractor));
    143 		i = list;
    144 		while (i != NULL) {
    145 			if (!i->libname)
    146 				continue;
    147 
    148 			XPUSHs(sv_2mortal(newSVpv(i->libname, strlen(i->libname))));
    149 
    150 			if (i->options) {
    151 				XPUSHs(sv_2mortal(newSVpv(i->options, strlen(i->options))));
    152 			} else {
    153 				XPUSHs(&PL_sv_undef);
    154 			}
    155 
    156 			i = i->next;
    157 		}
    158 
    159 #BOOT:
    160 #	PEXTRACTOR_CALL_BOOT(boot_File__Extract__ExtractorList);