Jabber-mod_perl

 view release on metacpan or  search on metacpan

patches/NADs.xs  view on Meta::CPAN


}


void my_nad_cache_free(SV* sv_nc){

    nad_cache_free(((nad_cache_t) SvIV(SvRV(sv_nc))));

}


SV* my_nad_nad_new(SV* sv_nc){

    SV* obj_ref = NULL;
    SV* obj = NULL;

    nad_t n = nad_new(((nad_cache_t) SvIV(SvRV(sv_nc))));

    obj_ref = newSViv(0);
    obj = newSVrv(obj_ref, NULL);
    sv_setiv(obj, (IV) n);
    sv_bless(obj_ref, gv_stashpv("Jabber::NADs", 0));
    SvREADONLY_on(obj);

    return obj_ref;

}


SV* my_nad_copy(SV* sv_n){

    SV* obj_ref = NULL;
    SV* obj = NULL;

    nad_t n = nad_copy(((nad_t) SvIV(SvRV(sv_n))));

    obj_ref = newSViv(0);
    obj = newSVrv(obj_ref, NULL);
    sv_setiv(obj, (IV) n);
    sv_bless(obj_ref, gv_stashpv("Jabber::NADs", 0));
    SvREADONLY_on(obj);

    return obj_ref;

}


void my_nad_wrap_elem(SV* sv_n, SV* sv_startelem, SV* sv_ns, SV* sv_name){

    if (SvIV(sv_startelem) < 0 )
						return;

    nad_wrap_elem(((nad_t) SvIV(SvRV(sv_n))),
                  SvIV(sv_startelem),
                  SvIV(sv_ns),
                  SvPV(sv_name, SvCUR(sv_name)));

}


SV* my_nad_insert_elem(SV* sv_n, SV* sv_startelem, SV* sv_ns, SV* sv_name, SV* sv_cdata){

    if (SvIV(sv_startelem) < 0 )
            return newSVsv(&PL_sv_undef);

    return newSViv( 
         nad_insert_elem( 
             ((nad_t) SvIV(SvRV(sv_n))),
             SvIV(sv_startelem),
             SvIV(sv_ns),
             SvPV(sv_name, SvCUR(sv_name)),
             SvPV(sv_cdata, SvCUR(sv_cdata))
         )
      );

}


SV* my_nad_append_elem(SV* sv_n, SV* sv_ns, SV* sv_name, SV* sv_depth){

    char *str;
    int len;

    return newSViv( nad_append_elem(((nad_t) SvIV(SvRV(sv_n))),
                    SvIV(sv_ns),
                    SvPV(sv_name, SvCUR(sv_name)),
                    SvIV(sv_depth)) );

}


