CIAO-Lib-StackIO

 view release on metacpan or  search on metacpan

StackIO.xs  view on Meta::CPAN

	{
	  idx = SvIV(ST(1));
	  if (  0 == idx ) 
	    stk_rewind( stack );
          else
	  {
            if ( -1 == idx ) 
	       idx = stk_count( stack );
	    stk_set_current( stack, idx );
	  }
	}
   OUTPUT:
	RETVAL

###########################################################################

int
delete(stack, ... )
	CIAO_Lib_StackIO *	stack
   PREINIT:
	int idx;	
   CODE:
	if ( items > 1 )
	{
	  idx = SvIV(ST(1));
          if ( idx == -1 ) 
	     idx = stk_count( stack );
	  /* make up for bug in stk_delete_num which doesn't 
	     handle error checking */
	  RETVAL = idx < 0 ? -1 : stk_delete_num( stack, idx );
	}
	else
	{
	   RETVAL = stk_delete_current( stack );
	}
   OUTPUT:
	RETVAL

###########################################################################

void
DESTROY(stack)
	CIAO_Lib_StackIO *	stack
  CODE:
	stk_close( stack );

###########################################################################

void
stk_disp(stack)
	CIAO_Lib_StackIO *	stack

###########################################################################

SV *
read(stack, ...)
	CIAO_Lib_StackIO *	stack
  PREINIT:
	int idx;
	char *retval;
  PPCODE:
        /* no particular entry requested */
	if ( items == 1 )
	{
	  /* 
	     scalar context: return the next entry 
	  */
	  if ( GIMME_V == G_SCALAR )
          {
	    retval = stk_read_next( stack );
	    EXTEND(SP, 1);
	    if ( retval )
	    {
	      PUSHs(sv_2mortal(newSVpv(retval, 0)));
	      Safefree( retval );
            }
	    else	  
	    {
	      PUSHs(sv_newmortal());
            }
          }
	  /*
	     array context: return it all
          */
	  else if ( GIMME_V == G_ARRAY )
          {
	    int current = stk_current( stack );
	    EXTEND(SP, stk_count(stack) );
	    stk_rewind(stack);
	    while( retval = stk_read_next( stack ) )
	    {
	      PUSHs(sv_2mortal(newSVpv(retval, 0)));
	      Safefree( retval );
	    }
	    if ( current ) stk_set_current( stack, current );
	    else           stk_rewind( stack );
          }
	}
	/* particular entry requested */
	else
	{
	  idx = SvIV(ST(1));
          if ( idx == -1 ) 
	     idx = stk_count( stack );
	  retval = stk_read_num( stack, idx );
	  EXTEND(SP, 1);
	  if ( retval )
	  {
	    PUSHs(sv_2mortal(newSVpv(retval, 0)));
	    Safefree( retval );
	  }
	  else	  
	  {
	    PUSHs(sv_newmortal());
          }
	}


###########################################################################

void



( run in 0.500 second using v1.01-cache-2.11-cpan-71847e10f99 )