     1			/*
     2			 * This file was generated automatically by ExtUtils::ParseXS version 2.10 from the
     3			 * contents of ByteLoader.xs. Do not edit this file, edit ByteLoader.xs instead.
     4			 *
     5			 *	ANY CHANGES MADE HERE WILL BE LOST! 
     6			 *
     7			 */
     8			
     9			#line 1 "ByteLoader.xs"
    10			#include "EXTERN.h"
    11			#include "perl.h"
    12			#include "XSUB.h"
    13			#include "byterun.h"
    14			
    15			/* Something arbitary for a buffer size */
    16			#define BYTELOADER_BUFFER 8096
    17			
    18			int
    19			bl_getc(struct byteloader_fdata *data)
    20			{
    21			    dTHX;
    22			    if (SvCUR(data->datasv) <= (STRLEN)data->next_out) {
    23			      int result;
    24			      /* Run out of buffered data, so attempt to read some more */
    25			      *(SvPV_nolen (data->datasv)) = '\0';
    26			      SvCUR_set (data->datasv, 0);
    27			      data->next_out = 0;
    28			      result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
    29			
    30			      /* Filter returned error, or we got EOF and no data, then return EOF.
    31				 Not sure if filter is allowed to return EOF and add data simultaneously
    32				 Think not, but will bullet proof against it. */
    33			      if (result < 0 || SvCUR(data->datasv) == 0)
    34				return EOF;
    35			      /* Else there must be at least one byte present, which is good enough */
    36			    }
    37			
    38			    return *((U8 *) SvPV_nolen (data->datasv) + data->next_out++);
    39			}
    40			
    41			int
    42			bl_read(struct byteloader_fdata *data, char *buf, size_t size, size_t n)
    43			{
    44			    dTHX;
    45			    char *start;
    46			    STRLEN len;
    47			    size_t wanted = size * n;
    48			
    49			    start = SvPV (data->datasv, len);
    50			    if (len < (data->next_out + wanted)) {
    51			      int result;
    52			
    53			      /* Shuffle data to start of buffer */
    54			      len -= data->next_out;
    55			      if (len) {
    56				memmove (start, start + data->next_out, len + 1);
    57			      } else {
    58				*start = '\0';	/* Avoid call to memmove. */
    59			      }
    60			      SvCUR_set(data->datasv, len);
    61			      data->next_out = 0;
    62			
    63			      /* Attempt to read more data. */
    64			      do {
    65				result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
    66				
    67				start = SvPV (data->datasv, len);
    68			      } while (result > 0 && len < wanted);
    69			      /* Loop while not (EOF || error) and short reads */
    70			
    71			      /* If not enough data read, truncate copy */
    72			      if (wanted > len)
    73				wanted = len;
    74			    }
    75			
    76			    if (wanted > 0) {
    77			      memcpy (buf, start + data->next_out, wanted);
    78				data->next_out += wanted;
    79			      wanted /= size;
    80			    }
    81			    return (int) wanted;
    82			}
    83			
    84			static I32
    85			byteloader_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
    86			{
    87			    OP *saveroot = PL_main_root;
    88			    OP *savestart = PL_main_start;
    89			    struct byteloader_state bstate;
    90			    struct byteloader_fdata data;
    91			    int len;
    92			    (void)buf_sv;
    93			    (void)maxlen;
    94			
    95			    data.next_out = 0;
    96			    data.datasv = FILTER_DATA(idx);
    97			    data.idx = idx;
    98			
    99			    bstate.bs_fdata = &data;
   100			    bstate.bs_obj_list = Null(void**);
   101			    bstate.bs_obj_list_fill = -1;
   102			    bstate.bs_sv = Nullsv;
   103			    bstate.bs_iv_overflows = 0;
   104			
   105			/* KLUDGE */
   106			    if (byterun(aTHX_ &bstate)
   107				    && (len = SvCUR(data.datasv) - (STRLEN)data.next_out))
   108			    {
   109				PerlIO_seek(PL_rsfp, -len, SEEK_CUR);
   110				PL_rsfp = NULL;
   111			    }
   112			    filter_del(byteloader_filter);
   113			
   114			    if (PL_in_eval) {
   115			        OP *o;
   116			
   117			        PL_eval_start = PL_main_start;
   118			
   119			        o = newSVOP(OP_CONST, 0, newSViv(1));
   120			        PL_eval_root = newLISTOP(OP_LINESEQ, 0, PL_main_root, o);
   121			        PL_main_root->op_next = o;
   122			        PL_eval_root = newUNOP(OP_LEAVEEVAL, 0, PL_eval_root);
   123			        o->op_next = PL_eval_root;
   124			    
   125			        PL_main_root = saveroot;
   126			        PL_main_start = savestart;
   127			    }
   128			
   129			    return 0;
   130			}
   131			
   132			#ifndef PERL_UNUSED_VAR
   133			#  define PERL_UNUSED_VAR(var) if (0) var = var
   134			#endif
   135			
   136			#line 137 "ByteLoader.c"
   137			
   138			XS(XS_ByteLoader_import); /* prototype to pass -Wmissing-prototypes */
   139			XS(XS_ByteLoader_import)
   140	          19    {
   141	          19        dXSARGS;
   142	          19        PERL_UNUSED_VAR(cv); /* -W */
   143	          19        PERL_UNUSED_VAR(ax); /* -Wall */
   144	          19        SP -= items;
   145			    {
   146	          19    	char *	package;
   147			#line 131 "ByteLoader.xs"
   148			    SV *sv = newSVpvn ("", 0);
   149			#line 150 "ByteLoader.c"
   150			
   151	          19    	if (items < 1)
   152	      ######    	    package = "ByteLoader";
   153				else {
   154	          19    	    package = (char *)SvPV_nolen(ST(0));
   155				}
   156			#line 133 "ByteLoader.xs"
   157			    if (!sv)
   158			      croak ("Could not allocate ByteLoader buffers");
   159			    filter_add(byteloader_filter, sv);
   160			#line 161 "ByteLoader.c"
   161	          19    	PUTBACK;
   162				return;
   163			    }
   164			}
   165			
   166			#ifdef __cplusplus
   167			extern "C"
   168			#endif
   169			XS(boot_ByteLoader); /* prototype to pass -Wmissing-prototypes */
   170			XS(boot_ByteLoader)
   171	          39    {
   172	          39        dXSARGS;
   173	          39        char* file = __FILE__;
   174			
   175	          39        PERL_UNUSED_VAR(cv); /* -W */
   176	          39        PERL_UNUSED_VAR(items); /* -W */
   177	          39        XS_VERSION_BOOTCHECK ;
   178			
   179	          39            newXSproto("ByteLoader::import", XS_ByteLoader_import, file, ";$@");
   180	          39        XSRETURN_YES;
   181			}
   182			
