		/*
		 * This file was generated automatically by ExtUtils::ParseXS version 2.10 from the
		 * contents of ByteLoader.xs. Do not edit this file, edit ByteLoader.xs instead.
		 *
		 *	ANY CHANGES MADE HERE WILL BE LOST! 
		 *
		 */
		
		#line 1 "ByteLoader.xs"
		#include "EXTERN.h"
		#include "perl.h"
		#include "XSUB.h"
		#include "byterun.h"
		
		/* Something arbitary for a buffer size */
		#define BYTELOADER_BUFFER 8096
		
		int
		bl_getc(struct byteloader_fdata *data)
		{
		    dTHX;
		    if (SvCUR(data->datasv) <= (STRLEN)data->next_out) {
		      int result;
		      /* Run out of buffered data, so attempt to read some more */
		      *(SvPV_nolen (data->datasv)) = '\0';
		      SvCUR_set (data->datasv, 0);
		      data->next_out = 0;
		      result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
		
		      /* Filter returned error, or we got EOF and no data, then return EOF.
			 Not sure if filter is allowed to return EOF and add data simultaneously
			 Think not, but will bullet proof against it. */
		      if (result < 0 || SvCUR(data->datasv) == 0)
			return EOF;
		      /* Else there must be at least one byte present, which is good enough */
		    }
		
		    return *((U8 *) SvPV_nolen (data->datasv) + data->next_out++);
		}
		
		int
		bl_read(struct byteloader_fdata *data, char *buf, size_t size, size_t n)
		{
		    dTHX;
		    char *start;
		    STRLEN len;
		    size_t wanted = size * n;
		
		    start = SvPV (data->datasv, len);
		    if (len < (data->next_out + wanted)) {
		      int result;
		
		      /* Shuffle data to start of buffer */
		      len -= data->next_out;
		      if (len) {
			memmove (start, start + data->next_out, len + 1);
		      } else {
			*start = '\0';	/* Avoid call to memmove. */
		      }
		      SvCUR_set(data->datasv, len);
		      data->next_out = 0;
		
		      /* Attempt to read more data. */
		      do {
			result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
			
			start = SvPV (data->datasv, len);
		      } while (result > 0 && len < wanted);
		      /* Loop while not (EOF || error) and short reads */
		
		      /* If not enough data read, truncate copy */
		      if (wanted > len)
			wanted = len;
		    }
		
		    if (wanted > 0) {
		      memcpy (buf, start + data->next_out, wanted);
			data->next_out += wanted;
		      wanted /= size;
		    }
		    return (int) wanted;
		}
		
		static I32
		byteloader_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
		{
		    OP *saveroot = PL_main_root;
		    OP *savestart = PL_main_start;
		    struct byteloader_state bstate;
		    struct byteloader_fdata data;
		    int len;
		    (void)buf_sv;
		    (void)maxlen;
		
		    data.next_out = 0;
		    data.datasv = FILTER_DATA(idx);
		    data.idx = idx;
		
		    bstate.bs_fdata = &data;
		    bstate.bs_obj_list = Null(void**);
		    bstate.bs_obj_list_fill = -1;
		    bstate.bs_sv = Nullsv;
		    bstate.bs_iv_overflows = 0;
		
		/* KLUDGE */
		    if (byterun(aTHX_ &bstate)
			    && (len = SvCUR(data.datasv) - (STRLEN)data.next_out))
		    {
			PerlIO_seek(PL_rsfp, -len, SEEK_CUR);
			PL_rsfp = NULL;
		    }
		    filter_del(byteloader_filter);
		
		    if (PL_in_eval) {
		        OP *o;
		
		        PL_eval_start = PL_main_start;
		
		        o = newSVOP(OP_CONST, 0, newSViv(1));
		        PL_eval_root = newLISTOP(OP_LINESEQ, 0, PL_main_root, o);
		        PL_main_root->op_next = o;
		        PL_eval_root = newUNOP(OP_LEAVEEVAL, 0, PL_eval_root);
		        o->op_next = PL_eval_root;
		    
		        PL_main_root = saveroot;
		        PL_main_start = savestart;
		    }
		
		    return 0;
		}
		
		#ifndef PERL_UNUSED_VAR
		#  define PERL_UNUSED_VAR(var) if (0) var = var
		#endif
		
		#line 137 "ByteLoader.c"
		
		XS(XS_ByteLoader_import); /* prototype to pass -Wmissing-prototypes */
		XS(XS_ByteLoader_import)
          19    {
          19        dXSARGS;
          19        PERL_UNUSED_VAR(cv); /* -W */
          19        PERL_UNUSED_VAR(ax); /* -Wall */
          19        SP -= items;
		    {
          19    	char *	package;
		#line 131 "ByteLoader.xs"
		    SV *sv = newSVpvn ("", 0);
		#line 150 "ByteLoader.c"
		
          19    	if (items < 1)
      ######    	    package = "ByteLoader";
			else {
          19    	    package = (char *)SvPV_nolen(ST(0));
			}
		#line 133 "ByteLoader.xs"
		    if (!sv)
		      croak ("Could not allocate ByteLoader buffers");
		    filter_add(byteloader_filter, sv);
		#line 161 "ByteLoader.c"
          19    	PUTBACK;
			return;
		    }
		}
		
		#ifdef __cplusplus
		extern "C"
		#endif
		XS(boot_ByteLoader); /* prototype to pass -Wmissing-prototypes */
		XS(boot_ByteLoader)
          39    {
          39        dXSARGS;
          39        char* file = __FILE__;
		
          39        PERL_UNUSED_VAR(cv); /* -W */
          39        PERL_UNUSED_VAR(items); /* -W */
          39        XS_VERSION_BOOTCHECK ;
		
          39            newXSproto("ByteLoader::import", XS_ByteLoader_import, file, ";$@");
          39        XSRETURN_YES;
		}
		
