#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #include #include "src/head.h" #include "src/element.h" static int not_here(char *s) { croak("%s not implemented on this architecture", s); return -1; } static double constant(char *name, int len, int arg) { errno = EINVAL; return 0; } MODULE = Table::ParentChild::Head PACKAGE = Table::ParentChild::Head double constant(sv,arg) PREINIT: STRLEN len; INPUT: SV * sv char * s = SvPV(sv, len); int arg CODE: RETVAL = constant(s,len,arg); OUTPUT: RETVAL head * new( CLASS, id ) char * CLASS PREINIT: head * p_head; INPUT: unsigned long id; CODE: p_head = (head *) safemalloc( sizeof( head )); if( p_head == NULL ) { warn( "unable to allocate Table::ParentChild::Head" ); XSRETURN_UNDEF; } p_head->id = id; p_head->first = NULL; RETVAL = p_head; OUTPUT: RETVAL void DESTROY( self ) head * self CODE: safefree( (char *) self ); void add_node( p_head_parent, p_head_child, quantity ) PREINIT: element * node; element * linked_list_node; INPUT: head * p_head_parent; head * p_head_child; double quantity; CODE: node = (element *) safemalloc( sizeof( element )); node->next_parent = NULL; node->next_child = NULL; node->head_parent = p_head_parent; node->head_child = p_head_child; node->value = quantity; linked_list_node = p_head_parent->first; p_head_parent->first = node; node->next_parent = linked_list_node; /* if( linked_list_node ) { printf( "First node: P(%ld) => C(%ld) = %lf\n", linked_list_node->head_parent->id, linked_list_node->head_child->id, linked_list_node->value ); printf( "Inserting: P(%ld) => C(%ld) = %lf\n", node->head_parent->id, node->head_child->id, quantity ); printf( "Next node: P(%ld) => C(%ld) = %lf\n", node->next_parent->head_parent->id, node->next_parent->head_child->id, node->next_parent->value ); } else { printf( "Adding: P(%ld) => C(%ld) = %lf\n", node->head_parent->id, node->head_child->id, quantity ); } */ linked_list_node = p_head_child->first; p_head_child->first = node; node->next_child = linked_list_node; /* if( linked_list_node ) { printf( "First node: P(%ld) => C(%ld) = %lf\n", linked_list_node->head_parent->id, linked_list_node->head_child->id, linked_list_node->value ); printf( "Inserting: P(%ld) => C(%ld) = %lf\n", node->head_parent->id, node->head_child->id, quantity ); printf( "Next node: P(%ld) => C(%ld) = %lf\n", node->next_child->head_parent->id, node->next_child->head_child->id, node->next_child->value ); } else { printf( "Adding: P(%ld) => C(%ld) = %lf\n", node->head_parent->id, node->head_child->id, quantity ); } */ unsigned long first_child( p_head_parent ) INPUT: head * p_head_parent; CODE: RETVAL = p_head_parent->first->head_parent->id; OUTPUT: RETVAL unsigned long first_parent( p_head_child ) INPUT: head * p_head_child; CODE: RETVAL = p_head_child->first->head_child->id; OUTPUT: RETVAL unsigned long id( p_head ) INPUT: head * p_head; CODE: RETVAL = p_head->id; OUTPUT: RETVAL SV * search_for_parents( p_head_child ) INPUT: head * p_head_child; PREINIT: HV * hv_search_results; element * node; CODE: hv_search_results = newHV(); RETVAL = newRV_noinc((SV *) hv_search_results); node = p_head_child->first; while( node ) { /* printf( "Parent %ld found for Child %ld\n", node->head_parent->id, p_head_child->id ); */ hv_store_ent( hv_search_results, newSVpvf( "%ld", node->head_parent->id ), newSVnv( node->value ), 0 ); node = node->next_child; } OUTPUT: RETVAL SV * search_for_children( p_head_parent ) INPUT: head * p_head_parent; PREINIT: HV * hv_search_results; element * node; CODE: hv_search_results = newHV(); RETVAL = newRV_noinc((SV *) hv_search_results); node = p_head_parent->first; while( node ) { /* printf( "Parent %ld found for Child %ld\n", node->head_parent->id, p_head_child->id ); */ hv_store_ent( hv_search_results, newSVpvf( "%ld", node->head_child->id ), newSVnv( node->value ), 0 ); node = node->next_parent; } OUTPUT: RETVAL