SV* my_nad_print(SV* sv_n, SV* sv_depth){

    char *xml;
    int len;
    nad_print(((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_depth), &xml, &len);
    return newSVpvn(xml,len);

}


void my_nad_write(SV* sv_n, SV* sv_c){

//    my_modperl_write_nad(sv_n, sv_c);
    //my_mod_perl_write_nad(((nad_t) SvIV(SvRV(sv_n))), ((conn_t) SvIV(SvRV(sv_c))));

}


void my_nad_free(SV* sv_n){

    nad_free(((nad_t) SvIV(SvRV(sv_n))));

}


SV* my_nad_find_elem(SV* sv_n, SV* sv_startelem, SV* sv_ns, SV* sv_name, SV* sv_depth){

    char *name = NULL;

    if (SvIV(sv_startelem) < 0 )
            return newSVsv(&PL_sv_undef);

    if (SvTRUE(sv_name))
        name = SvPV(sv_name, SvCUR(sv_name));
    //fprintf(stderr, "NAME: %s \n", name);
    //fprintf(stderr, "found at: %d \n",  nad_find_elem(((nad_t) SvIV(SvRV(sv_n))),
    //                2, 1,  "unsubscribe", 1) );
    return newSViv( nad_find_elem(((nad_t) SvIV(SvRV(sv_n))),
                    SvIV(sv_startelem),SvIV(sv_ns),  name, SvIV(sv_depth)) );

}


void my_nad_append_cdata(SV* sv_n, SV* sv_cdata, SV* sv_len, SV* sv_depth){

    nad_append_cdata(((nad_t) SvIV(SvRV(sv_n))),
                 SvPV(sv_cdata, SvCUR(sv_cdata)),
                 SvIV(sv_len),
                 SvIV(sv_depth));

}

/** this is the safety check used to make sure there's always enough mem */
#define NAD_SAFE(blocks, size, len) if((size) > len) len = _nad_realloc((void**)&(blocks),(size));

void my_nad_append_cdata_head(SV* sv_n, SV* sv_elem, SV* sv_cdata){

    if (SvIV(sv_elem) < 0 )
            return;

    nad_t nad = ((nad_t) SvIV(SvRV(sv_n)));
    int elem = SvIV(sv_elem);
    int len = SvCUR(sv_cdata);

/*        nad, current tot len + strlen to add, current block len */
		NAD_SAFE(nad->cdata, nad->ccur + len, nad->clen);

		// move other data down
		//   tgt, src, len
    int toset = nad->elems[elem].icdata + nad->elems[elem].lcdata + len;
		int soset = nad->elems[elem].icdata + nad->elems[elem].lcdata;
		int copy_len = nad->ccur - (nad->elems[elem].icdata + nad->elems[elem].lcdata);
		SV* sv_temp = newSVpv(nad->cdata+soset, copy_len);
    memcpy(nad->cdata+toset, SvPV(sv_temp, SvCUR(sv_temp)), copy_len);

		// increment overall length
		nad->ccur += len;

		// copy in new data
    memcpy(nad->cdata+(nad->elems[elem].icdata + nad->elems[elem].lcdata), SvPV(sv_cdata, SvCUR(sv_cdata)), len);

		// adjust pointers for all others after this one
		//    attrs, ns, elem

		// attributes
		int iattr, ins, ielem;
	  for(iattr=0;iattr < nad->acur;iattr++)
	  {
						if (nad->attrs[iattr].iname > nad->elems[elem].icdata)
							nad->attrs[iattr].iname += len;
						if (nad->attrs[iattr].ival >  nad->elems[elem].icdata)
						  nad->attrs[iattr].ival += len;
		}
		// namespaces
	  for(ins=0;ins < nad->ncur;ins++)
	  {
						// namespaces
						if (nad->nss[ins].iuri > nad->elems[elem].icdata)
							nad->nss[ins].iuri += len;
						// namespace prefixes
						if (nad->nss[ins].iprefix > nad->elems[elem].icdata)
							nad->nss[ins].iprefix += len;
		}
		// Elements
	  for(ielem=0;ielem < nad->ecur;ielem++)
	  {
						if (nad->elems[ielem].iname > nad->elems[elem].icdata)
							nad->elems[ielem].iname += len;
					  if (nad->elems[ielem].icdata > nad->elems[elem].icdata)
						  nad->elems[ielem].icdata += len;
						if (nad->elems[ielem].itail > nad->elems[elem].icdata)
							nad->elems[ielem].itail += len;
		}
		
		// adjust pointer + len for modified elem offender
    nad->elems[elem].lcdata += len;

		// reprint the nad so that the xml serialisation is inline
    char *xml;
    int xlen;
    nad_print(nad, 0, &xml, &xlen);

}

void my_nad_replace_cdata_head(SV* sv_n, SV* sv_elem, SV* sv_cdata){

    if (SvIV(sv_elem) < 0 )
            return;

    nad_t nad = ((nad_t) SvIV(SvRV(sv_n)));
    int elem = SvIV(sv_elem);
    int len = SvCUR(sv_cdata);

		// if len_diff < 0 then we have to reduce the overall length of cdata
		//    if not - then increase cdata by len_diff
    int len_diff = len  - nad->elems[elem].lcdata;


		if (len_diff > 0) {
/*        nad, current tot len + strlen to add, current block len */
		  NAD_SAFE(nad->cdata, nad->ccur + len_diff, nad->clen);
	  }

		// move other data down
		//   tgt, src, len
    int toset = nad->elems[elem].icdata + nad->elems[elem].lcdata + len_diff;
		int soset = nad->elems[elem].icdata + nad->elems[elem].lcdata;
		int copy_len = nad->ccur - (nad->elems[elem].icdata + nad->elems[elem].lcdata);
		SV* sv_temp = newSVpv(nad->cdata+soset, copy_len);
    memcpy(nad->cdata+toset, SvPV(sv_temp, SvCUR(sv_temp)), copy_len);

		// increment overall length
		nad->ccur += len_diff;

		// copy in new data
    memcpy(nad->cdata+nad->elems[elem].icdata, SvPV(sv_cdata, SvCUR(sv_cdata)), len);

		// adjust pointers for all others after this one
		//    attrs, ns, elem

		// attributes
		int iattr, ins, ielem;
	  for(iattr=0;iattr < nad->acur;iattr++)
	  {
						if (nad->attrs[iattr].iname > nad->elems[elem].icdata)
							nad->attrs[iattr].iname += len_diff;
						if (nad->attrs[iattr].ival >  nad->elems[elem].icdata)
						  nad->attrs[iattr].ival += len_diff;
		}
		// namespaces
	  for(ins=0;ins < nad->ncur;ins++)
	  {
						// namespaces
						if (nad->nss[ins].iuri > nad->elems[elem].icdata)
							nad->nss[ins].iuri += len_diff;
						// namespace prefixes
						if (nad->nss[ins].iprefix > nad->elems[elem].icdata)
							nad->nss[ins].iprefix += len_diff;
		}
		// Elements
	  for(ielem=0;ielem < nad->ecur;ielem++)
	  {
						if (nad->elems[ielem].iname > nad->elems[elem].icdata)
							nad->elems[ielem].iname += len_diff;
					  if (nad->elems[ielem].icdata > nad->elems[elem].icdata)
						  nad->elems[ielem].icdata += len_diff;
						if (nad->elems[ielem].itail > nad->elems[elem].icdata)
							nad->elems[ielem].itail += len_diff;
		}
		
		// adjust pointer + len for modified elem offender
    nad->elems[elem].lcdata += len_diff;

		// reprint the nad so that the xml serialisation is inline
    char *xml;
    int xlen;
    nad_print(nad, 0, &xml, &xlen);

}


void my_nad_append_cdata_tail(SV* sv_n, SV* sv_elem, SV* sv_cdata){

    if (SvIV(sv_elem) < 0 )
            return;

    nad_t nad = ((nad_t) SvIV(SvRV(sv_n)));
    int elem = SvIV(sv_elem);
    int len = SvCUR(sv_cdata);

/*        nad, current tot len + strlen to add, current block len */
		NAD_SAFE(nad->cdata, nad->ccur + len, nad->clen);

		// move other data down
		//   tgt, src, len
    int toset = nad->elems[elem].itail + nad->elems[elem].ltail + len;
		int soset = nad->elems[elem].itail + nad->elems[elem].ltail;
		int copy_len = nad->ccur - (nad->elems[elem].itail + nad->elems[elem].ltail);
		SV* sv_temp = newSVpv(nad->cdata+soset, copy_len);
    memcpy(nad->cdata+toset, SvPV(sv_temp, SvCUR(sv_temp)), copy_len);

		// increment overall length
		nad->ccur += len;

		// copy in new data
    memcpy(nad->cdata+(nad->elems[elem].itail + nad->elems[elem].ltail), SvPV(sv_cdata, SvCUR(sv_cdata)), len);

		// adjust pointers for all others after this one
		//    attrs, ns, elem

		// attributes
		int iattr, ins, ielem;
	  for(iattr=0;iattr < nad->acur;iattr++)
	  {
						if (nad->attrs[iattr].iname > nad->elems[elem].itail)
							nad->attrs[iattr].iname += len;
						if (nad->attrs[iattr].ival > nad->elems[elem].itail)
							nad->attrs[iattr].ival += len;
		}
		// namespaces
	  for(ins=0;ins < nad->ncur;ins++)
	  {
						// namespaces
						if (nad->nss[ins].iuri > nad->elems[elem].itail)
							nad->nss[ins].iuri += len;
						// namespace prefixes
						if (nad->nss[ins].iprefix > nad->elems[elem].itail)
							nad->nss[ins].iprefix += len;
		}
		// Elements
	  for(ielem=0;ielem < nad->ecur;ielem++)
	  {
						if (nad->elems[ielem].iname > nad->elems[elem].itail)
							nad->elems[ielem].iname += len;
						if (nad->elems[ielem].icdata >  nad->elems[elem].itail)
						  nad->elems[ielem].icdata += len;
						if (nad->elems[ielem].itail > nad->elems[elem].itail)
							nad->elems[ielem].itail += len;
		}
		
		// adjust pointer + len for modified elem offender
    nad->elems[elem].ltail += len;

		// reprint the nad so that the xml serialisation is inline
    char *xml;
    int xlen;
    nad_print(nad, 0, &xml, &xlen);

}


void my_nad_replace_cdata_tail(SV* sv_n, SV* sv_elem, SV* sv_cdata){

    if (SvIV(sv_elem) < 0 )
            return;

    nad_t nad = ((nad_t) SvIV(SvRV(sv_n)));
    int elem = SvIV(sv_elem);
    int len = SvCUR(sv_cdata);

		// if len_diff < 0 then we have to reduce the overall length of cdata
		//    if not - then increase cdata by len_diff
    int len_diff = len  - nad->elems[elem].lcdata;


		if (len_diff > 0) {
    /*        nad, current tot len + strlen to add, current block len */
		  NAD_SAFE(nad->cdata, nad->ccur + len_diff, nad->clen);
	  }


		// move other data down
		//   tgt, src, len
    int toset = nad->elems[elem].itail + nad->elems[elem].ltail + len_diff;
		int soset = nad->elems[elem].itail + nad->elems[elem].ltail;
		int copy_len = nad->ccur - (nad->elems[elem].itail + nad->elems[elem].ltail);
		SV* sv_temp = newSVpv(nad->cdata+soset, copy_len);
    memcpy(nad->cdata+toset, SvPV(sv_temp, SvCUR(sv_temp)), copy_len);

		// increment overall length
		nad->ccur += len_diff;

		// copy in new data
    memcpy(nad->cdata+nad->elems[elem].itail, SvPV(sv_cdata, SvCUR(sv_cdata)), len);

		// adjust pointers for all others after this one
		//    attrs, ns, elem

		// attributes
		int iattr, ins, ielem;
	  for(iattr=0;iattr < nad->acur;iattr++)
	  {
						if (nad->attrs[iattr].iname > nad->elems[elem].itail)
							nad->attrs[iattr].iname += len_diff;
						if (nad->attrs[iattr].ival > nad->elems[elem].itail)
							nad->attrs[iattr].ival += len_diff;
		}
		// namespaces
	  for(ins=0;ins < nad->ncur;ins++)
	  {
						// namespaces
						if (nad->nss[ins].iuri > nad->elems[elem].itail)
							nad->nss[ins].iuri += len_diff;
						// namespace prefixes
						if (nad->nss[ins].iprefix > nad->elems[elem].itail)
							nad->nss[ins].iprefix += len_diff;
		}
		// Elements
	  for(ielem=0;ielem < nad->ecur;ielem++)
	  {
						if (nad->elems[ielem].iname > nad->elems[elem].itail)
							nad->elems[ielem].iname += len_diff;
						if (nad->elems[ielem].icdata >  nad->elems[elem].itail)
						  nad->elems[ielem].icdata += len_diff;
						if (nad->elems[ielem].itail > nad->elems[elem].itail)
							nad->elems[ielem].itail += len_diff;
		}
		
		// adjust pointer + len for modified elem offender
    nad->elems[elem].ltail += len_diff;

		// reprint the nad so that the xml serialisation is inline
    char *xml;
    int xlen;
    nad_print(nad, 0, &xml, &xlen);

}


SV* my_nad_find_attr(SV* sv_n, SV* sv_startelem, SV* sv_ns, SV* sv_name, SV* sv_val){

    char *val = NULL;

    if (SvIV(sv_startelem) < 0 )
            return newSVsv(&PL_sv_undef);

    if (SvTRUE(sv_val))
        val = SvPV(sv_val, SvCUR(sv_val));
    return newSViv( nad_find_attr(((nad_t) SvIV(SvRV(sv_n))),
                    SvIV(sv_startelem), SvIV(sv_ns), SvPV(sv_name, SvCUR(sv_name)), val) );

}


SV* my_nad_get_attr(SV* sv_n, SV* sv_attr){

    return newSVpvn(NAD_AVAL(((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_attr)),
                    NAD_AVAL_L(((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_attr)));

}


void my_nad_set_attr(SV* sv_n, SV* sv_startelem, SV* sv_ns, SV* sv_name, SV* sv_val){

    if (SvIV(sv_startelem) < 0 )
            return;

    nad_set_attr(((nad_t) SvIV(SvRV(sv_n))),
                 SvIV(sv_startelem),
                 SvIV(sv_ns),
                 SvPV(sv_name, SvCUR(sv_name)),
                 SvPV(sv_val, SvCUR(sv_val)),
                 SvCUR(sv_val));

}


SV* my_nad_append_attr(SV* sv_n, SV* sv_ns, SV* sv_name, SV* sv_val){

    return newSViv( nad_append_attr(((nad_t) SvIV(SvRV(sv_n))),
                       SvIV(sv_ns),
                       SvPV(sv_name, SvCUR(sv_name)),
                       SvPV(sv_val, SvCUR(sv_val))) );

patches/NADs.xs  view on Meta::CPAN

}


AV* my_nad_list_namespaces(SV* sv_n){

		// namespaces
		int ins;
    AV* array;
	  AV* nss = newAV();
    nad_t nad = ((nad_t) SvIV(SvRV(sv_n)));

	  for(ins=0;ins < nad->ncur;ins++)
	  {
						// namespaces
						av_push(nss, newRV_noinc( (SV*) ( array = newAV() ) ));
	          av_push(array, newSVpv(NAD_NURI(nad, ins), NAD_NURI_L(nad, ins)));
						if (nad->nss[ins].iprefix >= 0){
	            av_push(array, newSVpv(NAD_NPREFIX(nad, ins), NAD_NPREFIX_L(nad, ins)));
					  } else {
	            av_push(array, newSVsv(&PL_sv_undef));
						}
		}
    return nss;

}


SV* my_nad_nad_attr_name(SV* sv_n, SV* sv_attr){

    return newSVpvn( 
                     NAD_ANAME( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_attr) ),
                     NAD_ANAME_L( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_attr) )
                    );

}


SV* my_nad_nad_attr_val(SV* sv_n, SV* sv_attr){

    return newSVpvn( 
                     NAD_AVAL( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_attr) ),
                     NAD_AVAL_L( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_attr) )
                    );

}


