The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
MODULE = SWISH::3       PACKAGE = SWISH::3::Token

PROTOTYPES: enable

SV*
value (self)
    swish_Token *self;
    
    PREINIT:
        xmlChar *value;
              
    CODE:
        value = self->value;
        if (value == NULL) {
            RETVAL = &PL_sv_undef;
        }
        else {
            RETVAL = newSVpvn( (char*)value, self->len );
            SvUTF8_on(RETVAL);  // because we stored as UTF-8
        }
        
    OUTPUT:
        RETVAL
        

swish_MetaName*
meta (self)
    swish_Token *self;
    
    PREINIT:
        char* CLASS;
        
    CODE:
        CLASS  = METANAME_CLASS;
        RETVAL = self->meta;
        RETVAL->ref_cnt++;
        
    OUTPUT:
        RETVAL
       
SV*
meta_id (self)
        swish_Token *self;
    CODE:
        RETVAL = newSViv( self->meta->id );
    OUTPUT:
        RETVAL

     
SV*
context (self)
    swish_Token *self;
    CODE:
        RETVAL = newSVpvn( (char*)self->context, strlen((char*)self->context) );
        
    OUTPUT:
        RETVAL
        

SV*
pos (self)
    swish_Token *self;
    CODE:
        RETVAL = newSViv( self->pos );
        
    OUTPUT:
        RETVAL


SV*
offset (self)
    swish_Token *self;
    CODE:
        RETVAL = newSViv( self->offset );
        
    OUTPUT:
        RETVAL


SV*
len(self)
    swish_Token *self;
    CODE:
        RETVAL = newSViv( self->len );
        
    OUTPUT:
        RETVAL


void
DESTROY(self)
    swish_Token* self
    
    CODE:
        self->ref_cnt--;
                        
        if (SWISH_DEBUG) {
            warn("DESTROY %s [0x%lx] [ref_cnt = %d]", 
                SvPV(ST(0), PL_na), (long)self, self->ref_cnt);
            warn("Token has swish_MetaName object ref_cnt = %d", 
                self->meta->ref_cnt);
        }
        
        if (self->ref_cnt > 0 && self->meta->ref_cnt == 0) {
            SWISH_WARN("Token's MetaName ref_cnt should not be less than Token");
        }
        
        if (self->ref_cnt < 1) {
            swish_token_free(self);
        }