The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "perl_extractor.h"

MODULE = File::Extractor	PACKAGE = File::Extractor	PREFIX = EXTRACTOR_

PROTOTYPES: DISABLE

void
EXTRACTOR_getDefaultLibraries (class)
	PREINIT:
		const char *libraries;
		char *copy, *pos, *token;
	PPCODE:
		libraries = EXTRACTOR_getDefaultLibraries ();

		if (!libraries) {
			XSRETURN_EMPTY;
		}

		copy = strdup (libraries);
		pos = copy;

		while ((token = strsep (&pos, ":"))) {
			mXPUSHp (token, strlen (token));
		}

		free (copy);

EXTRACTOR_ExtractorList *
EXTRACTOR_loadDefaultLibraries (class)
	C_ARGS:
		/* void */

EXTRACTOR_ExtractorList *
EXTRACTOR_loadConfigLibraries (prev, config)
		EXTRACTOR_ExtractorList_or_null *prev
		const char *config
	POSTCALL:
		if (prev) {
			perl_extractor_invalidate_object (ST (0));
		}

EXTRACTOR_ExtractorList *
EXTRACTOR_addLibrary (prev, library)
		EXTRACTOR_ExtractorList_or_null *prev
		const char *library
	POSTCALL:
		if (prev) {
			perl_extractor_invalidate_object (ST (0));
		}

EXTRACTOR_ExtractorList *
EXTRACTOR_addLibraryLast (prev, library)
		EXTRACTOR_ExtractorList_or_null *prev
		const char *library
	POSTCALL:
		if (prev) {
			perl_extractor_invalidate_object (ST (0));
		}

EXTRACTOR_ExtractorList *
EXTRACTOR_removeLibrary (prev, library)
		EXTRACTOR_ExtractorList *prev
		const char *library
	POSTCALL:
		perl_extractor_invalidate_object (ST (0));

void
EXTRACTOR_getKeywords (extractor, data)
		EXTRACTOR_ExtractorList *extractor
		SV *data
	PREINIT:
		STRLEN len;
		char *buf;
		EXTRACTOR_KeywordList *list, *i;
	PPCODE:
		if (SvROK (data) && (SvTYPE (SvRV (data)) == SVt_PVGV)) {
			buf = perl_extractor_slurp_from_handle (data, &len);
		}
		else {
			buf = SvPVbyte (data, len);
		}

		list = EXTRACTOR_getKeywords2 (extractor, buf, len);
		list = EXTRACTOR_removeEmptyKeywords (list);
		list = EXTRACTOR_removeDuplicateKeywords (list, 0);

		if (!list) {
			XSRETURN_EMPTY;
		}

		for (i = list; i; i = i->next) {
			EXTEND (sp, 2);
			PUSHs (perl_extractor_keyword_type_to_sv (i->keywordType));
			PUSHs (newSVpv (i->keyword, 0));
		}

		EXTRACTOR_freeKeywords (list);

void
DESTROY (libraries)
		EXTRACTOR_ExtractorList *libraries = perl_extractor_object_is_invalid ($arg) ? NULL : ($type)perl_extractor_get_ptr_from_sv ($arg, "File::Extractor");
	CODE:
		if (libraries) {
			EXTRACTOR_removeAll (libraries);
		}