SV* my_nad_nad_elem_name(SV* sv_n, SV* sv_elem){

    if (SvIV(sv_elem) < 0 )
            return newSVsv(&PL_sv_undef);

    return newSVpvn( 
                     NAD_ENAME( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_elem) ),
                     NAD_ENAME_L( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_elem) )
                    );

}


SV* my_nad_nad_cdata(SV* sv_n, SV* sv_elem){

    if (SvIV(sv_elem) < 0 )
            return newSVsv(&PL_sv_undef);

    return newSVpvn( 
                     NAD_CDATA( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_elem) ),
                     NAD_CDATA_L( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_elem) )
                    );

}


SV* my_nad_nad_uri(SV* sv_n, SV* sv_ns){

    return newSVpvn( 
                     NAD_NURI( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_ns) ),
                     NAD_NURI_L( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_ns) )
                    );

}


SV* my_nad_nad_uri_prefix(SV* sv_n, SV* sv_ns){

    return newSVpvn( 
                     NAD_NPREFIX( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_ns) ),
                     NAD_NPREFIX_L( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_ns) )
                    );

}


MODULE = Jabber::NADs	PACKAGE = Jabber::NADs	PREFIX = my_nad_

PROTOTYPES: DISABLE



SV *
my_nad_cache_new ( )

