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);