void
my_nad_cache_free (sv_nc)
	SV *	sv_nc

SV *
my_nad_nad_new (sv_nc)
	SV *	sv_nc

SV *
my_nad_copy (sv_n)
	SV *	sv_n

SV *
my_nad_insert_elem (sv_n, sv_startelem, sv_ns, sv_name, sv_cdata)
	SV *	sv_n
	SV *	sv_startelem
	SV *	sv_ns
	SV *	sv_name
	SV *	sv_cdata

void
my_nad_wrap_elem (sv_n, sv_startelem, sv_ns, sv_name)
	SV *	sv_n
	SV *	sv_startelem
	SV *	sv_ns
	SV *	sv_name

SV *
my_nad_append_elem (sv_n, sv_ns, sv_name, sv_depth)
	SV *	sv_n
	SV *	sv_ns
	SV *	sv_name
	SV *	sv_depth

SV *
my_nad_print (sv_n, sv_depth)
	SV *	sv_n
	SV *	sv_depth

void
my_nad_write (sv_n, sv_c)
	SV *	sv_n
	SV *	sv_c

void
my_nad_free (sv_n)
	SV *	sv_n

SV *
my_nad_find_elem (sv_n, sv_startelem, sv_ns, sv_name, sv_depth)
	SV *	sv_n
	SV *	sv_startelem
	SV *	sv_ns
	SV *	sv_name
	SV *	sv_depth

void
my_nad_append_cdata (sv_n, sv_cdata, sv_len, sv_depth)
	SV *	sv_n
	SV *	sv_cdata
	SV *	sv_len
	SV *	sv_depth

void
my_nad_append_cdata_head (sv_n, sv_elem, sv_cdata)
	SV *	sv_n
	SV *	sv_elem
	SV *	sv_cdata

void
my_nad_replace_cdata_head (sv_n, sv_elem, sv_cdata)
	SV *	sv_n
	SV *	sv_elem
	SV *	sv_cdata

void
my_nad_append_cdata_tail (sv_n, sv_elem, sv_cdata)
	SV *	sv_n
	SV *	sv_elem
	SV *	sv_cdata

void
my_nad_replace_cdata_tail (sv_n, sv_elem, sv_cdata)
	SV *	sv_n
	SV *	sv_elem
	SV *	sv_cdata

SV *
my_nad_find_attr (sv_n, sv_startelem, sv_ns, sv_name, sv_val)
	SV *	sv_n
	SV *	sv_startelem
	SV *	sv_ns
	SV *	sv_name
	SV *	sv_val

SV *
my_nad_get_attr (sv_n, sv_attr)
	SV *	sv_n
	SV *	sv_attr

void
my_nad_set_attr (sv_n, sv_startelem, sv_ns, sv_name, sv_val)
	SV *	sv_n
	SV *	sv_startelem
	SV *	sv_ns
	SV *	sv_name
	SV *	sv_val

SV *
my_nad_append_attr (sv_n, sv_ns, sv_name, sv_val)
	SV *	sv_n
	SV *	sv_ns
	SV *	sv_name
	SV *	sv_val

SV *
my_nad_add_namespace (sv_n, sv_ns)
	SV *	sv_n
	SV *	sv_ns

SV *
my_nad_find_namespace (sv_n, sv_elem, sv_uri, sv_prefix)
	SV *	sv_n
	SV *	sv_elem
	SV *	sv_uri
	SV *	sv_prefix

SV *
my_nad_find_scoped_namespace (sv_n, sv_uri, sv_prefix)
	SV *	sv_n
	SV *	sv_uri
	SV *	sv_prefix

AV *
my_nad_list_namespaces (sv_n)
	SV *	sv_n

SV *
my_nad_nad_attr_name (sv_n, sv_attr)
	SV *	sv_n
	SV *	sv_attr

SV *
my_nad_nad_attr_val (sv_n, sv_attr)
	SV *	sv_n
	SV *	sv_attr

SV *
my_nad_nad_elem_name (sv_n, sv_elem)
	SV *	sv_n
	SV *	sv_elem

SV *
my_nad_nad_cdata (sv_n, sv_elem)
	SV *	sv_n
	SV *	sv_elem

SV *
my_nad_nad_uri (sv_n, sv_ns)
	SV *	sv_n
	SV *	sv_ns

SV *
my_nad_nad_uri_prefix (sv_n, sv_ns)
	SV *	sv_n
	SV *	sv_ns

void
my_nad_find_children (sv_n, sv_elem)
	SV *	sv_n
	SV *	sv_elem
    INIT:
        int depth, el;
        nad_t nad;

    PPCODE:
        nad = ((nad_t) SvIV(SvRV(sv_n)));
        el = SvIV(sv_elem);
        // find the children of the given node = + 1
        if (el >= 0){
          depth = nad->elems[el].depth + 1;
          for(el = el + 1; el < nad->ecur; el++)
          {
             if (nad->elems[el].depth < depth)
                break;
             if (nad->elems[el].depth == depth){
               XPUSHs(sv_2mortal(newSViv(el)));
             }
          }
        }


void
my_nad_attrs (sv_n, sv_elem)
	SV *	sv_n
	SV *	sv_elem
    INIT:
        int attr, el;
        nad_t nad;

    PPCODE:
        nad = ((nad_t) SvIV(SvRV(sv_n)));
        el = SvIV(sv_elem);
        if (el >= 0 && el < nad->ecur){
          attr = nad->elems[el].attr;
          while (attr >= 0){
            XPUSHs(sv_2mortal(newSViv(attr)));
            attr = nad->attrs[attr].next;
          }
        }



( run in 1.591 second using v1.01-cache-2.11-cpan-99c4e6809bf )